

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

# Lock:extend
<a name="wait-event.lockextend"></a>

`Lock:extend` 事件表示後端程序正在等待鎖定關聯來延伸，但另一個程序也基於相同目的而鎖定該關聯。

**Topics**
+ [支援的引擎版本](#wait-event.lockextend.context.supported)
+ [Context](#wait-event.lockextend.context)
+ [等待變多的可能原因](#wait-event.lockextend.causes)
+ [動作](#wait-event.lockextend.actions)

## 支援的引擎版本
<a name="wait-event.lockextend.context.supported"></a>

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

## Context
<a name="wait-event.lockextend.context"></a>

`Lock:extend` 事件表示後端程序正在等待延伸關聯，但另一個後端程序已鎖定該關聯而正在延伸。因為一次只有一個程序可以延伸關聯，所以系統產生 `Lock:extend` 等待事件。`INSERT`、`COPY` 及`UPDATE` 操作可能產生此事件。

## 等待變多的可能原因
<a name="wait-event.lockextend.causes"></a>

`Lock:extend` 事件比平時更常出現時，可能表示有效能問題，典型原因包括：

**突增並行插入或更新同一個資料表 **  
以查詢來插入或更新同一個資料表的並行工作階段可能變多。

**網路頻寬不足**  
資料庫執行個體上的網路頻寬可能不足以滿足目前工作負載的儲存通訊需求。這可能會引起儲存延遲，導致 `Lock:extend` 事件增加。

## 動作
<a name="wait-event.lockextend.actions"></a>

根據等待事件的原因，我們會建議不同的動作。

**Topics**
+ [減少並行插入和更新同一個關聯](#wait-event.lockextend.actions.action1)
+ [增加網路頻寬](#wait-event.lockextend.actions.increase-network-bandwidth)

### 減少並行插入和更新同一個關聯
<a name="wait-event.lockextend.actions.action1"></a>

首先，判斷 `tup_inserted` 和 `tup_updated` 指標是否增加，以及此等待事件是否也隨之增加。如果是，請檢查哪些關聯激烈爭用插入和更新操作。若要查明，請在 `pg_stat_all_tables` 檢視表中查詢 `n_tup_ins` 和 `n_tup_upd` 欄位的值。如需 `pg_stat_all_tables` 檢視表的相關資訊，請參閱 PostgreSQL 文件中的 [pg\$1stat\$1all\$1tables](https://www.postgresql.org/docs/13/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW)。

關於引起封鎖的查詢和被封鎖的查詢，如需詳細資訊，請查詢 `pg_stat_activity`，如下列範例所示：

```
SELECT
    blocked.pid,
    blocked.usename,
    blocked.query,
    blocking.pid AS blocking_id,
    blocking.query AS blocking_query,
    blocking.wait_event AS blocking_wait_event,
    blocking.wait_event_type AS blocking_wait_event_type
FROM pg_stat_activity AS blocked
JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
where
blocked.wait_event = 'extend'
and blocked.wait_event_type = 'Lock';
 
   pid  | usename  |            query             | blocking_id |                         blocking_query                           | blocking_wait_event | blocking_wait_event_type
  ------+----------+------------------------------+-------------+------------------------------------------------------------------+---------------------+--------------------------
   7143 |  myuser  | insert into tab1 values (1); |        4600 | INSERT INTO tab1 (a) SELECT s FROM generate_series(1,1000000) s; | DataFileExtend      | IO
```

在找出導致 `Lock:extend` 事件增加的關聯之後，請使用下列技巧來減少爭用：
+ 查明您是否可以使用分割來減少爭用同一個資料表。將插入或更新的元組分成不同分割區可以減少爭用。如需分割的相關資訊，請參閱[使用 pg\$1partman 擴充功能來管理 PostgreSQL 分割區](PostgreSQL_Partitions.md)。
+ 如果等待事件主要是由於更新活動，請考慮降低關聯的 fillfactor 值。這樣可以減少在更新期間請求新區塊。fillfactor 是資料表的儲存參數，決定可供壓縮資料表分頁的最大空間。以分頁總空間的百分比表示。如需 fillfactor 參數的詳細資訊，請參閱 PostgreSQL 文件中的 [CREATE TABLE](https://www.postgresql.org/docs/13/sql-createtable.html)。
**重要**  
如果您變更 fillfactor，強烈建議您測試系統，因為變更此值可能對效能造成負面影響，視工作負載而定。

### 增加網路頻寬
<a name="wait-event.lockextend.actions.increase-network-bandwidth"></a>

若要檢查寫入延遲是否變長，請在 CloudWatch 中檢查 `WriteLatency` 指標。如果是，請使用 `WriteThroughput` 和 `ReadThroughput` Amazon CloudWatch 指標來監控資料庫執行個體上的儲存體相關流量。這些指標可協助您判斷網路頻寬是否足以應付工作負載的儲存活動。

如果網路頻寬不夠，請增加頻寬。如果資料庫執行個體快達到網路頻寬限制，則增加頻寬的唯一辦法就是加大資料庫執行個體。

如需 CloudWatch 指標的詳細資訊，請參閱[Amazon RDS 的 Amazon CloudWatch 執行個體層級指標](rds-metrics.md#rds-cw-metrics-instance)。關於每個資料庫執行個體類別的網路效能，如需相關資訊，請參閱 [Amazon RDS 的 Amazon CloudWatch 執行個體層級指標](rds-metrics.md#rds-cw-metrics-instance)。