表定義:爲什麼這個查詢不使用正確的索引?
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
(從執行計劃收集)。它對主鍵索引進行了集羣掃描。但是,下面的代碼並使用IX_ExceptionDate
指數:
SELECT * INTO #yst
from AllErrors
where ExceptionDate between @yesterday and @yesterday + 1
AND ExceptionDate = ExceptionDate
這是爲什麼?
編輯:添加視覺執行計劃。
編輯:下面的文本執行計劃。
查詢1:
| --Table插入(OBJECT:([#YST]),SET:([#YST] [ID] = [Expr1006],[#YST] [ DomainLogin] = [MarketStats]。[dbo]。[AllErrors]。[DomainLogin],[#yst]。[ExceptionDate] = [MarketStats]。[dbo]。[AllErrors]。[ExceptionDate],[#yst]。[例外情況] = [MarketStats]。[dbo]。[AllErrors]。[ExceptionDescr],[#yst]。[MarketName] = [MarketStats]。[dbo]。[AllErrors]。[MarketName],[#yst]版本] = [MarketStats]。[dbo]。[AllErrors]。[Version])) | --Top(ROWCOUNT est 0) | --Compute Scalar(DEFINE:([Expr1006] = setidentity([MarketStats]。 ([市場統計])。 [所有錯誤]。[PK_AllErrors]),地點:([MarketStats]。[dbo]。[AllErrors]。[ExceptionDate]> = [@昨天]和[MarketStats]。[dbo]。[AllErrors]。 [ExceptionDate] < = [@昨天] + '1900年1月2日00:00:00.000'))
問題2:
| --Table插入(OBJECT:([# yst],SET:([#yst]。[ID] = [Expr1006],[#yst]。[DomainLogin] = [MarketStats]。[dbo]。[AllErrors]。[DomainLogin],[#yst]。 [ExceptionDate] = [MarketStats]。[dbo]。[AllErrors]。[ExceptionDate],[#yst]。[ExceptionDescr] = [MarketStats]。[dbo]。[AllErrors]。[ExceptionDescr],[#yst]。 [市場名稱] = [MarketStats]。[dbo]。[AllErrors]。[MarketName],[#yst]。[Version] = [MarketStats]。[dbo]。[AllErrors]。[Version ])) | --Top(ROWCOUNT est 0) | --Compute Scalar(DEFINE:([Expr1006] = setidentity([MarketStats]。[dbo]。[AllErrors]。[ID],( - 7), (外部參考:([MarketStats]。[dbo]。[AllErrors]。[ID],[Expr1008])使用無預置)([市場策略]。[市場策略]。[市場策略]。[所有錯誤]。[IX_ExceptionDate]),SEEK :(市場策略]。[dbo]。[AllErrors]。[ExceptionDate]> = [@昨天]和[MarketStats]。[dbo]。[AllErrors]。[ExceptionDate] < = [@yesterday] +'1900-01-02 00:00:00.000'),地點:([MarketStats]。[dbo]。 [AllErrors]。[ExceptionDate] = [MarketStats]。[dbo]。[AllErrors]。[ExceptionDate])ORDERED FORWARD) | - 羣集索引尋找(OBJECT :(市場策略]。[dbo]。[AllErrors]。 [PK_AllErrors]),SEEK:([MarketStats]。[dbo]。[AllErrors]。[ID] = [MarketStats]。[dbo]。[AllErrors]。[查看]查看訂單前進)
你可以發佈執行計劃嗎? – Lamak 2011-05-12 17:30:53
你可以發佈這個計劃,我對'| - 集羣索引掃描(OBJECT:([aspnetdb]。[dbo]。[AllErrors]。[PK_AllErrors]),WHERE:([aspnetdb]。[ dbo]。[AllErrors]。[ExceptionDate]> = [@昨天] AND [aspnetdb]。[dbo]。[AllErrors]。[ExceptionDate] <= [@ yesterday] +'1900-01-02 00:00:00.000 '))' – SQLMenace 2011-05-12 17:31:59
'| - 集羣索引掃描(OBJECT:([aspnetdb]。[dbo]。[AllErrors]。[PK_AllErrors]),WHERE:([aspnetdb]。[dbo]。[AllErrors]。[ExceptionDate ]> = [@昨天] AND [aspnetdb]。[dbo]。[AllErrors]。[ExceptionDate] <= [@ yesterday] +'1900-01-02 00:00:00.000'AND [aspnetdb]。[dbo] 。[AllErrors]。[ExceptionDate] = [aspnetdb]。[dbo]。[AllErrors]。[ExceptionDate]))' – SQLMenace 2011-05-12 17:32:17