2010-02-03 120 views
9

Estoy en el proceso de crear un almacenamiento de base de datos para mi aplicación que consiste en una sola tabla con un gran volumen de datos (cientos de millones de registros). Estoy planeando tener un índice en el campo de fecha, ya que realizaré una recuperación por lotes de todos los registros en un período de tiempo determinado de vez en cuando (por ejemplo, recuperando todos los registros para el día siguiente, a la medianoche))Partición dinámica de tablas en Oracle

Dado que el número de registros es enorme y el rendimiento es una preocupación importante en este sistema, me gustaría saber si hay una manera de dividir dinámicamente mi tabla para que pueda recuperar los registros más rápidamente, creando y truncando particiones ya que ya no son necesarios. Por ejemplo, ¿cómo podría crear una partición para el día siguiente y rellenarla con el resto de los datos una vez que haya terminado de procesar los registros de hoy?

Respuesta

3

puede automatizar el proceso de crear o truncar particiones mediante el uso de dynamic SQL. Escribiría procedimientos con EXECUTE IMMEDIATE o DBMS_SQL y los programaría con DBMS_JOB o DBMS_SCHEDULER (DBMS_SCHEDULER es una función 10g y es más versátil que DBMS_JOB).

Probablemente desee construir las instrucciones de partición manualmente primero y automatizar el proceso más adelante cuando esté seguro con el DDL. Encontrará todo el synthax en el documentation for the ALTER TABLE statement.

10

En 11g podemos definir particiones INTERVAL, y Oracle creará automáticamente nuevas particiones cuando obtenga nuevos registros cuyas claves no encajen en ninguno de los rangos existentes. Esta es una característica muy buena. Find out more.

Una cosa a tener en cuenta es que el Particionamiento es un cargo extra adicional a la licencia de Enterprise Edition. Entonces no es barato de usar.

+2

+1 La introducción del particionamiento de INTERVAL elimina la mayor parte de la necesidad del hogar soluciones para gestionar automáticamente la adición de particiones. La única mejora que desearía que Oracle proporcionara es una forma de definir una máscara de formato para los nombres de partición generados; ahora se generan con nombres genéricos generados por el sistema y siempre tengo que mirar la columna LONG HIGH_VALUE en x_tab_partitions para obtener información significativa sobre el intervalo. – dpbradley

+0

@dpbradley - No he tenido la suerte de usar Partitioning en 11g de verdad, pero puedo ver que sería bastante molesto. – APC

+0

Solo una advertencia, no puede mezclar particiones Referenciales con partición de Intervalos. Optamos por utilizar la partición referencial y, a continuación, distribuir un trabajo para crear las particiones mensuales con nuestra convención de nomenclatura preferida. – PenFold

1

Aquí hay una muestra de algo que se me ocurrió para crear particiones usando SYSDATE y un desplazamiento. Tenía que crear parámetros de sustitución con una cadena concatenada a la SYSDATE:

COLUMN temp_var new_value partition_name_01; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 3, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_01; 
SELECT TO_CHAR(SYSDATE - 3, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_02; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 2, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_02; 
SELECT TO_CHAR(SYSDATE - 2, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_03; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 1, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_03; 
SELECT TO_CHAR(SYSDATE - 1, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_04; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_04; 
SELECT TO_CHAR(SYSDATE, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
CREATE TABLE TABLE_NAME 
(
    SEQ_NO     NUMBER NOT NULL, 
    INSERT_DATE   DATE NOT NULL, 
    FIRST_NAME    VARCHAR2 (256 BYTE), 
    LAST_NAME    VARCHAR2 (256 BYTE), 
    ID_NUM     NUMBER, 
    ID_STATUS    NUMBER 
) 

PARTITION BY RANGE 
    (INSERT_DATE) 
    SUBPARTITION BY LIST 
     (ID_STATUS) 
     SUBPARTITION TEMPLATE (
     SUBPARTITION SP1 VALUES (0) TABLESPACE &tblspce, 
     SUBPARTITION SP2 VALUES (1) TABLESPACE &tblspce, 
     SUBPARTITION SP3 VALUES (2) TABLESPACE &tblspce) 

    (
    PARTITION &partition_name_01 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_01', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 

    PARTITION &partition_name_02 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_02', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 

    PARTITION &partition_name_03 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_03', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 
sysdate 

    PARTITION &partition_name_04 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_04', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN'))) 

ENABLE ROW MOVEMENT; 
1

Hay un producto que se encarga de ello automáticamente. PartitionManager for Oracle proporciona administración de partición automática, basada en la retención de la organización, incluyendo depuración y archivo de datos antiguos, copia de estadísticas, etc. Puede probarlo en http://www.xyrosoft.com

+0

¿De qué manera es esto una mejora sobre lo que Oracle ya proporciona? –

Cuestiones relacionadas