Pourquoi est-ce une requête de SUPPRESSION si lent sur Oracle?

Je suis à l'écriture de la base de données de scripts de mise à niveau, et suis en cours d'exécution dans une requête qui prend beaucoup plus de temps que je pense qu'il devrait:

DELETE FROM TPM_TASK WHERE TASK_TYPE='System';

Cette requête prend plus d'une heure, et je suis curieux de savoir ce que le coupable est.

Le plan d'exécution est:

DELETE STATEMENT    899.0   887 57793984    35481   1454721 899                             ALL_ROWS                                            
DELETE                                                      1   TPMDBO  TPM_TASK                                                        
TABLE ACCESS (FULL) 899.0   887 57793984    35481   1454721 1   TPMDBO  TPM_TASK    FULL    TABLE   ANALYZED    1   

En cours d'exécution:

select count(1) FROM TPM_TASK WHERE TASK_TYPE='System';

Le plan est:

SELECT STATEMENT    92.0    89  14527479    1   7   92                  ALL_ROWS                                            
SORT (AGGREGATE)                1   7   1           AGGREGATE                                                   
INDEX (FAST FULL SCAN)  92.0    89  14527479    35481   248367  1   TPMDBO  TPM_TASK_TASK_TYPE  FAST FULL SCAN  INDEX   ANALYZED

Cette requête est assez rapide et qui me donne 44,202 lignes. Le nombre total de lignes dans la table est 71419. Depuis que je suis la suppression de plus de la moitié des lignes, je suis en train de penser Oracle n'est pas la peine d'utiliser l'index pour les supprimer, ce qui est bien. Une analyse complète de 71 000 lignes devraient encore prendre quelques secondes de toute façon.

Il n'y a pas de déclencheurs sur ce tableau. Il n'y a pas d'autres tables qui ont des contraintes FK sur cette table, il y a cependant quelques points de vue et des fonctions SQL qui utilisent ce tableau. La seule application qui utilise cette base de données est notre serveur web, qui est arrêté lors de la mise à niveau - donc je ne pense pas qu'il soit problèmes de verrouillage de passe. D'autres idées?

  • L'instruction delete, en effet, ne pas utiliser l'index comme vous pouvez le voir par la TABLE ACCESS (FULL) étape (btw: merci de poster les plans avec l'onglet caractères supprimés, actuellement, les colonnes ne s'alignent pas et il est pratiquement impossible de les lire)
  • Mais qui doit être bien droit? La clause where retourne plus de la moitié des lignes, à l'aide de l'index ne serait pas vraiment une énorme perf d'amélioration.
  • Hmm, Aqua Data Studio de vis jusqu'à la mise en forme lorsque vous copiez et collez des plans d'exécution.
  • Si il y a des références principales étrangères à cette table, et les autres tables ont beaucoup de dossiers, les effacez requête sera lente.