powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / INDEX SKIP SCAN и Concatenation
21 сообщений из 21, страница 1 из 1
INDEX SKIP SCAN и Concatenation
    #39875098
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
никак не могу заставить использовать конкатенацию или inlinst iterator для хорошо селективного запроса, но с индексным доступом SKIP SCAN.
Как форсировать SKIP SCAN и конкатенацию хинтом?

Версия:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

Тестовый пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
drop table tmp_tst purge;
create table tmp_tst as 
select level as id, '****' as pad, trunc(level/5000) as pid
from dual
connect by level < 10000
;

create index i_tmp_tst on tmp_tst(pid, id);

begin
dbms_stats.gather_table_stats(ownname => user, tabname => 'tmp_tst');
end;



Запрос по 1 значения - skip scan:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
explain plan for
select * from tmp_tst where id = :a;
SELECT * FROM table(DBMS_XPLAN.DISPLAY); 

Plan hash value: 285570937
 
-------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |           |     1 |    12 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TMP_TST   |     1 |    12 |     1   (0)| 00:00:01 |
|*  2 |   INDEX SKIP SCAN                   | I_TMP_TST |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("ID"=TO_NUMBER(:A))
       filter("ID"=TO_NUMBER(:A))
 
Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold




По 2 значениям - full scan:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
explain plan for
select * from tmp_tst where id IN( :1 , :2 );
SELECT * FROM table(DBMS_XPLAN.DISPLAY); 

Plan hash value: 4175485756
 
-------------------------------------------------------------------------------------
| Id  | Operation                 | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |         |     2 |    24 |    10  (10)| 00:00:01 |
|*  1 |  TABLE ACCESS STORAGE FULL| TMP_TST |     2 |    24 |     9   (0)| 00:00:01 |
-------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - storage("ID"=TO_NUMBER(:1) OR "ID"=TO_NUMBER(:2))
       filter("ID"=TO_NUMBER(:1) OR "ID"=TO_NUMBER(:2))
 
Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold



С хинтом USE_CONCAT тоже самое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
explain plan for
select /*+ USE_CONCAT */ * from tmp_tst where id IN( :1 , :2 );
SELECT * FROM table(DBMS_XPLAN.DISPLAY); 

Plan hash value: 4175485756
 
-------------------------------------------------------------------------------------
| Id  | Operation                 | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |         |     2 |    24 |    10  (10)| 00:00:01 |
|*  1 |  TABLE ACCESS STORAGE FULL| TMP_TST |     2 |    24 |     9   (0)| 00:00:01 |
-------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - storage("ID"=TO_NUMBER(:1) OR "ID"=TO_NUMBER(:2))
       filter("ID"=TO_NUMBER(:1) OR "ID"=TO_NUMBER(:2))
 
Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39875397
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, сломали что-то в 10.2. В 10.1 ещё работало, но опять же надо форсить хинтом. Я лично склонен считать это багом, т.к. в случае ниже skip scan явно выгоднее и по стоимости и по производительности.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
drop table t1 purge;

create table t1 as
select mod(rownum, 2) gender, rownum id, rpad(' ', 1000) pad
from dual
connect by level < 100000;

create index i1 on t1(gender, id);

begin
  dbms_stats.gather_table_stats(ownname => user, tabname => 't1', cascade => true);
end;
/

alter session set statistics_level=all;

select /*+ use_concat */ * from t1 where id in (1,2);
select * from table(dbms_xplan.display_cursor(null, null, 'iostats last cost'));

alter session set optimizer_features_enable = '10.1.0.5';
select /*+ use_concat */ * from t1 where id in (1,2);
select * from table(dbms_xplan.display_cursor(null, null, 'iostats last cost'));



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
------------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers | Reads  |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |      |      1 |        |  3918 (100)|      2 |00:00:00.13 |   14290 |  14286 |
|*  1 |  TABLE ACCESS STORAGE FULL| T1   |      1 |      2 |  3918   (1)|      2 |00:00:00.13 |   14290 |  14286 |
------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(("ID"=1 OR "ID"=2))



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
---------------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |      |      1 |        |     8 (100)|      2 |00:00:00.01 |   12 |         5 |
|   1 |  CONCATENATION               |      |      1 |        |            |      2 |00:00:00.01 |   12 |         5 |
|   2 |   TABLE ACCESS BY INDEX ROWID| T1   |      1 |      1 |     4   (0)|      1 |00:00:00.01 |    7 |         5 |
|*  3 |    INDEX SKIP SCAN           | I1   |      1 |      1 |     3   (0)|      1 |00:00:00.01 |    6 |         0 |
|   4 |   TABLE ACCESS BY INDEX ROWID| T1   |      1 |      1 |     4   (0)|      1 |00:00:00.01 |    5 |         0 |
|*  5 |    INDEX SKIP SCAN           | I1   |      1 |      1 |     3   (0)|      1 |00:00:00.01 |    4 |         0 |
---------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("ID"=2)
       filter("ID"=2)
   5 - access("ID"=1)
       filter("ID"=1)
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39875412
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander Anokhin,

это уже чтото, но все равно слабо рабочий вариант из-за alter session
если прописать хинт в запросе, то concatenation все равно не срабатывает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
explain plan for
select /*+ USE_CONCAT OPTIMIZER_FEATURES_ENABLE('10.1.0.1') */ * from tmp_tst where id IN( :1 , :2 );
SELECT * FROM table(DBMS_XPLAN.DISPLAY); 

-------------------------------------------------------------------------------------
| Id  | Operation                 | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |         |     2 |    24 |    10  (10)| 00:00:01 |
|*  1 |  TABLE ACCESS STORAGE FULL| TMP_TST |     2 |    24 |     9   (0)| 00:00:01 |
-------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39875417
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, видел. Почему хинт не работает не знаю. Могу предположить, что хинт OPT_PARAM проверяется позже, чем USE_CONCAT, но это как-то сомнительно.
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39876186
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Anokhin, ну у оптимизатора в тестовом примере стоимость конкатенации больше получается на 1, т.е. если ручками переписать запрос на
Код: plsql
1.
2.
3.
select * from tmp_tst t where id = ...
union 
select * from tmp_tst t where id = ...


то в плане будет конкатенация, но стоимость на еденичку выше, чем у фулскана (10 против 9)
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881208
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такой должен хинт быть
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select /*+ use_concat(OR_PREDICATES(1)) */
       *
  from t1
 where id in (1, 2);

---------------------------------------------------------------------------
| Id  | Operation                            | Name | E-Rows | Cost (%CPU)|
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |      |        |     8 (100)|
|   1 |  CONCATENATION                       |      |        |            |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |     4   (0)|
|*  3 |    INDEX SKIP SCAN                   | I1   |      1 |     3   (0)|
|   4 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |     4   (0)|
|*  5 |    INDEX SKIP SCAN                   | I1   |      1 |     3   (0)|
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("ID"=2)
       filter("ID"=2)
   5 - access("ID"=1)
       filter("ID"=1)


Можно было и раньше догадаться, он в аутлайне был.

С 12.2 работает новый or expansion, новый хинт OR_EXPAND. Как его с этим примером подружить не нашёл.
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881230
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
select * from v$version;

explain plan for
select /*+ index_ss(tmp_tst) */ * from tmp_tst where id IN( :1 , :2 );
SELECT * FROM table(DBMS_XPLAN.DISPLAY); 

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0
PL/SQL Release 12.2.0.1.0 - Production                                                    0
CORE	12.2.0.1.0	Production                                                                  0
TNS for Linux: Version 12.2.0.1.0 - Production                                            0
NLSRTL Version 12.2.0.1.0 - Production                                                    0


Explained.


PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 285570937
 
-------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |           |     2 |    24 |    27   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TMP_TST   |     2 |    24 |    27   (0)| 00:00:01 |
|*  2 |   INDEX SKIP SCAN                   | I_TMP_TST |     2 |       |    26   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------
 
   2 - filter("ID"=TO_NUMBER(:1) OR "ID"=TO_NUMBER(:2))
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881255
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkomyagkii_newbi, не хочу тебя расстраивать, но это Index Full Scan :-(
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881386
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander Anokhin,

спасибо, на 18 тоже работает
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881670
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander AnokhinMelkomyagkii_newbi, не хочу тебя расстраивать, но это Index Full Scan :-(

и правда, обман чтобы набрать классы прям какой-то(
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881718
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander AnokhinВот такой должен хинт быть


И что ты считаешь INDEX SKIP SCAN + TABLE ACCESS BY INDEX ROWID BATCHED выполнeнный дважды (один в поисках id = 1 второй в поисках id = 2) а затем CONCATENATION подразумевающий SORT/HASH лучше:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> explain plan for select /*+ index_ss(t1,i1) */ * from t1 where id in (1,2);

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------
Plan hash value: 319309540

--------------------------------------------------------------------------------------------
| Id  | Operation                           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |      |     2 |  2018 |   259   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T1   |     2 |  2018 |   259   (0)| 00:00:01 |
|*  2 |   INDEX SKIP SCAN                   | I1   |     2 |       |   258   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

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

   2 - filter("ID"=1 OR "ID"=2)

14 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881734
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

лучше. там действительно практически фулл скан получается.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
drop table t1 purge;

create table t1 as
select mod(rownum, 2) gender, rownum id, rpad(' ', 1000) pad
from dual
connect by level < 1000000;

create index i1 on t1(gender, id);

begin
  dbms_stats.gather_table_stats(ownname => user, tabname => 't1', cascade => true);
end;
/

alter session set statistics_level=all;




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL_ID  gah2j7aj82up6, child number 0
-------------------------------------
select /*+ TST1 index(t1 i1) */ * from t1 where id IN( 1 , 2 )
 
Plan hash value: 294074833
 
----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |      |      1 |        |  2596 (100)|      2 |00:00:00.17 |    2581 |      1 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |      2 |  2596   (1)|      2 |00:00:00.17 |    2581 |      1 |
|*  2 |   INDEX FULL SCAN                   | I1   |      1 |      2 |  2595   (1)|      2 |00:00:00.17 |    2580 |      0 |
----------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter(("ID"=1 OR "ID"=2))
 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL_ID  bf676hn089fbd, child number 0
-------------------------------------
select /*+ TST3 use_concat(OR_PREDICATES(1)) */ * from t1 where id IN( 
1 , 2 )
 
Plan hash value: 1503868165
 
--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |      |      1 |        |    10 (100)|      2 |00:00:00.01 |      16 |
|   1 |  CONCATENATION                       |      |      1 |        |            |      2 |00:00:00.01 |      16 |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |      1 |     5   (0)|      1 |00:00:00.01 |       8 |
|*  3 |    INDEX SKIP SCAN                   | I1   |      1 |      1 |     4   (0)|      1 |00:00:00.01 |       7 |
|   4 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |      1 |     5   (0)|      1 |00:00:00.01 |       8 |
|*  5 |    INDEX SKIP SCAN                   | I1   |      1 |      1 |     4   (0)|      1 |00:00:00.01 |       7 |
--------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("ID"=2)
       filter("ID"=2)
   5 - access("ID"=1)
       filter("ID"=1)



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL_ID  bn11srsqjnc0u, child number 0
-------------------------------------
select /*+ TST2 index_ss(t1 i1) */ * from t1 where id IN( 1 , 2 )
 
Plan hash value: 319309540
 
----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |      |      1 |        |  2582 (100)|      2 |00:00:00.43 |    2585 |      4 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |      2 |  2582   (1)|      2 |00:00:00.43 |    2585 |      4 |
|*  2 |   INDEX SKIP SCAN                   | I1   |      1 |      2 |  2581   (1)|      2 |00:00:00.43 |    2584 |      4 |
----------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter(("ID"=1 OR "ID"=2))
 
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881735
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну да, считаю. Этот Index Full Scan предполагает изменить моё мнение как-то ?
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881736
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, ну ок.
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881745
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander AnokhinНу да, считаю. Этот Index Full Scan предполагает изменить моё мнение как-то ?

И где ты видишь INDEX FULL SCAN???

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL_ID  bn11srsqjnc0u, child number 0
-------------------------------------
select /*+ TST2 index_ss(t1 i1) */ * from t1 where id IN( 1 , 2 )
 
Plan hash value: 319309540
 
----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |      |      1 |        |  2582 (100)|      2 |00:00:00.43 |    2585 |      4 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |      2 |  2582   (1)|      2 |00:00:00.43 |    2585 |      4 |
|*  2 |   INDEX SKIP SCAN                   | I1   |      1 |      2 |  2581   (1)|      2 |00:00:00.43 |    2584 |      4 |
----------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter(("ID"=1 OR "ID"=2))
 



SY.
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881749
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот всё возьми да расскажи! Тут тебе надо подумать.
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881761
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYИ где ты видишь INDEX FULL SCAN???Видишь access? Что скипает такой skip scan??
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881779
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-SYИ где ты видишь INDEX FULL SCAN???Видишь access? Что скипает такой skip scan??

Теперь вижу.

SY.
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881826
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alexander AnokhinС 12.2 работает новый or expansion, новый хинт OR_EXPAND. Как его с этим примером подружить не нашёл.хз что там за правила проверки - при нормальном id in (1,2) не работает (ORE: bypassed - No valid predicate for OR expansion.), но вот дурацкое добавление исправляет ситуацию:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
SQL> explain plan for select * from t1 where id=1 or id=2 and id!=1;
SQL> @xplan +outline

P_FORMAT
------------------------
typical +outline

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------
Plan hash value: 1477483978

---------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                 |     2 |  1056 |     8   (0)| 00:00:01 |
|   1 |  VIEW                                 | VW_ORE_BA8ECEFB |     2 |  1056 |     8   (0)| 00:00:01 |
|   2 |   UNION-ALL                           |                 |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID BATCHED| T1              |     1 |  1009 |     4   (0)| 00:00:01 |
|*  4 |     INDEX SKIP SCAN                   | I1              |     1 |       |     3   (0)| 00:00:01 |
|   5 |    TABLE ACCESS BY INDEX ROWID BATCHED| T1              |     1 |  1009 |     4   (0)| 00:00:01 |
|*  6 |     INDEX SKIP SCAN                   | I1              |     1 |       |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      BATCH_TABLE_ACCESS_BY_ROWID(@"SET$9162BF3C_2" "T1"@"SET$9162BF3C_2")
      INDEX_SS(@"SET$9162BF3C_2" "T1"@"SET$9162BF3C_2" ("T1"."GENDER" "T1"."ID"))
      BATCH_TABLE_ACCESS_BY_ROWID(@"SET$9162BF3C_1" "T1"@"SET$9162BF3C_1")
      INDEX_SS(@"SET$9162BF3C_1" "T1"@"SET$9162BF3C_1" ("T1"."GENDER" "T1"."ID"))
      NO_ACCESS(@"SEL$BA8ECEFB" "VW_ORE_BA8ECEFB"@"SEL$BA8ECEFB")
      OUTLINE(@"SEL$1")
      OUTLINE_LEAF(@"SEL$BA8ECEFB")
      OR_EXPAND(@"SEL$1" (1) (2))
      OUTLINE_LEAF(@"SET$9162BF3C")
      OUTLINE_LEAF(@"SET$9162BF3C_1")
      OUTLINE_LEAF(@"SET$9162BF3C_2")
      ALL_ROWS
      DB_VERSION('18.1.0')
      OPTIMIZER_FEATURES_ENABLE('18.1.0')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

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

   4 - access("ID"=1)
       filter("ID"=1)
   6 - access("ID"=2)
       filter("ID"=2 AND LNNVL("ID"=1))



только не смог придумать как такое же провернуть с IN
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881878
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderAlexander AnokhinС 12.2 работает новый or expansion, новый хинт OR_EXPAND. Как его с этим примером подружить не нашёл.хз что там за правила проверки - при нормальном id in (1,2) не работает (ORE: bypassed - No valid predicate for OR expansion.), но вот дурацкое добавление исправляет ситуацию:


Класс, теперь понятнее. Такая проверка нужна для переменных (bind или в случае соединений), когда значения зараннее не известны, чтобы одни и те же строки несколько раз не вытащить. И старый добрый or expansion (concatenation) умеет добавлять эти дополнительные условия, а для нового этот шаг преобразований забыли добавить, похоже. В результате для нового or expansion валидным считается только такой "or" где непересечение значений явно прописано и для литералов и для переменных.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
var b1 number
var b2 number
var b3 number

select /*+ use_concat(OR_PREDICATES(1)) */ * from t1 where id in (:B1,:B2, :B3);

---------------------------------------------------------------------------
| Id  | Operation                            | Name | E-Rows | Cost (%CPU)|
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |      |        |     9 (100)|
|   1 |  CONCATENATION                       |      |        |            |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |     3   (0)|
|*  3 |    INDEX SKIP SCAN                   | I1   |      1 |     3   (0)|
|   4 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |     3   (0)|
|*  5 |    INDEX SKIP SCAN                   | I1   |      1 |     3   (0)|
|   6 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |     3   (0)|
|*  7 |    INDEX SKIP SCAN                   | I1   |      1 |     3   (0)|
---------------------------------------------------------------------------

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

   3 - access("ID"=:B3)
       filter("ID"=:B3)
   5 - access("ID"=:B2)
       filter(("ID"=:B2 AND LNNVL("ID"=:B3)))
   7 - access("ID"=:B1)
       filter(("ID"=:B1 AND LNNVL("ID"=:B2) AND LNNVL("ID"=:B3)))



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select * from t1 where id in (:B1,:B2, :B3);

----------------------------------------------------------------
| Id  | Operation                 | Name | E-Rows | Cost (%CPU)|
----------------------------------------------------------------
|   0 | SELECT STATEMENT          |      |        |  2324 (100)|
|*  1 |  TABLE ACCESS STORAGE FULL| T1   |      1 |  2324   (1)|
----------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - storage(("ID"=:B1 OR "ID"=:B2 OR "ID"=:B3))
       filter(("ID"=:B1 OR "ID"=:B2 OR "ID"=:B3))



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
select * from t1 where (id = :B1 and :B1 <> :B2 and :B1 <> :B3) or (id = :B2 and :B2 <> :B3) or (id = :B3);

----------------------------------------------------------------------------------------
| Id  | Operation                              | Name            | E-Rows | Cost (%CPU)|
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                 |        |     9 (100)|
|   1 |  VIEW                                  | VW_ORE_BA8ECEFB |      3 |     9   (0)|
|   2 |   UNION-ALL                            |                 |        |            |
|   3 |    TABLE ACCESS BY INDEX ROWID BATCHED | T1              |      1 |     3   (0)|
|*  4 |     INDEX SKIP SCAN                    | I1              |      1 |     3   (0)|
|*  5 |    FILTER                              |                 |        |            |
|   6 |     TABLE ACCESS BY INDEX ROWID BATCHED| T1              |      1 |     3   (0)|
|*  7 |      INDEX SKIP SCAN                   | I1              |      1 |     3   (0)|
|*  8 |    FILTER                              |                 |        |            |
|   9 |     TABLE ACCESS BY INDEX ROWID BATCHED| T1              |      1 |     3   (0)|
|* 10 |      INDEX SKIP SCAN                   | I1              |      1 |     3   (0)|
----------------------------------------------------------------------------------------

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

   4 - access("ID"=:B3)
       filter("ID"=:B3)
   5 - filter(:B2<>:B3)
   7 - access("ID"=:B2)
       filter(("ID"=:B2 AND LNNVL("ID"=:B3)))
   8 - filter((:B1<>:B3 AND :B1<>:B2))
  10 - access("ID"=:B1)
       filter(("ID"=:B1 AND LNNVL("ID"=:B3) AND (LNNVL("ID"=:B2) OR
              LNNVL(:B2<>:B3))))
...
Рейтинг: 0 / 0
INDEX SKIP SCAN и Concatenation
    #39881879
Alexander Anokhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY... а затем CONCATENATION подразумевающий SORT/HASH лучше:

SY.
Нет там SORT/HASH. Шаг CONCATENATION ничего не делает, как UNION ALL, строки собирает снизу просто.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / INDEX SKIP SCAN и Concatenation
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]