Производительность SQL Alchemy - PullRequest
2 голосов
/ 12 мая 2011

Я работаю над проектом, который будет нуждаться в огромной базе данных. В настоящее время мы используем SQLAlchemy, но я немного обеспокоен проблемами с производительностью. У меня вопрос такой:

session.query(DataStorage).filter(DataStorage.storage_path.startswith(path)).all()

Как SQLAlchemy выполняет фактический перевод и фильтрацию. Получает ли он все записи из DataStorage с предложением SELECT, а затем проверяет все из них? Или он знает, как перевести «фильтр (DataStorage.storage_path.startswith (путь))» в SQL? Сколько теряется с точки зрения производительности при использовании собственных SQL-запросов?

С уважением, Богдан

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

SqlAlchemy использует ваш код для генерации оператора SQL. В вашем случае вы получаете что-то вроде:

SELECT * FROM DataStorage WHERE DataStorage.storage_path LIKE 'path%';

Запрос выполняется к базе данных, когда вы используете .all (). Так что в этом случае он получит все строки в итераторе набора результатов и вернет их вам.

1 голос
/ 12 мая 2011

Я не знаком с конкретными конструкциями SQLAlchemy, которые вы используете, но лучший способ выяснить это - попробовать.Включите ведение журнала запросов в MySQL и посмотрите, какие запросы генерирует SQLAlchemy.Вы можете попробовать написать запрос вручную и сравнить производительность обоих.(Для этого вам понадобится куча тестовых данных в вашей базе данных.)

Как правило, ORM отлично справляются с простыми SELECT, предложениями WHERE, ORDER BY и т. Д. Когда вы начинаете делать много соединений или многоПри обработке данных построенные запросы имеют тенденцию быть менее оптимальными.Это зависит от вашего приложения.Подход, который я обычно использую, состоит в том, чтобы писать вещи, используя ORM, и оптимизировать и заменять на SQL, где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...