Stratégie pour améliorer Oracle SUPPRIMER les performances

Nous avons un Oracle 11g installation qui commence à prendre de l'importance. Cette base de données est le backend à un parallèle de l'optimisation du système en cours d'exécution sur un cluster. D'entrée pour le processus est contenue dans la base de données avec la sortie de l'optimisation des étapes. L'entrée comprend la mémorisation des données de configuration et de certains fichiers binaires (à l'aide de 11g de SecureFiles). La sortie inclut 1D, 2D, 3D et 4D les données actuellement stockées dans la base de données.

DB Structure:

/* Metadata tables */
Case(CaseId, DeleteFlag, ...) On Delete Cascade CaseId
OptimizationRun(OptId, CaseId, ...) On Delete Cascade OptId
OptimizationStep(StepId, OptId, ...) On Delete Cascade StepId

/* Data tables */
Files(FileId, CaseId, Blob) /* deletes are near instantateous here */

/* Data per run */
OnedDataX(OptId, ...)
TwoDDataY1(OptId, ...) /* packed representation of a 1D slice */

/* Data not only per run, but per step */
TwoDDataY2(StepId, ...)  /* packed representation of a 1D slice */
ThreeDDataZ(StepId, ...) /* packed representation of a 2D slice */
FourDDataZ(StepId, ...)  /* packed representation of a 3D slice */
/* ... About 10 or so of these tables exist */

Un reaper script vient autour du quotidien et recherche de cas avec le DeleteFlag = 1 et procède à la DELETE FROM Case WHERE DeleteFlag = 1, permettant aux cascades de continuer.

Cette stratégie fonctionne très bien pour la lecture/écriture, mais dépasse aujourd'hui nos capacités lorsque l'on veut purger les données! Le hic, c'est la suppression d'une étude de Cas ~20 à 40 minutes selon la taille et souvent les surcharges de notre programme d'archivage de l'espace. La prochaine version majeure du produit se prendre un "à partir du sol" approche pour résoudre le problème. La prochaine version mineure doit rester dans les limites des données stockées dans la base de données.

Donc, pour la version mineure, nous avons besoin d'une approche qui peut améliorer supprimer les performances et la plupart exigent des changements modérés de la base de données.

  1. REF Partitionnement, mais la question est COMMENT? J'aimerais faire l'INTERVALLE sur Case et de REF sur le reste, mais ce n'est pas pris en charge. Est-il possible de partitionner manuellement OptimizationRun par CaseId par un déclencheur?
  2. Désactiver l'archivage/redo logs pour le supprime? Ne pouvais pas trouver une ASTUCE pour aller avec celui-ci. Pas sûr que c'est encore possible.
  3. Truncate? Ce qui a probablement besoin d'un peu sorta compliqué table de configuration. Mais peut-être que je ne suis pas en considérant l'ensemble de mon option. (par réponse, frappé)

Pour aider à illustrer le problème, les données en question par cas varie de 15MiB à 1.5 GiB avec n'importe où à partir de 20k à 2M lignes.

Mise à jour: taille Actuelle de la DB est de ~1,5 to.

Une question de conception: Si l'arbre des dépendances est Case -> OptimizationRun -> OptimizationStep tel qu'il apparaît, pourquoi certains tableaux de transmettre à la fois? Si vous utilisez DELETE CASCADE, vous êtes en cours d'exécution de la supprimer à l'encontre de ceux 12/13 tables à deux fois; une fois pour le OptID clé, et encore pour le StepID la clé! Si l'une de ces clés étrangères ne sont pas indexées, le rendement serait encore pire!
Musch: c'est une erreur, il est à seulement 1 clé sur ces tables. Merci pour la capture!

OriginalL'auteur user7116 | 2011-04-26