Имеется табличка:
create table a1(a varchar2(20), b varchar2(20),c varchar2(200));
Имеется индекс на табличке с очень высокой селективностью(практически уникальный):
create index idx_a1 on a1(a,b);
Необходимо выполнить запрос примерно следующего содержания:
select c from a1
where b like '12312%'
and a in (select * from TABLE(cast(LIST_TO_TABLE('s1,s2,s3,s4',',') as STRING_TBL_TYPE)))
LIST_TO_TABLE - ф-ия превращения строки в таблицу по разделителю
по данному запросу получается следующий план:
Plan hash value: 1092792744
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 488 | 42 (3)| 00:00:01 |
|* 1 | HASH JOIN SEMI | | 1 | 488 | 42 (3)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | A1 | 1 | 486 | 2 (0)| 00:00:01 |
| 3 | COLLECTION ITERATOR PICKLER FETCH| LIST_TO_TABLE | 16360 | 32720 | 39 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"=VALUE(KOKBF$))
2 - filter("B" LIKE '12312%')
Note
-----
- dynamic sampling used for this statement (level=2)
известно, что в ф-ции LIST_TO_TABLE может находится не более 3 значений. и всё бы хорошо, если бы не LIKE
Возможно ли на приведеном выше запросе получить RANGE SCAN,как если бы он думал что выполняется запрос вроде:
select c from a1
where b like '12312%'
and a in ('s1','s2','s3')
Plan hash value: 2212992804
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 486 | 1 (0)| 00:00:01 |
| 1 | INLIST ITERATOR | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID| A1 | 1 | 486 | 1 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | IDX_A1 | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access(("A"='s1' OR "A"='s2' OR "A"='s3') AND "B" LIKE '12312%')
filter("B" LIKE '12312%')
Note
-----
- dynamic sampling used for this statement (level=2)
либо вот так
select c from a1
where b = '12312'
and a in (select * from TABLE(cast(LIST_TO_TABLE('s1,s2,s3,s4',',') as STRING_TBL_TYPE)));
Plan hash value: 644285362
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 488 | 41 (5)| 00:00:01 |
| 1 | NESTED LOOPS | | | | | |
| 2 | NESTED LOOPS | | 1 | 488 | 41 (5)| 00:00:01 |
| 3 | SORT UNIQUE | | 16360 | 32720 | 39 (0)| 00:00:01 |
| 4 | COLLECTION ITERATOR PICKLER FETCH| LIST_TO_TABLE | 16360 | 32720 | 39 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IDX_A1 | 1 | | 0 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | A1 | 1 | 486 | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("A"=VALUE(KOKBF$) AND "B"='12312')
Note
-----
- dynamic sampling used for this statement (level=2)
сорри если совсем криво изложил мысль((