索引所有列

时间:2012-10-16 13:20:25

标签: sql sql-server indexing

知道索引列会带来更好的性能,是否值得为数据库的所有表中的所有列编制索引?这种方法有哪些优点/缺点?

如果值得,有没有办法在SQL Server中自动创建索引?我的应用程序动态添加表和列(取决于用户配置),我想让它们自动编入索引。

6 个答案:

答案 0 :(得分:16)

由于上述原因,很难想象真实场景中每列的索引都很有用。场景类型需要一堆不同的查询,所有查询都只访问表的一列。每个查询都可以访问不同的列。

其他答案未解决查询的选择方面的问题。显然,维护索引是一个问题,但是如果你创建表一次然后多次读取,则不需要考虑更新/插入/删除的开销。

索引包含原始数据以及数据所在的记录/页面的点。索引的结构可以快速执行以下操作:查找单个值,按顺序检索值,计算不同值的数量,以及查找最小值和最大值。

索引不仅占用磁盘空间。更重要的是,它占据了记忆。而且,内存争用通常是决定查询性能的因素。通常,在每列上构建索引将占用比原始数据更多的空间。 (一个例外是相对较宽且值相对较少的列。)

此外,为了满足许多查询,您可能需要一个或多个索引 plus 原始数据。您的页面缓存变得充满了数据,这可能会增加缓存未命中数,从而导致更多的开销。

我想知道您的问题是否真的表明您没有充分建模您的数据结构。在某些情况下,您希望用户构建临时永久表。更典型的是,他们的数据将以预定义的格式存储,您可以根据访问要求进行优化。

答案 1 :(得分:9)

不,因为您必须考虑到每次添加或更新记录时,都必须重新计算索引,并且在所有列上使用索引会花费大量时间并导致性能下降。

因此数据库就像只有选择查询的数据仓库是个好主意,但在普通数据库上这是一个坏主意。

此外,这不是因为您在where子句中使用了一个列,您必须在其上添加索引。 尝试找到一个列,其中记录几乎都是唯一的,如主键,并且您不经常编辑。 一个坏主意是索引一个人的性别,因为只有两个可能的值,索引的结果只会拆分数据,然后它会搜索几乎所有记录。

答案 2 :(得分:2)

不,维护索引会有开销,因此索引所有列会降低所有插入,更新和删除操作的速度。您应该索引在WHERE子句中经常引用的列,并且您将看到一个好处。

答案 3 :(得分:2)

索引占用空间。并且它们需要时间来创建,重建,维护等等。因此,对于任何旧列的索引都没有保证的性能回报。您应该为提供您将要使用的操作的性能的列编制索引。索引有助于读取,因此如果您主要阅读,则会对要搜索,排序或关联到其他表的索引列进行索引。否则,它比你可能看到的更有价值。

答案 4 :(得分:2)

不,您不应该为所有列编制索引,原因有以下几种:

  • 在插入,更新或删除语句期间维护每个索引会产生一定的成本,这会导致每个事务花费更长的时间。
  • 由于每个索引占用磁盘空间,因此会增加所需的存储空间。
  • 如果列值未分散,则不会使用/忽略索引(例如:性别标志)。
  • 复合索引(具有多个列的索引)可以极大地提高经常运行的WHERE,GROUP BY,ORDER BY或JOIN子句的性能,并且无法组合多个单个索引。

最好不要使用Explain计划和数据访问,并在必要时添加索引(仅在必要时添加索引,恕我直言),而不是预先创建它们。

答案 5 :(得分:0)

  • 每个索引在执行过程中都需要额外的CPU时间和磁盘I / O开销 插入和删除。
  • 非主键上的独立代码可能必须挂在更新上,尽管主键上的索引可能没有挂起(这是因为更新通常不会修改主键属性)。
  • 每个额外的索引都需要额外的存储空间。
  • 对于涉及多个searh键的条件的查询,例如enyny 即使只有一些键具有独立的键,可能也不错。 因此,通过在以下情况下添加独立代码,数据库性能的改善较少 已经有很多独立开发者了