| Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
| Все форумы / Oracle | ![]() |
||
|
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] Ответить | Цитировать Сообщить модератору | |
|
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 13835 |
А если явно статистику собрать? |
| 2 фев 12, 02:03 [12016382] Ответить | Цитировать Сообщить модератору | |
|
xtender Member Откуда: Мск Сообщений: 805 |
А фильтра: filter(NVL("COMM",0) IS NOT NULL)разве не должно быть? Мне кажется он просто не сообразил, что в правой части тоже fbi |
| 2 фев 12, 09:23 [12016758] Ответить | Цитировать Сообщить модератору | |
|
A.
Guest |
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] Ответить | Цитировать Сообщить модератору | |||
|
А.
Guest |
пардон, фигню написал |
| 2 фев 12, 10:22 [12017053] Ответить | Цитировать Сообщить модератору | |
|
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] Ответить | Цитировать Сообщить модератору | |
|
SY Member Откуда: Middlebury, CT USA Сообщений: 6043 |
Timur Akhmadeev, Cпacибo. SY. |
| 2 фев 12, 18:39 [12021950] Ответить | Цитировать Сообщить модератору | |
|
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] Ответить | Цитировать Сообщить модератору | |
|
Timur Akhmadeev Member Откуда: Сообщений: 379 |
Это план вида "2 в одном флаконе". В зависимости от входного значения :param выполняется либо та, либо другая ветка плана, что обеспечивает FILTER. |
||
| 2 фев 12, 19:18 [12022098] Ответить | Цитировать Сообщить модератору | |||
| Все форумы / Oracle | ![]() |
|