在SQL Server上将列定义为主表 - 这会使插入更慢吗?
我问,因为我理解这是索引的情况。
该表有数百万条记录。
答案 0 :(得分:6)
不,不一定!听起来很直观,但请阅读Kim Tripp's blog post中的这句话:
群集中的插入速度更快 表(但仅限于“正确” 聚集表)比一个 堆。这里的主要问题是 在IAM / PFS中查找以确定 堆中的插入位置是 比集群表中的速度慢 (插入位置已知, 由聚簇键定义)。插入 插入表格时速度更快 定义顺序(CL)和位置 这个顺序不断增加。
实际上,拥有一个好的聚簇索引(例如,在INT IDENTITY列上,如果可能的话)确实可以加快速度 - 甚至插入,更新和删除!
答案 1 :(得分:1)
主键自动编入索引,如果可能则进行群集,并使非群集失败。
因此,在这种意义上,插入受到轻微影响,但是假设表需要主键,当然没有主键通常会更糟糕。
首先测量,找出问题,然后尝试优化。一般来说,优化主键是一个非常糟糕的主意。
答案 2 :(得分:0)
不足以创造感性表现,并且其好处远远超过非常小的性能问题。在极少数情况下,您不应将主键放在表格上。
答案 3 :(得分:0)
真正快速的答案是:
是
主键总是被索引(并且SQL将尝试聚簇索引)。索引使插入更慢,聚簇索引更是如此。
根据您的桌子的用途,您可能有几个选择。
如果你进行大量的批量插入然后读取,你可以删除主键,插入堆(如果你有SQL 2008,这可以最低限度地记录以更快地运行)然后重新分配密钥并等待索引跑。
作为对此的补充,您还可以使用ORDER BY子句进行插入,该子句将使插入的行保持正确的聚簇索引顺序。如果您从已经订购的源中一次插入数百万行,这实际上只会有所帮助。
答案 4 :(得分:-1)
是的,向表中添加主键会降低插入速度(这是正常的,因为不向表中添加主键会加速应用程序的最终灾难性故障)。
如果你正在做的是创建一个新表,然后在其中插入数百万条记录,那么最初在没有主键的情况下创建表,插入所有记录,以及然后创建主键。或者使用替代工具执行批量插入。
答案 5 :(得分:-1)
是的,插入速度很慢,特别是有几个客户端同时执行插入操作,如果您的密钥顺序增加,则插入速度更快(所有插入都发生在索引树的最右侧节点,大多数数据库实现中或最后一个节点上)例如,群集SQL Server索引的表格页面 - 这两种情况都会导致资源争用。
也就是说,使用主键的SELECT加速了很多,并且保证了密钥的完整性。先做正确的事(到处定义主键)。其次,衡量您是否无法满足您的性能目标,以及这是否是由您的数据完整性约束引起的。然后才考虑解决方法。
答案 6 :(得分:-2)
不,不一定
无论如何,这不是您在桌面上定义主键的原因。
您可以在域模型需要时定义主键。