SQL Server Sargable查询

时间:2014-03-01 11:56:31

标签: sql sql-server

我在企业管理器中对可搜索和不可搜索的查询进行了测试,并对执行计划感到惊讶。他们都使用聚集索引扫描。我期待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在我的开发箱上运行。

1 个答案:

答案 0 :(得分:0)

您没有任何合适的索引可以进入。

CREATE INDEX IX ON [dbo].[TestSargable]([Created])

然后你会在sargable版本上看到索引范围搜索并扫描另一个版本。

enter image description here

聚集索引键作为行定位符添加到非聚簇索引,因此索引能够覆盖SELECT中的两列而无需查找。