2009-10-27 11 views
2
delete from a A where a.ID = 132. 

La table A contient environ 5000 enregistrements et A.ID est la clé primaire de la table A. Mais la suppression prend beaucoup de temps. Parfois, il est également temporisé. Cette table contient trois index et elle est référencée par trois clés étrangères. Quelqu'un peut-il m'expliquer pourquoi cela prend beaucoup de temps même si nous supprimons en fonction de la clé primaire. Et s'il vous plaît dites-moi un moyen d'optimiser ce problème ...?SQL DELETE performance

+0

Qu'entendez-vous par "long temps"? Toute opération, même une analyse de table complète, devrait être rapide sur une table de 5000 lignes. –

Répondre

3

Évidemment, cela ne devrait pas prendre beaucoup de temps. Cependant, il n'y a pas assez d'informations ici pour comprendre exactement pourquoi. Je peux vous dire, cependant, que vous devriez vous concentrer sur les clés étrangères.

Ils peuvent ralentir les choses s'ils imposent des contraintes à d'autres tables beaucoup plus grandes. Vous pouvez également découvrir que vos délais d'attente sont dus à des contrôles d'intégrité qui empêchent la suppression (la question est alors de savoir pourquoi vous n'obtenez pas d'exceptions au lieu d'un délai d'expiration). L'étape suivante consisterait à supprimer les clés étrangères, puis à vérifier les performances. Ensuite, ajoutez chacun à la fois et vérifiez les performances au fur et à mesure.

D'autres opérations (par exemple, insertions, sélections, mises à jour) prennent-elles beaucoup de temps?

12

Causes possibles:

1) en cascade les opérations de suppression

2) déclencheur (s)

3) le type de votre colonne de clé primaire est autre chose qu'un entier, forçant ainsi un type conversion sur chaque valeur PK pour faire la comparaison. cela nécessite un scan complet de la table.

4) Votre requête se termine-t-elle vraiment par un point comme vous l'avez posté dans la question? le cas échéant, le nombre peut considéré comme un nombre à virgule flottante au lieu d'un nombre entier, ce qui provoque une conversion de type similaire à 3)

5) votre requête de suppression est en attente pour une autre requête lente à libérer un verrou

+1

+1 sur la suggestion Triggers ... – Knobloch

+0

Vérifiez tout particulièrement s'il y a des suppressions en cascade vers une grande table qui est elle-même fortement indexée. –

1

Première réflexion: index sur les clés étrangères?

  • Ceci est lié à des suppressions en cascade mentionnées
  • Toutes les tables enfant muts vérifier et si vous avez un total de 500.000 lignes enfants, cela pourrait prendre un certain temps bien sûr ...

deuxième pensée: déclencheurs de tir?

  • Sur cette table ou sur les tables de l'enfant ou d'essayer de cascade via le code etc
  • empêchez Dieu, le curseur pour chaque ligne Deleted ...
0

Comme d'autres l'ont observé, les suspects probables sont les clés étrangères. Tout d'abord parce que ON DELETE CASCADE peut prendre de l'élan si les tables dépendantes sont à leur tour référencées par d'autres tables, qui à leur tour peuvent être référencées, et ainsi de suite. Deuxièmement, parce que d'autres utilisateurs peuvent avoir des verrous sur les lignes qui doivent être supprimés. C'est la cause la plus probable des délais d'attente.Tout dépend de la saveur et de la version de votre base de données. Par exemple, les anciennes versions d'Oracle (< = 8.0) devaient verrouiller la totalité de la table dépendante sauf si les colonnes de clé étrangère étaient indexées.

1

Tentative de mise à jour des statistiques. 5000 lignes n'est pas une grosse affaire. Si vous le faites régulièrement, vous devez aussi planifier la maintenance sur cette table (c'est-à-dire reconstruire les index, mettre à jour les statistiques, etc.)