powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить размеры индексов в произвольной схеме?
3 сообщений из 3, страница 1 из 1
Как получить размеры индексов в произвольной схеме?
    #39650617
enchanter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такой запрос для вывода размеров индексов в схеме public:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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. Изменяю условие:
Код: sql
1.
... WHERE t.schemaname='data' ...


Получаю ответ: relation "data_table" does not exist
где data_table - это таблица в схеме data. Пытаюсь указать схему:
Код: sql
1.
... 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 не видит таблицы из другой схемы, даже если явно указать схему?
...
Рейтинг: 0 / 0
Как получить размеры индексов в произвольной схеме?
    #39650708
aceton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
enchanter,
вот так получше:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SELECT
	c.relname tablename,
	foo.indexname,
	c.reltuples AS num_rows,
	pg_size_pretty(pg_relation_size(c.oid)) AS table_size,
	pg_size_pretty(pg_relation_size(foo.index_oid)) 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_class c
 LEFT OUTER JOIN
    ( SELECT 
    		c.oid AS table_oid,
    		ipg.oid AS index_oid, 
    		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 c.oid = foo.table_oid
WHERE c.relkind in ('r'::"char", 'p'::"char")
	and c.relnamespace = 'public'::regnamespace
ORDER BY 1,2;


Посмотрите определение вьюхи pg_tables.
С именами связываться смысла нет, когда oid'ы под рукой.
"JOIN pg_class c ON t.tablename=c.relname" - объединение по имени без схемы?
...
Рейтинг: 0 / 0
Как получить размеры индексов в произвольной схеме?
    #39650758
enchanter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aceton, авторС именами связываться смысла нет, когда oid'ы под рукой.
Да, спасибо, это хорошая мысль. Всё получилось.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить размеры индексов в произвольной схеме?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]