#python #sqlalchemy
#python #sqlalchemy
Вопрос:
Я работаю над проектом, для которого потребуется огромная база данных. В настоящее время мы используем SQLAlchemy, но меня немного беспокоят проблемы с производительностью. Мой вопрос заключается в том, что запрос типа:
session.query(DataStorage).filter(DataStorage.storage_path.startswith(path)).all()
Как SQLAlchemy выполняет фактический перевод и фильтрацию. Получает ли он все записи из хранилища данных с помощью предложения SELECT, а затем проверяет каждую из них? Или он знает, как перевести «filter(DataStorage.storage_path.startswith(path))» в SQL? Сколько теряется производительности при использовании собственных SQL-запросов?
с уважением, Богдан
Ответ №1:
SQLAlchemy использует ваш код для генерации инструкции SQL. В вашем случае вы получаете что-то вроде:
SELECT * FROM DataStorage WHERE DataStorage.storage_path LIKE 'path%';
Запрос выполняется к базе данных, как только вы используете .all(). Таким образом, в этом случае он получит все строки в итераторе результирующего набора и вернет их вам.
Ответ №2:
Я не знаком с конкретными конструкциями SQLAlchemy, которые вы используете, но лучший способ узнать это — попробовать. Включите ведение журнала запросов в MySQL и проверьте запросы, генерируемые SQLAlchemy. Вы можете попробовать написать запрос вручную и сравнить производительность двух. (Для этого вам понадобится куча тестовых данных в вашей базе данных.)
Как правило, ORM прекрасно справляются с простыми предложениями SELECT, WHERE, ORDER BY и т.д. Когда вы начинаете выполнять много соединений или много обработки данных, построенные запросы, как правило, менее оптимальны. Это зависит от вашего приложения. Подход, который я обычно использую, заключается в том, чтобы записывать вещи с использованием ORM и оптимизировать и заменять SQL, где это необходимо.
Комментарии:
1. Вы также можете включить ведение журнала в SQLAlchemy, чтобы просмотреть сгенерированный SQL.