Давление на 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.