2010-10-07 19 views
7

J'ai une table vraiment énorme, avec ~ 200 millions de lignes. Il n'y avait pas d'index/pk du tout. Les sélections dans cette table étaient (évidemment) exécutées lentement. J'ai décidé de créer un PK en utilisant 3 colonnes. Je l'ai fait dans un environnement de test qui a une version plus petite de cette table et cela a fonctionné comme un charme.La création d'index/pk dans une table volumineuse prend trop de temps. J'utilise Oracle. Comment savoir si ça va bien?

Alors, avant de rentrer chez je l'ai fait une ALTER TABLE HUGETABLE ADD CONTRAINTE PK_HUGETABLE PRIMARY KEY (ID1, ID2, ID3);

Je m'attendais à ce que ça marche pendant la nuit, mais ça fait déjà plus de 24 heures et ça fonctionne encore. Je sais si j'avais gardé l'identifiant de session avant de commencer ma requête, je serais capable de le suivre à V $ SESSION_LONGOPS. Mais je ne l'ai pas fait.

Existe-t-il un moyen de vérifier le fonctionnement de ma requête ou le temps qu'il faudra encore?

Répondre

7

Vous devriez toujours pouvoir interroger V $ SESSION_LONGOPS. Si vous exécutez quelque chose comme

SELECT sid, serial#, start_time, sofar, totalwork, time_remaining, message 
    FROM v$session_longops 
WHERE time_remaining > 0 

vous verrez probablement une seule séance qui a commencé hier et les autres colonnes devront confirmer que des indications que la session a fait beaucoup de travail. Le MESSAGE devrait également indiquer quelque chose comme un scan complet sur HUGETABLE.

+0

Je ne pouvais pas le trouver. J'ai trouvé beaucoup de processus en cours, mais je ne pouvais pas identifier le mien. J'ai donc abandonné et l'ai annulé :) Je vais tout arrêter pendant le week-end et essayer à nouveau. Cette fois, je vais obtenir l'identifiant de session avant de commencer le travail. Merci quand même. – Michael

+2

La prochaine fois, définissez l'index avec PARALLEL n, où n est un certain degré de parallélisme acceptable sur votre système. Lorsque vous avez terminé, modifiez l'index en NOPARALLEL. En outre, si vous n'utilisez pas Data Guard et pouvez effectuer une sauvegarde de la base de données lorsque vous avez terminé, utilisez la clause NOLOGGING. –

0

Vous n'avez pas besoin de se rappeler votre identifiant de session pour surveiller l'état d'une déclaration. Comme Justin l'a suggéré, vous ne devriez pas avoir trop de requêtes longues depuis la veille. Vous pouvez également spécifier l'heure de début pour affiner les résultats.

select * from V$SESSION_LONGOPS where time_remaining > 0 and start_time > <'your run date/time here'>; 

Outre l'option « PARALLÈLE n », vous devriez envisager d'utiliser l'option « en ligne » et si vous créez (ou reconstruction) un index en lecture/écriture simultanée sont en cours sur la grande table.