Выполнение запроса из pyodb c занимает намного больше времени, чем из SSMS - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь выполнить простой запрос на SQL сервере, используя pyodb c. Похоже, что запрос застрял и или занимает вечность для завершения. Когда я запускаю тот же запрос из SSMS, запрос выполняется за 2 секунды. Если у кого-то есть идея, почему pyodb c занимает так много времени, пожалуйста, дайте мне знать.

Это запрос:

SELECT *
FROM [TABLE]
WHERE (SELECT CONVERT(DATE, MAX(v)) 
       FROM (VALUES ([INSERT_DATE]), ([LAST_MODIFIED_DATE])) AS value(v)) = CONVERT(DATE, GETDATE() - 1);

Таблица спецификаций c, похоже, обновляется регулярно в течение дня, и мне интересно, если это особенно затруднит получение данных на основе даты.

1 Ответ

0 голосов
/ 17 января 2020

Это, вероятно, блокировка. Как написано, этот запрос всегда требует полного сканирования. Тот факт, что он выполняется в SSMS в 2 се c, указывает на то, что это не очень дорогой запрос. Возможно, у вас есть незафиксированное обновление этой таблицы в другом сеансе?

Вы можете попробовать реорганизовать его для возможного использования индексов или исследовать блокировку на SQL сервере.

EG

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
...