4

我试图找出在 SQL Server 中处理表上的索引的最佳方法。

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

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

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

对此的任何帮助都会很棒。

更新:

已经有一些很好的答案,但我想详细说明我的需求。

有一个带有自动记录的主表。我需要能够对超过 100 毫米的记录进行非常快速的计数。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)

因此,where 子句中可能有大约 5-6 列,但在哪些列上会有很大差异。

4

2 回答 2

6

您拥有的索引越少 - 越好。每个索引可能会加快一些查询 - 但它也会产生开销并且需要维护。如果您不写太多东西到桌子上,那还不错。

如果您可以将多个列组合成一个索引 - 完美!但是,如果您在多列上有一个复合索引,则只有在您使用/需要最左边的 n 列时才能使用该索引。

(City, LastName, FirstName)因此,如果您在电话簿中有类似的索引- 如果您正在寻找:

  • 特定城市的每个人
  • “波士顿”中的每个“史密斯”
  • “纽约”中的每个“保罗·史密斯”

但它不能用于在整个表格中查找名字为“Paul”的所有条目或姓氏为“Brown”的所有人;当您还指定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)以便非聚集索引覆盖(例如,查询所需的所有信息都在非聚集索引本身中 - 无需返回“基本”表)。

于 2012-10-10T16:58:42.667 回答
4

这取决于您的访问模式

对于只读表,我很可能会创建多个非聚集索引,每个索引都有多个键列来匹配 WHERE 子句,并且包含非键列的列

我不会有一个非集群的所有人,也没有一个每列:它们不会有用。实际查询

于 2012-10-10T16:56:22.733 回答