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

У меня есть простой оператор выбора для CTE, в котором я объявил и SET значения перед WITH, и я выбираю данные за один день, который будет иметь почти 200000 строк данных. Если я выполню этот запрос, он займет больше времени (не завершено за 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 ответ

Поскольку для фильтрации 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 

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

Другие вопросы по тегам