主键:慢插入?

时间:2010-07-21 12:14:34

标签: sql-server tsql

在SQL Server上将列定义为主表 - 这会使插入更慢吗?

我问,因为我理解这是索引的情况。

该表有数百万条记录。

7 个答案:

答案 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)

不,不一定

无论如何,这不是您在桌面上定义主键的原因。

您可以在域模型需要时定义主键。