28

知道索引列会带来更好的性能,是否值得对数据库所有表中的所有列进行索引?这种方法的优点/缺点是什么?

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

4

6 回答 6

27

由于上述原因,很难想象在现实世界中为每一列建立索引会很有用。这种场景需要一堆不同的查询,所有查询都只访问表的一列。每个查询都可能访问不同的列。

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

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

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

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

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

于 2012-10-16T13:47:03.103 回答
12

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

因此,仅使用选择查询的数据仓库之类的数据库是一个好主意,但在普通数据库上却是个坏主意。

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

于 2012-10-16T13:25:16.793 回答
6

不,您不应该索引所有列,这有几个原因:

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

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

于 2012-10-16T13:27:38.453 回答
3

不,维护索引有开销,因此索引所有列会减慢所有插入、更新和删除操作。您应该索引在 WHERE 子句中经常引用的列,您会看到好处。

于 2012-10-16T13:23:45.677 回答
3

索引占用空间。而且它们会花费时间来创建、重建、维护等。因此,对任何旧列进行索引都不能保证性能回报。您应该索引为您将使用的操作提供性能的列。索引有助于阅读,因此,如果您主要阅读,索引列将被搜索、排序或关联到其他表。否则,它比您可能看到的好处更昂贵。

于 2012-10-16T13:24:51.617 回答
0
  • 每个索引在插入和删除期间都需要额外的 CPU 时间和磁盘 I/O 开销。
  • 非主键上的独立可能必须在更新时挂起,尽管主键上的索引可能不会(这是因为更新通常不会修改主键属性)。
  • 每个额外的索引都需要额外的存储空间。
  • 对于涉及多个搜索键上的条件的查询,即使只有一些键上有独立,也可能不坏。因此,当已经存在许多独立时,通过添加独立来较少地提高数据库性能。
于 2020-01-30T21:11:39.947 回答