Литтл.поздно после комментирования, но ...
Как обсуждалось в комментариях, такой код, как CAST(DateTimeColumn AS date)
, на самом деле SARGable.Роб Фарли опубликовал статью о некоторых функциональных возможностях SARGable и non-SARGable здесь , однако в любом случае я расскажу несколько вещей.
Во-первых, применение функции к столбцу приведет кобычно делает ваш запрос не SARGable, особенно если он меняет порядок значений или порядок их значений не имеет смысла.Возьмем что-то вроде:
SELECT *
FROM TABLE
WHERE RIGHT(COLUMN,5) = 'value';
Порядок значений в столбце здесь совершенно бесполезен, так как мы фокусируемся на символах справа.К сожалению, как Роб также обсуждает:
SELECT *
FROM TABLE
WHERE LEFT(COLUMN,5) = 'value';
Это также не SARGable.Однако как насчет следующего?
SELECT *
FROM TABLE
WHERE Column LIKE 'value%';
Это так, поскольку логика не применяется к столбцу и порядок не изменяется.Если значение wehre '%value%'
, тогда оно тоже не будет SARGable.
При применении логики, которая добавляет (или вычитает) то, что вы хотите найти, вы всегда хотите применить это к буквальному значению (или функции)., как GETDATE () `).Например, одно из этих выражений - SARGable, другое - нет:
Column + 1 = @Variable --non-SARGable
Column = @Variable - 1 --SARGable
То же относится и к таким вещам, как DATEADD
@DateVariable BETWEEN DateColumn AND DATEADD(DAY, 30,DateColumn) --non-SARGable
DateColumn BETWEEN DATEADD(DAY, -30, @DateVariable) AND @DateVariable --SARGable
Изменение типа данных (кроме * 1027).*) редко будет держать запрос SARGable.CONVERT(date,varchardate,112)
не будет SARGable, даже если порядок столбцов не изменился.Однако преобразование decimal
в int
привело к тому же результату, что и преобразование datetime
в date
, и сохранило SARGability:
CREATE TABLE testtab (n decimal(2,1) PRIMARY KEY CLUSTERED);
INSERT INTO testtab
VALUES(0.1),
(0.3),
(1.1),
(1.7),
(2.4);
GO
SELECT n
FROM testtab
WHERE CONVERT(int,n) = 2;
GO
DROP TABLE testtab;
Надеюсь, это даст вам достаточно для продолжения, но Пелас спросит, хотите ли вы, чтобы я добавил что-нибудь еще.