从pyodbc运行查询比从SSMS运行需要更长的时间

4

我正在尝试使用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);

特定的表格似乎在一天中不断更新,我想知道是否这会使得基于日期拉取数据变得特别困难。

你的服务器上有sp_whoisactive或其他监控工具吗?这可能会提供更多的见解。 - scottsaenz
我会检查,但你具体想要什么? - not_a_comp_scientist
如果出现 SQL Server 问题,它将有助于诊断。sp_whoisactive 将显示 SQL 端上是否存在活动会话。 - scottsaenz
1个回答

0

这可能是阻塞的问题。按照现有的写法,该查询将始终需要完整扫描。在 SSMS 中执行只需 2 秒的事实表明它并不是一个昂贵的查询。您是否可能在另一个会话中对该表进行了未提交的更新?

您可以尝试重构它以可能使用索引,或者调查 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

1
我不会撒谎,我对阻塞并不了解。我在这里阅读了一些关于它的内容:https://support.microsoft.com/en-us/help/224453/inf-understanding-and-resolving-sql-server-blocking-problems。我想知道为什么在SSMS中可以完美运行而在Python中却不能。我该如何避免阻塞? - not_a_comp_scientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接