python - 从 pyodbc 运行查询比从 SSMS 运行查询花费的时间要长得多
问题描述
我正在尝试使用 pyodbc 在 SQL Server 上运行一个简单的查询。查询似乎卡住了,或者需要很长时间才能完成。当我从 SSMS 运行相同的查询时,查询将在 2 秒内执行。如果有人知道为什么 pyodbc 需要这么长时间,请告诉我。
这是查询:
SELECT *
FROM [TABLE]
WHERE (SELECT CONVERT(DATE, MAX(v))
FROM (VALUES ([INSERT_DATE]), ([LAST_MODIFIED_DATE])) AS value(v)) = CONVERT(DATE, GETDATE() - 1);
特定表似乎全天定期更新,我想知道这是否会使基于日期的拉数据特别困难。
解决方案
那应该是阻塞了。如所写,该查询将始终需要完整扫描。它在 2 秒内在 SSMS 中执行的事实表明它并不是一个真正昂贵的查询。您是否有可能在另一个会话中对该表进行了未提交的更新?
您可以尝试重构它以可能使用索引,或调查 SQL Server 上的阻塞。
例如
USE TEMPDB
GO
drop table if exists [TABLE]
go
create table [TABLE]
(
id int primary key,
data char(200) not null default replicate('z',200),
INSERT_DATE datetime,
LAST_MODIFIED_DATE datetime
)
create index ix_T_id on [TABLE](INSERT_DATE)
create index ix_T_lm on [TABLE](LAST_MODIFIED_DATE)
go
with q as
(
select top 1000000 row_number() over (order by (select null)) i
from sys.messages m, sys.messages m2
)
insert into [TABLE] (id,insert_date,LAST_MODIFIED_DATE)
select i, dateadd(minute,-1*i,getdate()),dateadd(minute,-1*i,getdate())
from q
go
set statistics time on
go
SELECT *
FROM [TABLE]
WHERE [INSERT_DATE] >= CONVERT(DATE, GETDATE() - 1) AND [INSERT_DATE] < CONVERT(DATE, GETDATE())
OR [LAST_MODIFIED_DATE] >= CONVERT(DATE, GETDATE() - 1) AND [LAST_MODIFIED_DATE] < CONVERT(DATE, GETDATE())
/*
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 233 ms, elapsed time = 233 ms.
*/
SELECT *
FROM [TABLE]
WHERE (SELECT CONVERT(DATE, MAX(v))
FROM (VALUES ([INSERT_DATE]), ([LAST_MODIFIED_DATE])) AS value(v)) = CONVERT(DATE, GETDATE() - 1);
/*
SQL Server Execution Times:
CPU time = 1360 ms, elapsed time = 328 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
*/
go
set statistics time off
go
推荐阅读
- ruby-on-rails - Zip 流在生产环境中不起作用 (RAILS/AWS)
- javascript - Arrays.sort 比较器问题
- sql - 使用“using”而不是“on”交叉连接两个表
- javascript - 在同一段落中包含两个链接,在模态窗口中启动不同的图像
- html - 使用本地版本时丢失 BootStrap 格式
- html - 从 div 类中选择第一个 span 标签
- matlab - 在 Matlab 中使用 fscanf 从文本文件中读取一些缺失信息的数据
- c# - 具有嵌套依赖的类型的依赖注入
- javascript - POST request fails with XMLHttpRequest(), yet works with Postman
- php - Laravel Valet MySQL 错误:指定为定义者的用户不存在