在 SQL 中使用默认聚集索引将数据插入 table 后会发生什么

What happens after inserting data to a table with default clustered index in SQL

我正在 MS SQL 服务器上工作。

我有一个名为 "User" 的 table,它具有三列和默认索引,它是使用 table、UserId 的主键创建的。

我有一个逐行包含用户信息的word文件。差不多有10000行。

我有一个程序可以从word文件中读取用户信息并将其插入到数据库中。它是在 visual studio 中用 C# 编写的。该程序使用存储库和工作单元模式。

程序流程如下: 1)从word文件中读取一行用户信息。 2)根据信息创建用户对象 3)将对象写入存储库 4) 提交工作,其中执行数据库插入语句。

程序基本上每次从word文件中读取用户信息都会执行"insert statement"

这是我的问题。

我记录了每个 "insert statement" 的时间,我可以看到 "insert statement" 需要更长的时间,因为插入的数据更多。这是因为数据库在 B 树中有更多数据需要整理,因为 table 在其主键上有默认的聚簇索引吗?

请赐教 SQL 数据库中插入语句前后发生了什么。

谢谢你们。

Is this because the database has more data to sort out in B tree since a table has default clustered index on its primary key?

No.In 事实上 USERID autoincreament 因为 clustered index 是 CI 的理想选择。 由于PK候选为Auto Increament。数据将始终附加在最后一页。

但是,如果地址比以前的长度大,则可能会发生 Udate 语句页面拆分。

如果可能,请将地址设为 varchar 并尽可能缩小。

主要问题插入非常频繁,数据库命中非常频繁。 如果要插入 1000 条记录,则在 time.You 处创建 UDT 并插入 create 50/100 即可,因此通过在插入 method.It 中应用分页逻辑很容易并且会有所帮助。

像使用Connection Pooling一样优化你的UI层代码,在DAL(Sql parameter).

中保留相关的数据类型和传递变量的长度

I logged the time of each "insert statement", and I can see that the "insert statement" takes longer as there are more data inserted. Is this because the database has more data to sort out in B tree since a table has default clustered index on its primary key?

否,因为用户 ID 一直在增加。没有排序工作发生。 可能是 `insert sql script' 有错误。罪魁祸首是非常频繁的数据库命中。

Please enlighten me what happens after and before the insert statement in SQL database.

请赐教 SQL 数据库中插入语句前后发生了什么。

每当插入数据时,插入都会发生在两个地方。在数据页中的 table 级别和索引级别。

聚集索引在索引的叶级存储table的实际数据行,此外还控制数据页内数据的排序标准和顺序页面本身,基于聚簇索引键。

将发生索引页拆分。如何 ?假设有 3 个中间层和 4 个叶层。 例如现在如果你插入 1 条记录,2 条记录什么都不会 happen.Insertion 在这个阶段处理会很快。

假设您再插入几条记录(比如在 10,20 之后),那么中间层和叶层都会 increase.Becasue 索引页有 space 限制,所以当它没有

如果无法容纳新记录,那么它将拆分页面以容纳新记录 records.Becasue,因此列长度应尽可能窄。

但在您的情况下,聚簇索引不必执行排序 criteriA.So 聚簇索引执行的工作少了一项。

此外,索引页面拆分成本将低于非自动增量键或宽键。

由于您非常频繁地插入记录,它会时不时地影响您的性能。

在批量插入索引的情况下,页面拆分会更少,因此性能会提高。

在 HEAP Table 中,由于没有聚集索引来维护,因此 do.So 非常频繁的插入可能会有所改进。

但您必须决定插入性能与 Select 性能。

如果此 table 非常频繁地用于获取记录,那么您必须保留聚簇索引。 如果很少使用或者记录小于100 HEAP table 可以。

进一步阅读,

index structure and concepts

Index Architecture and Design Guide

Heaps (Tables without Clustered Indexes)

如果您的 Word 文档包含 UserId(主键),然后将其插入 table,我明白为什么这会特别慢。

Understanding CLUSTERED vs NON-Clustered Indexing.

CLUSTERED INDEX 中,每个 table 的物理行根据索引重新排列。打个日常比喻,就好比把书(唱片)按字母顺序排列在书架上。每次有新书进来时,您都必须重新排列其他书籍,以便正确维护字母索引。显然,这对于插入来说非常慢,但对于 SELECTS 来说非常快。

A Non-Clustered 另一方面,当有新记录进入时,索引不会改变 table 中的物理行。以书架为例, 如果您想按作者查找书籍,您可以在旁边放一张纸作为 "index card" 以查找与特定作者匹配的书在书架中的位置。

如果您要一次插入大量记录,我的解决方案是:

  1. 删除索引
  2. 批量插入数据
  3. 重新创建索引