Как я могу оценить размер индекса Oracle? - PullRequest
8 голосов
/ 06 мая 2009

Я подумываю добавить индекс в таблицу Oracle, но я бы хотел сначала оценить размер индекса после его построения (точный размер мне не нужен - просто оценка).

Предположим, у меня есть доступ ко всем метаданным о таблице (количество строк, столбцов, типов данных столбцов и т. Д.), Которые я могу выполнить любой произвольный запрос Oracle SQL, чтобы получить дополнительные данные о текущем состоянии таблицы , и я знаю, что я хотел бы, чтобы определение индекса было, как я могу оценить этот размер?

Ответы [ 3 ]

10 голосов
/ 06 мая 2009

Вы можете использовать эти Таблицы планирования емкости Oracle и определения размеров .

Для чего-то не столь полного, если вы просто хотите вернуться к типу конверта приблизительные оценки для индекса :

Рассчитайте средний размер каждого из столбцы, составляющие ключ индекса и суммировать столбцы плюс один rowid и добавить 2 байта для заголовка строки индекса чтобы получить средний размер строки. Теперь добавьте только немного к pctfree значению для индекс, чтобы придумать накладные расходы коэффициент, может быть 1,125 для pctfree из 10.

количество строк в индексированной таблице X средняя строка len X 1.125

Примечание - если индекс содержит обнуляемый столбцы, то каждая строка таблицы не может появляются в индексе. На одном индекс столбца, где 90% столбцов нулевые только 10% будут идти в индекс.

Сравнить оценку с экстентом табличного пространства метод распределения и корректировка финала ответьте, если необходимо.

Также может быть увеличен коэффициент накладных расходов. лучше, так как индекс становится больше, так как чем больше данных проиндексировано, тем больше ответвлений блоки, необходимые для поддержки индекса структура и расчет действительно просто цифры для листовых блоков.

2 голосов
/ 21 февраля 2014

Вы можете оценить размер индекса, запустив explain plan в операторе создания индекса:

create table t as
  select rownum r 
  from   dual 
  connect by level <= 1000000;

explain plan for
  create index i on t (r);

select * 
from   table(dbms_xplan.display(null, null, 'BASIC +NOTE'));

PLAN_TABLE_OUTPUT                                                                                                                         
--------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1744693673                                                                                                                 

---------------------------------------                                                                                                     
| Id  | Operation              | Name |                                                                                                     
---------------------------------------                                                                                                     
|   0 | CREATE INDEX STATEMENT |      |                                                                                                     
|   1 |  INDEX BUILD NON UNIQUE| I    |                                                                                                     
|   2 |   SORT CREATE INDEX    |      |                                                                                                     
|   3 |    TABLE ACCESS FULL   | T    |                                                                                                     
---------------------------------------                                                                                                     

Note                                                                                                                                        
-----                                                                                                                                       
   - estimated index size: 4194K bytes    

Посмотрите на раздел «Примечание» внизу: Расчетный размер индекса: 4194 Кбайт

0 голосов
/ 09 августа 2017

Начиная с версии 10gR2 вы можете использовать DBMS_SPACE.CREATE_INDEX_COST

DBMS_SPACE.CREATE_INDEX_COST (
   ddl             IN    VARCHAR2,
   used_bytes      OUT   NUMBER,
   alloc_bytes     OUT   NUMBER,
   plan_table      IN    VARCHAR2 DEFAULT NULL);

Из документов: «Эта процедура определяет стоимость создания индекса для существующей таблицы. Входными данными является оператор DDL, который будет использоваться для создания индекса. Процедура выведет память, необходимую для создания индекса».

См. https://docs.oracle.com/database/121/ARPLS/d_space.htm#ARPLS68101

Пример (также на sqlfiddle ):

DECLARE 
 ub NUMBER; 
 ab NUMBER; 
BEGIN 
 DBMS_SPACE.CREATE_INDEX_COST (
    ddl             => 'CREATE INDEX x_1 ON t1 (a,b,c) TABLESPACE users',
    used_bytes      => ub,
    alloc_bytes     => ab
   );
 DBMS_OUTPUT.PUT_LINE('Used MBytes: ' || ROUND(ub/1024/1024)); 
 DBMS_OUTPUT.PUT_LINE('Alloc MBytes: ' || ROUND(ab/1024/1024)); 
END; 
/ 

Выход:

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