我正在使用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中?
谢谢
4条答案
按热度按时间l5tcr1uw1#
这可能会让你比平时快一点
vyu0f0g12#
我也遇到了同样的问题,只是因为跟踪是打开的。只需打开ODBC数据源管理器,然后转到“跟踪”选项卡并关闭跟踪。它完全解决了问题。
ipakzgxi3#
你的问题不在于pyodbc,而在于sql-server。你的代码有两个问题:
1)你需要在“WHERE”子句中出现的列上创建索引。DT_RETIRADA和SITUACAO)。请注意,如果您总是使用这两个值不断过滤SITUACAO,您可以使用过滤索引。如果你有这两个字段的索引,最好的解决方案是重建索引。
2)你的查询最有可能遭受“参数嗅探”。你需要搜索更多
z9smfwbn4#
我也有同样的问题。我没有找到解决方案,但我意识到,当从局域网连接到数据库时,ODBC变得更快。
Connection scenarios