在 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 可以。
进一步阅读,
如果您的 Word 文档包含 UserId(主键),然后将其插入 table,我明白为什么这会特别慢。
Understanding CLUSTERED vs NON-Clustered Indexing.
在 CLUSTERED INDEX 中,每个 table 的物理行根据索引重新排列。打个日常比喻,就好比把书(唱片)按字母顺序排列在书架上。每次有新书进来时,您都必须重新排列其他书籍,以便正确维护字母索引。显然,这对于插入来说非常慢,但对于 SELECTS 来说非常快。
A Non-Clustered 另一方面,当有新记录进入时,索引不会改变 table 中的物理行。以书架为例, 如果您想按作者查找书籍,您可以在旁边放一张纸作为 "index card" 以查找与特定作者匹配的书在书架中的位置。
如果您要一次插入大量记录,我的解决方案是:
- 删除索引
- 批量插入数据
- 重新创建索引
我正在 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 可以。
进一步阅读,
如果您的 Word 文档包含 UserId(主键),然后将其插入 table,我明白为什么这会特别慢。
Understanding CLUSTERED vs NON-Clustered Indexing.
在 CLUSTERED INDEX 中,每个 table 的物理行根据索引重新排列。打个日常比喻,就好比把书(唱片)按字母顺序排列在书架上。每次有新书进来时,您都必须重新排列其他书籍,以便正确维护字母索引。显然,这对于插入来说非常慢,但对于 SELECTS 来说非常快。
A Non-Clustered 另一方面,当有新记录进入时,索引不会改变 table 中的物理行。以书架为例, 如果您想按作者查找书籍,您可以在旁边放一张纸作为 "index card" 以查找与特定作者匹配的书在书架中的位置。
如果您要一次插入大量记录,我的解决方案是:
- 删除索引
- 批量插入数据
- 重新创建索引