2010-04-07 103 views

回答

2

覆盖索引是一个复合索引,它包含您正在用select语句检索并且参与where子句的每一列。这是提高查询性能的最佳方法之一。

0

覆盖索引是覆盖(因此名称)所有履行查询或连接条件所必需的列的复合索引。

这里没有什么特别的关于SQL服务器,这些都是通用名称。

+0

索引不被ANSI标准覆盖 - 供应商没有以不同方式命名功能是很幸运的。 – 2010-04-07 20:31:05

+0

@OMG小马:我怀疑这些名字是由计算机科学家创造的,而不是由数据库供应商提供的。 – Tomalak 2010-04-07 20:36:56

0

当索引包含您的搜索条件以及您的查询尝试检索的所有数据时,复合索引也是覆盖索引。在这个例子中:

SELECT a,b,c FROM Foo WHERE a = 'FooFoo' 

覆盖索引将包含列(搜索谓语)以及列b和c。

在这种情况下,SQL Server经过优化以返回在索引中找到的那些值,并且不需要在实际表中进行额外查找。如果b和c频繁返回但很少搜索到,则索引可能会设置为使b和c包含在索引中但未编入索引。

在SQL Server 2005 DBA之前,会在其索引中添加额外的'覆盖'列以实现此优化。在SQL Server 2005中添加了一个附加功能,允许您在索引的树叶节点中包含不属于索引树的列。创建索引时,您可以在include子句中指定其他“覆盖”列。这些列不会编入索引,而是添加到保存SQL Server的索引的叶节点,以查找主表中的其他数据。将数据添加到include子句可以节省SQL Server在获取覆盖索引带来的优化的同时将额外数据添加到搜索树的开销。