Вам необходимо проиндексировать вычисляемый столбец, чтобы SQL мог выполнить поиск. Вычисляемый столбец оценивается только во время выбора, если он не сохраняется или не индексируется. Даже если бы он был помечен как persisted
, его все равно нужно было бы сканировать без индекса. Тот факт, что выражение является детерминированным c и точным, означает, что оно может быть проиндексировано, но вам все равно нужно добавить индекс.
Ваш комментарий ниже указывает на то, что вы не можете добавить индекс в вычисляемый столбец. Но в этом конкретном случае он вам все равно не нужен для выполнения того же запроса, потому что ваш вычисляемый столбец добавляет постоянное смещение к исходному столбцу. Следовательно, константное выражение можно переместить в правую часть операции сравнения в самом запросе, и SQL по-прежнему сможет использовать исходный кластерный индекс.
То есть вместо создавая новый столбец, который равен Dt
плюс некоторая константа, вы можете вычесть константу из правой части неравенства. Вместо:
alter table _test ADD [Dt_2] AS DATEADD(MINUTE, 300, Dt);
DECLARE @EndTime DATETIME2(7) = '2020-07-10 00:00:00.000'
DECLARE @StartTime DATETIME2(7) = DATEADD(day, -12, @EndTime);
select * from _test
where
Dt_2 > @StartTime AND Dt_2 < @EndTime;
можно использовать:
--subtract 300 minutes from the @endTime parameter instead of adding 300 minutes to every value of Dt
DECLARE @EndTime DATETIME2(7) = dateadd(minute, -300, '2020-07-10 00:00:00.000');
DECLARE @StartTime DATETIME2(7) = DATEADD(day, -12, @EndTime);
select * from _test
where
Dt > @StartTime
AND Dt < @EndTime;