SlideShare una empresa de Scribd logo
1 de 12
Descargar para leer sin conexión
DBA - Particionamiento
Una tabla Oracle, por defecto, es un sesgmento del tipo TABLE, y un segmento pertenece a un
tablespace concreto. Sin embargo, una tabla particionada está formada por varios segmentos (uno por
partición/subpartición), de modo que permite separar las particiones en diferentes tablespaces,
repartiendo la E/S, y además se puede operar a nivel de partición, de modo que el administrador tiene
más opciones a la hora de realizar labores de mantenimiento sobre una tabla; por ejemplo, puede poner
offline una sola partición, dejando el resto online, o mover una partición a otro tablespace, sin afectar
al resto, etc.
Lo que cuento a continuación está, en su mayor parte, extraído de
http://www.dataprix.com/blogs/respinosamilla/particionado-tablas-oracle. y del manual de conceptos
de particionamiento de Oracle.
El particionamiento es en gran medida una técnica de optimización que pretende mejorar los tiempos
de respuesta de las consultas, así como el mantenimiento de las tablas, y que puede ser especialmente
útil en tablas muy grandes.
El particionamiento fue introducido por primera vez en la versión 8 de Oracle para la gestión de
grandes cantidades de información, y para facilitar la tarea de los administradores de bases de datos.
Dependiendo de la versión de Oracle en la que estemos, tenemos diferentes tipos de particionado
disponibles:
• Oracle 8.0: particionamiento Range.
• Oracle 8i: además del particionado Range se añaden los tipos Hash y Composite.
• Oracle 9iR2/10g: se amplian con el tipo List y se permiten nuevas combinaciones de tipos en el
Particionamiento Composite.
• Oracle 11g: se introducen las columnas virtuales para particionar (que no existen fisicamente
en la tabla), así como el Particionamiento System (donde podemos gestionar directamente en
que partición de la tabla se insertan los registros) y el Particionamiento Interval.
Tipos de Particionamiento
Basicamente, el particionamiento se realiza utilizando una clave de particionado (partitioning key), que
determina en qué partición de las existentes en la tabla van a residir los datos que se insertan. Oracle
también permite realizar el particionado de indices y de tablas organizadas por indices. Cada partición
ademas puede tener sus propias propiedades de almacenamiento. Las tablas particionadas aparecen en
el sistema como una única tabla, realizando el sistema la gestión automatica de lectura y escritura en
cada una de las particiones (excepto para el caso de la partición de Sistema introducida en la versión
11g). La definición de las particiones se indica en la sentencia de creación de las tablas, con la sintaxis
oportuna para cada uno de los tipos.
• Particionamiento Range: la clave de particionado viene determinada por un rango de valores,
que determina la partición donde se almacenara un valor.
• Particionamiento Hash: la clave de particionado es una función hash, aplicada sobre una
columna, que tiene como objetivo realizar una distribución equitativa de los registros sobre las
diferentes particiones. Es útil para particionar tablas donde no hay unos criterios de
particionado claros, pero en la que se quiere mejor el rendimiento.
• Particionamiento List: la clave de particionado es una lista de valores, que determina cada una
de las particiones.
• Particionamiento Composite: los particionamientos anteriores eran del tipo simple (single o
one-level), pues utilizamos un unico método de particionado sobre una o mas columnas. Oracle
nos permite utilizar metodos de particionado compuestos, utilizando un primer particionado de
un tipo determinado, y luego para cada particion, realizar un segundo nivel de particionado
utilizando otro metodo. Las combinaciones son las siguientes (se han ido ampliando conforme
han ido avanzando las versiones): range-hash, range-list, range-range, list-range, list-list, list-
hash y hash-hash (introducido en la versión 11g).
• Particionamiento Interval: tipo de particionado introducido igualmente en la versión 11g. En
lugar de indicar los rangos de valores que van a determinar como se realiza el particionado, el
sistema automáticamente creara las particiones cuando se inserte un nuevo registro en la b.d.
Las técnicas de este tipo disponible son Interval, Interval List, Interval Range e Interval Hash
(por lo que el particionado Interval es complementario a las técnicas de particionado vistas
anteriormente).
• Particionamiento Reference: particiona una tabla del mismo modo en que lo está la tabla a la
que apunta mediante una FK, de este modo es muy fácil particionar del mismo modo 2 tablas
"maestro-detalle", pues solo tengo que definir el particionamiento en la tabla maestra (la q tiene
la PK) y en la tabla hija (la de la FK) usar PARTITION BY REFERENCE. Es nuevo en 11g.
• Particionamiento System: se define la tabla particionada indicando las particiones deseadas,
pero no se indica una clave de particionamiento. En este tipo de particionado, se delega la
gestión del particionamiento a las aplicaciones que utilicen la base de datos (por ejemplo, en las
sentencias sql de inserción deberemos de indicar en qué partición insertamos los datos). Es
nuevo en 11g.
Oracle nos permite definir sentencias SQL del tipo DML haciendo referencia a las particiones. Es lo
que llaman nombres de tabla con extension de partición (partition-extended table names). Por ejemplo,
podremos hacer un select sobre una tabla particionada indicando en la sintaxis la partición de la
queremos que se haga lectura. Por ejemplo:
SELECT * FROM schema.table PARTITION(part_name);
Esto es igualmente válido para las sentencias INSERT, UPDATE, DELETE, LOCK TABLE. Esta
sintaxis nos proporciona una forma simple de acceder a las particiones individuales como si fueran
tablas, y utilizarlas, por ejemplo, para la creación de vistas (utilizando la vista en lugar de la tabla), lo
que nos puede ser útil en muchas situaciones.
Ejemplos de cada tipo de Particionamiento
Particionado Range
El Particionamiento Range requiere que los registros estén identificados por un “partition key”, y el
valor de las columnas “partition key” determina la partición a la cual pertenecerá el registro.
CREATE TABLE sales
( prod_id NUMBER(6)
, cust_id NUMBER
, time_id DATE
, channel_id CHAR(1)
, promo_id NUMBER(6)
, quantity_sold NUMBER(3)
, amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-
2006','dd-MON-yyyy')) TABLESPACE tsa
, PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-
2006','dd-MON-yyyy')) TABLESPACE tsb
, PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-
2006','dd-MON-yyyy')) TABLESPACE tsc
, PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-
2007','dd-MON-yyyy')) TABLESPACE tsd
);
Este tipo de particionamiento es interesante cuando se tienen datos con un rango lógico y que pueden
ser distribuidos por este. Ej. Mes del Año o un valor numérico.
Particionado Hash
En el Particionamiento Hash se aplica una función hash a la partition key, y el resultado de dicha
función hash determina a qué partición irá el registro. Es una forma automática de balancear la E/S con
el particionamiento. En el ejemplo siguiente vemos una definición sin indicar los nombres de las
particiones (solo el número de particiones):
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
PARTITION BY HASH(deptno) PARTITIONS 16;
Igualmente, se pueden indicar los nombres de cada particion individual o los tablespaces donde se
localizaran cada una de ellas:
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
STORAGE (INITIAL 10K)
PARTITION BY HASH(deptno)
(PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2,
PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3);
Lo q dice el manual de Oracle del particionamiento hash:
• Cuando usar particionamiento hash: básicamente para repartir la E/S (cuando no existe un
sistema de almacenamiento q haga striping), y paralelizar las consultas ...
• Añadir una partición: Oracle elige una de las q ya existen y la divide en 2.
• Unir 2 particiones (coalesce): lo contrario del caso anterior (Oracle elige 2 y las funde en
una).
• Como crear una tabla particionada e índices: aquí explica q con "create index ... local;"
Oracle crea un índice con el mismo particionamiento q la tabla correspondiente (además
se puede especificar el tablespace y/o los nombres de las particiones).
Particionado List
El Particionamiento List fue añadido por Oracle en la versión 9, permitiendo determinar el
particionado según una lista de valores definidos sobre el valor de una columna especifica.
CREATE TABLE sales_list (salesman_id NUMBER(5), salesman_name
VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois')
PARTITION sales_other VALUES(DEFAULT)
);
Este particionado tiene algunas limitaciones, como que no soporta múltiples columnas en la clave de
particionado, los valores literales deben ser únicos en la lista, permitiendo el uso del valor NULL
(aunque no el valor MAXVALUE, que si puede ser utilizado en particiones del tipo Range). El valor
DEFAULT sirve para definir la partición donde irán el resto de registros que no cumplen ninguna
condición de las diferentes particiones.
Particionamiento Composite
El Particionamiento Composite combina el uso de dos particionados a la vez. Veamos un ejemplo
utilizando el tipo RANGE y el HASH. En primer lugar, hace un particionado del tipo RANGE
utilizando rangos de años. En segundo lugar, para cada partición definida por cada año, hacemos un
segundo particionado (subparticion) del tipo aleatorio (HASH) por el valor de otra columna:
CREATE TABLE TAB2 (ord_id NUMBER(10),
ord_day NUMBER(2),
ord_month NUMBER(2),
ord_year NUMBER(4)
)
PARTITION BY RANGE(ord_year)
SUBPARTITION BY HASH(ord_id)
SUBPARTITIONS 8
( PARTITION q1 VALUES LESS THAN(2001)
( SUBPARTITION q1_h1 TABLESPACE TBS1,
SUBPARTITION q1_h2 TABLESPACE TBS2,
SUBPARTITION q1_h3 TABLESPACE TBS3,
SUBPARTITION q1_h4 TABLESPACE TBS4
),
PARTITION q2 VALUES LESS THAN(2002)
( SUBPARTITION q2_h5 TABLESPACE TBS5,
SUBPARTITION q2_h6 TABLESPACE TBS6,
SUBPARTITION q2_h7 TABLESPACE TBS7,
SUBPARTITION q2_h8 TABLESPACE TBS8
),
PARTITION q3 VALUES LESS THAN(2003)
( SUBPARTITION q3_h1 TABLESPACE TBS1,
SUBPARTITION q3_h2 TABLESPACE TBS2,
SUBPARTITION q3_h3 TABLESPACE TBS3,
SUBPARTITION q3_h4 TABLESPACE TBS4
),
PARTITION q4 VALUES LESS THAN(2004)
( SUBPARTITION q4_h5 TABLESPACE TBS5,
SUBPARTITION q4_h6 TABLESPACE TBS6,
SUBPARTITION q4_h7 TABLESPACE TBS7,
SUBPARTITION q4_h8 TABLESPACE TBS8
)
)
Las combinaciones permitidas son las siguientes (se han ido ampliando conforme han ido avanzando
las versiones de Oracle): range-hash, range-list, range-range, list-range, list-list, list-hash y hash-hash
(introducido en la versión 11g).
Particionado Interval
El Particionamiento Interval ha sido introducido en la versión 11g para habilitar la creación dinámica
de particiones al particionar por rango (RANGE). Normalmente, cuando realizamos un particionado
sobre una tabla, indicamos una lista de valores o rangos para crear de antemano las particiones.
Posteriormente, ajustamos la definición de las particiones para incluir nuevas para nuevos rangos o
valores. Con el particionamiento Interval, Oracle crea las particiones de forma automática cuando lo
necesita. Básicamente, se define un intervalo y una directiva para decirle a Oracle como se tiene que
comportar. Veamos un ejemplo:
CREATE TABLE T_11G(C1 NUMBER(38,0),
C2 VARCHAR2(10),
C3 DATE)
PARTITION BY RANGE (C3) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
(PARTITION P0902 VALUES LESS THAN (TO_DATE('2009-03-01
00:00:00','YYYY-MM-DD HH24:MI:SS')));
Hemos creado una partición base, y con lo especificado en Interval definimos como gestionar la
creación automática de nuevas particiones. La posibilidad de definir un intevalo y que Oracle se
encargue de crear las particiones a medida que se vayan necesitando resulta muy interesante para
facilitar el mantenimiento y administración de particiones.
Particionado System
El Particionamiento System es una de las nuevas funcionalidades introducida en la version 11g, y
también se denomina particionamiento interno o de sistema. En este particionado Oracle no realiza la
gestión del lugar donde se almacenarán los registros, sino que seremos nosotros los que tendremos que
indicar en que partición se hacen las inserciones.
create table t (c1 int,
c2 varchar2(10),
c3 date)
partition by system
(partition p1,
partition p2,
partition p3);
Si hicieramos un insert sobre la tabla (por ejemplo, insert into t values
(1,’A',sysdate);), daría error, siendo la instrucción a ejecutar correcta la siguiente:
insert into t partition (p3) values (1,’A',sysdate);
Puede ser util este particionado cuando nos interesa particionar en función de la lógica de la aplicación.
Uso de columnas virtuales para particionar
En la versión 11g se pueden definir en las tablas columnas virtuales (no existen físicamente). Ademas
estas columnas se pueden utilizar para realizar particionado sobre ellas. La forma de crear una tabla
con columnas de este tipo sería la siguiente:
create table t (c1 int,
c2 varchar2(10),
c3 date,
c3_v char(1)
generated always as
(to_char(c3,'d')) virtual
)
partition by list (c3_v)
(partition p1 values ('1'),
partition p2 values ('2'),
partition p3 values ('3'),
partition p4 values ('4'),
partition p5 values ('5'),
partition p6 values ('6'),
partition p7 values ('7') );
Gestión del particionado
Se pueden añadir particiones a una tabla particionada existente, juntar o borrar particiones, convertir
una particion en una tabla no particionada, dividir una partición en dos (Splitting), hacer un truncate
(borra los datos de la partición pero deja la estructura). También podemos mover una partición de un
tablespace a otro, renombrarla, etc. Os recomiendo la lectura del Database Design que también habla
sobre el tema.
Enlaces sobre Particionamiento y nuevas funcionalidades en 11g
 En castellano:
 http://www.dataprix.com/blogs/respinosamilla/particionado-tablas-oracle
 http://oramdq.blogspot.com.es/2009/02/lo-nuevo-en-particionamiento-de-tablas.html
 Database Design
 En inglés:
 http://www.orafaq.com/node/1912
 http://www.dba-oracle.com/t_interval_partitioning.htm
 http://www.oracle-base.com/articles/11g/partitioning-enhancements-11gr1.php
FAQ
• No se puede particionar por una columna "timestamp with time zone", da un error ORA-3001
de "funcionalidad no implementada". Sí podremos usar una columna "timestamp" normal
• Si la tabla está particionada por rango (o intervalos), y nos interesa particionar los índices
únicos de forma local, sería necesario que la clave de particionamiento formase parte de ellos.
En el siguiente ejemplo la clave de particionamiento es LOGS_FECHA:
create unique index uk_LOGS_FIND on LOGATICA.LOGATICA_LOGS
(LOGS_APLICACION, LOGS_FECHA, LOGS_NIVEL, LOGS_LOUR_CODIGO)
local tablespace indlogatica storage (initial 2M next 2M
maxextents 1 pctincrease 0);
DBA - Convertir Tabla Normal en Particionada
Si queremos "convertir" una tabla normal T1 en particionada, podemos hacerlo creando una tabla T2 igual que la
original, pero particioinada, y después usaremos el paquete DBMS_REDEFINITION para que T2 pase a ser T1
todos los datos, índices y constraints que tenía T1, y finalmente borraremos T2.
En primer lugar, necesitamos los permisos que nos dice el Manual de Oracle.
EJEMPLO SIMPLE
- Creamos la tabla T2 particionada (con las mismas columnas que tenga T1)
create table t2
(username varchar2(30),
user_id number,
created date)
partition by hash(user_id) partitions 8;
Table created.
- Iniciamos el proceso de "redifinición" de T1 comprobando si es posible hacerlo:
exec dbms_redefinition.can_redef_table( user, 'T1' );
PL/SQL procedure successfully completed.
- Si la comprobación anterior no falla, le decimos a Oracle que vamos a redifinir T1 en base a T
exec dbms_redefinition.start_redef_table( user, 'T1', 'T2' );
PL/SQL procedure successfully completed.
- Le decimos que copie las dependencias que tenía T1
variable nerrors number
begin
dbms_redefinition.copy_table_dependents ( user, 'T1', 'T2',
copy_indexes => dbms_redefinition.cons_orig_params,
num_errors => :nerrors );
end;
/
PL/SQL procedure successfully completed.
- Finalmente le decimos que hemos terminado:
exec dbms_redefinition.finish_redef_table( user, 'T1', 'T2' );
PL/SQL procedure successfully completed.
EJEMPLO REAL
Vamos a convertir la tabla LOGATICA_LOGS (no particionada) en particionada, tal y como indica la tabla
LOGATICA_LOGS2 (particionada por rango con intervalo de 3 meses):
- Script para redefinir la tabla LOGATICA_LOGS:
SQL> !cat redefinir_logatica.sql
set serveroutput on
exec dbms_redefinition.can_redef_table( 'LOGATICA', 'LOGATICA_LOGS',
DBMS_REDEFINITION.CONS_USE_PK );
exec dbms_redefinition.start_redef_table( 'LOGATICA', 'LOGATICA_LOGS',
'LOGATICA_LOGS2' );
variable nerrors number
begin
dbms_redefinition.copy_table_dependents ( 'LOGATICA', 'LOGATICA_LOGS',
'LOGATICA_LOGS2',
copy_indexes => dbms_redefinition.cons_orig_params,
ignore_errors => TRUE,
num_errors => :nerrors );
end;
/
select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS;
exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('LOGATICA', 'LOGATICA_LOGS',
'LOGATICA_LOGS2')
exec dbms_redefinition.finish_redef_table( 'LOGATICA', 'LOGATICA_LOGS',
'LOGATICA_LOGS2' );
- Compruebo si el proceso de redefinición es posible
SQL> set serveroutput on
SQL> exec dbms_redefinition.can_redef_table( 'LOGATICA', 'LOGATICA_LOGS',
DBMS_REDEFINITION.CONS_USE_PK );
PL/SQL procedure successfully completed.
- Creo la tabla destino (como quedará una vez finalizado el proceso)
SQL> @crea_tab_logatica2.sql
Table created.
- Inicio el proceso de redefinición
SQL> exec dbms_redefinition.start_redef_table( 'LOGATICA', 'LOGATICA_LOGS',
'LOGATICA_LOGS2' );
PL/SQL procedure successfully completed.
- Copio las dependencias, indicando que ignore los errores (pues la tabla destino,
LOGATICA_LOGS2, ya tiene la 3 constraints NOT NULL que existen en LOGATICA_LOGS)
SQL> variable nerrors number
begin
dbms_redefinition.copy_table_dependents ( 'LOGATICA', 'LOGATICA_LOGS',
'LOGATICA_LOGS2',
copy_indexes => dbms_redefinition.cons_orig_params,
ignore_errors => TRUE,
num_errors => :nerrors );
end;
/
PL/SQL procedure successfully completed.
- Compruebo los errores para asegurarme que solo estan los 3 NOT NULL
SQL> select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERR
OBJECT_NAME BASE_TABLE_NAME
------------------------------ ------------------------------
DDL_TXT
---------------------------------------------------------------------------
SYS_C00477007 LOGATICA_LOGS
ALTER TABLE "LOGATICA"."LOGATICA_LOGS2" MODIFY ("LOGS_APLICACION" CONSTRAIN
SYS_C00477006 LOGATICA_LOGS
ALTER TABLE "LOGATICA"."LOGATICA_LOGS2" MODIFY ("LOGS_SECUENCIA" CONSTRAINT
SYS_C00491401 LOGATICA_LOGS
ALTER TABLE "LOGATICA"."LOGATICA_LOGS2" MODIFY ("LOGS_FECHA" CONSTRAINT "TM
- "Refresco" la redefinición
SQL> exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('LOGATICA', 'LOGATICA_LOGS',
'LOGATICA_LOGS2')
PL/SQL procedure successfully completed.
- Termino el proceso
SQL> exec dbms_redefinition.finish_redef_table( 'LOGATICA', 'LOGATICA_LOGS'
'LOGATICA_LOGS2' );
PL/SQL procedure successfully completed.
ENLACES
• DBMS_REDEFINITION en Manual de Oracle
• Artículo en OraFAQs
• Pregunta sobre el tema en Ask Tom
FAQ
• Si queremos cancelar el proceso de "redefinición" lo haremos con
exec dbms_redefinition.ABORT_REDEF_TABLE('NombreUsuario','T1', 'T2');
• Si el proceso se alarga, podemos "refrescarlo" con
exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('NombreUsuario', 'T1', 'T2');
• Podemos obtener una "copia de seguridad" de la sentencia DDL de creación de la tabla con
SELECT DBMS_METADATA.GET_DDL('TABLE','NombreUsuario', 'T1') FROM DUAL;
• Y de los índices con
SELECT DBMS_METADATA.GET_DDL('INDEX','NombreUsuario', 'NombreIndice') FROM DUAL;
• No se puede "redefinir" la tabla si las columnas no son exactamente iguales, por lo que da un error ORA-
T1 tiene una columna "timestamp with time zone" y en T2 es "timestamp" SIN "time zone".
• No se puede particionar por una columna "timestamp with time zone", da un error ORA-3001 de "funcio
no implementada". Sí podremos usar una columna "timestamp" normal
• Si la tabla está particionada por rango (o intervalos), y nos interesa particionar los índices únicos de form
sería necesario que la clave de particionamiento formase parte de ellos. En el siguiente ejemplo la clave d
particionamiento es LOGS_FECHA:
create unique index uk_LOGS_FIND on LOGATICA.LOGATICA_LOGS
(LOGS_APLICACION, LOGS_FECHA, LOGS_NIVEL, LOGS_LOUR_CODIGO)
local tablespace indlogatica storage (initial 2M next 2M maxextents 1
pctincrease 0);

Más contenido relacionado

La actualidad más candente

Comandos de configuracion vfp
Comandos de configuracion vfpComandos de configuracion vfp
Comandos de configuracion vfphmosquera
 
Presentacion oracle9 i
Presentacion oracle9 iPresentacion oracle9 i
Presentacion oracle9 iLorena Duque
 
Un lenguaje de bases de datos relacionales
Un lenguaje de bases de datos relacionalesUn lenguaje de bases de datos relacionales
Un lenguaje de bases de datos relacionalesJennifer Montano
 
4. sql (autoguardado)
4. sql (autoguardado)4. sql (autoguardado)
4. sql (autoguardado)felpe33
 
Clente servidor consultas sql
Clente servidor consultas sqlClente servidor consultas sql
Clente servidor consultas sqlDiego Bladimir
 
DDL - Lenguaje de definición de datos
DDL - Lenguaje de definición de datosDDL - Lenguaje de definición de datos
DDL - Lenguaje de definición de datosvargasaldanajohanna
 
Sql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datosSql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datosjosecuartas
 
Intro sql y plsql
Intro sql y plsqlIntro sql y plsql
Intro sql y plsqlolsoftware
 
Desarrollo taller bases de datos
Desarrollo taller bases de datosDesarrollo taller bases de datos
Desarrollo taller bases de datosorus004
 
Técnicas avanzadas de consultas con sql server 2014
Técnicas avanzadas de consultas con sql server 2014Técnicas avanzadas de consultas con sql server 2014
Técnicas avanzadas de consultas con sql server 2014JOSE AHIAS LOPEZ PORTILLO
 
Bases de datos módulo 3 el lenguaje sql
Bases de datos módulo 3 el lenguaje sqlBases de datos módulo 3 el lenguaje sql
Bases de datos módulo 3 el lenguaje sqlFreddyRomana
 

La actualidad más candente (20)

Lenguaje sql
Lenguaje sqlLenguaje sql
Lenguaje sql
 
Tablas en Oracle
Tablas en OracleTablas en Oracle
Tablas en Oracle
 
Comandos de configuracion vfp
Comandos de configuracion vfpComandos de configuracion vfp
Comandos de configuracion vfp
 
Presentacion oracle9 i
Presentacion oracle9 iPresentacion oracle9 i
Presentacion oracle9 i
 
Vistas
VistasVistas
Vistas
 
Un lenguaje de bases de datos relacionales
Un lenguaje de bases de datos relacionalesUn lenguaje de bases de datos relacionales
Un lenguaje de bases de datos relacionales
 
Curso sql
Curso sqlCurso sql
Curso sql
 
Indices en oracle
Indices en oracleIndices en oracle
Indices en oracle
 
4. sql (autoguardado)
4. sql (autoguardado)4. sql (autoguardado)
4. sql (autoguardado)
 
Clente servidor consultas sql
Clente servidor consultas sqlClente servidor consultas sql
Clente servidor consultas sql
 
Lenguaje Sql
Lenguaje SqlLenguaje Sql
Lenguaje Sql
 
DDL - Lenguaje de definición de datos
DDL - Lenguaje de definición de datosDDL - Lenguaje de definición de datos
DDL - Lenguaje de definición de datos
 
Sql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datosSql DDL Lenguaje de definición de datos
Sql DDL Lenguaje de definición de datos
 
Intro sql y plsql
Intro sql y plsqlIntro sql y plsql
Intro sql y plsql
 
Unidad 6 Lenguaje Sql
Unidad 6 Lenguaje SqlUnidad 6 Lenguaje Sql
Unidad 6 Lenguaje Sql
 
Desarrollo taller bases de datos
Desarrollo taller bases de datosDesarrollo taller bases de datos
Desarrollo taller bases de datos
 
Técnicas avanzadas de consultas con sql server 2014
Técnicas avanzadas de consultas con sql server 2014Técnicas avanzadas de consultas con sql server 2014
Técnicas avanzadas de consultas con sql server 2014
 
Manipulacion de Bases de Datos
Manipulacion de Bases de DatosManipulacion de Bases de Datos
Manipulacion de Bases de Datos
 
Db2 (2)
Db2 (2)Db2 (2)
Db2 (2)
 
Bases de datos módulo 3 el lenguaje sql
Bases de datos módulo 3 el lenguaje sqlBases de datos módulo 3 el lenguaje sql
Bases de datos módulo 3 el lenguaje sql
 

Destacado

SolarCity Investors _ Nov 2015
SolarCity  Investors _ Nov 2015SolarCity  Investors _ Nov 2015
SolarCity Investors _ Nov 2015Dmitry Tseitlin
 
Perda Nunukan Izin Usaha hotel dan penginapan
Perda Nunukan Izin Usaha hotel dan penginapanPerda Nunukan Izin Usaha hotel dan penginapan
Perda Nunukan Izin Usaha hotel dan penginapanArifuddin Ali
 
4. pedagogia-progresista
4. pedagogia-progresista4. pedagogia-progresista
4. pedagogia-progresistaEmy Fuentes
 
Perfil de la carrera de derecho
Perfil de la carrera de derechoPerfil de la carrera de derecho
Perfil de la carrera de derecho0401jpchxmorro
 
74.01 tp1.1-2013-2 c-g8 planta estructura
74.01 tp1.1-2013-2 c-g8 planta estructura74.01 tp1.1-2013-2 c-g8 planta estructura
74.01 tp1.1-2013-2 c-g8 planta estructuraMarco Ugaz Balladares
 
31 Video Content Strategies
31 Video Content Strategies31 Video Content Strategies
31 Video Content StrategiesCatherine Heeg
 
Universidad regional autonoma de los andes
Universidad regional autonoma de los andesUniversidad regional autonoma de los andes
Universidad regional autonoma de los andesandy711
 
Formación en estrategias pedagógicas utilizando las tic
Formación en estrategias pedagógicas utilizando las ticFormación en estrategias pedagógicas utilizando las tic
Formación en estrategias pedagógicas utilizando las ticGuissella2015
 
Issue 2 NTEU Chapter 164 newsletter
Issue 2 NTEU Chapter 164 newsletterIssue 2 NTEU Chapter 164 newsletter
Issue 2 NTEU Chapter 164 newsletterNTEU Chapter 164
 

Destacado (14)

SolarCity Investors _ Nov 2015
SolarCity  Investors _ Nov 2015SolarCity  Investors _ Nov 2015
SolarCity Investors _ Nov 2015
 
Presentacion diapositivas
Presentacion diapositivasPresentacion diapositivas
Presentacion diapositivas
 
Perda Nunukan Izin Usaha hotel dan penginapan
Perda Nunukan Izin Usaha hotel dan penginapanPerda Nunukan Izin Usaha hotel dan penginapan
Perda Nunukan Izin Usaha hotel dan penginapan
 
4. pedagogia-progresista
4. pedagogia-progresista4. pedagogia-progresista
4. pedagogia-progresista
 
Perfil de la carrera de derecho
Perfil de la carrera de derechoPerfil de la carrera de derecho
Perfil de la carrera de derecho
 
LPP Profile_capabilities page A
LPP Profile_capabilities page ALPP Profile_capabilities page A
LPP Profile_capabilities page A
 
Consejos de supervivencias
Consejos de supervivenciasConsejos de supervivencias
Consejos de supervivencias
 
74.01 tp1.1-2013-2 c-g8 planta estructura
74.01 tp1.1-2013-2 c-g8 planta estructura74.01 tp1.1-2013-2 c-g8 planta estructura
74.01 tp1.1-2013-2 c-g8 planta estructura
 
31 Video Content Strategies
31 Video Content Strategies31 Video Content Strategies
31 Video Content Strategies
 
Universidad regional autonoma de los andes
Universidad regional autonoma de los andesUniversidad regional autonoma de los andes
Universidad regional autonoma de los andes
 
Formación en estrategias pedagógicas utilizando las tic
Formación en estrategias pedagógicas utilizando las ticFormación en estrategias pedagógicas utilizando las tic
Formación en estrategias pedagógicas utilizando las tic
 
Scuff20160019
Scuff20160019Scuff20160019
Scuff20160019
 
Issue 2 NTEU Chapter 164 newsletter
Issue 2 NTEU Chapter 164 newsletterIssue 2 NTEU Chapter 164 newsletter
Issue 2 NTEU Chapter 164 newsletter
 
Defense Ver. 2
Defense Ver. 2Defense Ver. 2
Defense Ver. 2
 

Similar a Part tab (20)

Curso oracle por temas
Curso oracle por temasCurso oracle por temas
Curso oracle por temas
 
Tablas
TablasTablas
Tablas
 
Dbd04 t06 oracle
Dbd04 t06 oracleDbd04 t06 oracle
Dbd04 t06 oracle
 
Taba y tipos de datos
Taba y tipos de datosTaba y tipos de datos
Taba y tipos de datos
 
Tablas y tipos de datos
Tablas y tipos de datosTablas y tipos de datos
Tablas y tipos de datos
 
Data warehouse
Data warehouseData warehouse
Data warehouse
 
Data warehouse
Data warehouseData warehouse
Data warehouse
 
Data werehousing
Data werehousingData werehousing
Data werehousing
 
Manejo De Sentencias De Definicion
Manejo De Sentencias De DefinicionManejo De Sentencias De Definicion
Manejo De Sentencias De Definicion
 
Sql dinamico14042011
Sql dinamico14042011Sql dinamico14042011
Sql dinamico14042011
 
SQL avanzado
SQL avanzadoSQL avanzado
SQL avanzado
 
SQL
SQLSQL
SQL
 
SQL-2022-2023.pptx
SQL-2022-2023.pptxSQL-2022-2023.pptx
SQL-2022-2023.pptx
 
Abf leccion 10
Abf leccion 10Abf leccion 10
Abf leccion 10
 
Base de datos
Base de datosBase de datos
Base de datos
 
lenguaje transact
lenguaje transactlenguaje transact
lenguaje transact
 
lenguaje transact
lenguaje transactlenguaje transact
lenguaje transact
 
Conceptos basicos
Conceptos basicosConceptos basicos
Conceptos basicos
 
Diagramas ER
Diagramas ERDiagramas ER
Diagramas ER
 
Grupo3
Grupo3Grupo3
Grupo3
 

Último

SENSICO CURSO DE EXPEDIENTE TECNICO DE OBRAS
SENSICO CURSO DE EXPEDIENTE TECNICO DE OBRASSENSICO CURSO DE EXPEDIENTE TECNICO DE OBRAS
SENSICO CURSO DE EXPEDIENTE TECNICO DE OBRASpaotavo97
 
Portafolio de Diseño Gráfico por Giorgio B Huizinga
Portafolio de Diseño Gráfico por Giorgio B HuizingaPortafolio de Diseño Gráfico por Giorgio B Huizinga
Portafolio de Diseño Gráfico por Giorgio B Huizingagbhuizinga2000
 
TIPOS DE LINEAS utilizados en dibujo técnico mecánico
TIPOS DE LINEAS utilizados en dibujo técnico mecánicoTIPOS DE LINEAS utilizados en dibujo técnico mecánico
TIPOS DE LINEAS utilizados en dibujo técnico mecánicoWilsonChambi4
 
Maquetas-modelos-prototipos-Mapa mental-.pdf
Maquetas-modelos-prototipos-Mapa mental-.pdfMaquetas-modelos-prototipos-Mapa mental-.pdf
Maquetas-modelos-prototipos-Mapa mental-.pdforianaandrade11
 
Slaimen Barakat - SLIDESHARE TAREA 2.pdf
Slaimen Barakat - SLIDESHARE TAREA 2.pdfSlaimen Barakat - SLIDESHARE TAREA 2.pdf
Slaimen Barakat - SLIDESHARE TAREA 2.pdfslaimenbarakat
 
LAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdf
LAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdfLAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdf
LAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdfBrbara57940
 
Jesus Diaz afiche Manierismo .pdf arquitectura
Jesus Diaz afiche Manierismo .pdf arquitecturaJesus Diaz afiche Manierismo .pdf arquitectura
Jesus Diaz afiche Manierismo .pdf arquitecturajesusgrosales12
 
TRABAJO DESDE CASA REGION INSULAR.docx.pdf
TRABAJO DESDE CASA REGION INSULAR.docx.pdfTRABAJO DESDE CASA REGION INSULAR.docx.pdf
TRABAJO DESDE CASA REGION INSULAR.docx.pdfDamarysNavarro1
 
APORTES Y CARACTERISTICAS DE LAS OBRAS DE CORBUSIER. MIES VAN DER ROHE
APORTES Y CARACTERISTICAS DE LAS OBRAS DE  CORBUSIER. MIES VAN DER ROHEAPORTES Y CARACTERISTICAS DE LAS OBRAS DE  CORBUSIER. MIES VAN DER ROHE
APORTES Y CARACTERISTICAS DE LAS OBRAS DE CORBUSIER. MIES VAN DER ROHEgonzalezdfidelibus
 
CERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdf
CERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdfCERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdf
CERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdfasnsdt
 
Presentacion de 100 psicologos dijeron.pptx
Presentacion de 100 psicologos dijeron.pptxPresentacion de 100 psicologos dijeron.pptx
Presentacion de 100 psicologos dijeron.pptxbarbaracantuflr
 
plantilla-de-messi-1.pdf es muy especial
plantilla-de-messi-1.pdf es muy especialplantilla-de-messi-1.pdf es muy especial
plantilla-de-messi-1.pdf es muy especialAndreaMlaga1
 
Arquitectos del Movimiento Moderno (Historia de la Arquitectura)
Arquitectos del Movimiento Moderno (Historia de la Arquitectura)Arquitectos del Movimiento Moderno (Historia de la Arquitectura)
Arquitectos del Movimiento Moderno (Historia de la Arquitectura)LeonardoDantasRivas
 
Le Corbusier y Mies van der Rohe: Aportes a la Arquitectura Moderna
Le Corbusier y Mies van der Rohe: Aportes a la Arquitectura ModernaLe Corbusier y Mies van der Rohe: Aportes a la Arquitectura Moderna
Le Corbusier y Mies van der Rohe: Aportes a la Arquitectura Modernasofpaolpz
 
2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdf
2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdf2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdf
2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdfcnaomi195
 
PRESENTACION SOBRE EL PROYECTO DE GRADO .
PRESENTACION SOBRE EL PROYECTO DE GRADO .PRESENTACION SOBRE EL PROYECTO DE GRADO .
PRESENTACION SOBRE EL PROYECTO DE GRADO .Rosa329296
 
Arquitectura moderna / Nazareth Bermúdez
Arquitectura moderna / Nazareth BermúdezArquitectura moderna / Nazareth Bermúdez
Arquitectura moderna / Nazareth BermúdezNaza59
 
EL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdf
EL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdfEL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdf
EL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdfCeciliaTernR1
 
Brochure Tuna Haus _ Hecho para mascotas.pdf
Brochure Tuna Haus _ Hecho para mascotas.pdfBrochure Tuna Haus _ Hecho para mascotas.pdf
Brochure Tuna Haus _ Hecho para mascotas.pdfhellotunahaus
 
Arquitectura moderna nazareth bermudez PSM
Arquitectura moderna nazareth bermudez PSMArquitectura moderna nazareth bermudez PSM
Arquitectura moderna nazareth bermudez PSMNaza59
 

Último (20)

SENSICO CURSO DE EXPEDIENTE TECNICO DE OBRAS
SENSICO CURSO DE EXPEDIENTE TECNICO DE OBRASSENSICO CURSO DE EXPEDIENTE TECNICO DE OBRAS
SENSICO CURSO DE EXPEDIENTE TECNICO DE OBRAS
 
Portafolio de Diseño Gráfico por Giorgio B Huizinga
Portafolio de Diseño Gráfico por Giorgio B HuizingaPortafolio de Diseño Gráfico por Giorgio B Huizinga
Portafolio de Diseño Gráfico por Giorgio B Huizinga
 
TIPOS DE LINEAS utilizados en dibujo técnico mecánico
TIPOS DE LINEAS utilizados en dibujo técnico mecánicoTIPOS DE LINEAS utilizados en dibujo técnico mecánico
TIPOS DE LINEAS utilizados en dibujo técnico mecánico
 
Maquetas-modelos-prototipos-Mapa mental-.pdf
Maquetas-modelos-prototipos-Mapa mental-.pdfMaquetas-modelos-prototipos-Mapa mental-.pdf
Maquetas-modelos-prototipos-Mapa mental-.pdf
 
Slaimen Barakat - SLIDESHARE TAREA 2.pdf
Slaimen Barakat - SLIDESHARE TAREA 2.pdfSlaimen Barakat - SLIDESHARE TAREA 2.pdf
Slaimen Barakat - SLIDESHARE TAREA 2.pdf
 
LAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdf
LAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdfLAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdf
LAMODERNIDADARQUITECTURABYBARBARAPADILLA.pdf
 
Jesus Diaz afiche Manierismo .pdf arquitectura
Jesus Diaz afiche Manierismo .pdf arquitecturaJesus Diaz afiche Manierismo .pdf arquitectura
Jesus Diaz afiche Manierismo .pdf arquitectura
 
TRABAJO DESDE CASA REGION INSULAR.docx.pdf
TRABAJO DESDE CASA REGION INSULAR.docx.pdfTRABAJO DESDE CASA REGION INSULAR.docx.pdf
TRABAJO DESDE CASA REGION INSULAR.docx.pdf
 
APORTES Y CARACTERISTICAS DE LAS OBRAS DE CORBUSIER. MIES VAN DER ROHE
APORTES Y CARACTERISTICAS DE LAS OBRAS DE  CORBUSIER. MIES VAN DER ROHEAPORTES Y CARACTERISTICAS DE LAS OBRAS DE  CORBUSIER. MIES VAN DER ROHE
APORTES Y CARACTERISTICAS DE LAS OBRAS DE CORBUSIER. MIES VAN DER ROHE
 
CERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdf
CERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdfCERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdf
CERTIFICACIÓN DE CAPACITACIÓN PARA EL CENSO - tfdxwBRz6f3AP7QU.pdf
 
Presentacion de 100 psicologos dijeron.pptx
Presentacion de 100 psicologos dijeron.pptxPresentacion de 100 psicologos dijeron.pptx
Presentacion de 100 psicologos dijeron.pptx
 
plantilla-de-messi-1.pdf es muy especial
plantilla-de-messi-1.pdf es muy especialplantilla-de-messi-1.pdf es muy especial
plantilla-de-messi-1.pdf es muy especial
 
Arquitectos del Movimiento Moderno (Historia de la Arquitectura)
Arquitectos del Movimiento Moderno (Historia de la Arquitectura)Arquitectos del Movimiento Moderno (Historia de la Arquitectura)
Arquitectos del Movimiento Moderno (Historia de la Arquitectura)
 
Le Corbusier y Mies van der Rohe: Aportes a la Arquitectura Moderna
Le Corbusier y Mies van der Rohe: Aportes a la Arquitectura ModernaLe Corbusier y Mies van der Rohe: Aportes a la Arquitectura Moderna
Le Corbusier y Mies van der Rohe: Aportes a la Arquitectura Moderna
 
2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdf
2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdf2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdf
2024-EL CAMBIO CLIMATICO Y SUS EFECTOS EN EL PERÚ Y EL MUNDO.pdf
 
PRESENTACION SOBRE EL PROYECTO DE GRADO .
PRESENTACION SOBRE EL PROYECTO DE GRADO .PRESENTACION SOBRE EL PROYECTO DE GRADO .
PRESENTACION SOBRE EL PROYECTO DE GRADO .
 
Arquitectura moderna / Nazareth Bermúdez
Arquitectura moderna / Nazareth BermúdezArquitectura moderna / Nazareth Bermúdez
Arquitectura moderna / Nazareth Bermúdez
 
EL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdf
EL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdfEL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdf
EL CONCEPTO Y EL PARTIDO ARQUITECTONICO.pdf
 
Brochure Tuna Haus _ Hecho para mascotas.pdf
Brochure Tuna Haus _ Hecho para mascotas.pdfBrochure Tuna Haus _ Hecho para mascotas.pdf
Brochure Tuna Haus _ Hecho para mascotas.pdf
 
Arquitectura moderna nazareth bermudez PSM
Arquitectura moderna nazareth bermudez PSMArquitectura moderna nazareth bermudez PSM
Arquitectura moderna nazareth bermudez PSM
 

Part tab

  • 1. DBA - Particionamiento Una tabla Oracle, por defecto, es un sesgmento del tipo TABLE, y un segmento pertenece a un tablespace concreto. Sin embargo, una tabla particionada está formada por varios segmentos (uno por partición/subpartición), de modo que permite separar las particiones en diferentes tablespaces, repartiendo la E/S, y además se puede operar a nivel de partición, de modo que el administrador tiene más opciones a la hora de realizar labores de mantenimiento sobre una tabla; por ejemplo, puede poner offline una sola partición, dejando el resto online, o mover una partición a otro tablespace, sin afectar al resto, etc. Lo que cuento a continuación está, en su mayor parte, extraído de http://www.dataprix.com/blogs/respinosamilla/particionado-tablas-oracle. y del manual de conceptos de particionamiento de Oracle. El particionamiento es en gran medida una técnica de optimización que pretende mejorar los tiempos de respuesta de las consultas, así como el mantenimiento de las tablas, y que puede ser especialmente útil en tablas muy grandes. El particionamiento fue introducido por primera vez en la versión 8 de Oracle para la gestión de grandes cantidades de información, y para facilitar la tarea de los administradores de bases de datos. Dependiendo de la versión de Oracle en la que estemos, tenemos diferentes tipos de particionado disponibles: • Oracle 8.0: particionamiento Range. • Oracle 8i: además del particionado Range se añaden los tipos Hash y Composite. • Oracle 9iR2/10g: se amplian con el tipo List y se permiten nuevas combinaciones de tipos en el Particionamiento Composite. • Oracle 11g: se introducen las columnas virtuales para particionar (que no existen fisicamente en la tabla), así como el Particionamiento System (donde podemos gestionar directamente en que partición de la tabla se insertan los registros) y el Particionamiento Interval. Tipos de Particionamiento Basicamente, el particionamiento se realiza utilizando una clave de particionado (partitioning key), que determina en qué partición de las existentes en la tabla van a residir los datos que se insertan. Oracle
  • 2. también permite realizar el particionado de indices y de tablas organizadas por indices. Cada partición ademas puede tener sus propias propiedades de almacenamiento. Las tablas particionadas aparecen en el sistema como una única tabla, realizando el sistema la gestión automatica de lectura y escritura en cada una de las particiones (excepto para el caso de la partición de Sistema introducida en la versión 11g). La definición de las particiones se indica en la sentencia de creación de las tablas, con la sintaxis oportuna para cada uno de los tipos. • Particionamiento Range: la clave de particionado viene determinada por un rango de valores, que determina la partición donde se almacenara un valor. • Particionamiento Hash: la clave de particionado es una función hash, aplicada sobre una columna, que tiene como objetivo realizar una distribución equitativa de los registros sobre las diferentes particiones. Es útil para particionar tablas donde no hay unos criterios de particionado claros, pero en la que se quiere mejor el rendimiento. • Particionamiento List: la clave de particionado es una lista de valores, que determina cada una de las particiones. • Particionamiento Composite: los particionamientos anteriores eran del tipo simple (single o one-level), pues utilizamos un unico método de particionado sobre una o mas columnas. Oracle nos permite utilizar metodos de particionado compuestos, utilizando un primer particionado de un tipo determinado, y luego para cada particion, realizar un segundo nivel de particionado utilizando otro metodo. Las combinaciones son las siguientes (se han ido ampliando conforme han ido avanzando las versiones): range-hash, range-list, range-range, list-range, list-list, list- hash y hash-hash (introducido en la versión 11g). • Particionamiento Interval: tipo de particionado introducido igualmente en la versión 11g. En lugar de indicar los rangos de valores que van a determinar como se realiza el particionado, el sistema automáticamente creara las particiones cuando se inserte un nuevo registro en la b.d. Las técnicas de este tipo disponible son Interval, Interval List, Interval Range e Interval Hash (por lo que el particionado Interval es complementario a las técnicas de particionado vistas anteriormente). • Particionamiento Reference: particiona una tabla del mismo modo en que lo está la tabla a la que apunta mediante una FK, de este modo es muy fácil particionar del mismo modo 2 tablas "maestro-detalle", pues solo tengo que definir el particionamiento en la tabla maestra (la q tiene la PK) y en la tabla hija (la de la FK) usar PARTITION BY REFERENCE. Es nuevo en 11g. • Particionamiento System: se define la tabla particionada indicando las particiones deseadas, pero no se indica una clave de particionamiento. En este tipo de particionado, se delega la gestión del particionamiento a las aplicaciones que utilicen la base de datos (por ejemplo, en las sentencias sql de inserción deberemos de indicar en qué partición insertamos los datos). Es nuevo en 11g. Oracle nos permite definir sentencias SQL del tipo DML haciendo referencia a las particiones. Es lo que llaman nombres de tabla con extension de partición (partition-extended table names). Por ejemplo, podremos hacer un select sobre una tabla particionada indicando en la sintaxis la partición de la queremos que se haga lectura. Por ejemplo: SELECT * FROM schema.table PARTITION(part_name); Esto es igualmente válido para las sentencias INSERT, UPDATE, DELETE, LOCK TABLE. Esta sintaxis nos proporciona una forma simple de acceder a las particiones individuales como si fueran tablas, y utilizarlas, por ejemplo, para la creación de vistas (utilizando la vista en lugar de la tabla), lo que nos puede ser útil en muchas situaciones.
  • 3. Ejemplos de cada tipo de Particionamiento Particionado Range El Particionamiento Range requiere que los registros estén identificados por un “partition key”, y el valor de las columnas “partition key” determina la partición a la cual pertenecerá el registro. CREATE TABLE sales ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE , channel_id CHAR(1) , promo_id NUMBER(6) , quantity_sold NUMBER(3) , amount_sold NUMBER(10,2) ) PARTITION BY RANGE (time_id) ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR- 2006','dd-MON-yyyy')) TABLESPACE tsa , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL- 2006','dd-MON-yyyy')) TABLESPACE tsb , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT- 2006','dd-MON-yyyy')) TABLESPACE tsc , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN- 2007','dd-MON-yyyy')) TABLESPACE tsd ); Este tipo de particionamiento es interesante cuando se tienen datos con un rango lógico y que pueden ser distribuidos por este. Ej. Mes del Año o un valor numérico. Particionado Hash En el Particionamiento Hash se aplica una función hash a la partition key, y el resultado de dicha función hash determina a qué partición irá el registro. Es una forma automática de balancear la E/S con el particionamiento. En el ejemplo siguiente vemos una definición sin indicar los nombres de las particiones (solo el número de particiones): CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32)) PARTITION BY HASH(deptno) PARTITIONS 16; Igualmente, se pueden indicar los nombres de cada particion individual o los tablespaces donde se localizaran cada una de ellas: CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32)) STORAGE (INITIAL 10K) PARTITION BY HASH(deptno) (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2, PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3); Lo q dice el manual de Oracle del particionamiento hash: • Cuando usar particionamiento hash: básicamente para repartir la E/S (cuando no existe un
  • 4. sistema de almacenamiento q haga striping), y paralelizar las consultas ... • Añadir una partición: Oracle elige una de las q ya existen y la divide en 2. • Unir 2 particiones (coalesce): lo contrario del caso anterior (Oracle elige 2 y las funde en una). • Como crear una tabla particionada e índices: aquí explica q con "create index ... local;" Oracle crea un índice con el mismo particionamiento q la tabla correspondiente (además se puede especificar el tablespace y/o los nombres de las particiones). Particionado List El Particionamiento List fue añadido por Oracle en la versión 9, permitiendo determinar el particionado según una lista de valores definidos sobre el valor de una columna especifica. CREATE TABLE sales_list (salesman_id NUMBER(5), salesman_name VARCHAR2(30), sales_state VARCHAR2(20), sales_amount NUMBER(10), sales_date DATE) PARTITION BY LIST(sales_state) ( PARTITION sales_west VALUES('California', 'Hawaii'), PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'), PARTITION sales_central VALUES('Texas', 'Illinois') PARTITION sales_other VALUES(DEFAULT) ); Este particionado tiene algunas limitaciones, como que no soporta múltiples columnas en la clave de particionado, los valores literales deben ser únicos en la lista, permitiendo el uso del valor NULL (aunque no el valor MAXVALUE, que si puede ser utilizado en particiones del tipo Range). El valor DEFAULT sirve para definir la partición donde irán el resto de registros que no cumplen ninguna condición de las diferentes particiones. Particionamiento Composite El Particionamiento Composite combina el uso de dos particionados a la vez. Veamos un ejemplo utilizando el tipo RANGE y el HASH. En primer lugar, hace un particionado del tipo RANGE utilizando rangos de años. En segundo lugar, para cada partición definida por cada año, hacemos un segundo particionado (subparticion) del tipo aleatorio (HASH) por el valor de otra columna: CREATE TABLE TAB2 (ord_id NUMBER(10), ord_day NUMBER(2), ord_month NUMBER(2), ord_year NUMBER(4) ) PARTITION BY RANGE(ord_year)
  • 5. SUBPARTITION BY HASH(ord_id) SUBPARTITIONS 8 ( PARTITION q1 VALUES LESS THAN(2001) ( SUBPARTITION q1_h1 TABLESPACE TBS1, SUBPARTITION q1_h2 TABLESPACE TBS2, SUBPARTITION q1_h3 TABLESPACE TBS3, SUBPARTITION q1_h4 TABLESPACE TBS4 ), PARTITION q2 VALUES LESS THAN(2002) ( SUBPARTITION q2_h5 TABLESPACE TBS5, SUBPARTITION q2_h6 TABLESPACE TBS6, SUBPARTITION q2_h7 TABLESPACE TBS7, SUBPARTITION q2_h8 TABLESPACE TBS8 ), PARTITION q3 VALUES LESS THAN(2003) ( SUBPARTITION q3_h1 TABLESPACE TBS1, SUBPARTITION q3_h2 TABLESPACE TBS2, SUBPARTITION q3_h3 TABLESPACE TBS3, SUBPARTITION q3_h4 TABLESPACE TBS4 ), PARTITION q4 VALUES LESS THAN(2004) ( SUBPARTITION q4_h5 TABLESPACE TBS5, SUBPARTITION q4_h6 TABLESPACE TBS6, SUBPARTITION q4_h7 TABLESPACE TBS7, SUBPARTITION q4_h8 TABLESPACE TBS8
  • 6. ) ) Las combinaciones permitidas son las siguientes (se han ido ampliando conforme han ido avanzando las versiones de Oracle): range-hash, range-list, range-range, list-range, list-list, list-hash y hash-hash (introducido en la versión 11g). Particionado Interval El Particionamiento Interval ha sido introducido en la versión 11g para habilitar la creación dinámica de particiones al particionar por rango (RANGE). Normalmente, cuando realizamos un particionado sobre una tabla, indicamos una lista de valores o rangos para crear de antemano las particiones. Posteriormente, ajustamos la definición de las particiones para incluir nuevas para nuevos rangos o valores. Con el particionamiento Interval, Oracle crea las particiones de forma automática cuando lo necesita. Básicamente, se define un intervalo y una directiva para decirle a Oracle como se tiene que comportar. Veamos un ejemplo: CREATE TABLE T_11G(C1 NUMBER(38,0), C2 VARCHAR2(10), C3 DATE) PARTITION BY RANGE (C3) INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) (PARTITION P0902 VALUES LESS THAN (TO_DATE('2009-03-01 00:00:00','YYYY-MM-DD HH24:MI:SS'))); Hemos creado una partición base, y con lo especificado en Interval definimos como gestionar la creación automática de nuevas particiones. La posibilidad de definir un intevalo y que Oracle se encargue de crear las particiones a medida que se vayan necesitando resulta muy interesante para facilitar el mantenimiento y administración de particiones. Particionado System El Particionamiento System es una de las nuevas funcionalidades introducida en la version 11g, y también se denomina particionamiento interno o de sistema. En este particionado Oracle no realiza la gestión del lugar donde se almacenarán los registros, sino que seremos nosotros los que tendremos que
  • 7. indicar en que partición se hacen las inserciones. create table t (c1 int, c2 varchar2(10), c3 date) partition by system (partition p1, partition p2, partition p3); Si hicieramos un insert sobre la tabla (por ejemplo, insert into t values (1,’A',sysdate);), daría error, siendo la instrucción a ejecutar correcta la siguiente: insert into t partition (p3) values (1,’A',sysdate); Puede ser util este particionado cuando nos interesa particionar en función de la lógica de la aplicación. Uso de columnas virtuales para particionar En la versión 11g se pueden definir en las tablas columnas virtuales (no existen físicamente). Ademas estas columnas se pueden utilizar para realizar particionado sobre ellas. La forma de crear una tabla con columnas de este tipo sería la siguiente: create table t (c1 int, c2 varchar2(10), c3 date, c3_v char(1) generated always as (to_char(c3,'d')) virtual ) partition by list (c3_v) (partition p1 values ('1'), partition p2 values ('2'), partition p3 values ('3'), partition p4 values ('4'), partition p5 values ('5'), partition p6 values ('6'), partition p7 values ('7') ); Gestión del particionado Se pueden añadir particiones a una tabla particionada existente, juntar o borrar particiones, convertir una particion en una tabla no particionada, dividir una partición en dos (Splitting), hacer un truncate (borra los datos de la partición pero deja la estructura). También podemos mover una partición de un tablespace a otro, renombrarla, etc. Os recomiendo la lectura del Database Design que también habla sobre el tema. Enlaces sobre Particionamiento y nuevas funcionalidades en 11g  En castellano:  http://www.dataprix.com/blogs/respinosamilla/particionado-tablas-oracle  http://oramdq.blogspot.com.es/2009/02/lo-nuevo-en-particionamiento-de-tablas.html
  • 8.  Database Design  En inglés:  http://www.orafaq.com/node/1912  http://www.dba-oracle.com/t_interval_partitioning.htm  http://www.oracle-base.com/articles/11g/partitioning-enhancements-11gr1.php FAQ • No se puede particionar por una columna "timestamp with time zone", da un error ORA-3001 de "funcionalidad no implementada". Sí podremos usar una columna "timestamp" normal • Si la tabla está particionada por rango (o intervalos), y nos interesa particionar los índices únicos de forma local, sería necesario que la clave de particionamiento formase parte de ellos. En el siguiente ejemplo la clave de particionamiento es LOGS_FECHA: create unique index uk_LOGS_FIND on LOGATICA.LOGATICA_LOGS (LOGS_APLICACION, LOGS_FECHA, LOGS_NIVEL, LOGS_LOUR_CODIGO) local tablespace indlogatica storage (initial 2M next 2M maxextents 1 pctincrease 0);
  • 9. DBA - Convertir Tabla Normal en Particionada Si queremos "convertir" una tabla normal T1 en particionada, podemos hacerlo creando una tabla T2 igual que la original, pero particioinada, y después usaremos el paquete DBMS_REDEFINITION para que T2 pase a ser T1 todos los datos, índices y constraints que tenía T1, y finalmente borraremos T2. En primer lugar, necesitamos los permisos que nos dice el Manual de Oracle. EJEMPLO SIMPLE - Creamos la tabla T2 particionada (con las mismas columnas que tenga T1) create table t2 (username varchar2(30), user_id number, created date) partition by hash(user_id) partitions 8; Table created. - Iniciamos el proceso de "redifinición" de T1 comprobando si es posible hacerlo: exec dbms_redefinition.can_redef_table( user, 'T1' ); PL/SQL procedure successfully completed. - Si la comprobación anterior no falla, le decimos a Oracle que vamos a redifinir T1 en base a T exec dbms_redefinition.start_redef_table( user, 'T1', 'T2' ); PL/SQL procedure successfully completed. - Le decimos que copie las dependencias que tenía T1 variable nerrors number begin dbms_redefinition.copy_table_dependents ( user, 'T1', 'T2', copy_indexes => dbms_redefinition.cons_orig_params, num_errors => :nerrors ); end; / PL/SQL procedure successfully completed. - Finalmente le decimos que hemos terminado: exec dbms_redefinition.finish_redef_table( user, 'T1', 'T2' ); PL/SQL procedure successfully completed.
  • 10. EJEMPLO REAL Vamos a convertir la tabla LOGATICA_LOGS (no particionada) en particionada, tal y como indica la tabla LOGATICA_LOGS2 (particionada por rango con intervalo de 3 meses): - Script para redefinir la tabla LOGATICA_LOGS: SQL> !cat redefinir_logatica.sql set serveroutput on exec dbms_redefinition.can_redef_table( 'LOGATICA', 'LOGATICA_LOGS', DBMS_REDEFINITION.CONS_USE_PK ); exec dbms_redefinition.start_redef_table( 'LOGATICA', 'LOGATICA_LOGS', 'LOGATICA_LOGS2' ); variable nerrors number begin dbms_redefinition.copy_table_dependents ( 'LOGATICA', 'LOGATICA_LOGS', 'LOGATICA_LOGS2', copy_indexes => dbms_redefinition.cons_orig_params, ignore_errors => TRUE, num_errors => :nerrors ); end; / select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS; exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('LOGATICA', 'LOGATICA_LOGS', 'LOGATICA_LOGS2') exec dbms_redefinition.finish_redef_table( 'LOGATICA', 'LOGATICA_LOGS', 'LOGATICA_LOGS2' ); - Compruebo si el proceso de redefinición es posible SQL> set serveroutput on SQL> exec dbms_redefinition.can_redef_table( 'LOGATICA', 'LOGATICA_LOGS', DBMS_REDEFINITION.CONS_USE_PK ); PL/SQL procedure successfully completed. - Creo la tabla destino (como quedará una vez finalizado el proceso) SQL> @crea_tab_logatica2.sql Table created. - Inicio el proceso de redefinición SQL> exec dbms_redefinition.start_redef_table( 'LOGATICA', 'LOGATICA_LOGS', 'LOGATICA_LOGS2' ); PL/SQL procedure successfully completed. - Copio las dependencias, indicando que ignore los errores (pues la tabla destino, LOGATICA_LOGS2, ya tiene la 3 constraints NOT NULL que existen en LOGATICA_LOGS)
  • 11. SQL> variable nerrors number begin dbms_redefinition.copy_table_dependents ( 'LOGATICA', 'LOGATICA_LOGS', 'LOGATICA_LOGS2', copy_indexes => dbms_redefinition.cons_orig_params, ignore_errors => TRUE, num_errors => :nerrors ); end; / PL/SQL procedure successfully completed. - Compruebo los errores para asegurarme que solo estan los 3 NOT NULL SQL> select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERR OBJECT_NAME BASE_TABLE_NAME ------------------------------ ------------------------------ DDL_TXT --------------------------------------------------------------------------- SYS_C00477007 LOGATICA_LOGS ALTER TABLE "LOGATICA"."LOGATICA_LOGS2" MODIFY ("LOGS_APLICACION" CONSTRAIN SYS_C00477006 LOGATICA_LOGS ALTER TABLE "LOGATICA"."LOGATICA_LOGS2" MODIFY ("LOGS_SECUENCIA" CONSTRAINT SYS_C00491401 LOGATICA_LOGS ALTER TABLE "LOGATICA"."LOGATICA_LOGS2" MODIFY ("LOGS_FECHA" CONSTRAINT "TM - "Refresco" la redefinición SQL> exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('LOGATICA', 'LOGATICA_LOGS', 'LOGATICA_LOGS2') PL/SQL procedure successfully completed. - Termino el proceso SQL> exec dbms_redefinition.finish_redef_table( 'LOGATICA', 'LOGATICA_LOGS' 'LOGATICA_LOGS2' ); PL/SQL procedure successfully completed. ENLACES • DBMS_REDEFINITION en Manual de Oracle • Artículo en OraFAQs • Pregunta sobre el tema en Ask Tom FAQ
  • 12. • Si queremos cancelar el proceso de "redefinición" lo haremos con exec dbms_redefinition.ABORT_REDEF_TABLE('NombreUsuario','T1', 'T2'); • Si el proceso se alarga, podemos "refrescarlo" con exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('NombreUsuario', 'T1', 'T2'); • Podemos obtener una "copia de seguridad" de la sentencia DDL de creación de la tabla con SELECT DBMS_METADATA.GET_DDL('TABLE','NombreUsuario', 'T1') FROM DUAL; • Y de los índices con SELECT DBMS_METADATA.GET_DDL('INDEX','NombreUsuario', 'NombreIndice') FROM DUAL; • No se puede "redefinir" la tabla si las columnas no son exactamente iguales, por lo que da un error ORA- T1 tiene una columna "timestamp with time zone" y en T2 es "timestamp" SIN "time zone". • No se puede particionar por una columna "timestamp with time zone", da un error ORA-3001 de "funcio no implementada". Sí podremos usar una columna "timestamp" normal • Si la tabla está particionada por rango (o intervalos), y nos interesa particionar los índices únicos de form sería necesario que la clave de particionamiento formase parte de ellos. En el siguiente ejemplo la clave d particionamiento es LOGS_FECHA: create unique index uk_LOGS_FIND on LOGATICA.LOGATICA_LOGS (LOGS_APLICACION, LOGS_FECHA, LOGS_NIVEL, LOGS_LOUR_CODIGO) local tablespace indlogatica storage (initial 2M next 2M maxextents 1 pctincrease 0);