知道索引列会带来更好的性能,是否值得为数据库的所有表中的所有列编制索引?这种方法有哪些优点/缺点?
如果值得,有没有办法在SQL Server中自动创建索引?我的应用程序动态添加表和列(取决于用户配置),我想让它们自动编入索引。
答案 0 :(得分:16)
由于上述原因,很难想象真实场景中每列的索引都很有用。场景类型需要一堆不同的查询,所有查询都只访问表的一列。每个查询都可以访问不同的列。
其他答案未解决查询的选择方面的问题。显然,维护索引是一个问题,但是如果你创建表一次然后多次读取,则不需要考虑更新/插入/删除的开销。
索引包含原始数据以及数据所在的记录/页面的点。索引的结构可以快速执行以下操作:查找单个值,按顺序检索值,计算不同值的数量,以及查找最小值和最大值。
索引不仅占用磁盘空间。更重要的是,它占据了记忆。而且,内存争用通常是决定查询性能的因素。通常,在每列上构建索引将占用比原始数据更多的空间。 (一个例外是相对较宽且值相对较少的列。)
此外,为了满足许多查询,您可能需要一个或多个索引 plus 原始数据。您的页面缓存变得充满了数据,这可能会增加缓存未命中数,从而导致更多的开销。
我想知道您的问题是否真的表明您没有充分建模您的数据结构。在某些情况下,您希望用户构建临时永久表。更典型的是,他们的数据将以预定义的格式存储,您可以根据访问要求进行优化。
答案 1 :(得分:9)
不,因为您必须考虑到每次添加或更新记录时,都必须重新计算索引,并且在所有列上使用索引会花费大量时间并导致性能下降。
因此数据库就像只有选择查询的数据仓库是个好主意,但在普通数据库上这是一个坏主意。
此外,这不是因为您在where子句中使用了一个列,您必须在其上添加索引。 尝试找到一个列,其中记录几乎都是唯一的,如主键,并且您不经常编辑。 一个坏主意是索引一个人的性别,因为只有两个可能的值,索引的结果只会拆分数据,然后它会搜索几乎所有记录。
答案 2 :(得分:2)
不,维护索引会有开销,因此索引所有列会降低所有插入,更新和删除操作的速度。您应该索引在WHERE子句中经常引用的列,并且您将看到一个好处。
答案 3 :(得分:2)
索引占用空间。并且它们需要时间来创建,重建,维护等等。因此,对于任何旧列的索引都没有保证的性能回报。您应该为提供您将要使用的操作的性能的列编制索引。索引有助于读取,因此如果您主要阅读,则会对要搜索,排序或关联到其他表的索引列进行索引。否则,它比你可能看到的更有价值。
答案 4 :(得分:2)
不,您不应该为所有列编制索引,原因有以下几种:
最好不要使用Explain计划和数据访问,并在必要时添加索引(仅在必要时添加索引,恕我直言),而不是预先创建它们。
答案 5 :(得分:0)