Transaction

使用一個 INSERT 插入一堆數據與在事務中插入一堆 INSERT 的性能差異是什麼?

  • July 12, 2019

我試圖了解類似之間的性能差異

INSERT INTO Person (id, name) VALUES
(1, "Kevin"),
(2, "John"),
(3, "Jane"),
... 

BEGIN TRANSACTION;

INSERT INTO Person (id, name) VALUES (1, "Kevin");
INSERT INTO Person (id, name) VALUES (2, "John");
INSERT INTO Person (id, name) VALUES (3, "Jane");
...

END TRANSACTION;

我知道在交易期間索引是臨時建立的,但我不太確定。我也不知道兩者之間的其他性能差異。

使用事務消除了最昂貴的操作,事務日誌刷新,但其他每個語句的操作仍然可以使多行插入比單行插入更有效。

在 SQL Server 中,多行插入可以更有效地修改索引,並更有效地插入行,因為鎖定和閂鎖是逐語句而不是逐行進行的操作所必需的。並且執行每條語句都有一些成本,因為 TSQL(預設情況下)是一種解釋型語言。

此外,在每個語句之後,而不是在事務結束時,檢查引用完整性約束並觸發觸發器。因此,甚至可能出現在單個語句中插入多行的行為與使用多個語句不同的情況。例如

use tempdb
go

drop table if exists t 
create table t(id int primary key, tid int not null)
insert into t(id,tid) values (1,2),(2,1)

引用自:https://dba.stackexchange.com/questions/242700