Performance

在桌子上插入異常緩慢

  • August 16, 2021

我有一個“基本”定價層 Azure SQL 數據庫,其中包含一個 7 列的表、一個作為聚集索引和主鍵的 int ID 列、一個 datetime2(0) 列、3 個 varchar(100) 列和 2 個 varchar(MAX ) 列,都可以為空。

該表沒有觸發器、約束或外鍵。

現在我正在插入大量的測試數據,我正在做一個

INSERT INTO table_name (<all columns, except the ID one>)
values (<just some values, the ones for varchar(MAX) being 221 characters long>)`
GO 680000

但是查詢已經執行了 5 個小時,只插入了 290000 行。

我試圖找出原因。

您需要查看執行插入的會話的等待情況,以確定瓶頸是什麼。鑑於您處於“基本”層,您的插入可能會根據服務層被人為地限制。

如果您執行這樣的查詢…

SELECT *
FROM sys.dm_exec_session_wait_stats
WHERE session_id = <session doing the insert>
ORDER BY wait_time_ms DESC

…我懷疑您會看到頂部等待可能類似於LOG_RATE_GOVERNORor HADR_THROTTLE_LOG_RATE_GOVERNOR這些等待類型是由於人為限制寫入 Azure SQL DB 中的事務日誌的速率而引起的,並且是使用基本層時大型插入的常見瓶頸。基本層的可用系統資源極為有限。注意:有可能在不達到服務層的 DTU 限制的情況下達到日誌速率限制。

一種解決方案是簡單地使用更高的服務層,這將允許您有更多的 DTU(因此更多的整體系統資源)用於您的大型插入。載入完成後,您可以切換回較低的服務層。我已經寫了更多關於 DTU 的文章,並嘗試將 DTU 與您可能更熟悉的傳統本地硬體相關聯——您可以在此處閱讀。

可能有更多選項可以提高較低服務層的吞吐量,但要做到這一點,您需要詳細了解您正在做什麼,以及您的資源瓶頸是什麼。

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