martes, 12 de marzo de 2013

PARTICIONAMIENTO MYSQL & ORACLE

PARTICIONAMIENTO MYSQL
Particionar tablas en MySQL nos permite rotar la información de nuestras tablas en diferentes particiones, consiguiendo así realizar consultas más rápidas y recuperar espacio en disco al borrar los registros. El uso más común de particionado es según fecha (date).

Para ver si nuestra base de datos soporta particionado simplemente ejecutamos:

SHOW VARIABLES LIKE '%partition%';

Consiste en dividir los datos en particiones más pequeñas (hasta 1024) procurando, porque de otra forma sería absurdo, que sólo haya que acceder a una partición a la hora de buscar una tupla.

Se puede particionar una tabla de 5 maneras diferentes:
Por rango: para construir nuestras particiones especificamos rangos de valores. Por ejemplo, podríamos segmentar los datos en 12 particiones: una para los contratos de 1950 a 1960, otra para los años 60, los 70, 80, 90, la década del 2000 y la década actual
    

    1. ALTER TABLE contratos
    2. PARTITION BY RANGE(YEAR(fechaInicio)) (
    3. PARTITION partDecada50 VALUES LESS THAN (1960),
    4. PARTITION partDecada60 VALUES LESS THAN (1970),
    5. PARTITION partDecada70 VALUES LESS THAN (1980),
    6. PARTITION partDecada80 VALUES LESS THAN (1990),
    7. PARTITION partDecada90 VALUES LESS THAN (2000),
    8. PARTITION partDecada00 VALUES LESS THAN (2010),
    9. PARTITION partDecada10 VALUES LESS THAN MAXVALUE
    10. );

  • Por listas: para construir nuestras particiones especificamos listas de valores concretos.

    1. ALTER TABLE contratos
    2. PARTITION BY LIST(YEAR(fechaInicio)) (
    3. PARTITION partDecada50 VALUES IN (1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959),
    4. PARTITION partDecada60 VALUES IN (1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969),
    5. PARTITION partDecada70 VALUES IN (1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979),
    6. PARTITION partDecada80 VALUES IN (1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989),
    7. PARTITION partDecada90 VALUES IN (1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999),
    8. PARTITION partDecada00 VALUES IN (2000, 2001, 2002, 2003, 2004, 2005, 2006,
    9. 2007, 2008, 2009),
    10. PARTITION partDecada10 VALUES IN (2010, 2011, 2012, 2013, 2014, 2015, 2016,
    11. 2017, 2018, 2019)
    12. );

  • Por hash: MySQL se encarga de distribuir las tuplas automáticamente usando una operación de módulo. Sólo hay que pasarle una columna o expresión que resulte en un entero (el hash) y el número de particiones que queramos crear.
    1. ALTER TABLE contratos
    2. PARTITION BY HASH(YEAR(fechaInicio))
    3. PARTITIONS 7; R TABLE contratos
PARTITION BY HASH(YEAR(fechaInicio))PARTITIONS
  • Por clave: similar a la partición por hash, pero en este caso no necesitamos pasarle un entero; MySQL utilizará su propia función de hash para generarlo. Si no se indica ninguna columna a partir de la que generar el hash, se utiliza la clave primaria por defecto.
    1. ALTER TABLE contratos
    2. PARTITION BY KEY()
    3. PARTITIONS 7;
  • Compuesta: podemos combinar los distintos métodos de particionado y crear particiones de particiones

Por último, un pequeño ejemplo de cómo afectaría el particionado a una consulta sencilla como obtener el número total de tuplas que cumplen una condición. Estas son las estadísticas de la consulta sin particionado (ni índices)

    1. EXPLAIN SELECT COUNT(*)
    2. FROM contratos
    3. WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'
EXPLAIN SELECT COUNT(*)
FROM contratosWHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'
select_type
table
type
key
rows
Extra
SIMPLE
contratos
ALL
239796
Using where

Y este el resultado de añadir las particiones (nótese la palabra clave PARTITIONS para que nos muestre también la información relativa a las particiones)

1.     EXPLAIN PARTITIONS SELECT COUNT(*)

2.    FROM contratos

3.    WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'

WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'

select_type
table
partitions
type
key
rows
Extra
SIMPLE
contratos
partDecada50
ALL
8640
Using where

Como véis, el número de tuplas que MySQL tiene que comprobar se ve disminunido en 2 órdenes de magnitud.

PARTICIONES EN ORACLE

El particionado se realiza utilizando una clave de particionado (partitioning key), que determina en que 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.

  • Particionado Range: la clave de particionado viene determinada por un rango de valores, que determina la partición donde se almacenara un valor.
  • Particionado 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.
  • Particionado List: la clave de particionado es una lista de valores, que determina cada una de las particiones.
  • Particionado Composite: los particionados anteriores eran del tipo simples (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).
  • Particionado 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).
  • Particionado 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 particionado a las aplicaciones que utilicen la base de datos (por ejemplo, en las sentencias sql de inserción deberemos de indicar en que partición insertamos los datos).

REFERENCIAS




 

 

No hay comentarios:

Publicar un comentario