我试图找出处理SQL Server中表的索引的最佳方法。
我有一张只需要阅读的表格。没有真正写入表格(初始设置后)。
我在表中有大约5-6列需要编制索引。为整个表设置一个非聚簇索引并将我需要索引的所有列添加到该索引更合理,还是应该设置多个非聚簇索引,每个列都有一列?
我想知道哪种设置会有更好的读取性能。
对此的任何帮助都会很棒。
更新:
已经有一些好的答案,但我想详细说明我的需求。
有一个包含自动记录的主表。我需要能够对超过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子句中,但它会在哪些列上有很大不同。
答案 0 :(得分:5)
您拥有的索引越少越好。每个索引可能会加速一些查询 - 但它也会产生开销并需要维护。如果你不写很多东西,那就不那么糟了。
如果你可以将多个列组合成一个索引 - 完美!但是如果你有多个列的复合索引,那么如果你使用/需要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
)上的索引可能是一个好主意 - zip
和modelID
都在where子句中使用(一起),并且{{1}在索引中(作为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
,以便非聚集索引成为覆盖(例如查询所需的所有信息都在非聚集索引中 - 无需返回“基础”表。
答案 1 :(得分:4)
这取决于您的访问模式
对于只读表,我很可能会创建多个非聚集索引,每个索引都有多个键列来匹配WHERE子句,而INCLUDEd列用于非键列
对于所有人而言,我都不会有一个非群集,也不会每列一个:它们不会有用。实际查询