本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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 參數現在會顯示為常數。