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