随着表中行数的增加,插入会花费更长的时间吗?为什么?

时间:2019-02-21 03:44:40

标签: sql database relational-database

如果我有一个带有主键的表,即一个物理排列的聚集索引,其类型为整数,并且具有相同的标识值(伪SQL代码):

MyTable
--------
Id ( int, primary key, identity(1, 1) )
MyField1
MyField2
  1. 随着表中行数的增加,此表中的插入操作会花费更多时间吗?为什么?

    我能想象花费更长的时间的唯一原因是表行在刷新到磁盘之前是否在内部存储为链接列表的节点。

    我假设为表提供聚簇索引会复制表数据并将其存储为数组,因此遍历该数组的速度要快得多(恒定的时间,因为您只需要一条JMP指令而不是通过链表遍历单个整数(或机器位数,即32位机器上为32位,而64位机器上为64位)。

  2. 并且如果表没有索引,对差异插入时间有什么影响吗?也就是说,是否缺少上述情况的主键?

在哪里可以了解关系数据库如何在RAM和磁盘上存储表?

1 个答案:

答案 0 :(得分:1)

通常,插入行的开销包括一些组件。副手,我可以想到:

  1. 查找要放入行的页面。
  2. 更新索引。
  3. 记录交易。
  4. 触发器和约束的任何开销。

对于(1)。由于标识列上的聚集索引,因此在表的“末尾”(表的最后一页)将在表中插入新行。在这种情况下,表的大小与为行查找空间之间没有关系。

对于(2)。随着表的增长,用于更新聚簇索引的开销很小。但这很小-碎片似乎不是问题。

对于(3)。这与表的大小无关。

对于(4)。您似乎没有触发器或约束,所以这不是问题。

因此,根据我的估计,随着表的增大,插入的额外开销将很小。

注意:可能还有其他因素。例如,您可能需要增加表空间以支持更大的表。但是,这并不仅仅与表的大小有关,还与数据大小和可用资源之间的关系无关。