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.
- 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 manuellementOptimizationRun
parCaseId
par un déclencheur? - 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.
- 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.
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
Vous devez vous connecter pour publier un commentaire.
La suppression de données est un enfer d'un emploi, pour la base de données. Il a de créer avant d'images, de mise à jour des index, écrire redo logs et supprimer les données. C'est un processus lent. Si vous pouvez avoir une fenêtre pour effectuer cette tâche, la plus facile et la plus rapide est de construire de nouvelles tables, contenant les données utiles. Déposer les anciennes tables et renommez le nouveau tables de.
Cela nécessite certains travaux d'installation, c'est évident, mais il est très bien possible de faire.
Une étape de moins drastique à la baisse de l'index avant de le supprimer. Mon vote irait pour le DEC (Create Table (Select) et construire les nouvelles tables.
Un joli schéma de partitionnement serait certainement utile, peut-être dans la prochaine version d'Oracle pouvez combiner et de l'intervalle de référence de partitionnement. Il serait très agréable d'avoir.
La désactivation de la journalisation .... ne peut pas être fait pour les supprime mais DEC pouvez utiliser nologging. Faire une sauvegarde lorsque vous êtes prêt et assurez-vous de transférer les fichiers de données à partir de l'écran de base de données, si vous en avez un.
Oui, c'est vrai. Selon la manière dont le stockage est configuré, il peut être fait en une demi-heure. Si les données n'est pas modifié fréquemment, vous pourriez penser sur la compression des tables lors de l'ÉTG. Dans ce cas, vous pourriez très bien gagner de l'espace. Une autre option est de programmer supprimer des emplois qui sont constamment à la suppression des données. Le plus intelligent est de ne pas utiliser la cascade, mais commencer la suppression de tables enfant à la mère tables. Sont les clés étrangères indexées?
Oui les FK sont indexés. Nous n'avons pas vu d'amélioration dans un manuel de supprimer cependant.
Sont des déclencheurs de jouer un rôle dans le temps de réponse? Ils peuvent vraiment tuer la performance. Ce plan sont les supprime l'aide? Dans le manuel d'utilisation en vrac supprime de départ avec les enfants, j'attends une meilleure performance que de revenir à l'option cascade. Beaucoup d'indices en place? Pourriez-vous déposer?
Il y a des déclencheurs, mais je ne crois pas qu'elles s'exécutent sur supprimer. Par "supprimer en vrac" vous parlez à juste
DELETE FROM table WHERE id = ...
?OriginalL'auteur ik_zelf
Juste quelques pensées:
Je suppose que vous avez des index sur toutes les clés étrangères. On DELETE CASCADE tiendra ligne les verrous de niveau jusqu'à ce que le Cas de suppression est terminée, et sans index tiendra les verrous de table, je crois, et être super lent de cours
Avez-vous reporté contraintes? Ce seraient le plus susceptibles de ralentir les choses pour Oracle en cascade à travers les différentes table supprime
Avez-vous essayé de faire le supprime séparément pour toutes les tables concernées (au lieu de s'appuyer sur delete cascade)? Ce n'était pas facile, mais vous pourriez être surpris.
EDIT:
Encore une pensée. Vous pouvez envisager de faire un SOFT delete sur la table de Cas, ce qui signifie que vous avez un champ d'état qui va parler de votre application si cette Affaire doit être envisagée. Cet indicateur pourrait avoir de nombreuses valeurs différentes, mais peut-être 'Un' actif et " I " pour les inactifs. En supposant que vous êtes toujours à l'aide de Cas de conduite/table principale en se joint à d'autres tables, vous pouvez éviter le DUR supprime tous ensemble (et parfois de faire un nettoyage de l'extérieur des heures sur n'importe quel calendrier si vous le souhaitez). Les applications doivent être conscients de ce drapeau, bien sûr, et que vous souhaitez être lié à joindre à revenir à la table de Cas. Peuvent ou peuvent ne pas convenir à votre situation...
Le disque est bon marché de nos jours. Je dirais que votre suppressions en cascade sont plus chers. Par ailleurs, les suppressions ne pas réinitialiser la ligne des Hautes eaux, de sorte que votre avenir insère sera au-dessus de cette ligne des hautes eaux, et ne sera pas vraiment économiser de l'espace comme vous pouvez le penser. Vous aurez besoin de faire un truncate ou de com pour vraiment libérer de l'espace.
Théoriquement, le disque est bon marché; en réalité, il peut prendre 1 à 2 mois pour obtenir de stockage ajouté à notre base de données. Serait de passer à une stratégie de partitionnement de nous permettre de gérer l'espace mieux?
eh bien, la troncation d'une partition de libérer de l'espace, alors que la suppression des millions de lignes ne sera pas. Encore une fois, pas sûr de votre douleur au point exactement. Si ses vraiment de l'espace, puis en faisant supprime ne va pas aider, et en plus de cela vous êtes la création d'un plus grand problème en générant tous les journaux. Mais peut-être que je ne suis malentendu vous ici
Lors de la suppression d'une ligne libérant ainsi de l'espace à l'intérieur d'un bloc, Oracle peut réutiliser cet espace libre pour s'insérer. Selon la mise à jour des modèles que vous ne pouvez pas besoin pour récupérer de l'espace à tous, depuis que vous avez peut-être l'insertion, la suppression, pour la même quantité de stockage de toute façon. Aussi, pour un accès indexé, la ligne des hautes eaux n'a pas d'importance.
OriginalL'auteur tbone
CASCADE DELETE
s'exécute en interne lente-par-lent, er, ligne par ligne.Certaines options:
Votre purge de l'emploi instantané de tous les cas d'être vidés dans un scratch table avec un DEC. Ensuite, demandez à votre purge de l'emploi de la boucle sur la table, la suppression de chaque cas (et ses enfants) individuellement. Cela peut être désagréable, surtout si vous rencontrez des millions de descendants des lignes. Nous avons dû changer l'un des processus récemment à [business expurgé] qui n'a que pour déterminer ultime parents avaient enfant compte qui serait problématique, et ensuite utiliser un
rownum
limiteur d'une suppression à l'encontre de la problématique de la table enfant(s). Il n'est pas rapide, mais au moins il est plus sûr d'une gestion du undo/redo perspective en plaçant une limite supérieure sur la façon dont grand de toute transaction peut être.Si vous utilisez
CASCADE DELETE
comme une commodité, vous pouvez toujours ne pas le faire. Vous devriez écrire une version plus sophistiquée de purge de routine qui supprime de votre dépendance à l'arbre de "bas en haut".Si vous pouvez vous permettre le undo/redo génération sur le soft de supprimer, vous pourrait être de l'ordre de la partition de la société mère ultime sur
DeleteFlag
, alors la partition les enfantsBY REFERENCE
, toutes les tables à l'aide d'ACTIVER la LIGNE MOUVEMENT. Vous feriez subir annuler/refaire les frais de déplacement de l'lignes lorsque supprimée, mais quand il est venu le temps pour enfin vider, il serait tronquer les partitions oùDeleteFlag = 1
, rien de plus.Ajout d'espace de stockage est relativement bon marché. Si il y a une date basée sur option de conservation, d'utilisation, et ont juste le soft de supprimer l'option masquer les données de l'application avant la fin. C'est inélégant, mais à l'époque, donc est
CASCADE DELETE
.Le coût de performances pour l'utilisation de la ligne de mouvement serait de l'ordre de la réalité de l'insertion et de la suppression d'une quantité de données. L'avantage potentiel serait que la suppression du coût serait "cuit" à l'exploitation du système. Avec supprime vs gouttes ou tronque, il va toujours être payer maintenant ou payer plus tard.
OriginalL'auteur Adam Musch
Utiliser Enterprise Manager pour créer un rapport AWR et le lancer à travers statspack analyseur qui vous donnera des instructions détaillées sur les goulots d'étranglement dans votre système. Un rapport AWR est un fichier texte contenant toutes sortes de données sur ce que la base de données a fait pendant un certain temps et combien de temps il a fallu.... Que statspack analyseur ist de tri automatique d'un DBA de vous dire quoi faire.
Oublier les partitions jusqu'à Statspack Analyzer vous dit qu'ils pourraient être utiles et vous avez un peu ralenti les disques que vous pouvez utiliser pour distribuer les I/O.
Ne pense pas à tronquer. Il force un commit...
BTW, je ne suis pas affilié avec Statspack de l'Analyseur, mais je pense que c'est une très viable général de l'approche tuning pour Oracle, surtout si il n'y a pas de DBA autour de.
pour que la taille de la DB je serais certainement faire un statspack rapport de la première.
Nous avons fait une analyse avec précision i3 et appris que notre supprimer ont été le goulot d'étranglement.
Je crois qu'un statspack rapport serait aller au-delà de i3. Afin d'affiner votre supprime que vous auriez à trouver la 1ère combien d'e/S physiques qu'ils causent et comment le I/O est distribué à travers vos partitions.
0 partitions, donc assez facile de trouver de la distribution 🙂
OriginalL'auteur HAL 9000
Pas conseillé pour vivre de la base de données.
OriginalL'auteur keiki