SQL Server:性能插入與選擇
我從同事/研究中聽到了不同的東西。在創建臨時表時,Select Into vs Insert into 有什麼好的性能指南?我知道小桌子的差異很小。
例如:表有 20 列,5000 萬行。
我有 DBA 狀態,插入更快,因為編譯器/解析器不需要動態查找 Column 數據類型。其他人說 Select into 更快。我們進行了性能測試,似乎 select into 稍微快了一點。
有什麼好的原則可以確定哪個更快,為什麼?我認為微軟會優化插入到,同樣快,以進行仔細的程式。
文章陳述如下。
SELECT INTO 與 INSERT INTO 對臨時表的 SQL Server 性能
INSERT…INTO 命令將重用在記憶體中創建的數據頁用於插入/更新/刪除操作。當它被刪除時,它也會截斷表。SELECT…INTO 命令將為創建表創建類似於正常表的新頁面,並在刪除臨時表時將它們物理刪除。
問題是,為什麼微軟不優化使插入和選擇一樣快?
我們為數據倉庫編寫了超過 500 個儲存過程,並且需要良好的臨時使用指南。
本文並沒有真正關注性能和原因:
文章中的人提到了好處:
這主要是因為 SQL Server 知道目標表沒有爭用。insert into #temp with(tablock) select * from .. 的性能與 select * into #temp from 的性能大致相同
您引用了兩篇不同的文章,討論了兩種不同的事情。
第一篇文章比較
insert..select
了臨時表,第二篇文章比較select into
了這兩個**。**通常
insert..select
比較慢,因為它是一個完全記錄的操作。select into
最低限度地登錄simple
和bulk logged
恢復模型。您引用的最後一條評論是 about
insert into with(tablock)
,這with(tablock)
可以insert into
在一些附加條件下進行最低限度的記錄:它應該是一個堆並且沒有索引。您可以在此處找到完整的指南:數據載入性能指南
可以總結在這張表中:
請注意 SQL Server 2016 和更高版本中的 SQL Server 2016 更新,Parik Savjani(Microsoft SQL Server Tiger 團隊的高級項目經理)在批量載入操作中的最小日誌記錄和影響。更新後的表格是:
關於第一篇文章。它討論了臨時表的特殊情況。
數據庫之所以特殊,
tempdb
是因為它始終處於簡單恢復模式,並且因為登錄tempdb
方式不同。在每次伺服器重新啟動時重新tempdb
創建,這意味著不會對 進行崩潰恢復tempdb
,這意味著登錄tempdb
不需要任何修改數據的“之後”映像,如果存在則只有“之前”映像才能進行回滾需要。這導致即使沒有提示(在第一篇文章中討論過的情況),insert into..select
也很少登錄。tempdb``tablock``heap
結論“
select into
與insert..select
日誌方面的對比”:在 a 的情況下
heap
,insert into..select
執行類似於select into
臨時表的情況,並且通常在tablock
不使用提示時較慢。第二個方面是並行執行的可能性。
Select into
從 SQL Server 2014 開始可以並行執行,而並行insert...select
首先在 SQL Server 2016 中實現。我沒有重現SQL Server 2012 上的臨時表之間的任何性能差異,所有這些都是串列執行的
select into
。insert into ..select