El Rincon del BI

Descubriendo el Business Intelligence…

Archive for the ‘Oracle’ Category

Suites de Business Intelligence.

Posted by Roberto Espinosa en 12 septiembre 2010


Cuando intentamos conocer algo sobre las soluciones de Business Intelligence de los principales fabricantes (o venimos de conocer un fabricante concreto), se hace dificil aclararse entre la maraña de siglas, productos, suites, versiones (mas en algunos fabricantes tras la compra masiva de competidores de los ultimos años).

He estado buscando un poquito y pidiendo ayuda, y aquí os dejo algunos links interesantes donde se explican los principales productos de algunos de los fabricantes mas importantes de soluciones BI. Espero que os ayude a aclararos.

SUITES DE ORACLE

En Dataprix, Carlos Fernández nos explica muy bien las diferentes suites que incluye Oracle en su repertorio, así como las novedades recien presentadas en la versión 11g:

http://www.dataprix.com/las-suites-business-intelligence-oracle

http://www.dataprix.com/blogs/carlos/lo-que-trae-oracle-business-intelligence-11g

Pau de BI Facil nos habla de la confusión de los diferentes productos Oracle (motivada por las adquisiciones realizadas en los últimos tiempos ):

http://www.businessintelligence.info/productos/oracle-bi-vs-oracle-bi.html

SUITES DE SAP BUSINESS OBJECTS

Gracias a Anibal Goicochea que me ha pasado la información amablemente en  respuesta a un comentario en su blog.

anibalgoicochea.com
myBPC-BO.com

Criterios para elegir componentes
http://www.mybpc-bo.com/2010/01/criterios-para-elegir-el-componente-sap.html
http://anibalgoicochea.com/2010/06/08/un-tipo-de-reporting-para-cada-circunstancia/
http://anibalgoicochea.com/2010/04/15/simplificando-la-seleccion-de-componentes-sap-businessobjects/
http://anibalgoicochea.com/2010/01/12/la-herramienta-de-bi-mas-idonea-para-el-usuario/

Altenativas para la PYME
http://www.mybpc-bo.com/2010/01/criterios-para-elegir-el-componente-sap.html
http://anibalgoicochea.com/2010/02/25/sap-businessobjects-para-la-pyme-otra-propuesta/

Herramientas para cuadros de mando
http://www.mybpc-bo.com/2009/07/sap-businessobjects-herramientas-para.html
http://www.mybpc-bo.com/2009/07/dashboards-y-scorecards-con-xcelsius.html

Recuento de herramientas BO en SAP
http://www.mybpc-bo.com/2009/07/sap-y-business-objects-una-union.html
http://anibalgoicochea.com/2010/05/06/sap-bo-componentes-de-bi-como-en-ninguna-plataforma/

Web Intelligence – Reporting Self Service
http://anibalgoicochea.com/2010/05/03/bi-self-service-un-complemento-para-el-reporting/
http://www.mybpc-bo.com/2010/04/conectividad-de-bo-con-sap-vista-desde.html

Buscador Empresarial – Una Tendencia
http://anibalgoicochea.com/2010/04/21/sap-businessobjects-explorer-el-protagonista-de-cualquier-evento/
http://anibalgoicochea.com/2010/06/02/otra-forma-de-consumir-contenidos-bi/

RoamBI – el mejor complemento para el móvil
http://anibalgoicochea.com/2010/04/17/roambi-un-excelente-complemento-para-el-bi-en-el-movil/

InfoView, el portal
http://anibalgoicochea.com/2010/04/30/el-lado-2-0-de-infoview/

BO para tratamiento de datos
http://www.mybpc-bo.com/2009/07/la-plataforma-de-bi-lider-tiene-mas-de.html

Lo que viene …
http://anibalgoicochea.com/2010/07/06/pioneer-o-sap-businessobjects-advanced-analysis-ya-mas-visible/
http://anibalgoicochea.com/2010/06/30/sap-presenta-innovacion-total-2015/

Otros links interesantes sobre Business Objects (Manuales, Comparativa con Oracle y Microstrategy, Información sobre Crystal Reports, etc):

http://todosap.blogspot.com/2010/01/manuales-sap-business-objects.html

http://anibalgoicochea.com/2010/07/09/novedades-de-obiee-11g-oracle-bi-pendientes-en-sap-businessobjects/

http://anibalgoicochea.com/2010/07/17/microstrategy-vs-sap-businessobjects/

http://anibalgoicochea.com/2010/06/11/crystal-reports-forever/

http://anibalgoicochea.com/2010/05/26/soluciones-sap-crystal-en-%e2%80%9cfree-trial%e2%80%9d/

http://anibalgoicochea.com/2010/05/18/rebranding-o-presentacion-de-la-marca-sap-crystal-reports/

SUITES DE IBM COGNOS

Otra vez Carlos de Dataprix nos describe muy acertadamente los componentes de las suites de IBM-Cognos:

http://www.dataprix.com/introduccion-cognos-bi-suite-business-intelligence-ibm

David Soto, en su blog de Integración y Calidad de Datos también nos explica muy bien los productos de IBM, haciendo mas hincapie en los productos de integración de datos:

http://integracionycalidad.blogspot.com/2010/02/el-portfolio-de-ibm-ibm-information.html

SUITES DE MICROSTRATEGY

Microstrategy ofrece un abanico mucho mas reducido de productos, intentando siempre que su suite aparezca como una aplicación integrada donde los diferentes elementos que la conforman forma un conjunto integrado de herramientas.

Podeis ampliar información sobre el producto en el analisis de la plataforma publicado en este blog:

https://churriwifi.wordpress.com/2010/04/05/14-12-conclusiones-evaluacion-final-microstrategy9/

En la web del fabricante podeis ver un detalle de los elementos que forman la suite:

http://www.microstrategy.es/Software/businessintelligence/

SUITES DE MICROSOFT

Respecto a Microsoft, podeis ampliar información en la web del fabricante:

http://www.microsoft.com/spain/sql/2008/business-intelligence.aspx

Sitios relacionados

Tambien en el blog SQLServer Si, de Salvador Ramos.

Creo que con todos estos links y análisis podemos hacernos algo más de idea de los diferentes productos que tenemos en el mercado, de cara a la selección de una plataforma de Business Intelligence (fuera del ambito del Open Source, donde no he querido entrar).

Posted in Business Intelligence, IBM Cognos, Microsoft, Microstrategy, Oracle, Sap | 12 Comments »

Clonar una base de datos Oracle.

Posted by Roberto Espinosa en 22 junio 2010


Seguro que a todos los que trabajais con Oracle (o con Sap y como base de datos Oracle como es mi caso), os ha surgido la necesidad de replicar una base de datos productiva (o de un entorno de pruebas), en otro sistema. En mi caso, trabajando con Sap, regularmente realizo una copia de la base de datos real en el sistema de desarrollo (integración), para que la pruebas de los cambios, desarrollos o parametrizaciones sean lo mas completas posibles (y lo mas fáciles posible de cara al usuario si dispone de los datos «reales» más actualizados).

Acabo de terminar la instalación de un nuevo entorno de desarrollo Sap (por un cambio de hardware), en el que hemos aprovechado para hacer una replica del sistema productivo a nivel de base de datos. Os voy a explicar los pasos seguidos por si alguno de vosotros tiene la misma necesidad, aunque seguro que hay otras formas de hacerlo (export de base de datos, utilizando RMAN, etc). En mi caso, he partido de un backup Online (aunque es recomendable realizarlo con uno Offline), y he copiado una base de datos que se llama MG1 en otra en una máquina distinta que se llama DE1. El procedimiento que os voy a explicar esta validado con Oracle 9i.

1) Realización del backup de la base de datos origen: como os he indicado, he realizado un backup online utilizando el software de backup Veritas Netbackup, que tiene sus herramientas especificas para trabajar con Sap y Oracle, pero podriamos igualmente haberlo realizado con un script sql para poner los tablespaces en modo backup y copiar los datafiles correspondientes a la nueva ubicación. Una vez terminada la copia, se vuelven a poner los tablespaces en modo normal. También podriamos haber realizado un backup offline con la base de datos parada (aunque esto no es siempre posible, pues podemos estar en un sistema cuya ventana de backup sea muy pequeña y no se pueda hacer de esta manera).

Los scripts sql para poner los tablespaces en modo backup(al comenzar este), asi como para ponerlos en modo normal(a la finalización del backup), los podeis generar con las sentencias SQL que os detallo a continuación:

set lines 999 pages 999
set verify off
set feedback off
set heading off

spool begin_backup.sql

select 'alter tablespace ' || tablespace_name || ' begin backup;' tsbb
from    dba_tablespaces
where   contents != 'TEMPORARY'
order by tablespace_name
/
spool off

spool end_backup.sql

select 'alter tablespace ' || tablespace_name || ' end backup;' tseb
from    dba_tablespaces
where   contents != 'TEMPORARY'
order by tablespace_name
/
spool off

Al ejecutar la sentencia se habrán generado dos ficheros: begin_backup.sql y end_backup.sql, cada uno con el cometido indicado anteriormente.

2) Preparación de la copia: en mi caso, en el sistema destino ya tengo instalado Oracle y creada toda la estructura de carpetas para las ubicaciones de los datafiles. En caso contrario, habrá que realizar la instalación de Oracle y crear las carpetas correspondientes donde se van a ubicar los ficheros de datos. Una vez preparado todo en el sistema destino, vamos a realizar un par de tareas mas de preparación.

  • Ajuste del fichero de parametros de oracle: el fichero de parametros de oracle es imprescindible para poder arrancar la base de datos en el sistema destino (fichero init<SID>.ora, donde <SID> es el nombre de la base de datos). Habremos de ajustar el contenido de este fichero para que corresponda a los directorios del nuevo sistema (destino de redologs, rollback segments en el caso de que los utilicemos, etc), pero siempre tomando como modelo el mismo fichero del sistema origen. Igualmente, puede que tengamos que ajustar parametros de este fichero conforme a las características físicas de la maquina destino (memoria, procesadores, etc).
  • Creación de la sentencia SQL para recrear los ficheros de control:  ejecutaremos la sentencia SQL en el sistema origen: alter database backup controlfile to trace as ‘/tmp/crea_bd.sql’; Con la ejecución de esta sentencia, hemos creado un fichero con sentencias sql, que nos van a permitir recrear los ficheros de control en el sistema destino una vez hayamos recuperado el backup. En mi ejemplo, el contenido del fichero creado es el siguiente:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "MG1" RESETLOGS  ARCHIVELOG
--  SET STANDBY TO MAXIMIZE PERFORMANCE
 MAXLOGFILES 16
 MAXLOGMEMBERS 3
 MAXDATAFILES 1022
 MAXINSTANCES 50
 MAXLOGHISTORY 5445
LOGFILE
 GROUP 11 (
 '/oracle/MG1/mirrlogA/log_g11m2.dbf',
 '/oracle/MG1/origlogA/log_g11m1.dbf'
 ) SIZE 20M,
 GROUP 12 (
 '/oracle/MG1/mirrlogB/log_g12m2.dbf',
 '/oracle/MG1/origlogB/log_g12m1.dbf'
 ) SIZE 20M,
 GROUP 13 (
 '/oracle/MG1/mirrlogA/log_g13m2.dbf',
 '/oracle/MG1/origlogA/log_g13m1.dbf'
 ) SIZE 20M,
 GROUP 14 (
 '/oracle/MG1/mirrlogB/log_g14m2.dbf',
 '/oracle/MG1/origlogB/log_g14m1.dbf'
 ) SIZE 20M
-- STANDBY LOGFILE

DATAFILE
 '/oracle/MG1/sapdata1/system_1/system.data1',
 '/oracle/MG1/sapdata5/btabd_1/btabd.data1',
 '/oracle/MG1/sapdata2/btabi_1/btabi.data1',
 '/oracle/MG1/sapdata6/clud_1/clud.data1',

………………………..

CHARACTER SET WE8DEC
;

Habremos de realizar algunos cambios en el scritpt SQL contenido en este fichero para poder utilizarlo de forma correcta en el sistema destino:

  • Nombre de la base de datos: el nuevo nombre de la base de datos va a ser DE1. Para ello, cambiaremos la parte inicial del script, sustituyendo MG1 por DE1. Igualmente, cambiaremos el valor REUSE por SET. La sintaxis quedaría como sigue:
CREATE CONTROLFILE SET DATABASE "DE1" RESETLOGS  ARCHIVELOG..........
  • Ubicación de ficheros de logs y de datafiles: todas las rutas de los logs y de los datafiles que aparecen en el fichero han de ser modificadas para que correspondan con las ubicaciones reales que van a tener en el sistema destino. En mi caso, voy a cambiar la carpeta /oracle/MG1 por /oracle/DE1, que es la ubicación en mi sistema de todos esos elementos.
  • Resto de sentencias SQL en el fichero: todas las sentencias SQL que hay a partir del valor CHARACTER SET … las borramos, pues las lanzaremos manualmente una vez recreados los controlfile (borrar RECOVER DATABASE…. y ALTER DATABASE OPEN RESETLOGS).

3) Restauración de ficheros de datos en el sistema destino: realizamos una recuperación de la copia de seguridad en las ubicaciones correspondientes del sistema destino. Las localizaciones de los datafiles deberan de coincidir con las que hayamos descrito en el script crea_bd.sql (tal y como hemos visto en el punto anterior), pues al lanzarlo, debera de encontrar todos los ficheros para poder realizar correctamente el proceso. En el caso de que hayamos realizado un backup offline, no hará falta traerse los ficheros de redologs del sistema origen, pero si en el caso de un backup online. Esto es necesario para dejar la base de datos en un punto consistente, pues durante el backup, todos los cambios que se producen en los tablespaces se van quedando registrados en los redologs. Es una forma de asegurar la consistencia de la base de datos tras el proceso  de recuperación.

4) Proceso final: recreación de control file y arranque de la base de datos. Una vez ha terminada la recuperación, vamos a realizar la parte final del proceso, y las más crítica. Para ello, ya ubicados en el sistema destino, arrancaremos el listener (puede que también haya que realizar algun ajuste en el para adaptarlo al nombre de la nueva base de datos), y nos conectaremos a la base de datos con sqlplus. La base de datos no esta arrancada, y ejecutaremos el script crea_bd.sql que hemos creado y ajustado anteriormente:

tm-des:orade1 1> sqlplus

SQL*Plus: Release 9.2.0.8.0 - Production on Tue Jun 22 16:00:10 2010

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.8.0 - Production

SQL> @/tmp/crea_bd.sql

La sentencia arranca la base de datos en modo NOMOUNT y realiza la recreación de los ficheros de control (las ubicaciones de estos ficheros estan definidas en el fichero init<SID>.ora, en el parametro control_files). Durante este proceso, se verifica que todos los ficheros existan fisicamente. En el caso de presentarse algun error y se pare el proceso (no existe alguna carpeta o los ficheros estan en una ubicación distinta), corregiremos los errores y volveremos a lanzar el proceso.

Una vez concluida la creación de los ficheros de control, arrancaremos la base de datos. La forma variara según si partimos de un backup offline o online. Por ejemplo, para el backup offline, que es un backup consistente pues se ha parado toda la actividad de la base de datos cuando se realizo, ejecutaremos la siguiente sentencia sql:

ALTER DATABASE OPEN RESETLOGS;

En el caso de haber realizado un backup online, pueden variar las sentencias a ejecutar. En mi caso, quiero dejar la base de datos consistente en un determinado momento del tiempo. Para ello, ejecutare las siguientes sentencias:

RECOVER DATABASE UNTIL TIME '2010-06-10:01:00:00' USING BACKUP CONTROLFILE;
ALTER DATABASE OPEN RESETLOGS;

He recuperado la base de datos a un momento determinado del tiempo (la 1 de la madrugada del 10 de junio de 2010). Para el proceso, ha sido necesario tener en el directorio de redologs los logs archivados necesarios (provenientes del sistema origen), para que su contenido sea aplicado sobre los tablespaces y llegar de forma coherente al punto del tiempo indicado.

En este momento, la base de datos ya esta recuperada y abierta. Como paso final, ejecutaremos la siguiente sentencia para cambiar el global database name (podemos ver el valor actual ejecutando la sentencia select * from global_name;):

ALTER DATABASE RENAME GLOBAL_NAME TO DE1.world

En mi caso, arranco además Sap y realizo una serie de acciones para dejar el sistema preparado para trabajar con el. En el caso de que estemos solo con una base de datos de pruebas en cualquier otro tipo de instalación, ya tendriamos los datos del sistema origen online y disponibles para poder realizar cualquier operativa sobre ellos. También puede ser una forma útil de replicar un sistema de Business Intelligence para sistema de test o de formación.

Os dejo algunos links donde podeis ampliar información de la forma de realizar todos los procesos descritos, pues mi explicación ha sido bastante resumida y según la forma de realizar el proceso, puede que tengaís que tener muchas mas cosas en cuenta:

Oracle Dba Quick Guide.

Sap System Copy: para el caso de que esteis trabajando con Sap (se explican aspectos adicionales en la copia homogenea de un sistema a otro).

Posted in Bases de Datos, Oracle | 4 Comments »

15.4.1. Particionado de tablas en Oracle.

Posted by Roberto Espinosa en 24 abril 2010


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 mejorar 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’) );

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)

Vistas Materializadas

Otra funcionalidad muy interesante de Oracle y que nos puede ser util cuando estemos construyendo un sistema de Business Intelligence son las Vistas Materializadas. Las vistas materializadas son un tipo de vistas especiales, en las que, ademas de guardarse la definición de esta (como es habitual en todos los sistemas de gestión de bases de datos), también se guardan los datos. También se determina en su definición cuando se va a realizar el refresco del contenido de la «vista». Nos pueden ser muy utiles para la creación de tablas sumarizadas en un DW o para la creación de tablas intermedias. Os recomiendo la lectura de la entrada en dataprix.com donde se habla de este tema.

Posted in Bases de Datos, Oracle | Leave a Comment »