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

Откуда: Middlebury, CT USA
Сообщений: 6043
The following works as expected (optimizer-wise):

create table emp1 as select * from emp;

Table created.

create index emp1_idx1 on emp1(comm);

Index created.

explain plan for
  select * from emp1 where comm= nvl(:param1,comm);

Explained.

@?\rdbms\admin\utlxpls

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
Plan hash value: 858425457

-------------------------------------------------------------------------------------------
| Id  | Operation                     | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |           |    19 |  1653 |     4   (0)| 00:00:01 |
|   1 |  CONCATENATION                |           |       |       |            |          |
|*  2 |   FILTER                      |           |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID| EMP1      |    16 |  1392 |     2   (0)| 00:00:01 |
|*  4 |     INDEX FULL SCAN           | EMP1_IDX1 |   327 |       |     1   (0)| 00:00:01 |
|*  5 |   FILTER                      |           |       |       |            |          |

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
|   6 |    TABLE ACCESS BY INDEX ROWID| EMP1      |     3 |   261 |     2   (0)| 00:00:01 |
|*  7 |     INDEX RANGE SCAN          | EMP1_IDX1 |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

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

   2 - filter(:PARAM1 IS NULL)
   4 - filter("COMM" IS NOT NULL)
   5 - filter(:PARAM1 IS NOT NULL)
   7 - access("COMM"=:PARAM1)

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

26 rows selected.

SQL> 


Now same thing with FBI:

create index emp1_idx2 on emp1(nvl(comm,0));

Index created.

explain plan for
  select * from emp1 where nvl(comm,0) = nvl(:param1,nvl(comm,0))
/

Explained.

@?\rdbms\admin\utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
Plan hash value: 2226897347

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    87 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMP1 |     1 |    87 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------

   1 - filter(NVL("COMM",0)=NVL(:PARAM1,NVL("COMM",0)))

Note
-----
   - dynamic sampling used for this statement

17 rows selected.


SY.
2 фев 12, 01:54    [12016365]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 13835
А если явно статистику собрать?
2 фев 12, 02:03    [12016382]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
xtender
Member

Откуда: Мск
Сообщений: 805
А фильтра:
filter(NVL("COMM",0) IS NOT NULL)
разве не должно быть? Мне кажется он просто не сообразил, что в правой части тоже fbi
2 фев 12, 09:23    [12016758]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
A.
Guest
SY
SY.

SY, проблема что план не тот, или что индекс не юзается вообще?
Если первое, то обрати внимание на


--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    87 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMP1 |     1 |    87 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
2 фев 12, 10:20    [12017044]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
А.
Guest
пардон, фигню написал
2 фев 12, 10:22    [12017053]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
Timur Akhmadeev
Member

Откуда:
Сообщений: 379
281483.1 "This feature has not been implemented", хотя и имеется 8352378 Allow function-based indexes on OR-Expansion
2 фев 12, 11:13    [12017467]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 6043
Timur Akhmadeev,

Cпacибo.

SY.
2 фев 12, 18:39    [12021950]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 6043
Actually, even without FBI plan is not as optimal as it could be. I am not sure why in:

explain plan for
  select * from emp1 where comm= nvl(:param1,comm);

Explained.

@?\rdbms\admin\utlxpls

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
Plan hash value: 858425457

-------------------------------------------------------------------------------------------
| Id  | Operation                     | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |           |    19 |  1653 |     4   (0)| 00:00:01 |
|   1 |  CONCATENATION                |           |       |       |            |          |
|*  2 |   FILTER                      |           |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID| EMP1      |    16 |  1392 |     2   (0)| 00:00:01 |
|*  4 |     INDEX FULL SCAN           | EMP1_IDX1 |   327 |       |     1   (0)| 00:00:01 |
|*  5 |   FILTER                      |           |       |       |            |          |

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
|   6 |    TABLE ACCESS BY INDEX ROWID| EMP1      |     3 |   261 |     2   (0)| 00:00:01 |
|*  7 |     INDEX RANGE SCAN          | EMP1_IDX1 |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

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

   2 - filter(:PARAM1 IS NULL)
   4 - filter("COMM" IS NOT NULL)
   5 - filter(:PARAM1 IS NOT NULL)
   7 - access("COMM"=:PARAM1)


CONCATENATION is done after "TABLE ACCESS BY INDEX ROWID" and not before. In other words it would be cheaper to concatenate ROWIDS first and only then read table.

SY.
2 фев 12, 18:46    [12021973]     Ответить | Цитировать    Сообщить модератору
 Re: Optimizer and FBI  [new]
Timur Akhmadeev
Member

Откуда:
Сообщений: 379
SY
CONCATENATION is done after "TABLE ACCESS BY INDEX ROWID" and not before. In other words it would be cheaper to concatenate ROWIDS first and only then read table.

Это план вида "2 в одном флаконе". В зависимости от входного значения :param выполняется либо та, либо другая ветка плана, что обеспечивает FILTER.
2 фев 12, 19:18    [12022098]     Ответить | Цитировать    Сообщить модератору
Все форумы / Oracle Ответить