2014-10-02 73 views
1

我有一个查询,看起来像这样:索引扫描与探针代替索引查找

--Updated To remove Distinct per Aaron Bertrand's suggestion in the comments 
SELECT TOP 100 ord.OrderId 
FROM Customer cust 
     JOIN CustomerOrder ord 
      ON ord.CustomerId = cust.CustomerId 
WHERE cust.FirstName LIKE (@firstName + '%')     
ORDER BY ord.CreatedWhen DESC 

而且我有一个这样的指标:

CREATE NONCLUSTERED INDEX [IX_MyIndex] ON CustomerOrder 
(
    OrderId DESC, 
    CustomerId DESC, 
    CreatedWhen Desc 
) 
GO 

当我运行我的查询中,索引被使用,但它是一个索引扫描。和它给这样的信息:([Bitmap1011],[MyDatabase的] [顺序] [CustomerOrder] [单编号]如[ORD] [单编号],N '[IN ROW]'。)

PROBE

输出列表由OrderId和CreatedWhen组成。

这是什么探测器在做什么,为什么我没有得到一个索引寻求?

UPDATE:

在客户表中的名字列确实具有在一个INDEXSEEK正在使用的索引。

CREATE NONCLUSTERED INDEX [IX_Customer_FirstName] ON Customer 
(
    [FirstName] ASC 
) 
GO 
+0

为什么你需要独特?你真的可以有两个具有相同的ID和创建日期不同的订单吗?你也可以使数控指数独一无二......虽然没有一个聚集索引可以促进这一点吗? – 2014-10-02 15:46:29

+0

另外,为什么你期望在这个索引上寻找一个方法,何时你的where子句在一个甚至没有被这个索引覆盖的列上过滤(不必介意主要的列)? – 2014-10-02 15:50:36

+0

@AaronBertrand - 我正在使用的FirstName上有另一个索引。 – Vaccano 2014-10-02 15:54:30

回答

0

简单的原因:您的FirstName列不在索引中。它必须扫描每一行以查看该行是否与您想要的模式匹配。

+0

FirstName在不同的表上(并且它在该表上有一个索引)。 – Vaccano 2014-10-02 15:57:21

+0

那么第二个索引的定义是什么? – 2014-10-02 15:58:07

+0

我不认为这是相关的,所以我把它排除在外。但我只是将其添加到问题中。 – Vaccano 2014-10-02 16:00:18