IMPDP con tablas particionadas

Hoy vamos a una entrada muy sencilla y corta, pero que puede salvarnos de algún que otro desastre.

¿Es posible truncar/reemplazar una única particion en una tabla durante un proceso de IMPDP?

La respuesta es rápida y clara . No
La documentacion de oracle indica claramente:
If you attempt to use Data Pump parameter table_exists_action=truncate, or even the replace option
be aware that the complete table will be truncated, not just the partition being imported!

Más información en la nota a a Single Partition be Truncated during Data Pump Import? (Doc ID 877792.1)

Mover tablas con subparticiones

Supongamos que tenemos una tabla llamada AGENTE , esta tabla agente está particionada por número de agente, y a su vez, particionada por trimestre.
Así pues tendremos que la estructura es mas o menos
PARTICIONADO

Y queremos mover estas particiones a un nuevo tablespace (TS_NEW). Lo primero que se nos pasa por la cabeza es el ejecutar:

alter table PROPIETARIO.AGENTE move partition  AG1  tablespace TS_NEW;

Pero Oracle nos devolverá el error

Error at line 1
ORA-14257: no se puede mover una partición que no sea de Rango, Lista, Sistema o Hash

Lo primero que nos viene a la cabeza es el preguntarnos donde está el error e ir a comprobar que tipo de partición tenemos, sin embargo, si aplicamos un poco el sentido común, veremos que lo que nos está indicando este error es que debemos de mover nuestra tabla subparticion a subparticion .
La sintaxsis correcta será:

alter table PROPIETARIO.AGENTE 
	move subpartition  PRIMER1
			tablespace TS_NEW;
alter table PROPIETARIO.AGENTE 
	move subpartition  PRIMER2 
				tablespace TS_NEW;
alter table PROPIETARIO.AGENTE
		move subpartition
			PRIMER3 tablespace TS_NEW;

Esta tarea puede ser realmente tediosa si nuestra tabla tiene un gran número de particiones y subparticiones, con lo que, lo mejor será hacer un script para moverla.
Lo primero que ha de hacerse en estos casos, es guardar la manera de volver a la situacion actual, esto lo conseguiremos con la salida del comando

select 'alter table'||
	    table_owner||
		'.'||
		table_name||
		' move subpartition '
		||subpartition_name||
		' tablespace '
		|| tablespace_name||
		' ;'
     		from  DBA_TAB_SUBPARTITIONS
   			where table_name='TABLA'

Una vez hemos guardado esta salida, podemos pasar a generar el script que nos moverá todas las subparticiones al nuevo tablespace TS_NEW

select 'alter table '
		||table_owner||
		'.'
		||table_name||
		' move subpartition '
		||subpartition_name||
		' tablespace 
		TS_NEW;' 
		    from  DBA_TAB_SUBPARTITIONS 
			 where table_name='TABLA'

Como siempre, mas información en la documentación de Oracle

Consultas sobre tablas particionadas

Nos hemos mudado a bloger!
El contenido actualizado de esta entrada lo tienes en:

    http://dba.pamplona.name/2013/12/consultas-sobre-tablas-particionadas.html

    Hola de nuevo.
    Tras un largo parón, vamos a volver con otra nueva entrada de SQL para dummies
    Vamos a ver algunas consultas interesantes para cuando se trabaja con tablas particionadas.

    Mover una particion de un tablespace a otro

    ALTER TABLE  MITABLA  MOVE PARTITION   PART_GRANDE 
         TABLESPACE TS_NUEVO NOLOGGING;
    
    

    Tamaño de las particiones

     select  b.TABLE_OWNER,
             b.TABLE_NAME,b.PARTITION_NAME,
             sum(a.bytes)/1024/1024 Mb 
      from
              dba_segments a,
             dba_tab_subpartitions b
      where 
           a.segment_name=b.table_name 
           and a.PARTITION_NAME=b.SUBPARTITION_NAME
      group by b.TABLE_OWNER,b.TABLE_NAME,b.PARTITION_NAME
      order by TABLE_NAME
    
    

    Tamaño de las particiones de una determinada tabla

    select 
       owner,
       segment_name,
       segment_type,
       partition_name,
       bytes/1024/1024 Mb
    from
        dba_segments 
    where segment_name='TABLA'