索引所有列

Mos*_*aou 17 sql sql-server indexing

知道索引列会带来更好的性能,是否值得为数据库的所有表中的所有列编制索引?这种方法有哪些优点/缺点?

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

Gor*_*off 19

由于上述原因,很难想象真实场景中每列的索引都是有用的.场景类型需要一堆不同的查询,所有查询都只访问表的一列.每个查询都可以访问不同的列.

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

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

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

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

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


Mar*_*arc 10

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

因此数据库就像只有选择查询的数据仓库是个好主意,但在普通数据库上这是一个坏主意.

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

  • 用于引用价值分配的+1(又名人的性别) (8认同)

Ste*_*rea 5

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

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

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