SQL Server非聚簇索引

Seq*_*zia 4 sql-server indexing

我试图找出处理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)
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

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

因此,大约有5-6列可以在where子句中,但它会在哪些列上有很大不同.

mar*_*c_s 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)
Run Code Online (Sandbox Code Playgroud)

在这里,一个索引(zip, modelID)可能是一个好主意-既zipmodelIDwhere子句(一起)在被使用,并且具有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)
Run Code Online (Sandbox Code Playgroud)

再次:基于WHERE子句 - 在(stateID, classCode, makeID)上创建索引并可能添加Include(RecordID)以使非聚簇索引成为覆盖(例如,查询所需的所有信息都在非聚簇索引本身中 - 无需返回"基本"表).