共用方式為


針對專用 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。 將您的 CTASINSERT SELECT 陳述式細分為多個較小的交易。
記憶體配置不足 設定記憶體不足的查詢(透過資源類別或工作負載群組)可能會溢出到 tempdb 使用較大的資源類別或具有更多資源的工作負載群組來執行查詢。
終端使用者外部資料表查詢 對外部數據表的查詢對於用戶查詢而言並非最佳,因為引擎必須先將整個檔案讀入 tempdb ,才能處理數據。 載入資料至永久資料表,然後將使用者查詢導向至該處。
整體資源不足 您可能會發現專用 SQL 集區在高活動期間接近其 tempdb 容量上限。 請考慮將專用 SQL 集區相應增加,並結合上述任何風險降低措施。

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

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

  • 開啟明確的交易,但絕不會發出 COMMITROLLBACK
  • 設定 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

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

資源