WITH waiting_pids AS ( SELECT DISTINCT pid FROM pg_catalog.pg_locks WHERE NOT granted AND pid IS NOT NULL ), blocking_candidates AS ( SELECT DISTINCT blocking_locks.pid AS blocking_pid, blocked_locks.pid AS blocked_pid FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid != blocked_locks.pid WHERE NOT blocked_locks.granted AND blocking_locks.granted ), eligible_blockers AS ( SELECT DISTINCT bc.blocking_pid FROM blocking_candidates bc LEFT JOIN waiting_pids wp ON bc.blocking_pid = wp.pid WHERE wp.pid IS NULL -- блокирующая сессия НЕ ждёт ), metrics AS ( SELECT 'blocking' AS metric, COUNT() AS value FROM eligible_blockers UNION ALL SELECT 'waiting', COUNT() FROM waiting_pids ) SELECT DATE_TRUNC('second', NOW()) AT TIME ZONE 'Europe/Moscow' AS sample_time, MAX(CASE WHEN metric = 'blocking' THEN value ELSE 0 END) AS blocking_sessions, MAX(CASE WHEN metric = 'waiting' THEN value ELSE 0 END) AS waiting_sessions FROM metrics;
Нужно точно определить blocking Если это сессии получившие блокировку и удерживающие ее, тогда запрос неверный Проверка: 1-я сессия BEGIN;update lock_test set name = '2222'
where ID = 1; без COMMIT 2 -я сессия BEGIN;update lock_test
set name = '3333'
where ID = 1;COMMIT; 3-я сессия BEGIN;update lock_test
set name = '4444'
where ID = 1;COMMIT; Запрос возвращает 2,2 т.е. учитывает 2-ю сессию как blocking и как blocked Может определение blocking отличается от приведенного выше ? Если нужно пришлю запрос для этого определения
Добрый день!
Нужно четко сформулировать назначение продукта и ограничения по его использованию.
И от этого плясать.
Пока APEX(на мой взгляд) это пример от Oracle как нужно\не нужно писать интернет приложения c использованием БД.
Еще было бы интересно узнать про внутреннюю реализацию. Мониторю с точки зрения производительности одно приложение на APEX так там большая часть ожидания сети Не совсем понятно для чего вообще нужна мощь транзакционной БД.
Похоже на гланды будем рвать через… Или на БД Oracle можно сделать все, даже грабли
Но это мое личное впечатление :)
WITH waiting_pids AS (
SELECT DISTINCT pid
FROM pg_catalog.pg_locks
WHERE NOT granted
AND pid IS NOT NULL
),
blocking_candidates AS (
SELECT DISTINCT
blocking_locks.pid AS blocking_pid,
blocked_locks.pid AS blocked_pid
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
WHERE NOT blocked_locks.granted
AND blocking_locks.granted
),
eligible_blockers AS (
SELECT DISTINCT bc.blocking_pid
FROM blocking_candidates bc
LEFT JOIN waiting_pids wp ON bc.blocking_pid = wp.pid
WHERE wp.pid IS NULL -- блокирующая сессия НЕ ждёт
),
metrics AS (
SELECT 'blocking' AS metric, COUNT() AS value FROM eligible_blockers UNION ALL SELECT 'waiting', COUNT() FROM waiting_pids
)
SELECT
DATE_TRUNC('second', NOW()) AT TIME ZONE 'Europe/Moscow' AS sample_time,
MAX(CASE WHEN metric = 'blocking' THEN value ELSE 0 END) AS blocking_sessions,
MAX(CASE WHEN metric = 'waiting' THEN value ELSE 0 END) AS waiting_sessions
FROM metrics;
Нужно точно определить
blocking Если это сессии получившие блокировку и удерживающие ее, тогда запрос неверный Проверка: 1-я сессияBEGIN;update lock_test set name = '2222' where ID = 1; без COMMIT 2 -я сессия BEGIN;update lock_test set name = '3333' where ID = 1;COMMIT; 3-я сессия BEGIN;update lock_test set name = '4444' where ID = 1;COMMIT; Запрос возвращает 2,2 т.е. учитывает 2-ю сессию какblocking и как blocked Может определение blocking отличается от приведенного выше ? Если нужно пришлю запрос для этого определенияДобрый день! Каким запросом и как часто собираются
синяя — количество сессий, ожидающих ресурсы;
красная — количество сессий, удерживающих ресурсы ?
Добрый день! В чем измеряется производительность системы ? CPI это что ?
Нужно четко сформулировать назначение продукта и ограничения по его использованию.
И от этого плясать.
Пока APEX(на мой взгляд) это пример от Oracle как нужно\не нужно писать интернет приложения c использованием БД.
Еще было бы интересно узнать про внутреннюю реализацию. Мониторю с точки зрения производительности одно приложение на APEX так там большая часть ожидания сети Не совсем понятно для чего вообще нужна мощь транзакционной БД.
Похоже на гланды будем рвать через… Или на БД Oracle можно сделать все, даже грабли
Но это мое личное впечатление :)