Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f58b6d4

Browse files
author
Rinat Mukhtarov
committed
Как определить, что таблицы в БД используются?
1 parent fe87c38 commit f58b6d4

File tree

1 file changed

+69
-2
lines changed

1 file changed

+69
-2
lines changed

‎TODO.md‎

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,9 @@ $regexp$
790790
$regexp,ドル 'gx') as m;
791791
```
792792

793-
# Как правильно обрабатывать очередь?
793+
# Как правильно обрабатывать очередь?
794+
795+
Самый простой вариант обработки очереди, но не самый эффективный.
794796

795797
```sql
796798
delete from queue
@@ -811,4 +813,69 @@ returning *;
811813
1. Нашли запись: блокируем её и возвращаем
812814
1. Помечаем кортеж удаленным и **держим транзакцию открытой**
813815
1. В случае сбоя транзакция откатится и строка окажется неудалённой снова
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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /