Oracle-DB: List tables suitable for partition exchange
Partition Exchange requires a partitioned and a non-partitioned table with the same column and index structure. All indexes of the partitioned table have to be local partitioned.
The following SQL lists all combinations of structure-identical partitioned and non-partitioned tables that are suitable for partition exchange.
This information may be useful before changing the structure of tables or indexes to be informed about possible partition exchange operation and to prevent from crashing such operations.
The following SQL lists all combinations of structure-identical partitioned and non-partitioned tables that are suitable for partition exchange.
This information may be useful before changing the structure of tables or indexes to be informed about possible partition exchange operation and to prevent from crashing such operations.
WITH Tables AS (SELECT /*+ NO_MERGE MATERIALIZE */ tc.Owner, tc.Table_Name, COUNT(*) Columns,
SUM(ORA_HASH(tc.Data_Type) * tc.Column_ID * tc.Data_Length *
NVL(tc.Data_Precision,1) *
NVL(DECODE(tc.Data_Scale, 0, -1, tc.Data_Scale),1)) Structure_Hash
FROM DBA_Tab_Columns tc
JOIN DBA_Tables t ON t.Owner = tc.Owner AND t.Table_Name = tc.Table_Name /* exclude views */
WHERE tc.Owner NOT IN ('SYS', 'SYSTEM')
GROUP BY tc.Owner, tc.Table_Name
),
Part_Tables AS (SELECT /*+ NO_MERGE MATERIALIZE */ t.Owner, t.Table_Name, t.Partitioned
FROM DBA_Tables t
WHERE t.Partitioned = 'YES'
AND t.Owner NOT IN ('SYS', 'SYSTEM')
AND NOT EXISTS (SELECT 1 FROM DBA_Indexes i WHERE i.Table_Owner = t.Owner
AND i.Table_Name = t.Table_Name AND i.Partitioned = 'NO')
),
Indexes as (SELECT /*+ NO_MERGE MATERIALIZE */ ic.Table_Owner, ic.Table_Name,
COUNT(DISTINCT ic.Index_Name) Indexes, COUNT(*) Ind_Columns,
SUM(ic.Column_Position * ic.Column_Length ) Structure_Hash
FROM DBA_Ind_Columns ic
GROUP BY ic.Table_Owner, ic.Table_Name
),
Result_Tables AS (SELECT /*+ NO_MERGE MATERIALIZE */ t.Owner, t.Table_Name,
t.Structure_Hash Table_Structure_Hash,
i.Structure_Hash Index_Structure_Hash,
t.Columns, i.Indexes, i.Ind_Columns,
dt.Partitioned
FROM Tables t
LEFT OUTER JOIN Part_Tables dt ON dt.Owner = t.Owner AND dt.Table_Name = t.Table_Name
LEFT OUTER JOIN Indexes i ON i.Table_Owner = t.Owner AND i.Table_Name = t.Table_Name
)
SELECT t.Table_Structure_Hash, t.Index_Structure_Hash, t.Columns, t.Indexes, t.Ind_Columns,
t.Owner NonPart_Owner, t.Table_Name NonPart_TableName,
pt.Owner Part_Owner, pt.Table_Name Part_TableName
FROM Result_Tables t
JOIN Result_Tables pt ON pt.Table_Structure_Hash = t.Table_Structure_Hash
AND pt.Index_Structure_Hash = t.Index_Structure_Hash
AND pt.Columns = t.Columns
AND pt.Indexes = t.Indexes
AND pt.Ind_Columns = t.Ind_Columns
WHERE t.Partitioned IS NULL
AND pt.Partitioned = 'YES'
ORDER BY pt.Owner, pt.Table_Name, t.Owner, t.Table_Name
;
Comments
Post a Comment