2012-10-10 138 views
3

我想弄清楚处理SQL Server中的表上的索引的最佳方法。SQL Server非聚簇索引

我有一张表,只需要从中读取。没有真正写入表格(初始设置后)。

我有大约5-6列需要被索引的表。为整个表设置一个非聚簇索引并将需要索引的所有列添加到该索引或我应该设置多个非聚簇索引(每个列都有一列)是否更有意义?

我想知道哪个设置会有更好的读取性能。

对此的任何帮助将是伟大的。

UPDATE:

有一些好的答案已,但我想阐述一下我需要多一点。

有一个主表与自动记录。我需要能够对超过100MM记录执行非常快速的计数。 Where语句会有所不同,但我试图索引where语句中的所有可能的列。所以我有这样的查询:

SELECT COUNT(recordID) 
FROM tableName 
WHERE zip IN (32801, 32802, 32803, 32809) 
AND makeID = '32' 
AND modelID IN (22, 332, 402, 504, 620) 

或者是这样的:

SELECT COUNT(recordID) 
FROM tableName 
WHERE stateID = '9' 
AND classCode IN (3,5,9) 
AND makeID NOT IN (55, 56, 60, 80, 99) 

因此,有大约5-6列,可能是在where子句中,但它会改变在哪些不少。

+2

您需要提供更多信息,因为答案取决于您要运行的查询类型以及数据的外观,尤其是,基数。此外,您可能受益于计算列,索引视图或全文索引。无法用您提供的最少信息来说。 – RedFilter

+1

仔细选择[聚簇索引](http://stackoverflow.com/questions/11787797)对于读取性能也非常重要。 –

回答

5

你拥有的指标少 - 越好。每个索引可能会加快一些查询速度 - 但也会导致开销并需要维护。如果你不写很多东西,那还不错。

如果你可以将多个列组合成一个索引 - 完美!但是,如果您在多个列上有复合索引,那么如果您使用/需要最左边的n列,那么可以使用该索引,仅使用

所以,如果你有一个像在电话簿上(City, LastName, FirstName)指数 - 这个作品,如果你正在寻找:

  • 大家在一个给定的城市
  • 每一个“史密斯”,在“波士顿”
  • 每一个“保罗·史密斯”,在“纽约”

不能被用于查找名字“保罗”的所有条目或与姓氏所有的人“布朗”在你的桌子上;该指数可以使用,如果您还指定City

因此,因此 - 复合索引是有益的,可取的 - 但前提是你真的可以使用它们!有您的6列只是一个指数并不能帮助你所有,如果您需要选择列单独

更新:与具体的查询,你现在可以开始设计什么指标会有所帮助:

SELECT COUNT(recordID) 
FROM tableName 
WHERE zip IN (32801, 32802, 32803, 32809) 
AND modelID = '32' 
AND model ID IN (22, 332, 402, 504, 620) 

在这里,一个索引(zip, modelID)可能会是一个好主意 - 无论zipmodelID在where子句(在一起)中使用,且该指数recordID以及(作为Include(RecordID)条款)也应该有所帮助。

SELECT COUNT(recordID) 
FROM tableName 
WHERE stateID = '9' 
AND classCode IN (3,5,9) 
AND makeID NOT IN (55, 56, 60, 80, 99) 

再次:立足WHERE条款 - 创建(stateID, classCode, makeID)指数,并可能增加Include(RecordID)使非聚集索引成为覆盖(例如,所有需要为您的查询的信息是在非聚集索引本身 - 无需返回到“基本”表)。

+0

感谢您的帮助。这是有道理的,但我不确定最好的方法来做到这一点,因为我正在处理WHERE子句中的6列。有太多的可能组合可以为我创建索引。如果我只是将所有可能的列放在一个索引中,并将recordID作为include,那会是一个问题。它可以减慢查询速度吗? – Sequenzia

+0

@Sequenzia:“只有所有列的索引”的想法将不会有益。如果你幸运的话,你可能会得到适合一种情况的组合 - 在这种情况下,它会被使用 - 但是索引只是在所有可能的列上**完全不是**好主意!不要这样做!没有比这样的索引更好的索引! –

+1

感谢您的跟进。我明白你在说什么。我做了更多的研究和一些测试。我看到那种方法不起作用。我将尝试更多地确定我的查询需求并围绕它建立索引。我感谢您的帮助。 – Sequenzia

4

这取决于你的访问模式

对于只读表,我想最有可能创建多个非聚集索引,每个都具有多个键列匹配WHERE子句,并INCLUDEd列非键列

我既不会有一个非聚集所有,也不每列一个:他们不会useful.actual查询

相关问题