跨多个列创建一个索引与创建多个索引(每列一个)之间的区别是什么?
是否有理由使用其中一个而不是另一个?
例如:
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)
我同意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子句,以及你的分组依据。
这篇文章会有很大帮助。:-)