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

Откуда: Владивосток
Сообщений: 4441
Натолкнулся на следующую проблему при использовании bitmap индекса и функции в предикате. Воспроизвел на 10.2.0.5, 11.2.0.2.
create table tst as select mod(rownum, 100000) rn, rownum name from dual connect by level <= 1000000; 

Table created.

create bitmap index idx_tst on tst(rn);

Index created.

exec DBMS_STATS.GATHER_TABLE_STATS(OwnName => null,TabName => 'TST',Estimate_Percent => null,Method_Opt => 'FOR ALL COLUMNS SIZE 1',Cascade => TRUE);

PL/SQL procedure successfully completed.

set autotrace traceonly explain

select * from tst where rn = 1;

Execution Plan
----------------------------------------------------------
Plan hash value: 3706541314

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |    10 |   100 |     5   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID | TST     |    10 |   100 |     5   (0)| 00:00:01 |
|   2 |   BITMAP CONVERSION TO ROWIDS|         |       |       |            |          |
|*  3 |    BITMAP INDEX SINGLE VALUE | IDX_TST |       |       |            |          |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("RN"=1)


select * from tst where rn = dbms_random.value(1,1);

Execution Plan
----------------------------------------------------------
Plan hash value: 4148258400

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    10 |   100 |   745  (26)| 00:00:09 |
|*  1 |  TABLE ACCESS FULL| TST  |    10 |   100 |   745  (26)| 00:00:09 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("RN"="DBMS_RANDOM"."VALUE"(1,1))

Из 10053 проблема, собственно, понятна.
Для функции:
  Bitmap nodes:
    Used IDX_TST
      Cost = 857.519956, sel = 1.000000
  Access path: Bitmap index - accepted
    Cost: 4139.678113 Cost_io: 4119.040000 Cost_cpu: 354333496.217600 Sel: 1.000000
Без функции:
  Bitmap nodes:
    Used IDX_TST
      Cost = 3.001256, sel = 0.000010
  Access path: Bitmap index - accepted
    Cost: 5.026420 Cost_io: 5.024147 Cost_cpu: 39029.158854 Sel: 0.000010
Это что-то известное?
10 окт 11, 06:36    [11410206]     Ответить | Цитировать Сообщить модератору
 Re: Bitmap index + function = проблема  [new]
-2-
Member

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

индетерминантность dbms_random.value?
10 окт 11, 08:32    [11410288]     Ответить | Цитировать Сообщить модератору
 Re: Bitmap index + function = проблема  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
-2-
wurdu,

индетерминантность dbms_random.value?
Ну на селективность это не должно влиять. Проблема будет и для
create or replace function f_tst return number deterministic is
begin
return 1;
end;
/
10 окт 11, 09:47    [11410481]     Ответить | Цитировать Сообщить модератору
 Re: Bitmap index + function = проблема  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
wurdu
-2-
wurdu,

индетерминантность dbms_random.value?
Ну на селективность это не должно влиять. Проблема будет и для
create or replace function f_tst return number deterministic is
begin
return 1;
end;
/

ну, правильно. детерминированность это полдела. надо еще, чтобы планировщик учитывал, что аргументы функции не зависят от данных в строках запроса. в вашем примере это так и есть, а вот в жизни - (имхо) чаще нет, чем да.
ну а когда таки да (как для этого примера) - есть же возможность предварительной материализации.
10 окт 11, 11:33    [11411269]     Ответить | Цитировать Сообщить модератору
 Re: Bitmap index + function = проблема  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
orawish
wurdu
пропущено...
Ну на селективность это не должно влиять. Проблема будет и для
create or replace function f_tst return number deterministic is
begin
return 1;
end;
/

ну, правильно. детерминированность это полдела. надо еще, чтобы планировщик учитывал, что аргументы функции не зависят от данных в строках запроса. в вашем примере это так и есть, а вот в жизни - (имхо) чаще нет, чем да.
ну а когда таки да (как для этого примера) - есть же возможность предварительной материализации.
Ну оптимизатор учитывает такие вещи и мы видим, что селективность для таблицы рассчитывает корректно, в отличие от селективности для индекса. Опять же, проблемы нет с btree индексом.
10 окт 11, 12:34    [11411871]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить