我正在使用带有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中?
由于
答案 0 :(得分:0)
您的问题不在于pyodbc,而在于sql-server。你的代码有两个问题:
1)您需要在“WHERE”子句中出现的列上创建indecies(即DT_RETIRADA和SITUACAO)。请注意,如果您始终使用这两个值不断过滤SITUACAO,则可以使用过滤索引。如果你有这两个字段的索引,最好的解决方案是重建索引
2)你查询最有可能遭受“参数嗅探”。你需要更多地搜索那个
答案 1 :(得分:0)
这可能会使您的速度比平常快
cursor.execute(query)
df = cursor.fetchallarrow().to_pandas()