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

时间:2018-05-22 20:49:32

标签: python sql performance pyodbc

我正在使用带有Python 3的jupiter notebook并连接到SQL Server数据库。我使用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秒钟,如下所示:

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)

天宝: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

因此,当数据已经从数据库服务器检索到并且在处理数据时pyhton代码看起来很慢时,我的问题就是本地问题。

但我只有892行!

ra_ontem.shape

(189,2)

所以我的问题是如何更快地将结果加载到Pandas Dataframe中?

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这可能会使您的速度比平常快

cursor.execute(query)

df = cursor.fetchallarrow().to_pandas()