2010-06-18 56 views
8

Tengo algunas tablas en el entorno de Oracle que he encontrado que podrían beneficiarse de los nuevos índices. Sin embargo, son tablas grandes, que van desde registros de 1M hasta registros de 300M, así que primero trataría de calcular cuánto tiempo llevaría la creación del índice, así sabría al menos el orden de magnitud que tomaría (horas, días, semanas)?Estimación del tiempo de creación del índice en Oracle

¿Existe alguna función/regla de heurística/oráculo que pueda ayudarme a resolver este problema?

Respuesta

7

En realidad, hay demasiados factores a considerar, como la velocidad de la máquina, la memoria, etc. que podrían afectar el tiempo de creación. Además, la naturaleza de los datos en sí podría tener un efecto significativo en el tiempo de creación.

Lo que haría sería elegir una de las tablas más grandes, crear un índice y ver cuánto tiempo lleva. Luego, tómese el tiempo que tomó y divida por el número de filas en la tabla y eso le dará una medida aproximada de lo que puede esperar. Nota nuevamente, esto no va a ser preciso, pero es solo una regla general que podrías usar. Va a variar mucho porque algunas tablas tienen más columnas, menos valores de columnas dispersas, etc., pero es un punto de partida.

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

buen punto para comenzar un razonamiento. – kurast

5

Oracle puede estimar índice de tiempo de creación y el tamaño del índice con el comando EXPLAIN PLAN:

esquema de ejemplo

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

Resultados

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 

Notas

El tiempo de creación real en mi sistema fue de 2,5 segundos, en comparación con la estimación de 10 segundos. Pero eso es lo suficientemente bueno si solo estás buscando una estimación de orden de magnitud. La precisión depende de tener estadísticas precisas de la tabla, así como de system statistics. (¡Pero tenga cuidado antes de recopilar las estadísticas del sistema, puede influir en muchos planes de ejecución!) Puede seguir jugando con la configuración modificando manualmente sys.aux_stats$. Esa es una de las pocas tablas SYS que está bien modificar, aunque todavía debe tener cuidado.

Cuestiones relacionadas