DBAtlas · Атлас эксплуатации баз данных

Давление на undo / TempDB / временное пространство

Пространство undo/rollback, временное (temp) пространство или TempDB под давлением. Определим, где давление, и дойдём до первопричины: большая сортировка/хеширование, долгий запрос/транзакция или утечка пространства.

Где давление: undo, temp или конкуренция в tempdb?

Классифицируйте источник давления по использованию пространства: заполняется табличное пространство undo/rollback, общее временное (temp) пространство или, в MSSQL, это конкуренция за latch при выделении страниц 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/rollback заполняется (ORA-01555 / ORA-30036)
  • Временное (temp) пространство заполняется (вытеснение sort/hash)
  • Конкуренция за latch при выделении в TempDB (PFS/GAM/SGAM)

Что потребляет undo?

Давление на undo обычно бывает двух видов: долгому ЗАПРОСУ нужен старый undo для согласованного чтения на момент его начала (ORA-01555), или долгая/открытая ТРАНЗАКЦИЯ генерирует столько 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 возникает либо из-за большой операции sort/hash, вытесняемой на диск (нормально, но огромно), либо из-за одной сессии, постоянно удерживающей 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;
  • Большая операция sort/hash вытесняется на диск
  • Одна сессия удерживает temp (утечка/открытый курсор)

Конкуренция в TempDB связана с выделением или с объёмом?

В MSSQL TempDB возникают две разные проблемы: конкуренция PAGELATCH на страницах PFS/GAM/SGAM (множество мелких временных объектов) или большая сортировка/version store, заполняющие 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;
  • Конкуренция за latch PFS/GAM/SGAM
  • Большая сортировка/version store заполняет TempDB

Первопричина: долгий запрос + недостаточный undo (ORA-01555)

Старый undo, нужный долгому запросу для согласованного чтения, был перезаписан, так как истёк срок хранения или не хватило пространства.

Первопричина: долгая/открытая транзакция заполнила undo (ORA-30036)

Один огромный DML или открытая транзакция с отложенным commit сгенерировали слишком много undo; табличное пространство UNDO не смогло расшириться, и возникла ORA-30036.

Первопричина: большая сортировка/хеширование заполняет временное пространство

Большие операции sort/hash/group by, не помещающиеся в память, вытесняются во временное пространство и могут его заполнить.

Первопричина: сессия удерживает временное пространство (утечка)

Одна сессия не освобождает временное пространство из-за незакрытых курсоров, бесконечного запроса или открытых временных таблиц.

Первопричина: конкуренция за latch PFS/GAM/SGAM в TempDB

Когда множество сессий одновременно создают мелкие временные объекты, на страницах карт выделения TempDB (PFS/GAM/SGAM) возникает конкуренция PAGELATCH.

Открыть в DBAtlas →