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

标签 sql sql-server indexing non-clustered-index

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

问题是使用 20 个或更多不同类型的查询来访问该表。这使得为​​每个查询添加专门设计的索引成为一项繁琐的任务。我正在考虑简单地添加一个包含表中所有列的索引。这不是您在“良好”数据库设计中通常会做的事情,因此我假设有一些充分的理由为什么我不应该这样做。

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

更新:我忘了提及,我也不关心数据库的大小。没关系,这意味着我的数据库大小将变得比所需的更大

最佳答案

首先,SQL Server 中的索引的索引项最多只能有 900 个字节。仅此一点就不可能拥有包含所有列的索引。

最重要的是:这样的索引根本没有任何意义。你想实现什么目标?

考虑一下:如果您在(姓氏、名字、街道、城市) 上有一个索引,则该索引将无法用于加速以下查询:

  • 名字单独
  • 城市
  • 街道

该索引对于搜索很有用

  • (姓氏)
  • (姓氏、名字)
  • (姓氏、名字、街道)
  • (姓氏、名字、街道、城市)

但实际上没有别的 - 如果您仅搜索街道或仅城市,当然不会!

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

考虑一下你的电话簿:它可能是按姓氏、名字,也许是街道排序的。那么该索引是否可以帮助您找到您所在城市的所有“Joe's”?所有居住在“大街”上的人?不 - 您可以先按姓氏查找 - 然后您可以在该数据集中获得更具体的信息。仅对所有内容都建立索引并不能帮助加快所有列的搜索速度根本

如果您希望能够按Street进行搜索 - 您需要在(Street)上添加一个单独的索引(可能还需要添加一两列有意义的列) .

如果您希望能够按职业或其他任何内容进行搜索 - 您需要另一个特定索引。

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

主要规则是:使用尽可能少的索引 - 对于系统来说,太多索引可能比根本没有索引更糟糕......构建您的系统,监控其性能,并找到那些花费大多数 - 然后优化这些,例如通过添加索引。

不要仅仅因为可以就盲目地为每一列建立索引 - 这是糟糕的系统性能的保证 - 任何索引也需要维护和保养,因此你拥有的索引越多,你的 INSERT、UPDATE 和 DELETE 操作就越多由于所有这些索引都需要更新,因此会受到影响(变慢)。

关于sql - 为什么我不能简单地添加包含所有列的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447987/

相关文章:

sql - plpgsql;将所有表名存储到一个数组中

r - R中的排序关联规则

mysql - 将 MySQL 日期戳(毫秒)转换为 SQL Server 毫秒

使用 "with check option"的SQL View

sql - 将 CSV 从 Blob 存储批量加载到 SQL 数据库

c++ - 将二维上三角和下三角中的元素映射到线性结构

mysql - 连接表上的索引是否用于多对多关系?

sql - Adobe Air数据库

java - 我可以将 'ON DELETE CASCADE' 添加到 Hibernate 管理的表中吗?

mysql - 对于 MySQL 中的 JOIN,列中的值是否必须是唯一的?