这是一个关于索引优化理论的漫长而复杂的问题。这不是家庭作业,尽管我是在 Microsoft 70-432 的示例考试中第一次接触到这个问题。最初的问题是关于一般查询优化,但后来我发现了我无法解释的这种特殊行为。
一、表格:
CREATE TABLE Invoice_details (
Invoice_id int NOT NULL,
Customer_id int NOT NULL,
Invoice_date datetime DEFAULT GETDATE() NULL,
Amount_total int NULL,
Serial_num int IDENTITY (1,1) NOT NULL)
现在,一个聚集索引,以及两个用于测试的索引:
CREATE UNIQUE CLUSTERED INDEX [ix_serial] ON [dbo].[Invoice_details] ([Serial_num] ASC)
/* Below is the "original" index */
CREATE NONCLUSTERED INDEX [ix_invoice_customer] ON [dbo].[Invoice_details]
([Invoice_id] ASC,[Customer_id] ASC)
/* Below is the "optimized" index (adds one included field) */
CREATE NONCLUSTERED INDEX [ix_invoice_customer_inc] ON [dbo].[Invoice_details]
([Invoice_id] ASC,[Customer_id] ASC) INCLUDE ([Invoice_date])
我还向表中添加了一些随机测试数据 - 100000 行。Invoice_id、Customer_id 和 Amount_total 分别收到它们自己的随机值(范围 1000-9999),Invoice_date 收到 GETDATE() 加上随机秒数(范围 1000-9999)。我可以提供我使用的实际例程,但不认为具体是相关的。
最后,查询:
SELECT Invoice_id,Customer_id,Invoice_date FROM Invoice_details WHERE Customer_id=1234;
显然,查询的第一步将是非聚集索引扫描。无论使用哪个索引,第一步都将返回相同数量的索引行。使用“原始”索引,下一步将是通过聚集索引进行查找以检索 Invoice_date,然后是两个集合之间的内部 JOIN。使用“优化”索引,该字段包含在索引叶中,因此规划器直接返回结果。
哪个索引可以加快执行速度,为什么?