表定义:为什么这个查询不使用正确的索引?
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