一个高效的查询语句,通常都会以定位(SEEK)的方式检索某个或若干个覆盖索引,查找数据。所谓覆盖索引,顾名思义,就是说,这个索引包含了当前查询语句使用的所有字段的信息。索引也包含了不同的分类,不同类型的索引会涉及一些特殊的结构和隐含的功能,后面的章节中会介绍这些特殊的结构,这将有助于我们更好地定义最佳的覆盖索引。
在编写一个SQL语句时,要遵循如下这样一个流程:
首先得明白需要“做什么”,也就是要明确应从什么表中取出什么样的数据。
接下来要清楚“怎么做”,即应该用哪些字段来过滤,哪些字段要有索引,索引又该如何分布,怎样取才能更合理地应用索引等。
最后还需要确定查询出来的数据是否正确,符合需求与否。
也就是说,使用索引前,应该先了解具体的需求,并且要清楚查找的表的索引字段之具体信息,包括索引的类型(即是唯一索引、聚集索引还是非聚集索引)、筛选率及数据分布情况等,从而确定应该如何编写查询语句。
以代码清单3-1的语句为例,若创建的索引发生了变化,索引创建脚本将成为如下形式:
CREATE INDEX IX_SalesOrderDetail_ProductId
ON Sales.SalesOrderDetail(ProductID)
运行代码,会发现Clustered Index Scan的操作变成了Index Seek(见图3-5),并且数据查找操作的成本开销,由原来的87%变成了13%,同时整体的I/O开销和执行时间也获得了很大的提升。这就是索引的效果,在后面的章节中,将详细地介绍索引的工作原理及如何创建合理的索引。