2011-12-26 2 views

ответ

8

Это, как вы можете выбрать все имена разделов таблицы:

SELECT 
    nmsp_parent.nspname AS parent_schema, 
    parent.relname  AS parent, 
    nmsp_child.nspname AS child, 
    child.relname  AS child_schema 
FROM pg_inherits 
    JOIN pg_class parent  ON pg_inherits.inhparent = parent.oid 
    JOIN pg_class child   ON pg_inherits.inhrelid = child.oid 
    JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace 
    JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace 

Он может быть использован для подсчета, а также:

SELECT 
    nmsp_parent.nspname  AS parent_schema, 
    parent.relname   AS parent, 
    COUNT(*) 
FROM pg_inherits 
    JOIN pg_class parent  ON pg_inherits.inhparent = parent.oid 
    JOIN pg_class child  ON pg_inherits.inhrelid = child.oid 
    JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace 
    JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace 
GROUP BY 
    parent_schema, 
    parent; 
+0

Как удалить старый раздел? (Сначала был создан раздел?) – Shay

+0

Если самый низкий OID является самым старым разделом, вы можете использовать MIN (child.oid), чтобы найти этот раздел. Вы можете использовать это, чтобы найти имя и схему для этой таблицы и использовать ее для DROP этой таблицы. Хранимая процедура упрощает ее обслуживание. –

0

Этот вопрос стар. Но a new question on dba.SE ссылается на него, и я вынужден добавить более простое решение.

По вопросу, к ...

получить количество разделов, созданных в базе:

Использование inheritance и для конкретной родительской таблицы, я предполагаю:

SELECT count(*) AS partitions 
FROM pg_inherits i 
WHERE i.inhparent = 'my_schema.my_parent_tbl'::regclass; 

Подробнее о соответствующем ответе на dba.SE:
Get all partition names for a table