Производительность SQL Alchemy

#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.