Base de datos en la nubeDANAConnect |
DANAConnect provee una versátil herramienta de base de datos que opera completamente en la nube, capaz de manejar millones de registros, realizar segmentaciones automáticas y proveer diferentes vistas y reportes sobre los datos de acuerdo a distintos parámetros de análisis. |
La información cargada reside de forma segura en nuestros servidores de datos de alta disponibilidad y puede ser accedida simplemente a través de un navegador de internet tal como Firefox, Chrome e Internet Explorer. La aplicación cuenta con una interfaz sencilla que en pocos pasos permite la definición de una estructura de datos compleja, la carga masiva de datos y la generación de segmentos y reportes de gran utilidad. |
Manejo de Listas |
Las bases de datos de DANAConnect son el punto de partida de todas las aplicaciones de DANA, en tanto permiten la carga masiva y almacenamiento seguro de la información de los clientes y sus interacciones que será utilizada para la ejecución de campañas comunicacionales. |
![]() |
Las bases de datos son una representación lógica de cualquier tipo de información de negocio relevante que se desee almacenar. Esta información puede consistir en listas de clientes, productos, categorías, consumos, subscripciones, pagos, etc. La información puede organizarse en diferentes bases de datos, tantas como sea requerido, y cada base de datos admite tantos campos como sea necesario. |
![]() |
Cada campo de la base de datos puede ser de un tipo específico, tal como “numérico”, “alfanumérico”, “fecha”, etc. o puede ser de un tipo configurable avanzado tal como “correo electrónico”, “dirección”, o “archivo”. |
Los tipos de datos permiten definir reglas y validaciones sobre los campos ingresados desde la interfaz web, minimizando así errores durante la carga de datos. Adicionalmente, el sistema admite que una base de datos sea utilizada como un tipo de campo, de forma que los valores que dicho campo pueda tomar esté restringido por los valores incluidos en esa base de datos. |
Estas campos de tipo “relación” son extremadamente útiles para la definición de categorías y otros valores de tipificación. |
De este modo, es posible definir en apenas minutos una estructura compleja de bases de datos, organizada de acuerdo a un modelo flexible que puede ser modificado en cualquier momento. |
Segmentación Avanzada |
La segmentación avanzada de datos es una de las principales funcionalidades de nuestra plataforma. |
Los segmentos son subconjuntos de datos que ofrecen información agregada para usos gerenciales y de toma de decisiones y, por lo general, se definen para usos de negocio específicos, tal como el listado de los últimos clientes registrados en el sistema, o el listado de los productos más vendidos en el último trimestre. |
Un segmento se construye aplicando filtros sobre la información. Por ejemplo, un segmento puede definirse a partir de condiciones tales como “fecha de nacimiento mayor que hoy”, “nombre contiene letra m”, “email de contacto no es vacío”. |
![]() |
Las condiciones de filtro siempre deben operar sobre un campo clave de la base de datos, lo cual implica que debe prestarse atención a la calidad de la información contenida en el mismo. |
Si un campo utilizado para un filtro se define como opcional o no se le realizan validaciones durante la carga de datos, es posible que la información representada por la vista no tenga completa validez. |
Tanto las bases de datos como cualquiera de sus segmentos pueden ser utilizados como punto de partida para la ejecución de una campaña comunicacional. Incluso, la plataforma DANAConnect permite a la ejecución de campañas de segmentación automática, apalancando el nodo de marcado, las cuales realizan el proceso de creación de segmentos de forma automatizada. |
![]() |
Las condiciones de filtro siempre deben operar sobre un campo clave de la base de datos, lo cual implica que debe prestarse atención a la calidad de la información contenida en el mismo. Si un campo utilizado para un filtro se define como opcional o no se le realizan validaciones durante la carga de datos, es posible que la información representada por la vista no tenga completa validez. |
Tanto las bases de datos como cualquiera de sus segmentos pueden ser utilizados como punto de partida para la ejecución de una campaña comunicacional. Incluso, la plataforma DANAConnect permite a la ejecución de campañas de segmentación automática, apalancando el nodo de marcado, las cuales realizan el proceso de creación de segmentos de forma automatizada. |
Por ejemplo, sobre la base de una lista de contactos de potenciales clientes, se puede ejecutar una campaña de promoción enviando un correo electrónico con imágenes de distintos productos y enlaces a páginas de destino con mayor información sobre cada uno. |
Esta campaña puede detectar automáticamente aquellos clientes que han mostrado interés en un producto en particular y “marcarlos” como clientes de mayor valor. |
Este marcado genera una marca en la base de datos que puede usarse como filtro para un segmento avanzado, de forma que la vista de “Clientes Interesados” se alimente automáticamente con base en las interacciones ocurridas en la campaña. Este nuevo segmento puede ser utilizado como base para una nueva campaña más focalizada en el producto específico seleccionado por el cliente. |
Reportes |
La herramienta de base de datos permite la búsqueda avanzada y la generación de reportes con base en distintas condiciones sobre los datos existentes. El resultado de una búsqueda o un reporte puede exportarse a un archivo en formato CSV (separado por comas) para la consulta desde sistemas externos, o bien puede ser utilizado para la generación de un nuevo segmento de datos. |
![]() |
Importación/Exportación |
La herramienta de bases de datos facilita la carga y descarga de información a través de archivos en formato CSV (separado por comas), a fin de ser utilizados por sistemas externos a la plataforma DANAConnect. El proceso de carga de información en las bases de datos de DANA incluye funcionalidades avanzadas para detectar la existencias de registros duplicados. |
![]() |
jueves, 21 de marzo de 2013
Solucion de Bases de datos en la nube
Actividad #20 Creacion de la Bitacora
Crear bitácoras para el sistema ficticio de la tercera unidad ( clinica veterinaria) , utilizando las herramientas propias del DBMS
Se abre el Xampp en el cmd
luego se ingresa los siguentes comandos
C:\Users\Blue>cd..
C:\Users>cd..
C:\>cd xampp
C:\xampp>cd mysql
C:\xampp\mysql>cd bin
Este es el comando para crear la bitacora aqui seleccionas la direccion donde sera creada.
C:\xampp\mysql\bin>mysql -hlocalhost -uroot --tee="G:Bitacora.txt"
Actividad 19
Actividad #19 • Crear espacios de trabajo para tres usuarios de niveles distintos, con restricciones de almacenamiento acordes a cada perfil de usuario.
usuario administrador :( todos los privilegios)
Usuario: medico veterinario: ( con privilegios para borrar, agregar y modificar datos pero no para modificar estructuras de las tablas)
Usuario Asistente: solo tiene privilegios de consulta
usuario administrador :( todos los privilegios)
Usuario: medico veterinario: ( con privilegios para borrar, agregar y modificar datos pero no para modificar estructuras de las tablas)
Usuario Asistente: solo tiene privilegios de consulta
Creacion de Usuarios
Asignacion de Privilegios
lunes, 18 de marzo de 2013
Actividad 18
Actividad #18 • Implementar el esquema de base de datos de la clinica veterinaria ( incluir todas las tablas y datos de 5 pacientes con 2 registros de visita a la clinica cada uno)
Actividad 17
Actividad #17 • Planear y definir la estructura lógica de la base de datos de acuerdo a los recursos disponibles –memoria y disco. ( utilice el problema de la Veterinaria) incluya toda la secuencia, ( esquema conceptual, esquema lógico y esquema físico), calcular el numero de bytes por registro ( de acuerdo al tipo de datos) y cuantos bytes aproximados se require para alamacenar los datos de 100 pacientes con un promedio de 6 consultas al año) deben contener todos los campos incluidos en la hoja clinica en el diseño
Si furan 100 registros se necesitarian 10,500 bytes.
130 bytes por registro de la tabla Caracteristicas Especiales.
Si furan 100 registros se necesitarian 13,000 bytes.
Si furan 100 registros se necesitarian 9,800 bytes.
Si furan 100 registros se necesitarian 13,000 bytes.
martes, 12 de marzo de 2013
Particiones en Oracle
Particionado
de tablas en Oracle
En una entrada anterior del blog
vimos los conceptos básicos del particionado de tablas y como se podian llevar a la práctica
utilizando MySql. Incluso hicimos una comparativa de
tiempos de respuesta con una tabla de 1 millón de registros con y sin
particionado. Vamos a ver ahora como implementa Oracle el particionado y
algunos ejemplos prácticos de creación de tablas particionadas. Como ya vimos,
el particionado es una técnica de optimización que pretende mejorar los tiempos
de respuesta de las consultas, y que puede ser especialmente útil en un sistema
DW donde las tablas de hechos pueden ser muy grandes.
Tipos de
Particionado en Oracle
El particionado fue introducido
por primera vez en la versión 8 de Oracle, como una nueva característica DW
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:
particionado 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 particionado Composite.
- Oracle
11g:
se introducen las columnas virtuales para particionar(que no existen
fisicamente en la tabla), así como el particionado de Sistema (donde
podemos gestionar directamente en que partición de la tabla se insertan
los registros) y el particionado por Intervalos.
Particionado de Tablas en Oracle
Basicamente, 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).
Referente al particionado, y como
característica interesante, 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 util en muchas
situaciones.
Vamos a ver un ejemplo de
construcción de cada uno de los tipos de particionado.
Particionado Range
Esta forma de particionamiento requiere que
los registros estén identificado por un “partition key” relacionado por
un predefinido rango de valores. 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
esta mejor situado cuando se tiene datos que tienen rango lógicos y que pueden
ser distribuidos por este. Ej. Mes del Año o un valor numérico.
Particionado Hash
Los registros de la tabla tienen
su localización física determinada aplicando un valor hash a la columna del
partition key. La funcion hash devuelve un valor automatico que determina a que
partición irá el registro. Es una forma automática de balancear el particionado. Hay varias
formas de construir este particionado. 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);
Particionado List
Este tipo de particionado 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 (como en los otros tipos), 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 iran el resto de registros que no cumplen
ninguna condición de las diferentes particiones.
Particionado Composite
Este tipo de particionado es
compuesto, pues se conjuga 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
Composite en Oracle
Particionado Interval
El particionado Interval ha sido
introducido en la versión 11g para habilitar un mantenimiento de particiones
desasistido. 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 las particiones Interval, preparamos
para que Oracle cree las particiones de forma automática cuando lo necesite.
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
Una de las nuevas funcionalidades
introducida en la version 11g es el denominado partitioning interno o de
sistema. En este particionado Oracle no realiza la gestión del lugar donde se
almacenaran 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
para aplicaciones donde nos interesa ser nosotros lo que gestionamos la forma
en la que se realiza el particionado (lógica de 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') );
Os recomiendo la lectura de la
entrada del blog OraMDQ donde
Pablo Rovedo habla en profundidad sobre las nuevas funcionalidades de
particionado de la version 11g de Oracle, incluyendo unos completos ejemplos
prácticos.
Gestión del particionado.
La gestión del particionado es
totalmente dinámica, de forma que se podrán añadir particiones a una tabla
particionada existente, juntar o borrar particiones, convertir una particion en
una tabla no particionada, partir 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 de blog Bases de Datos y Tecnología donde se
explican en detalle algunas de estas operaciones, así como el blog Database Design que también
habla sobre el tema).
El particionado en Oracle tiene
muchas mas funcionalidades de las que podeis ampliar información en la propia
documentación online del fabricante (Oracle 10g y Oracle 11g)
Particiones en MySQL
Particiones en MySQL
Cuando alguna de las tablas de tu base de datos llega a crecer tanto que el rendimiento empieza a ser un problema, es hora de empezar a leer algo sobre optimización. Índices, el comando
EXPLAIN
, el registro de consultas lentas, … estas son herramientas básicas que todo el mundo debería conocer. Una característica algo menos conocida, aunque se introdujo en la versión 5.1 de MySQL, son las particiones.
En el hospital en que trabajo la mayor tabla con la que tenemos que lidiar es la que almacena todos y cada uno de los contratos de todos los trabajadores que alguna pasaron por el hospital desde que se fundó en los años 50. Esto supone sólo un par de cientos de miles de tuplas, lo cuál no debería dar muchos dolores de cabeza con una base de datos bien optimizada, consultas razonables, y un hardware decente. Sin embargo, hay personas que tienen que tratar con cantidades de datos realmente obscenas, que multiplican estos números por 10 veces 10.
Una solución que nos puede venir a la cabeza, sobre todo si la mayor parte de la información se almacena a modo de histórico y no se accede a ella frecuentemente, es dividir la tabla en varias porciones. Podríamos mantener una tabla para el año en curso y otra para el resto de años, por ejemplo; o una para cada uno de los años; una por lustro; por década… dependiendo de cómo se trabaje con los datos.
El particionado es un concepto parecido, aunque automatizado, que puede ahorrarnos muchos quebraderos de cabeza. 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
- ALTER TABLE contratos
- PARTITION BY RANGE(YEAR(fechaInicio)) (
- PARTITION partDecada50 VALUES LESS THAN (1960),
- PARTITION partDecada60 VALUES LESS THAN (1970),
- PARTITION partDecada70 VALUES LESS THAN (1980),
- PARTITION partDecada80 VALUES LESS THAN (1990),
- PARTITION partDecada90 VALUES LESS THAN (2000),
- PARTITION partDecada00 VALUES LESS THAN (2010),
- PARTITION partDecada10 VALUES LESS THAN MAXVALUE
- );
- Por listas: para construir nuestras particiones especificamos listas de valores concretos.
- ALTER TABLE contratos
- PARTITION BY LIST(YEAR(fechaInicio)) (
- PARTITION partDecada50 VALUES IN (1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959),
- PARTITION partDecada60 VALUES IN (1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969),
- PARTITION partDecada70 VALUES IN (1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979),
- PARTITION partDecada80 VALUES IN (1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989),
- PARTITION partDecada90 VALUES IN (1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999),
- PARTITION partDecada00 VALUES IN (2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008, 2009),
- PARTITION partDecada10 VALUES IN (2010, 2011, 2012, 2013, 2014, 2015, 2016,
- 2017, 2018, 2019)
- );
- 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.
- ALTER TABLE contratos
- PARTITION BY HASH(YEAR(fechaInicio))
- PARTITIONS 7;
- 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.
- ALTER TABLE contratos
- PARTITION BY KEY()
- PARTITIONS 7;
- Compuesta: podemos combinar los distintos métodos de particionado y crear particiones de particiones
- EXPLAIN SELECT COUNT(*)
- FROM contratos
- WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'
- EXPLAIN PARTITIONS SELECT COUNT(*)
- FROM contratos
- WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'
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)
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)
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.
Suscribirse a:
Entradas (Atom)