2016-04-25 1 views
1

J'ai une table avec 17 milliards de lignes. Je veux supprimer certaines d'entre elles, présentes dans une autre table.Oracle SUPPRIMER l'espace TEMP.

J'ai essayé une instruction delete, parallélisée, qui ne s'est pas terminée car l'espace temporaire n'était pas suffisant. Puis j'ai essayé de créer une table en tant que select qui a également échoué pour la même raison. Une suppression régulière (sans PARALLEL) prenait plus d'un jour, donc je devais la terminer.

Existe-t-il un moyen de libérer l'espace temporaire car il n'est plus nécessaire, lors de l'exécution de suppression?

Existe-t-il un autre moyen de le faire?

EDIT: B a 173 millions d'enregistrements et près de 16 milliards d'enregistrements doivent être supprimés (presque toute la table). Il n'y a pas d'index sur la table.

EDIT2: Explain plan pour la création de table est la suivante:

CREATE TABLE STATEMENT, GOAL = ALL_ROWS   6749420 177523935 10828960035 
PX COORDINATOR     
    PX SEND QC (RANDOM) SYS :TQ10001 6740915 177523935 10828960035 
    LOAD AS SELECT (HYBRID TSM/HWMB) USER A_TEMP   
    OPTIMIZER STATISTICS GATHERING   6740915 177523935 10828960035 
    MERGE JOIN ANTI NA   6740915 177523935 10828960035 
     SORT JOIN   6700114 17752393472 745600525824 
     PX BLOCK ITERATOR   45592 17752393472 745600525824 
     TABLE ACCESS FULL USER A 45592 17752393472 745600525824 
     SORT UNIQUE   40802 173584361 3298102859 
     PX RECEIVE   5365 173584361 3298102859 
     PX SEND BROADCAST SYS :TQ10000 5365 173584361 3298102859 
     PX BLOCK ITERATOR   5365 173584361 3298102859 
      TABLE ACCESS FULL USER B 5365 173584361 3298102859 

Merci à l'avance

+0

Combien de lignes comptez-vous sur la suppression? Combien de lignes y a-t-il dans b? Y a-t-il un index sur 'key1, key2'? Quel est le plan de requête? Je m'attendrais à ce que l'optimiseur considère la réécriture de cette requête comme un 'existe' mais vous pourriez essayer de le faire vous-même. –

+0

Pouvez-vous poster le plan d'explication de 'CREATE TABLE'? Exécutez 'plan d'explication pour créer une table ...', puis exécutez 'select * à partir de la table (dbms_xplan.display);' et publiez les résultats entiers ici. –

Répondre

0

Je l'ai fait fonctionner, en utilisant une solution différente. J'ai créé manuellement le tableau a_temp et j'ai fait un insert avec un indice APPEND PARALLEL. L'espace de température n'a pas été dépassé et les inserts se sont parfaitement déroulés.

Voici le code:

create table a_temp(..); 

insert /* + APPEND PARALLEL(a_temp, 32) */ 
    into a_temp(...) 
select /* + PARALLEL(a, 32) */ 
     (...) 
    from a 
where not exists 
     (select /* + PARALLEL(b, 16) */ 
       '1' 
      from b 
     where a.key1 = b.key1 
      and a.key2 = b.key2) 
0

Pour résoudre ce problème dans le passé, je l'ai supprimé par lots de ~ 1 M à un temps. Après beaucoup de creuser pour une solution plus propre, un DBA a insisté pour que je prenne cette approche.

Ce fut mon flux de travail:

je Python et le module cx_Oracle à lire dans les valeurs de PK pour les enregistrements à être-supprimés, les enfichée itérativement dans un executemany appel en tant que variables de liaison, et engagé après chaque itération.

Si vous voulez coller avec une approche d'exécution parallèle: Rappelez-vous d'utiliser ALTER SESSION ENABLE PARALLEL DML afin que votre fusion ou suppression est exécutée en parallèle aussi. Jetez un coup d'œil à cet excellent article de blog qui vous explique: https://dioncho.wordpress.com/2010/12/10/interpreting-parallel-merge-statement/

+0

Bonjour Deano, j'ai envisagé de faire des suppressions de batchs en PL/SQL, mais généralement SQL est plus rapide grâce à PL/SQL, et l'instruction de mise à jour sans parallèle prenait plus d'un jour. Est-ce que l'utilisation de python accélérerait les choses?Je suppose que le travail de base de données est toujours là, juste avec plus de frais généraux, non? Merci! – jcd

+0

Python ne va pas accélérer les choses de manière inhérente. L'avantage ici est qu'il vous permet d'exécuter SQL droit exécuter sur la base de données sur les tailles de lots spécifiés. Python transmettra simplement les paramètres et soumettra votre SQL à Oracle. J'imagine que vous pourriez utiliser ce type de stratégie avec une variété d'outils. – Deano

+0

Édité pour inclure des conseils sur l'exécution parallèle – Deano