DBAtlas · データベース運用アトラス

Undo / TempDB / 一時領域の圧迫

undo/ロールバック領域、一時 (temp) 領域、または TempDB が圧迫されている。圧迫がどこにあるかを特定し、大規模なソート/ハッシュ、長時間のクエリ/トランザクション、領域リークなどの根本原因まで掘り下げる。

圧迫はどこか: undo、temp、または tempdb の競合?

領域の使用状況を見て圧迫の発生源を分類する: undo/ロールバック表領域が満杯になりつつあるのか、一般的な一時 (temp) 領域か、それとも MSSQL の TempDB のページ割り当てラッチの競合か?

SELECT tablespace_name, ROUND(used_percent,1) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE tablespace_name LIKE '%UNDO%' OR tablespace_name LIKE 'TEMP%';
  • undo/ロールバック領域が満杯になりつつある (ORA-01555 / ORA-30036)
  • 一時 (temp) 領域が満杯になりつつある (ソート/ハッシュのスピル)
  • TempDB の割り当てラッチの競合 (PFS/GAM/SGAM)

何が undo を消費しているか?

undo の圧迫は通常 2 種類のいずれか: 長時間の QUERY が開始時点の読み取り一貫性のために古い undo を必要としている (ORA-01555) か、長時間/オープンな TRANSACTION が大量の undo を生成して領域を満杯にし、ORA-30036 を引き起こしている。

SELECT s.sid, s.username, t.used_ublk*8/1024 AS undo_mb, s.status, t.start_time
FROM v$transaction t JOIN v$session s ON s.taddr=t.addr
ORDER BY undo_mb DESC;
SELECT MAX(maxquerylen) AS longest_query_sec, MAX(tuned_undoretention) AS tuned_retention FROM v$undostat;
  • 長時間のクエリが古い undo を必要としている (ORA-01555)
  • 長時間/オープンなトランザクションが undo を蓄積している (ORA-30036)

何が一時領域を満杯にしているか?

temp の圧迫は、大規模なソート/ハッシュ操作がディスクにスピルしている (正常だが巨大) か、単一のセッションが temp を保持し続けている (オープンカーソル、リーク、終わらないクエリ) かのいずれかに起因する。

SELECT s.sid, s.username, u.tablespace, u.blocks*8/1024 AS temp_mb, u.sqladdr
FROM v$tempseg_usage u JOIN v$session s ON s.saddr=u.session_addr
ORDER BY temp_mb DESC;
  • 大規模なソート/ハッシュ操作がディスクにスピルしている
  • 単一のセッションが temp を保持している (リーク/オープンカーソル)

TempDB の競合は割り当ての問題か、量の問題か?

MSSQL の TempDB では 2 種類の問題が発生する: PFS/GAM/SGAM ページでの PAGELATCH の競合 (多数の小さな一時オブジェクト)、または大規模なソート/バージョンストアが量的に TempDB を満杯にすること。

SELECT session_id, wait_type, wait_duration_ms, resource_description
FROM sys.dm_os_waiting_tasks
WHERE wait_type LIKE 'PAGELATCH%' AND resource_description LIKE '2:%';
SELECT COUNT(*) AS tempdb_data_files FROM sys.master_files WHERE database_id=2 AND type=0;
  • PFS/GAM/SGAM のラッチ競合
  • 大規模なソート/バージョンストアが TempDB を満杯にしている

根本原因: 長時間のクエリ + undo の不足 (ORA-01555)

長時間のクエリが読み取り一貫性のために必要とする古い undo が、保持期間の経過または領域不足により上書きされた。

根本原因: 長時間/オープンなトランザクションが undo を満杯にした (ORA-30036)

単一の巨大な DML、またはコミットが遅れたオープンなトランザクションが大量の undo を生成し、UNDO 表領域を拡張できずに ORA-30036 が発生した。

根本原因: 大規模なソート/ハッシュが一時領域を満杯にしている

メモリに収まらない大規模なソート/ハッシュ/group by の操作が一時領域にスピルし、領域を満杯にする可能性がある。

根本原因: セッションが一時領域を保持している (リーク)

クローズされていないカーソル、終わらないクエリ、オープンなままの一時テーブルが原因で、単一のセッションが一時領域を解放しない。

根本原因: TempDB の PFS/GAM/SGAM ラッチ競合

多数のセッションが同時に小さな一時オブジェクトを作成すると、TempDB の割り当てマップページ (PFS/GAM/SGAM) で PAGELATCH の競合が発生する。

DBAtlas で開く →