Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить размеры индексов в произвольной схеме? / 3 сообщений из 3, страница 1 из 1
27.05.2018, 14:14
    #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
27.05.2018, 18:35
    #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
27.05.2018, 21:01
    #39650758
enchanter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить размеры индексов в произвольной схеме?
aceton, авторС именами связываться смысла нет, когда oid'ы под рукой.
Да, спасибо, это хорошая мысль. Всё получилось.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить размеры индексов в произвольной схеме? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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