Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
Создаем таблицу:
CREATE TABLE W_1 as 
SELECT ROUND(DBMS_RANDOM.VALUE(1,1000000)) c1,
       4 c2, 
       TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2453737,2453737+365)),'J') c3, 
       TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2453737,2453737+365)),'J') c4, 
       DBMS_RANDOM.STRING('A', ROUND(DBMS_RANDOM.VALUE(1,100))) c5
FROM ALL_OBJECTS,ALL_OBJECTS
WHERE ROWNUM<=100;

Создам индекс:
CREATE INDEX W_1_idx on W_1(c1, c2);

Далее хотим создать индекс по одному полю c2:
CREATE INDEX W_1_idx2 on W_1(c2);

Имеем следующий план для этого:
-----------------------------------------------------------------------------------                                          
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |                                          
-----------------------------------------------------------------------------------                                          
|   0 | CREATE INDEX STATEMENT |          |   409 |  5317 |     4   (0)| 00:00:01 |                                          
|   1 |  INDEX BUILD NON UNIQUE| W_1_IDX2 |       |       |            |          |                                          
|   2 |   SORT CREATE INDEX    |          |   409 |  5317 |            |          |                                          
|   3 |    INDEX FAST FULL SCAN| W_1_IDX  |       |       |            |          |                                          
-----------------------------------------------------------------------------------                                          
У нас INDEX FAST FULL SCAN.

Но если мы захотим создать bitmap index по c2:
CREATE BITMAP INDEX W_1_idx2 on W_1(c2);

Мы имеем TABLE FULL SCAN:
------------------------------------------------------------------------------------                                         
| Id  | Operation               | Name     | Rows  | Bytes | Cost (%CPU)| Time     |                                         
------------------------------------------------------------------------------------                                         
|   0 | CREATE INDEX STATEMENT  |          |   409 |  5317 |     4   (0)| 00:00:01 |                                         
|   1 |  INDEX BUILD NON UNIQUE | W_1_IDX2 |       |       |            |          |                                         
|   2 |   BITMAP COMPACTION     |          |       |       |            |          |                                         
|   3 |    SORT CREATE INDEX    |          |   409 |  5317 |            |          |                                         
|   4 |     BITMAP CONSTRUCTION |          |       |       |            |          |                                         
|   5 |      TABLE ACCESS FULL  | W_1      |   409 |  5317 |     3   (0)| 00:00:01 |                                         
------------------------------------------------------------------------------------ 

Почему в этом случаи, Oracle не использует b-tree index для построения bitmap index ?
26 июл 11, 19:52    [11030596]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
-2-
Member

Откуда:
Сообщений: 15330
sQud,

alter table w_1 modify c2 not null;
26 июл 11, 19:57    [11030604]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
Спасибо за подсказку
26 июл 11, 20:40    [11030706]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
Можно даже:
alter table w_1 modify c1 not null;

я не учел эту особенность
26 июл 11, 20:43    [11030713]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
Народ ещё раз хелп, не могу повторить кейс что бы был фулл скан b-tree индекса, кто нибудь может подтвердить что это работает?
2 сен 11, 18:25    [11220483]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
UP, народ неужели никому не интересно докопаться до правды ???
23 сен 11, 09:36    [11323371]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18487
Что из себя представляет "внутре" bitmap-index: значение, диапазон ROWID, битовая маска
Естественно, получение диапазона будет ненапряжным при сканировании таблицы, потому как при сканировании индекса порядок ROWID там неопределен

PS. [url=Презенташка по Bitmap индексам]http://www.juliandyke.com/Presentations/BitmapIndexInternals.ppt[/url]
23 сен 11, 09:44    [11323415]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
думаю не важно в каком порядке ROWID в b-tree, всегда можно отсортировать если уж на то пошло.
23 сен 11, 12:42    [11325086]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
sQud,

не важно в каком порядке и отсортировать можно, но просканировать таблицу - дешевле.
23 сен 11, 21:06    [11329788]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
НЕ понимаю по чему дешевле? Ведь сотрировка выполняетс и при создании b-tree, не вижу большой разницы что сортировать rowid или значения. Все же зависит от случая, у меня очень широкая таблица(на проекте), сканирутся больше часа.
Индекс сканируется за минуты. ну пусть ещё минут 10 потратит на сортировку... Предположу что просто нету такой финкциональности, ладненько будем выяснять у оракловых разработчиков
26 сен 11, 15:25    [11336449]     Ответить | Цитировать Сообщить модератору
 Re: create BITMAP index  [new]
sQud
Member

Откуда: Минск
Сообщений: 100
самое интересное что если сделать:
CREATE BITMAP INDEX W_1_idx on W_1(c1, c2);

Мы попрежнему имеем скан таблицы для:

CREATE BITMAP INDEX W_2_idx on W_1(c1);
-----------------------------------------------------------------------------------                                     
| Id  | Operation               | Name    | Rows  | Bytes | Cost (%CPU)| Time     |                                     
-----------------------------------------------------------------------------------                                     
|   0 | CREATE INDEX STATEMENT  |         |   100 |   500 |     2   (0)| 00:00:01 |                                     
|   1 |  INDEX BUILD NON UNIQUE | W_2_IDX |       |       |            |          |                                     
|   2 |   BITMAP COMPACTION     |         |       |       |            |          |                                     
|   3 |    SORT CREATE INDEX    |         |   100 |   500 |            |          |                                     
|   4 |     BITMAP CONSTRUCTION |         |       |       |            |          |                                     
|   5 |      TABLE ACCESS FULL  | W_1     |   100 |   500 |     1   (0)| 00:00:01 |                                     
-----------------------------------------------------------------------------------  
26 сен 11, 15:54    [11336645]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить