python pyodbc到SQL Server获取结果时速度太慢

mnemlml8  于 2023-06-28  发布在  Python
关注(0)|答案(4)|浏览(110)

我正在使用Python 3的jupiter notebook并连接到SQL Server数据库。我使用pyodbc版本4.0.22连接到数据库。
我的目标是将SQL结果存储在pandas Dataframe 中,但查询速度太慢了。
下面是代码:

import pyodbc 
cnxn = pyodbc.connect("DSN=ISTPRD02;"
                      "Trusted_Connection=yes;")
ontem = '20180521'

query = "SELECT LOJA, COUNT(DISTINCT RA) FROM VENDAS_CONTRATO(NOLOCK) WHERE DT_RETIRADA_RA = '" + ontem + "' AND SITUACAO IN ('ABERTO', 'FECHADO') GROUP BY LOJA"
start = time.time()
ra_ontem = pd.read_sql_query(query, cnxn)
end = time.time()
print("Tempo: ", end - start)

克里思:021 - 88888888传真:021 - 88888888
由于耗时较长,我对数据库服务器进行了监控,在服务器上运行查询大约需要3秒,如下图所示:

query = "SELECT LOJA, COUNT(DISTINCT RA)  FROM VENDAS_CONTRATO(NOLOCK) WHERE DT_RETIRADA_RA = '" + ontem + "' AND SITUACAO IN ('ABERTO', 'FECHADO') GROUP BY LOJA"
start = time.time()
crsr = cnxn.cursor()
crsr.execute(query)
end = time.time()
print("Tempo: ", end - start)

克里思:13937773933410645

start = time.time()
crsr.fetchone()
end = time.time()
print("Tempo: ", end - start)

克里思:1396855354309082

start = time.time()
crsr.fetchall()
end = time.time()
print("Tempo: ", end - start)

克里思:021 - 88888888传真:021 - 88888888
所以看起来我的问题是局部的,当数据已经从数据库服务器中检索时,pyhton代码在处理数据时看起来很慢。
但我只有892行!

ra_ontem.shape

(189、2)
所以我的问题是,我如何才能更快地将结果加载到Pandas Dataframe中?
谢谢

l5tcr1uw

l5tcr1uw1#

这可能会让你比平时快一点

cursor.execute(query)

df = cursor.fetchallarrow().to_pandas()
vyu0f0g1

vyu0f0g12#

我也遇到了同样的问题,只是因为跟踪是打开的。只需打开ODBC数据源管理器,然后转到“跟踪”选项卡并关闭跟踪。它完全解决了问题。

ipakzgxi

ipakzgxi3#

你的问题不在于pyodbc,而在于sql-server。你的代码有两个问题:
1)你需要在“WHERE”子句中出现的列上创建索引。DT_RETIRADA和SITUACAO)。请注意,如果您总是使用这两个值不断过滤SITUACAO,您可以使用过滤索引。如果你有这两个字段的索引,最好的解决方案是重建索引。
2)你的查询最有可能遭受“参数嗅探”。你需要搜索更多

z9smfwbn

z9smfwbn4#

我也有同样的问题。我没有找到解决方案,但我意识到,当从局域网连接到数据库时,ODBC变得更快。
Connection scenarios

相关问题