Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / INDEX SKIP SCAN и Concatenation / 21 сообщений из 21, страница 1 из 1
11.10.2019, 12:15
    #39875098
pihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Добрый день,
никак не могу заставить использовать конкатенацию или 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
11.10.2019, 17:18
    #39875397
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Похоже, сломали что-то в 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
11.10.2019, 17:37
    #39875412
pihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
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
11.10.2019, 17:50
    #39875417
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Да, видел. Почему хинт не работает не знаю. Могу предположить, что хинт OPT_PARAM проверяется позже, чем USE_CONCAT, но это как-то сомнительно.
...
Рейтинг: 0 / 0
14.10.2019, 19:15
    #39876186
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
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
24.10.2019, 19:32
    #39881208
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Вот такой должен хинт быть
Код: 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
24.10.2019, 20:14
    #39881230
Melkomyagkii_newbi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Код: 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
24.10.2019, 21:21
    #39881255
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Melkomyagkii_newbi, не хочу тебя расстраивать, но это Index Full Scan :-(
...
Рейтинг: 0 / 0
25.10.2019, 10:33
    #39881386
pihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Alexander Anokhin,

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

и правда, обман чтобы набрать классы прям какой-то(
...
Рейтинг: 0 / 0
25.10.2019, 18:15
    #39881718
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
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
25.10.2019, 18:37
    #39881734
Melkomyagkii_newbi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
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
25.10.2019, 18:38
    #39881735
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Ну да, считаю. Этот Index Full Scan предполагает изменить моё мнение как-то ?
...
Рейтинг: 0 / 0
25.10.2019, 18:39
    #39881736
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
А, ну ок.
...
Рейтинг: 0 / 0
25.10.2019, 19:10
    #39881745
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
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
25.10.2019, 19:17
    #39881749
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
Вот всё возьми да расскажи! Тут тебе надо подумать.
...
Рейтинг: 0 / 0
25.10.2019, 19:41
    #39881761
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
SYИ где ты видишь INDEX FULL SCAN???Видишь access? Что скипает такой skip scan??
...
Рейтинг: 0 / 0
25.10.2019, 20:33
    #39881779
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
-2-SYИ где ты видишь INDEX FULL SCAN???Видишь access? Что скипает такой skip scan??

Теперь вижу.

SY.
...
Рейтинг: 0 / 0
26.10.2019, 03:03
    #39881826
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
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
26.10.2019, 15:31
    #39881878
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
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
26.10.2019, 15:36
    #39881879
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INDEX SKIP SCAN и Concatenation
SY... а затем CONCATENATION подразумевающий SORT/HASH лучше:

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


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