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
Делая это, вы уменьшаете нагрузку во время фильтрации и делаете предварительные вычисления требуемых фиксированных переменных.