Как можно приблизительно оценить размер индекса до его создания?
Планируется добавить индекс в таблицу, но хотелось бы сначала оценить размер индекса, какой будет после его создания (не нужен точный размер, только ориентировочный).
Допустим, есть доступ ко всем метаданным о таблице (количество строк, столбцов, типы данных и т.д.), и возможно выполнить любой SQL запрос, чтобы получить дополнительные данные о текущем состоянии таблицы. Также доподлинно известно, каким будет определение индекса.
Как можно приблизительно оценить размер этого индекса до его создания?
Свободный перевод вопроса How can I estimate the size of an index? от участника @Jared
Ответы (1 шт):
Можно оценить размер индекса, выполнив EXPLAIN PLAN для запроса на создание индекса:
create table t (val) as
select rownum
from dual connect by level <= 1e6;
explain plan for
create index ti on t (val);
select *
from table (dbms_xplan.display (null, null, 'basic +note'));
PLAN_TABLE_OUTPUT
------------------------------------------------
Plan hash value: 2855645439
---------------------------------------
| Id | Operation | Name |
---------------------------------------
| 0 | CREATE INDEX STATEMENT | |
| 1 | INDEX BUILD NON UNIQUE| TI |
| 2 | SORT CREATE INDEX | |
| 3 | TABLE ACCESS FULL | T |
---------------------------------------
Note
-----
- estimated index size: 24M bytes
Обратите внимание на опцию +NOTE в функции DBMS_XPLAN.DISPLAY_PLAN. Она добавила раздел Note внизу, в котором и есть приблизительная оценка размера индекса. В данном случае - 24МБ.
Само собой разумеется, индекс при этом не будет создан:
select * from user_indexes where table_name='T';
no rows selected
Свободный перевод ответа от участника @Chris Saxon