首页 > 解决方案 > 从 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);

特定表似乎全天定期更新,我想知道这是否会使基于日期的拉数据特别困难。

标签: pythonsql-serverpyodbc

解决方案


那应该是阻塞了。如所写,该查询将始终需要完整扫描。它在 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

推荐阅读