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

2024-06-01 08:44:52 发布

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

我正在使用jupiter笔记本和python3并连接到一个sqlserver数据库。我使用pyodbc版本4.0.22连接到数据库。在

我的目标是将SQL结果存储在pandas数据帧中,但是查询太慢了。在

代码如下:

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)

节奏:26.379971981048584

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

^{pr2}$

节奏:3.7947773933410645

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

节奏:0.2396855354309082

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

节奏:23.67447066307068

因此,当数据已经从数据库服务器中检索出来,而且pyton代码在处理数据时似乎很慢,这说明我的问题是局部的。在

但我只有892行!在

ra_ontem.shape

(189,2)

所以我的问题是,如何才能更快地将结果加载到Pandas数据帧中?在

谢谢


Tags: 数据代码数据库timequerystartendra
2条回答

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

cursor.execute(query)

df = cursor.fetchallarrow().to_pandas()

您的问题不在于pyodbc,而在于sqlserver。您的代码有两个问题:
1) 您需要在“WHERE”子句中出现的列上创建索引(即DT_RETIRADA和SITUACAO)。请注意,如果您总是用这两个值来过滤SITUACAO,那么可以使用filtered index。如果在这两个字段上有索引,最好的解决方案是重建索引。
2) 您的查询很可能受到“参数嗅探”的困扰。你需要更多的信息

相关问题 更多 >