針對專用 SQL 集區的 tempdb 錯誤進行疑難排解

適用於:Azure Synapse Analytics

在專用 SQL 集區上,tempdb 資料庫會用於臨時表和數據移動的中繼空間(例如:隨機移動、修剪移動)、排序、載入、記憶體溢出和其他作業。 此外,與 tempdb 資料庫互動的一個會話中未認可的交易,會防止記錄檔排清所有其他會話,導致記錄檔填滿。 因為 tempdb 資料庫是共用資源,因此大量耗用 tempdb 空間可能會導致其他使用者的查詢失敗,而且可能會呈報以防止建立新的連線。

如果我無法連線到專用 SQL 集區,該怎麼辦?

如果您沒有現有連線來識別任何有問題的連線或查詢,則解決無法建立新連線 的唯一方法是暫停 和 繼續,或 調整 專用 SQL 集區。 此動作將會終止導致此問題的使用者交易,並在服務重新啟動時重新建立tempdb資料庫。

注意: 請務必為服務提供額外的時間來復原所有執行中的交易,因為暫停和調整作業可能需要比正常時間更久才能完成此案例。

針對完整的tempdb資料檔進行疑難解答

步驟 1:識別填滿 tempdb 資料庫的查詢

除非您已將記錄元件實作到 ETL 架構或稽核專用 SQL 集區語句,否則請確定您在執行查詢時,識別填滿 tempdb 資料庫的查詢。 在大部分情況下,不一定是發生問題的時間範圍內執行最長的查詢,是tempdb空間不足錯誤的原因。 執行下列查詢以取得長時間執行的查詢清單:

SELECT TOP 5 *
FROM sys.dm_pdw_exec_requests
WHERE status = 'running'
ORDER BY total_elapsed_time desc;

一旦您有相當可疑的查詢,請嘗試下列其中一個選項:

  • 終止 語句。
  • 嘗試防止任何其他工作負載進一步取用tempdb空間,讓長跑者可以完成。

步驟 2:防止週期性

識別並針對負責任查詢採取動作之後,請考慮實作風險降低措施,以防止問題週期性發生。 下表顯示 tempdb 完整錯誤最常見原因的風險降低:

原因 描述 降低
分散式方案不佳 針對指定查詢產生的分散式計劃,可能會因為數據表統計數據維護不佳而意外地導入高頻率數據移動。 更新相關數據表的統計數據 ,並確保它們會定期維護。
叢集資料行存放區索引 (CCI) 健康情況不佳 它會因為記憶體溢出而耗用tempdb空間。 重建CCI ,並確保其會定期維護。
大型交易 CREATE TABLE AS SELECT (CTAS)大量的或 INSERT SELECT 語句會在數據移動作業期間填滿 tempdb。 將您的 CTAS 或 INSERT SELECT 陳述式細分為多個較小的交易。
記憶體配置不足 設定記憶體不足的查詢(透過資源類別或工作負載群組)可能會溢出到 tempdb。 使用較大的資源類別或具有更多資源的工作負載群組來執行查詢。
終端使用者外部資料表查詢 對外部數據表的查詢對於用戶查詢而言並非最佳,因為引擎必須先將整個檔案讀入 tempdb ,才能處理數據。 載入資料至永久資料表,然後將使用者查詢導向至該處。
整體資源不足 您可能會發現專用 SQL 集區在高活動期間接近其 tempdb 容量上限。 請考慮將專用 SQL 集區相應增加,並結合上述任何風險降低措施。

針對完整的tempdb事務歷史記錄檔進行疑難解答

tempdb 事務歷史記錄通常只會在用戶端/使用者時填滿:

  • 開啟明確的交易,但絕不會發出 COMMIT 或 ROLLBACK。
  • 設定 IMPLICIT_TRANSACTION = ON (特別是針對使用 AutoCommit 功能的 JDBC 用戶端和工具)。

步驟 1:識別開啟的交易

有問題的連線可能是來自具有開啟交易但處於「閑置」狀態的用戶端。 執行下列查詢以協助識別此案例:

SELECT *
FROM sys.dm_pdw_exec_sessions
WHERE is_transactional = 1
AND status = 'Idle';

注意:並非所有因為此查詢而傳回的連接都一定有問題。 在執行之間至少執行兩次,且執行時間超過15分鐘,並查看哪些聯機會持續處於此狀態。

步驟 2:減輕並防止問題

識別要持有開啟交易的客戶端之後,請與使用者合作以變更其中一項或兩者:

  • 驅動程式組態 (例如:JDBC AutoCommit 設定為 off,這會設定 IMPLICIT_TRANSACTIONS = ON)
  • 臨機操作查詢行為(例如:未正確執行 BEGIN TRAN COMMIT/ROLLBACK)

或者,您可以考慮建立自動化程式來定期偵測此案例,並 終止 任何潛在的問題會話。

資源