随着 table 中行数的增加,插入是否需要更长的时间?为什么?
Do insertions take longer as the number of rows in a table increase? Why?
如果我有一个带有主键的 table,即物理排列的整数类型的聚簇索引,并且具有像这样的标识值(伪 SQL 代码):
MyTable
--------
Id ( int, primary key, identity(1, 1) )
MyField1
MyField2
随着 table 中行数的增加,此 table 中的插入操作是否会花费更多时间?为什么?
我可以想象它花费更长时间的唯一原因是 table 行在被刷新到磁盘之前是否在内部存储为链表的节点。
我假设为 table 提供聚簇索引会复制 table 数据并将其存储为数组,因此遍历该数组要快得多(常数时间为与遍历链表相比,您只需要一个 JMP
单个整数(或机器位数,即 32 位机器上的 32 位和 64 位机器上的 64 位)大小的指令。
如果 table 没有索引,差异插入时间会有什么不同吗?也就是说,如果上面的主键丢失了?
我在哪里可以了解到关系数据库如何在 RAM 和磁盘上存储 table?
一般来说,插入一行的开销由几个部分组成。副手,我能想到:
- 正在查找放置该行的页面。
- 正在更新索引。
- 记录交易。
- 触发器和约束的任何开销。
对于 (1)。由于标识列上的聚簇索引,新行进入 table 中 table 的 table —— 意思是在最后一页。在本例中,table 的大小与查找行的 space 之间没有关系。
对于 (2)。随着 table 的增长,更新聚簇索引的额外开销非常小。但这非常小——而且碎片似乎不是问题。
对于 (3)。这与 table 尺寸无关。
对于 (4)。您似乎没有触发器或约束,所以这不是问题。
因此,根据我的估计,随着 table 变大,插入的额外开销非常小。
注意:可能还有其他因素。例如,您可能需要增大 table space 以支持更大的 table。然而,这并不仅仅与 table 的大小有关,只是与数据大小和可用资源之间的关系有关。
如果我有一个带有主键的 table,即物理排列的整数类型的聚簇索引,并且具有像这样的标识值(伪 SQL 代码):
MyTable
--------
Id ( int, primary key, identity(1, 1) )
MyField1
MyField2
随着 table 中行数的增加,此 table 中的插入操作是否会花费更多时间?为什么?
我可以想象它花费更长时间的唯一原因是 table 行在被刷新到磁盘之前是否在内部存储为链表的节点。
我假设为 table 提供聚簇索引会复制 table 数据并将其存储为数组,因此遍历该数组要快得多(常数时间为与遍历链表相比,您只需要一个
JMP
单个整数(或机器位数,即 32 位机器上的 32 位和 64 位机器上的 64 位)大小的指令。如果 table 没有索引,差异插入时间会有什么不同吗?也就是说,如果上面的主键丢失了?
我在哪里可以了解到关系数据库如何在 RAM 和磁盘上存储 table?
一般来说,插入一行的开销由几个部分组成。副手,我能想到:
- 正在查找放置该行的页面。
- 正在更新索引。
- 记录交易。
- 触发器和约束的任何开销。
对于 (1)。由于标识列上的聚簇索引,新行进入 table 中 table 的 table —— 意思是在最后一页。在本例中,table 的大小与查找行的 space 之间没有关系。
对于 (2)。随着 table 的增长,更新聚簇索引的额外开销非常小。但这非常小——而且碎片似乎不是问题。
对于 (3)。这与 table 尺寸无关。
对于 (4)。您似乎没有触发器或约束,所以这不是问题。
因此,根据我的估计,随着 table 变大,插入的额外开销非常小。
注意:可能还有其他因素。例如,您可能需要增大 table space 以支持更大的 table。然而,这并不仅仅与 table 的大小有关,只是与数据大小和可用资源之间的关系有关。