SQL Server - DECLARE SET требует слишком много времени для выполнения, чем жесткое программирование параметров, в которых условие - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть простое выражение select для CTE, в котором перед объявлением WITH были объявлены значения и значения SET, и я собираю данные за один день, в котором будет около 200 000 строк данных.Если я выполню этот запрос, он займет больше времени (не завершено за 10 минут).Но если я удаляю эти DECLARE, SET и жестко закодирую эти входные значения в условии WHERE, результаты отображаются в 15 СЕКУНДАХ.

В этой таблице содержится около 350 миллионов строк данных с надлежащей индексацией столбцов первичного ключа.

Что может быть причиной этой медленности?

Фактический запрос

DECLARE @StartTime DATETIME
DECLARE @EndTime DATETIME
DECLARE @ApplicationName VARCHAR(100)
SET @StartTime = '2018-12-10'
SET @EndTime = '2018-12-10'
SET @Applicationname = 'APPNAME'

;WITH TOTAL as (
SELECT * FROM TABLE WHERE DATETIME >= + @StartTime + '00:00:01' AND
DATETIME <= + @EndTime + '23:59:59'
AND APPLICATIONID=(SELECT APPLICATIONID FROM APPLICATION WHERE ApplicationName=@Applicationname 
)
SELECT * FROM TOTAL

После изменения

SELECT * FROM TABLE WHERE DATETIME >= '2018-12-10 00:00:01' AND
DATETIME <= '2018-12-10 23:59:59'
AND APPLICATIONID=(SELECT APPLICATIONID FROM APPLICATION WHERE ApplicationName='APPNAME'

На самом деле у БД есть SP с длинным запросом, здесь я предоставил только первую таблицу CTE и те же условия таблицы, которые применимы ко всем остальным таблицам CTE.Если я получу подсказку об этой медлительности, я исправлю остальные запросы.

1 Ответ

0 голосов
/ 13 декабря 2018

Поскольку для фильтрации SQL-серверу необходимо скомпилировать переменные StartTime и EndTime для каждой записи в TABLE, это займет больше времени.если вы делаете что-то вроде следующего:

DECLARE @StartTime DATETIME
DECLARE @EndTime DATETIME
DECLARE @ApplicationName VARCHAR(100)
SET @StartTime = '2018-12-10 00:00:01'
SET @EndTime = '2018-12-10 23:59:59'
SET @Applicationname = 'APPNAME'

SELECT * 
FROM TABLE 
WHERE DATETIME >= @StartTime AND DATETIME <= @EndTime
AND APPLICATIONID=(SELECT APPLICATIONID FROM APPLICATION WHERE 
ApplicationName=@Applicationname 

Делая это, вы уменьшаете нагрузку во время фильтрации и делаете предварительные вычисления необходимых фиксированных переменных.

...