Оценка времени создания индекса в Oracle - PullRequest
8 голосов
/ 18 июня 2010

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

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

Ответы [ 2 ]

8 голосов
/ 18 июня 2010

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

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

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.
6 голосов
/ 18 июня 2015

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 секунд. Но это все еще достаточно, если вы ищете только оценку порядка. Точность зависит от наличия точной статистики таблицы, а также от хорошей системной статистики . (Но будьте осторожны, прежде чем собирать системную статистику, это может повлиять на множество планов выполнения!) Вы можете дополнительно поиграть с настройками, вручную изменив sys.aux_stats$. Это одна из немногих таблиц SYS, которую можно изменять, хотя вам все же нужно быть осторожным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...