Grandes volúmenes de datos Particionamiento bases de datos Particionamiento. Introducción Problemas con tablas con gran volumen de registros: ◦ Tiempo de respuesta en las consultas ◦ Problemas de almacenamiento El particionamiento consiste en dividir a nivel físico (no lógico) la tabla (o índice) en otras de menor tamaño mediante un patrón determinado solucionando los problemas anteriores. Este concepto existe en múltiples SGBDR (SqlServer, MySql, ORACLE,etc …) 2 Particionamiento Las tablas y los índices se pueden desglosar en partes más pequeñas y “manejables” ◦ Particiones y subparticiones Cada partición se almacena y gestiona físicamente de forma independiente En ORACLE pueden almacenarse de forma comprimida (COMPRESS) Transparente a las consultas y programas 3 Particionamiento. Introducción TABLA FACTURAS Mismas propiedades almacenamiento: Tablespace Initial Next PctIncrease PctFree PctUsed IniTrans Etc … Facturas 2014 TABLA FACTURAS PARTICION X Tablespace X Initial X Next X Etc … Particionamiento según criterio (por ejemplo por año) 500000 registros … 25 Millones de registros PARTICION Z Facturas 1990 Tablespace Z Initial Z Next Z Etc … 350000 registros 4 Particionamiento. Introducción A nivel lógico una tabla particionada es idéntica a una tabla no particionada, las sentencias SQL son exactamente las mismas. Cada partición tiene su propio nombre, y sus propias características de almacenamiento. Algunos SGBDR permiten definir sentencias SQL haciendo referencia a las particiones (mejora aún más el rendimiento aunque hacemos dependiente la programación) 5 Particionamiento. Introducción SELECT * from FACTURAS where anyo = 1990; ◦ Al usar el criterio de particionamiento en el WHERE la búsqueda se hace SOLO en la partición correspondiente SELECT * from FACTURAS where codcli = ‘A34’; ◦ Al NO usar el criterio de particionamiento en el WHERE la búsqueda se hace en toda la tabla SELECT * from FACTURAS PARTITION (facturas_1990) where codcli = ‘A34’; ◦ Podemos especificar que sólo busque en una de las particiones (no es un práctica aconsejable en la programación) 6 Particionamiento en Oracle Tipos de particionamiento ◦ ◦ ◦ ◦ ◦ Rango Hash Lista Uso de columnas virtuales (a partir de O11g) De Sistema (a partir de O11g) 7 Particionamiento en Oracle Tipos de particionamiento: Por rango Los datos se distribuyen de acuerdo con el rango de valores de la clave de particionamiento (por ejemplo curso académico, año factura, etc.) Útil si los datos tienen rangos con distribuciones uniformes. Sólo campos numéricos o de fecha Hay que especificar Método de particionamiento: range Columna de particionamiento Para cada partición se define el límite superior no inclusive con la clausula VALUES LESS THAN Para la última partición se pude poner un límite superior infinito (MAXVALUE) 8 Particionamiento en Oracle Ejemplo Podemos indicar el tablespace, CREATE TABLE pedidos_p ( sino, toma el de defecto de la tabla nume_pedi number(6), Podemos anyo_pedi number(4) not null, comprimir (afecta al esta_pedi char(1), rendimiento) impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY RANGE (anyo_pedi) ( PARTITION pedidos_p1 VALUES LESS THAN (1995) COMPRESS TABLESPACE TB_X, PARTITION pedidos_p2 VALUES LESS THAN (2000) TABLESPACE TB_X, PARTITION pedidos_p3 VALUES LESS THAN (2005) TABLESPACE TB_Y, PARTITION pedidos_p4 VALUES LESS THAN (MAXVALUE) ); Del 2005 en adelante 9 Particionamiento en Oracle Tipos de particionamiento: Hash Cuando no es posible encontrar un rango de particionamiento Dejamos que esa decisión la tome Oracle No sabemos en que partición estará una fila Hay que especificar Método de particionamiento: hash Columna de particionamiento Número de particiones Opcionalmente el nombre de las particiones (y opcionalmente su tablespace) 10 Particionamiento en Oracle Ejemplo CREATE TABLE pedidos_p ( nume_pedi number(6), anyo_pedi number(4) not null, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY HASH (anyo_pedi) PARTITIONS 4 ; CREATE TABLE pedidos_p ( nume_pedi number(6), anyo_pedi number(4) not null, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY HASH (anyo_pedi) ( PARTITION pedidos_p1 TABLESPACE TB_X, PARTITION pedidos_p2 TABLESPACE TB_X, PARTITION pedidos_p3 TABLESPACE TB_Y, PARTITION pedidos_p3 TABLESPACE TB_Z) ; 11 Particionamiento en Oracle Tipos de particionamiento: Lista Cuando se desea controlar de forma explícita el particionado según una lista de valores definidos sobre el valor de una columna. Hay que especificar Método de particionamiento: list Columna de particionamiento Para cada partición se define la lista de valores posibles de la columna de particionamiento con la clausula VALUES (se puede indicar una por defecto) 12 Particionamiento en Oracle Ejemplo CREATE TABLE pedidos_p ( nume_pedi number(6), anyo_pedi number(4) not null, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY LIST (esta_pedi) (PARTITION pedidos_p1 VALUES ('C', 'R') TABLESPACE TB_X, PARTITION pedidos_p2 VALUES ('P', 'G') TABLESPACE TB_Y , PARTITION pedidos_null VALUES (NULL), PARTITION pedidos_desconocidos VALUES (DEFAULT) ); 13 Particionamiento en Oracle Tipos de particionamiento: Columnas Virtuales (11g) En la versión 11g se pueden definir en las tablas columnas virtuales Se pueden usar estos campos determinar el particionamiento 14 Particionamiento en Oracle Ejemplo CREATE TABLE pedidos_p ( nume_pedi number(6), fecha_pedi date, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10), anyo_pedi varchar2(4) generated always as (to_char(fecha_pedi,’YYYY’) virtual) PARTITION BY RANGE (anyo_pedi) (PARTITION pedidos_p1 VALUES LESS THAN (‘1995’) TABLESPACE TB_X, PARTITION pedidos_p2 VALUES LESS THAN (‘2000’) TABLESPACE TB_X, PARTITION pedidos_p3 VALUES LESS THAN (‘2005’) TABLESPACE TB_Y, PARTITION pedidos_p4 VALUES LESS THAN (MAXVALUE) ); 15 Particionamiento en Oracle Tipos de particionamiento: De Sistema (11g) Oracle no realiza la gestión del lugar donde se almacenaran los registros Se delega a la capa de aplicación la decisión de la partición donde se inserta una fila. Oracle no permite insertar una fila si no se explicita a que partición debe asociarse. 16 Particionamiento en Oracle Ejemplo CREATE TABLE pedidos_p ( nume_pedi number(6), anyo_pedi number(4) not null, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY SYSTEM (PARTITION pedidos_p1 TABLESPACE TB_X, PARTITION pedidos_p2 TABLESPACE TB_Y , PARTITION pedidos_p3 TABLESPACE TB_Z , PARTITION pedidos_p4 TABLESPACE TB_Z ); Insert into pedidos_p partition (pedidos_p2) values (………. ) 17 Particionamiento en Oracle Se pueden crear SUBPARTICIONES incluso combinando métodos (composite partitioning) Podemos indicar el tablespace, A nivel de particion o Subparticion CREATE TABLE pedidos_p ( nume_pedi number(6), anyo_pedi number(4) not null, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY RANGE (anyo_pedi) SUBPARTITION BY LIST ( esta_pedido) (PARTITION pedidos_p1 VALUES LESS THAN (2000) TABLESPACE TB_X (SUBPARTITION pedidos_p1_CR_2000 VALUES ('C', 'R'), SUBPARTITION pedidos_p1_DG_2000 VALUES ('P', 'G'), SUBPARTITION pedidos_p1_null_2000 VALUES (NULL), SUBPARTITION pedidos_p1_desconocidos_2000 VALUES (DEFAULT) ), PARTITION pedidos_p2 VALUES LESS THAN (MAXVALUE) (SUBPARTITION pedidos_p2_CR_2000 VALUES ('C', 'R') TABLESPACE TB_W, SUBPARTITION pedidos_p2_DG_2000 VALUES ('P', 'G') TABLESPACE TB_Z, SUBPARTITION pedidos_p2_null_2000 VALUES (NULL) TABLESPACE TB_Y, SUBPARTITION pedidos_p2_desconocidos_2000 VALUES (DEFAULT) ) ); 18 Particionamiento en Oracle En principio NO se permite modificar el valor de una clave usada para el particionamiento si esto provoca un cambio de partición Update pedidos set anyo_pedi = 2002 where anyo_pedi = 1990; Informe de error: Error SQL: ORA-14402: la actualización de la columna de claves de partición provocaría un cambio de partición 14402. 00000 - "updating partition key column would cause a partition change" *Cause: An UPDATE statement attempted to change the value of a partition key column causing migration of the row to another partition *Action: Do not attempt to update a partition key column or make sure that the new partition key is within the range containing the old partition key. Para solucionarlo : alter table pedidos enable row movement; 19 Particionamiento en Oracle Índices particionados ◦ Local Partitioned: Cada clave de una partición del índice apunta a una única partición de la tabla del índice (son los mas recomendados al ser menos complejos de mantener) ◦ Global Partitioned: Cada clave de una mima partición pueden a apuntar a varias particiones distintas de la tabla 2007-08 20 Particionamiento en Oracle Ejemplo. Local CREATE TABLE pedidos_p ( nume_pedi number(6), anyo_pedi number(4) not null, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY HASH (anyo_pedi) (PARTITION p1, PARTITION p2, PARTITION p3); CREATE INDEX idx_pedidos_p on pedidos_p (anyo_pedi) LOCAL; Tendrá las mismas particiones que la tabla 2007-08 21 Particionamiento en Oracle Ejemplo. Globales CREATE TABLE pedidos_p ( nume_pedi number(6), anyo_pedi number(4) not null, esta_pedi char(1), impo_pedi number(10), empr_pedi varchar2(10) ) PARTITION BY RANGE (anyo_pedi) (PARTITION pedidos_p1 VALUES LESS THAN (1995) COMPRESS TABLESPACE TB_X, PARTITION pedidos_p2 VALUES LESS THAN (2000) TABLESPACE TB_X, PARTITION pedidos_p3 VALUES LESS THAN (2005) TABLESPACE TB_Y, PARTITION pedidos_p4 VALUES LESS THAN (MAXVALUE) ); CREATE INDEX idx_pedidos_p on pedidos_p (anyo_pedi) GLOBAL PARTITION BY RANGE (anyo_pedi) (PARTITION pedidos_p1 VALUES LESS THAN (1995), PARTITION pedidos_p2 VALUES LESS THAN (2005), PARTITION pedidos_p3 VALUES LESS THAN (MAXVALUE) ); En esta partición del indice tendremos indices de las particiones p2 y p3 de la tabla 2007-08 22 Particionamiento en Oracle Diccionario de datos En user_tab_partitions tenemos información acerca de nuestras tablas particionadas. Ojo, hay que pasar antes elas estadísticas: analyze table t compute statistics; Por ejemplo select partition_name,num_rows from user_tab_partitions where table_name = 'T'; Devuelve las filas de cada particion de la tabla T 23