2010-06-18 3 views
8

У меня есть несколько таблиц в среде Oracle, которые, как я нашел, могут извлечь выгоду из новых индексов. Однако они представляют собой большие таблицы, начиная от регистров 1M и заканчивая регистрами 300M, поэтому я сначала попытаюсь оценить, сколько времени потребуется для создания индекса, поэтому я бы знал, по крайней мере, величину порядка, который потребуется (часы, дни, недели)?Оценка времени создания индекса в оракуле

Есть ли какая-то эвристика/функция oracle/правило большого пальца, которое может помочь мне в решении этой проблемы?

ответ

7

Слишком много факторов, которые необходимо учитывать, например скорость машины, память и т. Д., Которые могут повлиять на время создания. Кроме того, характер самих данных может существенно повлиять на время создания.

Что бы я сделал, это выбрать одну из больших таблиц, создать на ней индекс и посмотреть, сколько времени потребуется. Затем возьмите время, которое требуется, и разделите на количество строк в таблице, и это должно дать вам приблизительную метрику для того, чего ожидать. Запомните еще раз, это не будет точно, но это просто эмпирическое правило, которое вы можете использовать. Это сильно изменится, потому что в некоторых таблицах больше столбцов, меньше разреженных значений столбцов и т. Д., Но это отправная точка.

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

Хороший момент для начала обоснования. – kurast

5

Oracle может оценить индекс времени создания и размера индекса с EXPLAIN PLAN команды:

Пример схемы

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

Результаты

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 

Примечания

Фактическое время создания на моей системе составляло 2,5 секунды, по сравнению с оценкой в ​​10 секунд. Но это все еще достаточно хорошо, если вы ищете только оценку порядка. Точность зависит от наличия точной таблицы статистики, а также хорошего system statistics. (Но будьте осторожны, прежде чем собирать системные статистические данные, это может повлиять на множество планов выполнения!). Вы можете дополнительно закрутить настройки, вручную изменив sys.aux_stats$. Это одна из немногих таблиц SYS, которую можно модифицировать, хотя вам все равно нужно быть осторожным.

Смежные вопросы