2012-10-16 41 views
10

可能重复:
Why can’t I simply add an index that includes all columns?索引的所有列

知道了索引列导致更好的性能,是值得指标均列的数据库的所有表中?这种方法的优点和缺点是什么?

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

+0

首先,如果您的查询使用的不是一个而是两个或更多的列,那么如果您有两个/多个列索引,则会更好。 第二 - 索引使用磁盘空间,所以它不是免费的:) –

+3

也索引使您的更新操作更慢 –

+9

Ocaso:不重复。您引用的问题询问是否创建包含表中所有列的1个索引是一个好主意。这个问题是询问是否为每个N列在表上创建N个索引是一个好主意。 –

回答

11

由于上面提到的原因,很难想象现实世界中每个列的索引都是有用的。场景的类型需要大量不同的查询,全部访问表格的一列。每个查询都可以访问不同的列。

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

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

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

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

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

+0

我会说我的概念和'master'数据库一样,它包含的表格可以保存服务器上的数据库和表的结构。那些包含你需要的数据。 –

+0

我的数据库有标准表格,可以保存用户所做的配置。根据他的要求,可以创建新的表格。我无法在设计时间猜出他的疑问 –

+1

实际上,我相信大多数现代数据库都将索引页面与数据页面分开存储,而不是连续的。虽然它增加了占用磁盘的总大小,但如果DBMS使用该索引,则只会影响内存,页面加载和高速缓存百分比,也就是将其读入内存。一个坐标不被使用的索引不影响选择性能。 –

2

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

2

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

7

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

所以像数据仓库那样只有选择查询的数据库是一个好主意,但在普通数据库中这是一个坏主意。

另外,这不是因为您在where子句中使用了一列,所以您必须在其上添加索引。 尝试查找记录将几乎全部像主键一样唯一且不经常编辑的列。 一个坏主意是索引一个人的性别,因为只有两个可能的值,索引的结果只会分割数据,然后它会搜索几乎每一条记录。

+6

+1参考价值分布(又名人的性别) –

+0

至少在Oracle中,这就是为什么[位图](http://www.oracle.com/technetwork/articles/sharma-indexes-093638.html)存在索引 –

+0

非常清楚的解释,谢谢! – ArchNoob

2

不,你不应该索引所有的字段,并且有几个方面的原因:

  • 有插入,更新过程中保持各指标或delete语句成本,这将导致各这些交易需要更长的时间。
  • 由于每个索引占用磁盘空间,它将增加所需的存储空间。
  • 如果列值不分散,索引将不会被使用/忽略(例如:性别标志)。
  • 对于经常运行的WHERE,GROUP BY,ORDER BY或JOIN子句,组合索引(具有多个列的索引)可以大大提高性能,并且不能组合多个单一索引。

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