我正在使用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数据帧中?在
谢谢
这可能会让你比平时快一点
您的问题不在于pyodbc,而在于sqlserver。您的代码有两个问题:
1) 您需要在“WHERE”子句中出现的列上创建索引(即DT_RETIRADA和SITUACAO)。请注意,如果您总是用这两个值来过滤SITUACAO,那么可以使用filtered index。如果在这两个字段上有索引,最好的解决方案是重建索引。
2) 您的查询很可能受到“参数嗅探”的困扰。你需要更多的信息
相关问题 更多 >
编程相关推荐