Attempting to perform an operation like:
TRUNCATE TABLE clustered_table;you've got the following error:
ORA-03292: Table to be truncated is part of a clusterthe data of the tables belonging to a cluster are all stored together in the same block, in other words a block (or more than one if necessary...) contains the data of the columns of multiple tables.
Imagine the rows in a join, typically you want to display one or more columns from table A side by side with columns taken from B. In a cluster you would find those values stored in a similar fashion, first the common key value, then the columns of table A, then the columns of table B and so on.
See a graphical representation of clusters in the Concepts book.
Table truncation is an expedite way of deleting the rows in a table by dropping or erasing the allocated blocks, depending on the optional DROP STORAGE or REUSE STORAGE clause you choose. In other terms, TRUNCATE works at the block level, not at the row level like a DELETE statement.
Therefore you should now understand why a cluster block containing data from multiple tables, cannot be drop or erased in the same easy way, unless you truncate the entire cluster.
Honestly, i thought that Oracle would allow an exception to this rule with single table hash clusters, but it doesn't, on the contrary, given a hash cluster, it will even complain if you try a TRUNCATE CLUSTER (see ORA-03293)!
So, it turns out that you can only truncate an entire cluster if the cluster type is indexed.
In conclusion, in order to erase the data of a single table, perform a DELETE statement, otherwise, for erasing all tables participating in a hash cluster, DROP and re-CREATE the cluster, finally, for erasing all tables in indexed clusters you can use TRUNCATE CLUSTER.
Clusters are meant to store data that doesn't change frequently and, given their nature, it is often required the development of specific loading programs, so dropping and recreating a cluster makes sense compared to traditional tables.
See message translations for ORA-03292 and search Oracle Documentation
No comments:
Post a Comment