Particionamiento Archivo

Anuncio
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
Descargar