표 정의 :이 쿼리가 적절한 인덱스를 사용하지 않는 이유는 무엇입니까?
CREATE TABLE [dbo].[AllErrors](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DomainLogin] [nvarchar](50) NULL,
[ExceptionDate] [datetime] NULL,
[ExceptionDescr] [nvarchar](max) NULL,
[MarketName] [nvarchar](50) NULL,
[Version] [nvarchar](50) NULL,
CONSTRAINT [PK_AllErrors] PRIMARY KEY CLUSTERED ([ID] ASC)
)
-- Add an index on the date
CREATE NONCLUSTERED INDEX [IX_ExceptionDate] ON [dbo].[AllErrors] ([ExceptionDate] ASC)
내가이 쿼리 실행
declare @yesterday datetime
select @yesterday = getdate() - 1
SELECT * INTO #yst
from AllErrors
where ExceptionDate between @yesterday and @yesterday + 1
가이 코드는 사용하지 않는 내 IX_ExceptionDate
(실행 계획에서 수집 참조). 기본 키 색인에서 클러스터 된 검사를 수행합니다.
SELECT * INTO #yst
from AllErrors
where ExceptionDate between @yesterday and @yesterday + 1
AND ExceptionDate = ExceptionDate
이 왜 그러나, 아래의 코드는 IX_ExceptionDate
인덱스를 사용합니까?
EDIT : Visual Execution Plan이 추가되었습니다.
EDIT : 아래 텍스트 실행 계획.
쿼리 1 :
| --table 삽입 (OBJECT :.. ([#의 YST), SET ([#의 YST [ID] = [Expr1006] [#의 YST] DomainLogin = [MarketStats]. [dbo]. [AllErrors]. [DomainLogin], [# yst]. [ExceptionDate] = [MarketStats]. [dbo]. [AllErrors]. [ExceptionDate], [# yst]. [ ExceptionDescr] [MarketStats]. [AllErrors]. [ExceptionDescr], [# yst]. [MarketName] = [MarketStats]. [dbo]. [AllErrors]. [MarketName], [# yst]. [ [버전] = [MarketStats]. [dbo]. [AllErrors]. [버전])) -- Top (ROWCOUNT est 0) | - Compute 스칼라 (DEFINE : ([Expr1006] = setidentity ([MarketStats]). (클러스터 된 인덱스 스캔 (OBJECT : ([MarketStats]). [AllErrors]. [AllErrors]. [PK_AllErrors]) : ([MarketStats]. [dbo]. [AllErrors]. [ExceptionDate]> = [@ 어제] 그리고 [MarketStats]. [dbo]. [AllErrors]. ([# : | :))
쿼리 2 --table 삽입 (OBJECT
[ExceptionDate] <는 = [@ 어제] + ': 00 : 00.000 1900년 1월 2일 00' yst]. [# yst]. [ID] = [Expr1006], [# yst]. [DomainLogin] = [MarketStats]. [dbo]. [AllErrors]. [DomainLogin], [# yst]. [ExceptionDate] = [MarketStats]. [dbo]. [AllErrors]. [ExceptionDate], [# yst]. [ExceptionDescr] = [MarketStats]. [dbo]. [AllErrors]. [ExceptionDescr], [# yst]. [MarketName] = [MarketStats]. [dbo]. [AllErrors]. [MarketName], [# yst]. [Version] = [MarketStats]. [dbo]. [AllErrors]. [Version ]]) | - Top (ROWCOUNT est 0) | - Compute Scalar (DEFINE : ([Expr1006] = setidentity ([MarketStats]. [dbo]. [AllErrors]. [- (Inner Join, Outer References : ([MarketStats]. [dbo]. [AllErrors]. [ID], [Expr1008]) 선입 선출 된 루프와 함께 최적화 됨 ([MarketStats]. [dbo]. [AllErrors]. [IX_ExceptionDate]) SEEK : ([MarketStats]. [dbo]. [AllErrors]. [ExceptionDate]> = [@ 어제] [MarketStats]. [dbo]. [AllErrors]. [ExceptionDate] < = [@ 어제] + '1900-01-02 00 : 00 : 00.000'), 어디서 : ([MarketStats]. [dbo]. [AllErrors]. [ExceptionDate] = [MarketStats]. [dbo]. [AllErrors]. [ExceptionDate]) ORDERED FORWARD) | - 클러스터 된 인덱스 찾기 (OBJECT : ([MarketStats]. [dbo]. [AllErrors]). [PK_AllErrors]) SEEK : ([MarketStats]. [dbo]. [AllErrors]. [ID] = [MarketStats]. [AllErrors].[ID]) LOOKUP ORDERED FORWARD)
실행 계획을 게시 할 수 있습니까? – Lamak
당신은 계획을 게시 할 수 있습니까? 나는 클러스터 된 인덱스 스캔 (OBJECT : ([aspnetdb]. [dbo]. [AllErrors]. [PK_AllErrors]), WHERE : ([aspnetdb]. [ dbo]. [AllErrors]. [ExceptionDate] = [@ yesterday] AND [aspnetdb]. [dbo]. [AllErrors]. [ExceptionDate] <= [@ 어제] + '1900-01-02 00 : 00 : 00.000 '[)])' – SQLMenace
'| - 클러스터 된 인덱스 스캔 (OBJECT : ([aspnetdb]. [dbo]. [AllErrors]. [PK_AllErrors]), ([aspnetdb]. [dbo]. [AllErrors]. [ExceptionDate ] [= 어제] AND [aspnetdb]. [dbo]. [AllErrors]. [ExceptionDate] <= [@ 어제] + '1900-01-02 00 : 00 : 00.000'AND [aspnetdb]. [dbo] . [AllErrors]. [ExceptionDate] = [aspnetdb]. [dbo]. [AllErrors]. [ExceptionDate])) ' – SQLMenace