SARGability에 대한 흥미로운 질문이 있습니다. 이 경우 두 날짜 열의 차이점에 대한 술어를 사용하는 것입니다. 설정은 다음과 같습니다.
USE [tempdb]
SET NOCOUNT ON
IF OBJECT_ID('tempdb..#sargme') IS NOT NULL
BEGIN
DROP TABLE #sargme
END
SELECT TOP 1000
IDENTITY (BIGINT, 1,1) AS ID,
CAST(DATEADD(DAY, [m].[severity] * -1, GETDATE()) AS DATE) AS [DateCol1],
CAST(DATEADD(DAY, [m].[severity], GETDATE()) AS DATE) AS [DateCol2]
INTO #sargme
FROM sys.[messages] AS [m]
ALTER TABLE [#sargme] ADD CONSTRAINT [pk_whatever] PRIMARY KEY CLUSTERED ([ID])
CREATE NONCLUSTERED INDEX [ix_dates] ON [#sargme] ([DateCol1], [DateCol2])
내가 자주 보게 될 것은 다음과 같습니다.
/*definitely not sargable*/
SELECT
* ,
DATEDIFF(DAY, [s].[DateCol1], [s].[DateCol2])
FROM
[#sargme] AS [s]
WHERE
DATEDIFF(DAY, [s].[DateCol1], [s].[DateCol2]) >= 48;
확실히 SARGable이 아닙니다. 인덱스 스캔이 발생하고 1000 행을 모두 읽습니다. 예상 행이 악취가납니다. 당신은 이것을 프로덕션에 넣지 않을 것입니다.
우리가 CTE를 구체화 할 수 있다면 좋을 것입니다. 왜냐하면 그것은 더 잘 SARGable하고 기술적으로 말하면 도움이 될 것이기 때문입니다. 그러나 아닙니다. 우리는 최상위와 동일한 실행 계획을 얻습니다.
/*would be nice if it were sargable*/
WITH [x] AS ( SELECT
* ,
DATEDIFF(DAY, [s].[DateCol1], [s].[DateCol2]) AS [ddif]
FROM
[#sargme] AS [s])
SELECT
*
FROM
[x]
WHERE
[x].[ddif] >= 48;
물론 상수를 사용하지 않기 때문에이 코드는 아무것도 변경하지 않으며 SARGable의 절반도 아닙니다. 재미 없어. 동일한 실행 계획.
/*not even half sargable*/
SELECT
* ,
DATEDIFF(DAY, [s].[DateCol1], [s].[DateCol2])
FROM
[#sargme] AS [s]
WHERE
[s].[DateCol2] >= DATEADD(DAY, 48, [s].[DateCol1])
운이 좋으면 연결 문자열의 모든 ANSI SET 옵션을 준수하는 경우 계산 열을 추가하고 검색 할 수 있습니다 ...
ALTER TABLE [#sargme] ADD [ddiff] AS
DATEDIFF(DAY, DateCol1, DateCol2) PERSISTED
CREATE NONCLUSTERED INDEX [ix_dates2] ON [#sargme] ([ddiff], [DateCol1], [DateCol2])
SELECT [s].[ID] ,
[s].[DateCol1] ,
[s].[DateCol2]
FROM [#sargme] AS [s]
WHERE [ddiff] >= 48
이렇게하면 세 가지 쿼리로 인덱스를 찾을 수 있습니다. 이상한 사람은 DateCol1에 48 일을 추가하는 곳입니다. 와 쿼리 DATEDIFF
에 WHERE
절은 CTE
계산 된 컬럼에 대한 술어, 최종 쿼리는 모두 당신에게 훨씬 좋네요 추정치 훨씬 더 좋은 계획을주고, 모든 것을.
하나의 질문 으로이 검색을 수행 할 수있는 SARGable 방법이 있습니까?
임시 테이블, 테이블 변수, 테이블 구조 변경 및 뷰가 없습니다.
자체 조인, CTE, 하위 쿼리 또는 데이터를 여러 번 통과하는 것이 좋습니다. 모든 버전의 SQL Server에서 작동 할 수 있습니다.
계산 열을 피하는 것은 인공적인 한계입니다. 다른 것보다 쿼리 솔루션에 더 관심이 있기 때문입니다.