Sqlalchemy работает медленно при первом запросеPython

Программы на Python
Anonymous
Sqlalchemy работает медленно при первом запросе

Сообщение Anonymous »

Я использую Sqlalchemy(2.0.3) с python3.10, и после загрузки нового контейнера выполнение определенного запроса занимает ~2,2 с, выполнение всех последовательных вызовов одного и того же запроса занимает ~70 мс. Я использую PostgreSQL, и выполнение необработанного запроса в DataGrip занимает 40–70 мс.
Вот код:

Код: Выделить всё

self._Session = async_sessionmaker(self._engine, expire_on_commit=False)

...

@property
def session(self):
return self._Session

...

async with PostgreSQL().session.begin() as session:
total_functions = aliased(db_models.Function)
finished_functions = aliased(db_models.Function)
failed_functions = aliased(db_models.Function)
stmt = (
select(
db_models.Job,
func.count(distinct(total_functions.id)).label("total"),
func.count(distinct(finished_functions.id)).label("finished"),
func.count(distinct(failed_functions.id)).label("failed")
)
.where(db_models.Job.project_id == project_id)
.outerjoin(db_models.Job.packages)
.outerjoin(db_models.Package.modules)
.outerjoin(db_models.Module.functions.of_type(total_functions))
.outerjoin(finished_functions, and_(
finished_functions.module_id == db_models.Module.id,
finished_functions.progress == db_models.FunctionProgress.FINISHED
))
.outerjoin(failed_functions, and_(
failed_functions.module_id == db_models.Module.id,
or_(
failed_functions.state == db_models.FunctionState.FAILED,
failed_functions.state == db_models.FunctionState.TERMINATED,
))
)
.group_by(db_models.Job.id)
)
start = time.time()
yappi.set_clock_type("WALL")
with yappi.run():
job_infos = await session.execute(stmt)
yappi.get_func_stats().print_all()
end = time.time()
Вещи, которые я пробовал и обнаружил:
  • Проблема не связана с подключением или запросом к базе данных базы данных. При загрузке службы устанавливаю соединение и делаю еще какие-то запросы.
  • Проблема, скорее всего, не связана с кешем. Я отключил кеш с помощью query_cache_size=0, однако я не уверен на 100%, что это сработало, поскольку в документации сказано:
Функции ORM, связанные с сохранением единиц работы, а также некоторые стратегии загрузки атрибутов, будут использовать отдельные кэши для каждого сопоставителя вне основного кэша.
  • Профилировщик не показал ничего, что привлекло бы мое внимание:

Код: Выделить всё

..urrency_py3k.py:130 greenlet_spawn  2/1    0.000000  2.324807  1.162403
..rm/session.py:2168 Session.execute  1      0.000028  2.324757  2.324757
..0 _UnixSelectorEventLoop._run_once  11     0.000171  2.318555  0.210778
..syncpg_cursor._prepare_and_execute  1      0.000054  2.318187  2.318187
..cAdapt_asyncpg_connection._prepare  1      0.000020  2.316333  2.316333
..nnection.py:533 Connection.prepare  1      0.000003  2.316154  2.316154
..nection.py:573 Connection._prepare  1      0.000017  2.316151  2.316151
..n.py:359 Connection._get_statement  2/1    0.001033  2.316122  1.158061
..ectors.py:452 EpollSelector.select  11     0.000094  2.315352  0.210487
..y:457 Connection._introspect_types  1      0.000025  2.314904  2.314904
..ction.py:1669 Connection.__execute  1      0.000027  2.314879  2.314879
..ion.py:1699 Connection._do_execute  1      2.314095  2.314849  2.314849
...py:2011 Session._execute_internal  1      0.000034  0.006174  0.006174
Я также видел, что можно отключить кеш для каждого соединения:

Код: Выделить всё

with engine.connect().execution_options(compiled_cache=None) as conn:
conn.execute(table.select())
Однако я работаю со слоем ORM и не знаю, как применить это в моем случае.
Есть идеи, откуда может возникнуть эта задержка?

Подробнее здесь: https://stackoverflow.com/questions/754 ... first-time

Вернуться в «Python»