我在企业管理器中对可搜索和不可搜索的查询进行了测试,并对执行计划感到惊讶。他们都使用聚集索引扫描。我期待sargable查询使用Seek。
我用过这张表:
CREATE TABLE [dbo].[TestSargable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Created] [datetime] NOT NULL)
GO
ALTER TABLE [dbo].[TestSargable] ADD CONSTRAINT [PK_TestSargable] PRIMARY KEY CLUSTERED ([ID] ASC)
GO
Sargable Query:
SELECT [ID]
,[Created]
FROM [dbo].[TestSargable]
WHERE [Created] > '2014-02-28 23:59:59'
AND [Created] < '2014-04-01 00:00:00'
非可疑查询:
SELECT [ID]
,[Created]
FROM [dbo].[TestSargable]
WHERE datediff(MM, [Created], '2014-03-01') = 0
当我查看实际的执行计划时,他们都使用了聚集索引扫描。
我在这里遗漏了什么,或者第一个查询也是非sargable吗?
这是使用SQLExpress 11.0.2100在我的开发箱上运行。
答案 0 :(得分:0)
您没有任何合适的索引可以进入。
CREATE INDEX IX ON [dbo].[TestSargable]([Created])
然后你会在sargable版本上看到索引范围搜索并扫描另一个版本。
聚集索引键作为行定位符添加到非聚簇索引,因此索引能够覆盖SELECT
中的两列而无需查找。