

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

# LWLock:pg\$1stat\$1statements
<a name="apg-rpg-lwlockpgstat"></a>

當 `pg_stat_statements` 延伸對追蹤 SQL 陳述式的雜湊資料表進行獨佔鎖定時，就會發生 LWLock:pg\$1stat\$1statements 等待事件。這會發生在下列案例中：
+ 當追蹤的陳述式數量達到設定的 `pg_stat_statements.max` 參數值，而且需要為更多項目騰出空間時，延伸會對呼叫數量執行排序、移除 5% 的最少執行的陳述式，並使用剩餘的項目重新填入雜湊。
+ 當 `pg_stat_statements` 對磁碟上的 `pgss_query_texts.stat` 檔案執行 `garbage collection` 操作，並重新寫入檔案。

**Topics**
+ [支援的引擎版本](#apg-rpg-lwlockpgstat.supported)
+ [Context](#apg-rpg-lwlockpgstat.context)
+ [等待時間增加的可能原因](#apg-rpg-lwlockpgstat.causes)
+ [動作](#apg-rpg-lwlockpgstat.actions)

## 支援的引擎版本
<a name="apg-rpg-lwlockpgstat.supported"></a>

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

## Context
<a name="apg-rpg-lwlockpgstat.context"></a>

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

**陳述式統計資料持久性** – 延伸會保留執行個體重新啟動時的陳述式統計資料：
+ 將資料寫入名為 pg\$1stat\$1statements.stat 的檔案
+ 使用 pg\$1stat\$1statements.save 參數控制持久性行為

當 pg\$1stat\$1statements.save 設定為：
+ ON (預設)：統計資料會在關閉時儲存，並在伺服器啟動時重新載入
+ OFF：統計資料不會在關機時儲存，也不會在伺服器啟動時重新載入

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

**陳述式解除配置程序** – 當追蹤的陳述式數量達到 `pg_stat_statements.max` 限制且需要追蹤新的陳述式時，延伸會：
+ 在雜湊資料表上進行獨佔鎖定 (LWLock:pg\$1stat\$1statements)。
+ 將現有資料載入本機記憶體。
+ 根據呼叫次數執行快速排序。
+ 移除最少呼叫的陳述式 (底部 5%)。
+ 將剩餘項目重新填入雜湊資料表。

**監控陳述式解除配置** – 在 PostgreSQL 14 和更新版本中，您可以使用 pg\$1stat\$1statements\$1info 檢視來監控陳述式解除配置。此檢視包含解除配置欄，顯示陳述式被解除配置的次數，以便為新陳述式騰出空間

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

## 等待時間增加的可能原因
<a name="apg-rpg-lwlockpgstat.causes"></a>

增加 `LWLock:pg_stat_statements` 等待的典型原因包括：
+ 應用程式使用的唯一查詢數量增加。
+ 與使用的唯一查詢數目相比，`pg_stat_statements.max` 參數值很小。

## 動作
<a name="apg-rpg-lwlockpgstat.actions"></a>

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

調整下列 `pg_stat_statements` 參數以控制追蹤行為，並減少 LWLock:pg\$1stat\$1 陳述式等待事件。

**Topics**
+ [停用 pg\$1stat\$1statements.track 參數](#apg-rpg-lwlockpgstat.actions.disabletrack)
+ [增加 pg\$1stat\$1statements.max 參數](#apg-rpg-lwlockpgstat.actions.increasemax)
+ [停用 pg\$1stat\$1statements.track\$1utility 參數](#apg-rpg-lwlockpgstat.actions.disableutility)

### 停用 pg\$1stat\$1statements.track 參數
<a name="apg-rpg-lwlockpgstat.actions.disabletrack"></a>

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

### 增加 pg\$1stat\$1statements.max 參數
<a name="apg-rpg-lwlockpgstat.actions.increasemax"></a>

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

**注意**  
`pg_stat_statements.max` 參數設為靜態。您必須重新啟動資料庫執行個體，才能將任何變更套用至此參數。

### 停用 pg\$1stat\$1statements.track\$1utility 參數
<a name="apg-rpg-lwlockpgstat.actions.disableutility"></a>

您可以分析 pg\$1stat\$1statements 檢視，以判斷哪些公用程式命令耗用 `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` 參數是動態參數。您可以變更其值，而無需重新啟動資料庫執行個體。

**Example pg\$1stat\$1statements 中唯一儲存點查詢的範例**  <a name="savepoint-queries"></a>

```
                     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 參數現在會顯示為常數。