SQLAlchemy Core select查询比原始SQL慢得多

2024-04-20 08:13:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python3代码运行Jupyter笔记本已经有一段时间了。它使用pyodbc和SQLAlchemy的组合来连接到我公司内部网上的几个sqlserver数据库。笔记本的目的是从初始的sqlserver数据库中提取数据,并将其作为Pandas数据帧存储在内存中。然后,该文件从其中一列中提取特定值,并将该值列表发送到两个不同的SQL Server数据库,以拉回映射列表。在

在我决定将原始SQL查询重写为SQLAlchemy核心语句之前,所有这些工作一直都很顺利。我已经完成了验证SQLAlchemy查询编译以匹配原始SQL查询的过程。然而,查询的运行速度慢得令人难以想象。例如,初始的原始SQL查询在25秒内运行,在SQLAlchemy Core中重写的同一查询在15分钟内运行!剩下的查询即使在运行了2个小时后也没有完成。在

这可能与我如何反映现有表有关。我甚至花了一些时间重写表上的ForeignKey和primary_key,希望这有助于提高性能。没有骰子。在

我也知道“如果它没有损坏,就不要修复它”,但是SQLAlchemy看起来比一个糟糕的硬编码SQL要好得多。在

有人能解释一下为什么SQLAlchemy查询运行得这么慢吗。SQLAlchemy文档没有提供太多的洞察力。我运行的是SQLAlchemy版本1.2.11。在

import sqlalchemy
sqlalchemy.__version__
'1.2.11'

以下是相关线路。为了简洁起见,我排除了出口商品,但万一有人需要看,我很乐意提供。在

^{pr2}$

应该匹配sql_dr2并运行lickety split的原始SQL查询如下:

"""SELECT Account_Number = z.AccountNumber, UCRN = y.UniqueClaimReferenceNumber 
FROM livecsdb.dbo.BarVisits z 
INNER JOIN 
livecsdb.dbo.BarBillsUB92Claims y
ON 
y.SourceID = z.SourceID 
AND 
y.BillingID = z.BillingID
WHERE
y.UniqueClaimReferenceNumber IN ({0})""".format(', '.join(["'" + acct + "'" for acct in dr2]))

列表dr2通常包含70000个以上的元素。同样,原始SQL在一分钟或更短的时间内就可以处理这个问题。SQLAlchemy重写已经运行了8个多小时了,但仍然没有完成。在

更新 其他信息如下。我不拥有数据库或表,它们包含受保护的健康信息,因此我不能直接共享这些信息,但我会考虑制作一些模拟数据。在

tables = ['BarVisits', 'BarBillsUB92Claims']
for t in tables:
    print(insp.get_foreign_keys(t))
[], []

for t in tables:
    print(insp.get_indexes(t))
[{'name': 'BarVisits_SourceVisit', 'unique': False, 'column_names': ['SourceID', 'VisitID']}]
[]

for t in tables:
    print(insp.get_pk_constraint(t))
{'constrained_columns': ['BillingID', 'SourceID'], 'name': 'mtpk_visits'}
{'constrained_columns': ['BillingID', 'BillNumberID', 'ClaimID', 'ClaimInsuranceID', 'SourceID'], 'name': 'mtpk_insclaim'}

提前感谢您的任何见解。在


Tags: 数据in信息数据库列表fortablessql
1条回答
网友
1楼 · 发布于 2024-04-20 08:13:52

我找到了如何使查询快速运行,但不知道为什么需要这个服务器而不是其他任何服务器。在

接受

sql_dr2 = str(sql.compile(dialect=mssql.dialect(), compile_kwargs={"literal_binds": True}))

把它送过去

^{pr2}$

在大约2秒钟内执行查询。在

但我又不知道为什么有用。在

相关问题 更多 >