如果我在表上创建非聚集索引,SQL服务器是否在该表中复制数据并将其单独存储?我只想考虑创建非聚集索引的成本。我猜选择索引中使用的密钥会更快,但所有插入,更新和删除都会很慢,因为sql server必须维护两个数据副本。我的理解是否正确?
答案 0 :(得分:8)
SQL Server不会复制表中的所有数据,只会复制索引列中包含的数据以及任何覆盖'列,以及额外的开销数据。
是的,插入/更新会稍微慢一些,但是由于没有选择索引而可能导致的成本远远超过这个。在大多数情况下,除非您每秒插入数百/数千行,否则您可能不会注意到在表上有适当数量的索引会对插入/更新产生太大影响。
我们尝试限制生产数据库上的索引,但在报告数据库上使用了更多的索引,这些索引可以从我们的生产数据库中复制。不会注意到在报告数据库上有许多索引(用于插入/更新)的开销。
答案 1 :(得分:2)
非聚集索引不会“复制”数据。 创建各种类型的“映射”(有时仅使用索引列[s]的完整副本),以便对该字段上的某些查询更快地进行查找。有关此基本准则,请考虑B树 http://en.wikipedia.org/wiki/B-tree 不同节点位于众所周知的位置,您可以根据查询确定从哪里开始查找。 是的,您需要花费一些资源来创建/维护地图......但是您花了多少时间进行搜索?
SQL Server中集群索引和非集群索引之间最根本的区别在于,聚簇索引描述了磁盘上行的物理存储顺序...这就是为什么顺序聚簇索引通常优先用于良好的插入性能。
另一方面,对于非聚集索引,您需要衡量搜索性能与插入性能/磁盘空间成本的重要性。我通常将在任何常用搜索字段上使用索引。 如果相同的字段有非常频繁的插入,它会变得有点复杂,但我从来没有亲自处理插入性能,使我不能使用索引。
答案 2 :(得分:0)
答案还取决于您是否使用了covering index,其中包含表格中部分或全部列的副本。上面链接的文章很好地解释了这些问题。