【问题标题】:Index all columns索引所有列
【发布时间】:2012-10-06 14:34:45
【问题描述】:

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

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

【问题讨论】:

  • 首先,如果您的查询使用的不是一列而是两列或更多列,那么最好有两列或多列索引。第二个索引使用磁盘空间,所以它不是免费的:)
  • 索引也会让你的更新操作变慢
  • 奥卡索:不是重复的。您引用的问题询问创建 1 个包含表中所有列的索引是否是个好主意。这个问题是在询问为表上的 N 列中的每一列创建 N 个索引是否是一个好主意。
  • 您的意思是,“N 列中的每一列都有 1 个索引...”

标签: sql sql-server indexing


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我想说我的概念与master 数据库相同,它包含保存数据库结构的表和服务器上的表。这些包含您需要的数据。
  • 我的数据库有标准的表格来保存用户的配置。根据他的要求,可以创建新表。我无法在设计时猜出他的查询
  • 实际上,我相信大多数现代数据库将索引页与数据页分开存储,不连续。虽然它确实增加了磁盘占用的总大小,但如果 DBMS 使用索引(也就是将其读入内存),它只会影响内存、页面加载和缓存百分比。未使用的索引不会影响选择性能。
【解决方案2】:

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

所以像数据仓库这样只使用选择查询的数据库是个好主意,但在普通数据库上这是个坏主意。

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

【讨论】:

  • 至少在 Oracle 中,这就是存在 bitmap 索引的原因
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:
        • 每个索引都需要额外的 CPU 时间和磁盘 I/O 开销 插入和删除。
        • 非主键上的独立可能必须在更新时挂起,尽管主键上的索引可能不会(这是因为更新通常不会修改主键属性)。
        • 每个额外的索引都需要额外的存储空间。
        • 对于涉及多个搜索键上的条件的查询,eieny 即使只有一些键上有独立,也可能不错。 因此,在 许多独立游戏已经存在。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-16
          • 2012-10-15
          相关资源
          最近更新 更多