我刚刚在SQL Server 2005中的表中添加了一个索引,它让我思考.创建1个索引和定义多个列之间的区别在于每个列要索引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)
evilhomer.. 301
我同意Cade Roux.
本文应该让您走上正轨:
SQL Server 2005/2008中的索引 - 最佳实践,第1部分
SQL Server 2005/2008中的索引 - 第2部分 - 内部
有一点需要注意,聚簇索引应该有一个唯一的键(我建议使用的标识列)作为第一列.基本上它可以帮助您在索引末尾插入数据,而不会导致大量磁盘IO和页面拆分.
其次,如果您正在为数据创建其他索引并且它们被巧妙地构造,则它们将被重用.
例如,想象你在三列上搜索一个表
州,县,邮编.
你有时只按国家搜索.
你有时会按州和县搜索.
你经常按州,县,邮编搜索.
然后是一个带有州,县,拉链的索引.将用于所有这三个搜索.
如果您通过zip单独搜索,那么上面的索引将不会被使用(无论如何由SQL Server),因为zip是该索引的第三部分,并且查询优化器将不会看到该索引有用.
然后,您可以在Zip上创建一个索引,该索引将在此实例中使用.
我想您正在寻找的答案取决于您经常使用的查询的where子句以及您的组.
这篇文章会有很多帮助.:-)
我同意Cade Roux.
本文应该让您走上正轨:
SQL Server 2005/2008中的索引 - 最佳实践,第1部分
SQL Server 2005/2008中的索引 - 第2部分 - 内部
有一点需要注意,聚簇索引应该有一个唯一的键(我建议使用的标识列)作为第一列.基本上它可以帮助您在索引末尾插入数据,而不会导致大量磁盘IO和页面拆分.
其次,如果您正在为数据创建其他索引并且它们被巧妙地构造,则它们将被重用.
例如,想象你在三列上搜索一个表
州,县,邮编.
你有时只按国家搜索.
你有时会按州和县搜索.
你经常按州,县,邮编搜索.
然后是一个带有州,县,拉链的索引.将用于所有这三个搜索.
如果您通过zip单独搜索,那么上面的索引将不会被使用(无论如何由SQL Server),因为zip是该索引的第三部分,并且查询优化器将不会看到该索引有用.
然后,您可以在Zip上创建一个索引,该索引将在此实例中使用.
我想您正在寻找的答案取决于您经常使用的查询的where子句以及您的组.
这篇文章会有很多帮助.:-)
是.我建议你查看Kimberly Tripp关于索引的文章.
如果索引是"覆盖",那么除了索引之外不需要使用任何东西.在SQL Server 2005中,您还可以向索引添加其他列,这些列不是键的一部分,可以消除到行的其余部分的行程.
拥有多个索引,每个索引在一个列上可能意味着只使用一个索引 - 您必须参考执行计划以查看不同索引方案提供的效果.
您还可以使用调整向导来帮助确定哪些索引可以使给定查询或工作负载的性能最佳.
多列索引可用于引用所有列的查询:
SELECT * FROM TableName WHERE Column1=1 AND Column2=2 AND Column3=3
可以使用多列索引直接查找.另一方面,最多可以使用一个单列索引(它必须查找具有Column1 = 1的所有记录,然后检查每个列中的Column2和Column3).
似乎已经错过的一个项目是星变换. 索引交集运算符通过在事实表上完成任何I/O之前计算每个谓词命中的行集来解析谓词.在星型模式中,您将索引每个单独的维度键,查询优化器可以解析索引交集计算要选择的行.各列的索引为此提供了最大的灵活性.
如果您的查询经常使用相对静态的列集,那么创建包含它们的单个覆盖索引将大大提高性能.
通过在索引中放置多个列,如果列不在索引中,优化器将只需要直接访问该表.我在数据仓库中经常使用这些.缺点是这样做会花费很多开销,特别是如果数据非常不稳定.
在单个列上创建索引对于OLTP系统中常见的查找操作很有用.
您应该问问自己为什么要为列编制索引以及如何使用它们.运行一些查询计划,看看它们何时被访问.指数调整与科学一样本能.