2009-01-30 6 views
1

Situation:Suppression d'enregistrements avec des tables enfants

  • Tableau TBL a ~ entrées 10k pour la suppression,
  • Table TBL a 14 tables enfants avec règle de suppression "pas d'action",
  • Je veux supprimer 10k entrées et entrées référencées dans les tables enfants.

Procédure:

  • dossiers Supprimer dans les tables enfant,
  • contraintes Désactiver (si les contraintes sont suppression non désactivées à l'étape suivante prend pour toujours),
  • Supprimer enregistrements dans la table TBL,
  • Autoriser les contraintes.

Existe-t-il une façon plus élégante de faire cela?

Le problème est que la troisième étape prend trop de temps car elle vérifie 14 grandes tables pour l'existence d'enregistrements inexistants. Ma procédure a un bon temps d'exécution mais je pense qu'il y a une manière plus élégante.

+0

Vous devez indexer la colonne FK dans la table enfant. Vous faites 14 FTS. C'est = lent. 14 recherches d'index = rapide. –

Répondre

3

Il semble que vous ayez besoin d'indexer vos clés étrangères sur vos tables enfant. Chaque fois que vous supprimez un enregistrement parent sans index sur la table enfant, il doit effectuer une analyse de table complète de l'enfant pour vérifier si la contrainte de clé étrangère a été rompue.

Avec l'index, il s'agit dans le pire des cas d'un balayage de plage d'index.

Modifier: Plus d'infos, et un script pour déterminer si c'est votre problème peut être trouvé ici. http://asktom.oracle.com/tkyte/unindex/index.html

+0

C'est un bon indice et un lien AskTom (j'ai voté) mais les tables enfants sont indexées sur ce FK. – Chobicus

+0

Ma principale préoccupation avec votre approche serait si une autre session insérée de mauvaises données dans les tables enfant alors que les contraintes étaient en baisse. Si ce n'est pas possible, alors ça devrait aller. –

Questions connexes