Sql-Server

SQL Server:性能插入與選擇

  • March 3, 2021

我從同事/研究中聽到了不同的東西。在創建臨時表時,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最低限度地登錄simplebulk logged恢復模型。

您引用的最後一條評論是 about insert into with(tablock),這with(tablock)可以insert into在一些附加條件下進行最低限度的記錄:它應該是一個堆並且沒有索引。

您可以在此處找到完整的指南:數據載入性能指南

可以總結在這張表中:

在此處輸入圖像描述

請注意 SQL Server 2016 和更高版本中的 SQL Server 2016 更新,Parik Savjani(Microsoft SQL Server Tiger 團隊的高級項目經理)在批量載入操作中的最小日誌記錄和影響。更新後的表格是:

SQL Server 2016 及以後的更新圖表

關於第一篇文章。它討論了臨時表的特殊情況。

數據庫之所以特殊,tempdb是因為它始終處於簡單恢復模式,並且因為登錄tempdb方式不同。在每次伺服器重新啟動時重新tempdb創建,這意味著不會對 進行崩潰恢復tempdb,這意味著登錄tempdb不需要任何修改數據的“之後”映像,如果存在則只有“之前”映像才能進行回滾需要。這導致即使沒有提示(在第一篇文章中討論過的情況),insert into..select也很少登錄。tempdb``tablock``heap

結論“select intoinsert..select日誌方面的對比”:

在 a 的情況下heapinsert into..select執行類似於select into臨時表的情況,並且通常在tablock不使用提示時較慢。

第二個方面是並行執行的可能性。

Select into從 SQL Server 2014 開始可以並行執行,而並行insert...select首先在 SQL Server 2016 中實現。

我沒有重現SQL Server 2012 上的臨時表之間的任何性能差異,所有這些都是串列執行的select intoinsert into ..select

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