Pregunta

Tengo una aplicación que registra la actividad en una tabla (Oracle 10g). Los registros de registro deben mantenerse durante al menos 30 días. Espero que unos 20 millones de filas que se añaden a esta mesa cada mes.

El DBA sugirió que la tabla se divide en particiones que contengan una semana de datos. La secuencia de comandos de mantenimiento semanal entonces eliminar la partición más antigua (dejando sólo 4 semanas de datos en la tabla).

¿Cuál sería la mejor manera de dividir la tabla de registro?

¿Fue útil?

Solución

La partición de una tabla no es difícil - que parece que va a ser la eliminación de los datos en una base semanal, por lo que las cláusulas de partición se verá como

PARTITION "P2009_45"  VALUES LESS THAN 
(TO_DATE(' 2009-11-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
 PARTITION "P2009_46"  VALUES LESS THAN 
(TO_DATE(' 2009-11-09 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
... etc

donde su columna de partición es su columna de fecha de interés en la tabla.

Comentarios adicionales:

  • Si se puede actualizar a 11g se puede tomar ventaja de intervalo de partición, que es similar a este rango de partición, pero Oracle gestionará la creación de nuevas particiones para usted.
  • Si vas a caer de forma rutinaria fuera particiones, aconsejaría hacer todo índices de la tabla localmente particionadas para evitar la Reconstruye que sería necesaria con particiones globales después de la partición operaciones.
  • Si usted tiene una buena idea de la cantidad de las entradas de registro al mes, y se se mantiene relativamente constante, es posible que Considere el uso de una secuencia (como clave primaria) que es un tope de este número y luego recicla de nuevo a 0. Luego, su declaraciones de registro deben convertirse en "Combinar EN ... "declaraciones que, o bien crear una nueva fila o sobrescribir la fila si existiera. Esto sólo garantías que usted va a conservar el número de filas permitido por el valor de secuencia máximo y NO cierto intervalo de tiempo, pero esto podría ser una alternativa a partición (que como puntos de DVE cabo, es una opción extra gasto)

Otros consejos

El esquema de particiones más probable sería la de gama-partición sus datos sobre la fecha de creación. Cada semana, se crearía una nueva partición y soltar el más antiguo. El impacto dependerá de cómo se usa esta tabla / indexado.

Dado que es una tabla de registro tal vez no está indexado, en ese caso dejar caer una partición tendrá poco impacto: no serán invalidadas objetos de referencia, la caída será sólo requieren un bloqueo de partición (y la más antigua partición shouldn' t insertarse en ese momento).

Si está indexada la tabla, tendrá que decidir si sus índices serán globales o partitionned. índices globales tendrán que ser reconstruido cuando se le cae una partición (que lleva tiempo, aunque 20M filas sigue siendo manejable). Puede utilizar el UPDATE GLOBAL INDEXES cláusula para mantener los índices válidos después de la caída de partición.

Los índices locales serán partitionned como la mesa y pueden ser menos eficientes que los índices globales (índice de escaneo de rangos tendrán que escanear cada índice local en lugar de un índice común si no consultar por fecha). Estos índices no tendrán que ser actualizados después de una caída de partición.

20 millones de filas y cada mes es suficiente para mantener 30 días de datos? (Eso es alrededor de un mes vale la pena).

A pesar de 12 meses el valor de los datos que no sería difícil de consultar esta tabla (como una mesa grande) con el índice correcto. Inserción hay Problemen ya sea con 1 fila en la tabla de registro o 20 millones.

Particionamiento en Oracle es también una característica que debe ser pagado si estoy en lo cierto, por lo que es muy costoso (si usted no tiene una licencia ya).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top