可能重复:
Why can’t I simply add an index that includes all columns?索引的所有列
知道了索引列导致更好的性能,是值得指标均列的数据库的所有表中?这种方法的优点和缺点是什么?
如果值得,有没有办法在SQL Server中自动创建索引?我的应用程序动态添加表和列(取决于用户配置),我想让它们自动索引。
可能重复:
Why can’t I simply add an index that includes all columns?索引的所有列
知道了索引列导致更好的性能,是值得指标均列的数据库的所有表中?这种方法的优点和缺点是什么?
如果值得,有没有办法在SQL Server中自动创建索引?我的应用程序动态添加表和列(取决于用户配置),我想让它们自动索引。
由于上面提到的原因,很难想象现实世界中每个列的索引都是有用的。场景的类型需要大量不同的查询,全部访问表格的一列。每个查询都可以访问不同的列。
其他答案没有解决期间选择期间的问题。很显然,维护索引是一个问题,但是如果您创建表/ s一次,然后阅读很多次,则更新/插入/删除的开销不是一个考虑因素。
索引包含原始数据以及指向数据所在记录/页面的点。索引的结构使得它能够快速执行如下操作:查找单个值,按顺序检索值,计算不同值的数量,并查找最小值和最大值。
索引不仅占用磁盘空间。更重要的是,它占据了记忆。而且,内存争用通常是决定查询性能的因素。一般来说,在每一列上建立一个索引将占用比原始数据更多的空间。 (一个例外将是相对宽并且具有相对较少值的列)。
另外,为了满足许多查询,您可能需要一个或多个索引加上的原始数据。您的页面缓存会充满数据,这可能会增加缓存未命中的数量,从而导致更多的开销。
我不知道你的问题是否真的表明你没有充分模拟你的数据结构。很少有情况下,您希望用户构建临时永久表。更典型的是,他们的数据将以预定义的格式存储,您可以根据访问需求进行优化。
我会说我的概念和'master'数据库一样,它包含的表格可以保存服务器上的数据库和表的结构。那些包含你需要的数据。 –
我的数据库有标准表格,可以保存用户所做的配置。根据他的要求,可以创建新的表格。我无法在设计时间猜出他的疑问 –
实际上,我相信大多数现代数据库都将索引页面与数据页面分开存储,而不是连续的。虽然它增加了占用磁盘的总大小,但如果DBMS使用该索引,则只会影响内存,页面加载和高速缓存百分比,也就是将其读入内存。一个坐标不被使用的索引不影响选择性能。 –
不,在维护索引时会有开销,因此索引所有列会减慢所有插入,更新和删除操作。您应该为您在WHERE子句中经常引用的列建立索引,并且您将看到一个好处。
索引占用空间。而且他们需要时间来创建,重建,维护等。因此,索引任何旧列的性能不会有保证的回报。您应该为给您使用的操作提供性能的列索引。索引有助于读取,所以如果您主要阅读,索引列将按照关系搜索,排序或联合到其他表。否则,它比您可能看到的好处更昂贵。
不,因为您必须考虑到每次添加或更新记录时都必须重新计算索引,并且在所有列上都有索引会花费大量时间并导致性能不佳。
所以像数据仓库那样只有选择查询的数据库是一个好主意,但在普通数据库中这是一个坏主意。
另外,这不是因为您在where子句中使用了一列,所以您必须在其上添加索引。 尝试查找记录将几乎全部像主键一样唯一且不经常编辑的列。 一个坏主意是索引一个人的性别,因为只有两个可能的值,索引的结果只会分割数据,然后它会搜索几乎每一条记录。
+1参考价值分布(又名人的性别) –
至少在Oracle中,这就是为什么[位图](http://www.oracle.com/technetwork/articles/sharma-indexes-093638.html)存在索引 –
非常清楚的解释,谢谢! – ArchNoob
不,你不应该索引所有的字段,并且有几个方面的原因:
在使用Explain计划和数据访问并在必要时添加索引(只在必要时,恕我直言),而不是事先创建它们,你会好得多。
首先,如果您的查询使用的不是一个而是两个或更多的列,那么如果您有两个/多个列索引,则会更好。 第二 - 索引使用磁盘空间,所以它不是免费的:) –
也索引使您的更新操作更慢 –
Ocaso:不重复。您引用的问题询问是否创建包含表中所有列的1个索引是一个好主意。这个问题是询问是否为每个N列在表上创建N个索引是一个好主意。 –