LWLock:pg_stat_statements - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

LWLock:pg_stat_statements

pg_stat_statements延伸對追蹤 SQL 陳述式的雜湊資料表進行獨佔鎖定時,會發生 LWLock:pg_stat_statements 等待事件。在下列情況下會發生這種情況:

  • 當追蹤的陳述式數量達到設定的pg_stat_statements.max參數值,而且需要為更多項目騰出空間時,延伸項目會對呼叫數量執行排序、移除 5% 的最少執行的陳述式,並使用剩餘的項目重新填入雜湊。

  • 當 對磁碟上的pgss_query_texts.stat檔案pg_stat_statements執行garbage collection操作,並重新寫入檔案。

支援的引擎版本

所有版本的 Aurora PostgreSQL 都支援此等待事件資訊。

Context

了解 pg_stat_statements 延伸 – pg_stat_statements 延伸會追蹤雜湊資料表中的 SQL 陳述式執行統計資料。延伸項目會追蹤 SQL 陳述式,最高可達 pg_stat_statements.max 參數定義的限制。此參數會決定可追蹤的陳述式數目上限,對應至 pg_stat_statements 檢視中的資料列數目上限。

陳述式統計資料持久性 – 延伸項目會保留執行個體重新啟動時的陳述式統計資料:

  • 將資料寫入名為 pg_stat_statements.stat 的檔案

  • 使用 pg_stat_statements.save 參數控制持久性行為

當 pg_stat_statements.save 設定為:

  • on (預設):統計資料會在關閉時儲存,並在伺服器啟動時重新載入

  • 關閉:統計資料不會在關機時儲存,也不會在伺服器啟動時重新載入

查詢文字儲存 – 延伸模組會將追蹤查詢的文字儲存在名為 的檔案中pgss_query_texts.stat。在垃圾回收發生之前,此檔案可以成長為所有追蹤 SQL 陳述式的平均大小的兩倍。擴充功能在清除操作和重寫pgss_query_texts.stat檔案期間,需要對雜湊資料表進行專屬鎖定。

陳述式解除配置程序 – 當追蹤的陳述式數量達到pg_stat_statements.max限制且需要追蹤新的陳述式時,延伸項目:

  • 在雜湊資料表上取得專屬鎖定 (LWLock:pg_stat_statements)。

  • 將現有資料載入本機記憶體。

  • 根據呼叫次數執行快速排序。

  • 移除最少呼叫的陳述式 (底部 5%)。

  • 將剩餘項目重新填入雜湊資料表。

監控陳述式解除配置 – 在 PostgreSQL 14 和更新版本中,您可以使用 pg_stat_statements_info 檢視來監控陳述式解除配置。此檢視包含解除配置資料欄,顯示陳述式解除配置的次數,以便為新陳述式騰出空間

如果陳述式的解除配置頻繁發生,將導致磁碟上pgss_query_texts.stat檔案的垃圾回收更頻繁。

等待時間增加的可能原因

增加LWLock:pg_stat_statements等待的典型原因包括:

  • 應用程式使用的唯一查詢數量增加。

  • 相較於使用的唯一查詢數量,pg_stat_statements.max參數值很小。

動作

根據等待事件的原因,我們會建議不同的動作。您可以使用 Amazon RDS Performance Insights 或查詢檢視 來識別LWLock:pg_stat_statements事件pg_stat_activity

調整下列pg_stat_statements參數以控制追蹤行為,並減少 LWLock:pg_stat_ 陳述式等待事件。

停用 pg_stat_statements.track 參數

如果 LWLock:pg_stat_statements 等待事件對資料庫效能造成負面影響,且在進一步分析pg_stat_statements檢視以識別根本原因之前需要快速解決方案,則可以將其設定為 來停用 pg_stat_statements.track 參數none。這將停用陳述式統計資料的集合。

增加 pg_stat_statements.max 參數

若要減少解除配置並將磁碟上pgss_query_texts.stat檔案的垃圾收集降到最低,請增加 pg_stat_statements.max 參數的值。預設值為 5,000

注意

pg_stat_statements.max 參數是靜態的。您必須重新啟動資料庫執行個體,才能將任何變更套用至此參數。

停用 pg_stat_statements.track_utility 參數

您可以分析 pg_stat_statements 檢視,以判斷哪些公用程式命令耗用 追蹤最多的資源pg_stat_statements

pg_stat_statements.track_utility 參數控制模組是否追蹤公用程式命令,其中包含 SELECT、INSERT、UPDATE、DELETE 和 MERGE 以外的所有命令。根據預設,此參數會設定為 on

例如,當您的應用程式使用許多原本是唯一的儲存點查詢時,可能會增加陳述式解除配置。若要解決此問題,您可以停用 pg_stat_statements.track_utility 參數以pg_stat_statements停止追蹤儲存點查詢。

注意

pg_stat_statements.track_utility 參數是動態參數。您可以變更其值,而無需重新啟動資料庫執行個體。

範例 pg_stat_statements 中唯一儲存點查詢的範例
query | queryid -------------------------------------------------+--------------------- SAVEPOINT JDBC_SAVEPOINT_495701 | -7249565344517699703 SAVEPOINT JDBC_SAVEPOINT_1320 | -1572997038849006629 SAVEPOINT JDBC_SAVEPOINT_26739 | 54791337410474486 SAVEPOINT JDBC_SAVEPOINT_1294466 | 8170064357463507593 ROLLBACK TO SAVEPOINT JDBC_SAVEPOINT_65016 | -33608214779996400 SAVEPOINT JDBC_SAVEPOINT_14185 | -2175035613806809562 SAVEPOINT JDBC_SAVEPOINT_45837 | -6201592986750645383 SAVEPOINT JDBC_SAVEPOINT_1324 | 6388797791882029332

PostgreSQL 17 為公用程式命令追蹤推出數種增強功能:

  • 儲存點名稱現在會顯示為常數。

  • 兩階段遞交命令的全域交易 IDs(GIDs) 現在會顯示為常數。

  • DEALLOCATE 陳述式的名稱會顯示為常數。

  • CALL 參數現在會顯示為常數。