本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
LWLock:pg_stat_statements
當 pg_stat_statements 延伸對追蹤 SQL 陳述式的雜湊資料表進行獨佔鎖定時,就會發生 LWLock:pg_stat_statements 等待事件。這會發生在下列案例中:
-
當追蹤的陳述式數量達到設定的
pg_stat_statements.max參數值,而且需要為更多項目騰出空間時,延伸會對呼叫數量執行排序、移除 5% 的最少執行的陳述式,並使用剩餘的項目重新填入雜湊。 -
當
pg_stat_statements對磁碟上的pgss_query_texts.stat檔案執行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 (預設):統計資料會在關閉時儲存,並在伺服器啟動時重新載入
-
OFF:統計資料不會在關機時儲存,也不會在伺服器啟動時重新載入
查詢文字儲存 – 延伸會將追蹤查詢的文字儲存在名為 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 或查詢檢視 pg_stat_activity 來識別 LWLock:pg_stat_statements 事件。
調整下列 pg_stat_statements 參數以控制追蹤行為,並減少 LWLock:pg_stat_ 陳述式等待事件。
停用 pg_stat_statements.track 參數
如果 LWLock:pg_stat_statements 等待事件對資料庫效能造成負面影響,且在進一步分析 pg_stat_statements 檢視以找出根本原因之前需要快速解決方案,則可以將其設定為 none 來停用 pg_stat_statements.track 參數。這將停用陳述式統計資料的集合。
增加 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 | 6388797791882029332PostgreSQL 17 為公用程式命令追蹤推出數種增強功能:
-
儲存點名稱現在會顯示為常數。
-
兩階段遞交命令的全域交易 IDs(GIDs) 現在會顯示為常數。
-
DEALLOCATE 陳述式的名稱會顯示為常數。
-
CALL 參數現在會顯示為常數。