2010-06-18 8 views
8

Ho alcune tabelle nell'ambiente Oracle che ho trovato potrebbero trarre vantaggio da nuovi indici. Tuttavia, sono tabelle grandi, che vanno da registri 1M a registri 300M, quindi dovrei innanzitutto stimare quanto tempo occorrerebbe per la creazione dell'indice, quindi vorrei conoscere almeno l'ordine di grandezza che occorrerebbe (ore, giorni, settimane)?Stima del tempo di creazione dell'indice in Oracle

Esiste qualche funzione euristica/oracolo/regola generale che potrebbe aiutarmi a risolvere questo problema?

risposta

7

Ci sono davvero troppi fattori da considerare, come velocità della macchina, memoria, ecc. Che potrebbero influire sul tempo di creazione. Inoltre, la natura dei dati stessi potrebbe avere un effetto significativo sul tempo di creazione.

Quello che vorrei fare è scegliere una delle tabelle più grandi, creare un indice e vedere quanto tempo ci vuole. Quindi, prenditi il ​​tempo necessario e dividi per il numero di righe nella tabella e questo dovrebbe darti una metrica approssimativa per cosa aspettarti. Nota ancora, questo non sarà preciso, ma è solo una regola empirica che potresti usare. Sta andando a variare molto perché alcune tabelle hanno più colonne, meno valori di colonne sparse, ecc., Ma è un punto di partenza.

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

buon punto per iniziare un razionale. – kurast

5

Oracle può stimare indice ora di creazione e la dimensione indice con il comando EXPLAIN PLAN:

Esempio di schema

--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); 

Risultati

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 

Note

L'ora di creazione effettiva sul mio sistema è stata di 2,5 secondi, rispetto alla stima di 10 secondi. Ma è ancora abbastanza buono se stai solo cercando una stima dell'ordine di grandezza. L'accuratezza dipende dall'avere statistiche accurate sulla tabella e da un buon system statistics. (Ma fai attenzione prima di raccogliere le statistiche di sistema, questo potrebbe influenzare molti piani di esecuzione!) Puoi continuare a giocare con le impostazioni modificando manualmente sys.aux_stats$. Questa è una delle poche tabelle SYS che è OK da modificare, sebbene sia ancora necessario fare attenzione.

Problemi correlati