2011-12-26 25 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 2011-12-26 10:28:42

+0

如果最低的OID是最舊的分區,則可以使用MIN(child.oid)來查找此分區。您可以使用它來查找此表的名稱和模式,並使用它來刪除此表。存儲過程使其更容易維護。 – 2011-12-26 11:27:21

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