This article provides a script to help administrators identify partition information in the database.
Note: Verify the script before running it on a production cluster.
This KB only applies to Greenplum 6.x.
List the tables that are partitioned and provide the total number of partitions and subpartitions in the table:
SELECT distinct m.schemaname||'.'||m.tablename "Relation Name", CASE WHEN p.tolpart IS NULL THEN 0 ELSE p.tolpart END AS "Total Parition", CASE WHEN s.tolsubpart IS NULL THEN 0 ELSE s.tolsubpart END AS "Total Subpartitions" FROM pg_partitions m LEFT JOIN (SELECT schemaname,tablename,count(*) tolpart FROM pg_partitions WHERE parentpartitiontablename IS NULL group by schemaname,tablename ) p ON p.schemaname=m.schemaname AND p.tablename=m.tablename LEFT JOIN (SELECT schemaname,tablename,count(*) tolsubpart FROM pg_partitions WHERE parentpartitiontablename IS NOT NULL group by schemaname,tablename) s ON s.schemaname=m.schemaname AND s.tablename=m.tablename ORDER BY 1;
If the table you want to query does not have subpartitions, perform the following queries.
Note:
<schemaname> and <tablename> with the schema and table names you want to query.
List all partition information for the table specified and provide its structural information:
SELECT p.schemaname||'.'||p.tablename "Relation Name",
p.partitionschemaname||'.'||p.partitiontablename "Partition Table",
p.partitionname "Name",
p.partitiontype "Type",
c.columnname "Partition Column",
p.partitionlevel "Level",
p.partitionrank "Rank",
p.partitionposition "Position",
CASE
WHEN p.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default"
FROM pg_partitions p , pg_partition_columns c
WHERE c.schemaname=p.schemaname
AND c.tablename=p.tablename
AND c.partitionlevel=p.partitionlevel
AND (p.schemaname,p.tablename)=('<schemaname>','<tablename>');
If the partition is of the type "Range", use the query below to access its partition criteria:
SELECT p.schemaname||'.'||p.tablename "Relation Name",
p.partitionschemaname||'.'||p.partitiontablename "Partition Table",
p.partitionname "Name",
p.partitiontype "Type",
c.columnname "Partition Column",
p.partitionrangestart "Start Range",
CASE
WHEN p.partitionstartinclusive='t' then 'YES'
ELSE 'NO'
END AS "Start Include",
p.partitionrangeend "End Range",
CASE
WHEN p.partitionendinclusive='t' then 'YES'
ELSE 'NO'
END AS "End Include",
CASE
WHEN p.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default"
FROM pg_partitions p, pg_partition_columns c
WHERE c.schemaname=p.schemaname
AND c.tablename=p.tablename
AND c.partitionlevel=p.partitionlevel
AND (p.schemaname,p.tablename)=('<schemaname>','<tablename>');
If the partition is of the type "List", use the query below to access its partition criteria:
SELECT p.schemaname||'.'||p.tablename "Relation Name",
p.partitionschemaname||'.'||p.partitiontablename "Partition Table",
p.partitionname "Name",
p.partitiontype "Type",
c.columnname "Partition Column",
p.partitionlistvalues "List Values",
CASE
WHEN p.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default"
FROM pg_partitions p , pg_partition_columns c
WHERE c.schemaname=p.schemaname
AND c.tablename=p.tablename
AND c.partitionlevel=p.partitionlevel
AND (p.schemaname,p.tablename)=('<schemaname>','<tablename>');
If the table you want to query contains subpartitions, use the queries below.
Notes:
<schemaname> and <tablename> with the schema and table names you want to query.<schemaname> and <partition tablename>, provide the schema name and partition name of the parent partition that holds the sub-partition.
List the partitions in the table, their partition criteria, and the total counts of sub-partitions:
SELECT distinct m.schemaname||'.'||m.tablename "Relation Name",
m.partitionschemaname||'.'||m.partitiontablename "Partition Table",
m.partitiontype "Type",
c.columnname "Column",
m.partitionrangestart "Start Range",
CASE
WHEN m.partitionstartinclusive='t' then 'YES'
ELSE 'NO'
END AS "Start Include",
m.partitionrangeend "End Range",
CASE
WHEN m.partitionendinclusive='t' then 'YES'
ELSE 'NO'
END AS "End Include",
m.partitionlistvalues "List Values",
CASE
WHEN m.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default",
CASE
WHEN s.tolsubpart IS NULL THEN 0
ELSE s.tolsubpart
END AS "Total Subpart's"
FROM pg_partitions m
LEFT JOIN (SELECT schemaname,tablename,parentpartitiontablename,count(*) tolsubpart FROM pg_partitions WHERE parentpartitiontablename IS NOT NULL group by schemaname,tablename,parentpartitiontablename) s
ON s.schemaname=m.schemaname
AND s.tablename=m.tablename
AND s.parentpartitiontablename=m.partitiontablename
LEFT JOIN pg_partition_columns c
ON c.schemaname=m.schemaname
AND c.tablename=m.tablename
AND c.partitionlevel=m.partitionlevel
WHERE m.parentpartitiontablename is NULL
AND (m.schemaname,m.tablename)=('<schemaname>','<tablename>')
ORDER BY 5;
Subpartition the parent partition structure information:
SELECT p.schemaname||'.'||p.tablename "Relation Name",
p.partitionschemaname||'.'||p.partitiontablename "Partition Table",
p.partitionname "Name",
p.partitiontype "Type",
c.columnname "Partition Column",
p.partitionlevel "Level",
p.partitionrank "Rank",
p.partitionposition "Position",
CASE
WHEN p.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default"
FROM pg_partitions p , pg_partition_columns c
WHERE p.parentpartitiontablename is NULL
AND c.schemaname=p.schemaname
AND c.tablename=p.tablename
AND c.partitionlevel=p.partitionlevel
AND (p.schemaname,p.tablename)=('<schemaname>','<tablename>');
Subpartition the structure information:
SELECT distinct p.schemaname||'.'||p.tablename "Relation Name",
p.partitionschemaname||'.'||p.partitiontablename "Partition Table",
s.partitionschemaname||'.'||s.partitiontablename "Subpartition Table",
s.partitionname "Name",
s.partitiontype "Type",
s.columnname "Column",
s.partitionlevel "Level",
s.partitionrank "Rank",
s.partitionposition "Position",
CASE
WHEN s.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default"
FROM pg_partitions p
LEFT JOIN (SELECT s.schemaname,
s.tablename,
partitionschemaname,
partitiontablename,
parentpartitiontablename,
partitionname,
partitiontype,
s.partitionlevel,
partitionrank,
partitionposition,
partitionisdefault,
columnname
FROM pg_partitions s
LEFT JOIN pg_partition_columns c
ON c.schemaname=s.schemaname
AND c.tablename=s.tablename
AND c.partitionlevel=s.partitionlevel
WHERE s.parentpartitiontablename is NOT NULL) s
ON s.schemaname=p.schemaname
AND s.tablename=p.tablename
AND s.parentpartitiontablename=p.partitiontablename
WHERE p.parentpartitiontablename is NULL
AND (p.schemaname,p.tablename)=('<schemaname>','<tablename>')
AND (p.schemaname,p.partitiontablename)=('<schemaname>','<partition tablename>')
ORDER BY 8;
If the subpartition is of the type "Range", use the query below to access its partition criteria:
SELECT distinct p.schemaname||'.'||p.tablename "Relation Name",
p.partitionschemaname||'.'||p.partitiontablename "Partition Table",
s.partitionschemaname||'.'||s.partitiontablename "Subpartition Table",
s.partitionname "Name",
s.partitiontype "Type",
s.columnname "Column",
s.partitionrangestart "Start Range",
CASE
WHEN s.partitionstartinclusive='t' then 'YES'
ELSE 'NO'
END AS "Start Include",
s.partitionrangeend "End Range",
CASE
WHEN s.partitionendinclusive='t' then 'YES'
ELSE 'NO'
END AS "End Include",
CASE
WHEN s.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default"
FROM pg_partitions p
LEFT JOIN (SELECT s.schemaname,
s.tablename,
partitionschemaname,
partitiontablename,
parentpartitiontablename,
partitionname,
partitiontype,
s.partitionlevel,
partitionrangestart,
partitionstartinclusive,
partitionrangeend,
partitionendinclusive,
partitionisdefault,
columnname
FROM pg_partitions s
LEFT JOIN pg_partition_columns c
ON c.schemaname=s.schemaname
AND c.tablename=s.tablename
AND c.partitionlevel=s.partitionlevel
WHERE s.parentpartitiontablename is NOT NULL) s
ON s.schemaname=p.schemaname
AND s.tablename=p.tablename
AND s.parentpartitiontablename=p.partitiontablename
WHERE p.parentpartitiontablename is NULL
AND (p.schemaname,p.tablename)=('<schemaname>','<tablename>')
AND (p.schemaname,p.partitiontablename)=('<schemaname>','<partition tablename>')
ORDER BY 3;
If subpartition is of the type "List", use the query below to access its partition criteria:
SELECT distinct p.schemaname||'.'||p.tablename "Relation Name",
p.partitionschemaname||'.'||p.partitiontablename "Partition Table",
s.partitionschemaname||'.'||s.partitiontablename "Subpartition Table",
s.partitionname "Name",
s.partitiontype "Type",
s.columnname "Column",
s.partitionlistvalues "List Values",
CASE
WHEN s.partitionisdefault='t' then 'YES'
ELSE 'NO'
END AS "Default"
FROM pg_partitions p
LEFT JOIN (SELECT s.schemaname,
s.tablename,
partitionschemaname,
partitiontablename,
parentpartitiontablename,
partitionname,
partitiontype,
s.partitionlevel,
partitionlistvalues,
partitionisdefault,
columnname
FROM pg_partitions s
LEFT JOIN pg_partition_columns c
ON c.schemaname=s.schemaname
AND c.tablename=s.tablename
AND c.partitionlevel=s.partitionlevel
WHERE s.parentpartitiontablename is NOT NULL) s
ON s.schemaname=p.schemaname
AND s.tablename=p.tablename
AND s.parentpartitiontablename=p.partitiontablename
WHERE p.parentpartitiontablename is NULL
AND (p.schemaname,p.tablename)=('<schemaname>','<tablename>')
AND (p.schemaname,p.partitiontablename)=('<schemaname>','<partition tablename>')
ORDER BY 3;
For more information on the columns in pg_partitions, please refer to the Greenplum documentation.