2010-06-18 21 views
8

J'ai dans l'environnement Oracle quelques tables dont j'ai trouvé qu'elles pourraient bénéficier de nouveaux index. Cependant, ce sont de grandes tables, allant de registres 1M à 300M, donc j'essaierais d'abord d'estimer combien de temps cela prendrait pour la création d'index, donc je connaîtrais au moins l'ordre de grandeur qu'il faudrait (heures, jours, semaines)? Y at-il une fonction heuristique/oracle/règle empirique qui pourrait m'aider à résoudre ce problème?Estimation de l'heure de création de l'index dans Oracle

Répondre

7

Il y a vraiment trop de facteurs à prendre en compte, tels que la vitesse de la machine, la mémoire, etc., qui pourraient avoir un impact sur le temps de création. De plus, la nature même des données pourrait avoir un effet significatif sur le temps de création.

Ce que je ferais est de choisir l'une des plus grandes tables, de créer un index sur elle et de voir combien de temps cela prend. Ensuite, prenez le temps qu'il a pris et divisez par le nombre de lignes dans la table et cela devrait vous donner une mesure approximative de ce à quoi vous attendre. Notez encore, cela ne va pas être précis, mais c'est juste une règle empirique que vous pourriez utiliser. Cela va beaucoup varier parce que certaines tables ont plus de colonnes, moins de valeurs de colonnes éparses, etc., mais c'est un point de départ.

Ex. It takes 3600 seconds to create a index on table X, which has 3 million rows. 
So the metric is 3600/3,000,000 = 0.0012 seconds per row. 

So if table Y has 8 million rows, you could expect 
.0012 * 8,000,000 = 9600 seconds (or 160 minutes) to create the index. 
+0

bon point pour commencer une logique. – kurast

5

Oracle peut estimer l'indice taille du temps et de l'index création avec la commande EXPLAIN PLAN:

Exemple de schéma

--Create a table with 1 million rows. 
drop table table1; 
create table table1(a number); 
insert into table1 select level from dual connect by level <= 1000000; 
--Gather statistics. 
begin 
    dbms_stats.gather_table_stats(user, 'table1'); 
end; 
/
--Estimate index creation and size. 
explain plan for create index table1_idx on table1(a); 
select * from table(dbms_xplan.display); 

Résultats

Plan hash value: 290895522 

------------------------------------------------------------------------------------- 
| Id | Operation    | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------- 
| 0 | CREATE INDEX STATEMENT |   | 1000K| 4882K| 683 (2)| 00:00:10 | 
| 1 | INDEX BUILD NON UNIQUE| TABLE1_IDX |  |  |   |   | 
| 2 | SORT CREATE INDEX |   | 1000K| 4882K|   |   | 
| 3 | TABLE ACCESS FULL | TABLE1  | 1000K| 4882K| 254 (5)| 00:00:04 | 
------------------------------------------------------------------------------------- 

Note 
----- 
    - automatic DOP: skipped because of IO calibrate statistics are missing 
    - estimated index size: 24M bytes 

Notes

La durée de création réelle sur mon système était de 2,5 secondes, par rapport à l'estimation de 10 secondes. Mais c'est encore suffisant si vous cherchez seulement une estimation de l'ordre de grandeur. La précision dépend de l'exactitude des statistiques de la table et de system statistics. (Mais attention avant de rassembler les statistiques du système, cela peut influencer beaucoup de plans d'exécution!) Vous pouvez encore bidouiller avec les paramètres en modifiant manuellement sys.aux_stats$. C'est l'une des rares tables SYS que vous pouvez modifier, même si vous devez toujours faire attention.