我正在尝试找出在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列,但在哪些列上会有很大的不同。
发布于 2012-10-11 00:58:43
索引越少越好。每个索引可能会加快一些查询的速度,但它也会产生开销并需要维护。如果你不在桌子上写太多东西,那就不会那么糟糕了。
如果您可以将多个列合并到一个索引中,那就太完美了!
在一个给定的城市里的每个人,在“波士顿”中的每个“史密斯”,在“”
但是它不能用于在整个表中查找名为"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)上建立索引可能是个好主意-- where子句中同时使用了zip和modelID,并且在索引中包含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-11 00:56:23
这取决于您的访问模式
对于只读表,我很可能会创建多个非聚集索引,每个索引都有多个键列以匹配WHERE子句,并为非键列创建INCLUDEd列
我既不会为所有人设置一个非集群查询,也不会为每个列设置一个非集群查询:它们将不是useful.actual查询
https://stackoverflow.com/questions/12824490
复制相似问题