@@ -790,7 +790,9 @@ $regexp$
790790$regexp,ドル ' gx' ) as m;
791791```
792792
793- # Как правильно обрабатывать очередь?
793+ # Как правильно обрабатывать очередь?
794+ 795+ Самый простой вариант обработки очереди, но не самый эффективный.
794796
795797``` sql
796798delete from queue
@@ -811,4 +813,69 @@ returning *;
8118131 . Нашли запись: блокируем её и возвращаем
8128141 . Помечаем кортеж удаленным и ** держим транзакцию открытой**
8138151 . В случае сбоя транзакция откатится и строка окажется неудалённой снова
814- 1 . Хорошо работает, если вы находитесь в рамках одной БД и процесс обработки транзакции ** «достаточно быстрый»**
816+ 1 . Хорошо работает, если вы находитесь в рамках одной БД и процесс обработки транзакции ** «достаточно быстрый»**
817+ 818+ 819+ # Как определить, что таблицы в БД используются?
820+ 821+ ``` sql
822+ WITH t AS (
823+ SELECT
824+ a .rolname ,
825+ -- round((s.calls * 100 / sum(s.calls) over())::numeric, 2) as percent,
826+ s .calls ,
827+ d .datname ,
828+ -- s.query,
829+ qt .table_name
830+ 831+ FROM pg_stat_statements as s
832+ INNER JOIN pg_database as d ON d .oid = s .dbid
833+ INNER JOIN pg_authid as a ON a .oid = s .userid
834+ cross join pg_size_bytes(regexp_replace(trim (current_setting(' track_activity_query_size' )), ' (?<![a-zA-Z])B$' , ' ' )) as q(track_activity_query_size_bytes)
835+ inner join lateral (
836+ select distinct to_regclass(m .v [1 ])
837+ from regexp_matches(s .query , $regexp$
838+ \m
839+ (?:from |join |lateral)
840+ \s+
841+ (
842+ (?:[a- zA- Z_]+ [a- zA- Z_\d]* \. | " (?:[^" ]|" " )+ " \.)? #schema name
843+ [a-zA-Z_]+[a-zA-Z_\d]*\M | " (?:[^" ]|" " )+" # table name
844+ )
845+ (?![\(\)]) # not function like now()
846+ $regexp,ドル ' ixg' ) as m(v)
847+ ) as qt(table_name) on qt .table_name is not null
848+ WHERE true
849+ -- and s.query ~* '(^|\n)\s*\m(insert\s+into|update|delete|truncate)\M' --только DML запросы
850+ and s .query !~* ' (^|\n )\s *\m (insert\s +into|update|delete|truncate)\M ' -- исключая DML запросы
851+ -- по умолчанию текст запроса обрезается до 1024 байт; это число определяется параметром track_activity_query_size
852+ -- обрезанные запросы игнорируем
853+ and octet_length(s .query ) < q .track_activity_query_size_bytes
854+ and rolname not in (' postgres' )
855+ -- ORDER BY calls DESC, table_name::text -- самые популярные по кол-ву
856+ -- LIMIT 100
857+ )
858+ , s as (
859+ select t .datname ,
860+ t .table_name ,
861+ sum (t .calls ) as calls_total
862+ from t
863+ group by t .datname , t .table_name
864+ order by calls_total desc , t .datname , t .table_name
865+ limit 100
866+ )
867+ select s .datname as db_name,
868+ n .nspname as schema_name,
869+ c .relname as table_name,
870+ s .calls_total ,
871+ round((s .calls_total * 100 / sum (s .calls_total ) over())::numeric , 2 ) as calls_total_percent
872+ from s
873+ join pg_class as c on c .oid = s .table_name
874+ join pg_namespace n on n .oid = c .relnamespace
875+ where n .nspname not in (' information_schema' )
876+ order by s .calls_total desc ,
877+ s .datname ,
878+ n .nspname ,
879+ c .relname
880+ limit 100 ;
881+ ```
0 commit comments