多索引与多列索引
我刚刚在SQL Server 2005中添加一个索引到一个表,它让我思考。 创build1个索引和定义多个列,每个列中有1个索引需要索引的区别是什么?
有一些原因是为什么应该使用另一个?
例如
Create NonClustered Index IX_IndexName On TableName (Column1 Asc, Column2 Asc, Column3 Asc)
与
Create NonClustered Index IX_IndexName1 On TableName (Column1 Asc) Create NonClustered Index IX_IndexName2 On TableName (Column2 Asc) Create NonClustered Index IX_IndexName3 On TableName (Column3 Asc)
我同意凯德Roux 。
这篇文章应该让你走在正确的轨道上:
- SQL Server 2005/2008中的索引 – 最佳实践,第1部分
- SQL Server 2005/2008中的索引 – 第2部分 – 内部
有一件事要注意,聚簇索引应该有一个唯一的键(我推荐的标识列)作为第一列。 基本上它可以帮助你的数据插入索引的末尾,而不会导致大量的磁盘IO和页面分割。
其次,如果你正在为你的数据创build其他索引,并且它们被巧妙地构build,它们将被重用。
假设你在三列上search一张桌子
州,县,邮编。
- 你有时只能按州进行search。
- 你有时候会按州和县进行search。
- 你经常search州,县,邮编。
然后是一个与州,县,邮编索引。 将被用于所有这三个search。
如果你通过zipsearch了很多,那么上面的索引不会被使用(无论由SQL Server),因为zip是该索引的第三部分,查询优化器将不会看到该索引有帮助。
然后你可以在这个实例中使用Zip来创build一个索引。
我想你要找的答案是它取决于你经常使用的查询的where子句,也取决于你的group by。
这篇文章会帮助很多。 🙂
是。 我build议你查阅Kimberly Tripp关于索引的文章 。
如果一个索引是“覆盖”的,那么就不需要使用索引以外的任何东西。 在SQL Server 2005中,还可以向索引添加不属于该键的其他列,这可以消除行的其余行。
具有多个索引,每个列上的每个索引可能意味着只有一个索引被使用 – 您将不得不参考执行计划来查看不同索引scheme提供的效果。
您还可以使用调整向导来帮助确定哪些索引可以使给定的查询或工作负载执行最佳。
多列索引可用于引用所有列的查询:
SELECT * FROM TableName WHERE Column1=1 AND Column2=2 AND Column3=3
这可以直接使用多列索引来查找。 另一方面,至多可以使用单列索引中的一个(它将不得不查找所有具有Column1 = 1的logging,然后检查每个列中的Column2和Column3)。
似乎已经错过的一个项目是明星转型。 索引相交运算符通过在事实表上完成任何I / O之前计算每个谓词所击中的行集来parsing谓词。 在星型模式中,您可以对每个维度键进行索引,查询优化器可以通过索引相交计算来parsing要select的行。 单列上的索引为此提供了最佳的灵活性。
如果您的查询经常使用相对静态的列,那么创build一个包含它们的覆盖索引将大大提高性能。
通过在索引中放置多个列,如果列不在索引中,优化器将只需直接访问表。 我在数据仓库中使用了很多。 缺点是这样做会花费很多开销,特别是在数据非常不稳定的情况下。
在单列上创build索引对于OLTP系统中常见的查找操作非常有用。
你应该问自己为什么要索引列以及如何使用它们。 运行一些查询计划,看看他们什么时候被访问。 索引调整和科学一样本能。