@alenov
Программист

Как правильно указать имя таблицы в функции pg_relation_size?

Есть такой запрос для вывода размеров индексов в схеме public:
SELECT
    t.tablename,
    indexname,
    c.reltuples AS num_rows,
    pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
    pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
    CASE WHEN indisunique THEN 'Y'
       ELSE 'N'
    END AS UNIQUE,
    idx_scan AS number_of_scans,
    idx_tup_read AS tuples_read,
    idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
    ( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
           JOIN pg_class c ON c.oid = x.indrelid
           JOIN pg_class ipg ON ipg.oid = x.indexrelid
           JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
    AS foo
    ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 1,2;

Работает. Но нужно, например, определить размеры индексов в другой схеме, не public. Изменяю условие:
... WHERE t.schemaname='data' ...
Получаю ответ: relation "data_table" does not exist
где data_table - это таблица в схеме data. Пытаюсь указать схему:
... pg_size_pretty(pg_relation_size(quote_ident(t.schemaname || '.' || t.tablename)::text)) AS table_size ...

Получаю ответ: relation "data.data_table" does not exist.
Что не так, почему pg_relation_size не видит таблицы из другой схемы, даже если явно указать схему?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Передайте pg_class.oid и всё.
pg_size_pretty(pg_table_size(с.oid)) AS size,
pg_size_pretty(pg_indexes_size(с.oid)) AS idxsize,
pg_size_pretty(pg_total_relation_size(с.oid)) as "total"


Если загляните в определение pg_tables - то увидите, что это view от pg_class с фильтром relkind = 'r'. То есть объединение с pg_tables довольно лишнее.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы