为什么我不能简单地添加包含所有列的索引?

Nie*_*nch 35 sql sql-server indexing non-clustered-index

我在SQL Server数据库中有一个表,我希望能够尽快搜索和检索数据.我不关心插入表中需要多长时间,我只关心我获取数据的速度.

问题是使用20种或更多不同类型的查询访问该表.这使得添加专为每个查询设计的索引变得繁琐.我正在考虑只是添加一个包含表的所有列的索引.这不是你通常在"好"数据库设计中所做的事情,所以我假设有一些很好的理由我不应该这样做.

谁能告诉我为什么我不应该这样做?

更新:我忘了提,我也不关心我的数据库的大小.没关系,这意味着我的数据库大小会比它需要的大

mar*_*c_s 74

首先,SQL Server中的索引在其索引条目中最多只能有900个字节.仅这一点就不可能有一个包含所有列的索引.

最重要的是:这样的指数毫无意义.你想要实现什么?

考虑一下:如果你有一个索引(LastName, FirstName, Street, City),那么该索引将无法用于加速查询

  • FirstName 单独
  • City
  • Street

该索引对搜索有用

  • (LastName), 要么
  • (LastName, FirstName), 要么
  • (LastName, FirstName, Street), 要么
  • (LastName, FirstName, Street, City)

但实际上没有别的 - 如果你只搜索Street或只是搜索,肯定不会City!

索引中列的顺序有很大不同,查询优化器不能只使用索引中间某处的任何列进行查找.

考虑一下你的电话簿:它的订单可能是LastName,FirstName,也许是Street.那么索引是否可以帮助您找到您所在城市的所有"Joe's"?所有人都住在"主街"?不 - 你可以先通过LastName查找 - 然后在这组数据中获得更具体的信息.只要有高于一切的指标并不利于加快搜索所有列在所有.

如果您希望能够搜索Street- 您需要添加一个单独的索引(Street)(可能还有另外一列或两个有意义).

如果您希望能够搜索Occupation或其他任何内容 - 您需要另一个特定的索引.

仅仅因为您的列存在于索引中并不意味着"将加速该列的所有搜索!

主要规则是:使用尽可能少的索引 - 对于系统来说,太多的索引甚至可能比没有索引更糟糕......建立你的系统,监控它的性能,找到那些成本最高的查询 - 然后优化这些,例如通过添加索引.

不要只是因为你可以盲目索引每一列 - 这是糟糕的系统性能的保证 - 任何索引也需要维护和维护,所以你拥有的索引越多,你的INSERT,UPDATE和DELETE操作就越多(获取)因为所有这些指数都需要更新.

  • 很好的答案,谢谢。您提到了索引的顺序:所提到的索引是否适用于“WHERE LastName = 'a' ORDER BY FirstName”和“WHERE FirstName = 'a' ORDER BY LastName”? (3认同)

Mar*_*and 8

您对索引的工作方式存在根本性的误解.

阅读此解释" 多列索引如何工作 ".

您可能遇到的下一个问题是为什么不为每列创建一个索引 - 但如果您尝试达到最佳选择性能,那么这也是一个死胡同.

您可能会觉得这是一项繁琐的工作,但我认为这是一项必须仔细索引的任务.如本例所示,马虎索引反击.

注意:我坚信正确的索引会得到回报,我知道很多人都有同样的问题.这就是为什么我正在写一本关于它的免费书.上面的链接指的是可能帮助您回答问题的页面.但是,您可能还想从头开始阅读它.