powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не получается добиться Index Range Scan, может кто подскажет
9 сообщений из 9, страница 1 из 1
Не получается добиться Index Range Scan, может кто подскажет
    #39369084
Фотография samatom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер, уважаемые коллеги!

Oracle EE 11.2.0.4.1

Приведу упрощенный пример. Есть вьюха (несколько миллиардов строк).
Имеем вот такой запрос к вьюхе, работает без проблем (IRS)
Код: plsql
1.
2.
3.
4.
5.
6.
explain plan for
select *
from codlog_all t2
where t2.MESSAGE_DEMAND_ID in ('bd0eff00d7177c4beed3dca0ad5d3bad')

select * from table( dbms_xplan.display() )

Код: 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.
Plan hash value: 34159560

-----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                          | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                               |     5 | 25770 |  1225   (0)| 00:00:15 |       |       |
|   1 |  VIEW                                   | CODLOG_ALL                    |     5 | 25770 |  1225   (0)| 00:00:15 |       |       |
|   2 |   UNION-ALL                             |                               |       |       |            |          |       |       |
|   3 |    VIEW                                 | CODLOG                        |     2 | 10268 |   452   (0)| 00:00:06 |       |       |
|   4 |     UNION-ALL                           |                               |       |       |            |          |       |       |
|   5 |      PARTITION RANGE ALL                |                               |     1 |  2592 |   130   (0)| 00:00:02 |     1 |1048575|
|   6 |       PARTITION HASH ALL                |                               |     1 |  2592 |   130   (0)| 00:00:02 |     1 |    16 |
|   7 |        TABLE ACCESS BY LOCAL INDEX ROWID| CODLOG_B                      |     1 |  2592 |   130   (0)| 00:00:02 |     1 |1048575|
|*  8 |         INDEX RANGE SCAN                | CL_MESSAGE_DEMAND_ID_INDEX_B  |     1 |       |   129   (0)| 00:00:02 |     1 |1048575|
|   9 |      PARTITION RANGE ALL                |                               |     1 |  1860 |   322   (0)| 00:00:04 |     1 |1048575|
|  10 |       PARTITION HASH ALL                |                               |     1 |  1860 |   322   (0)| 00:00:04 |     1 |    32 |
|  11 |        TABLE ACCESS BY LOCAL INDEX ROWID| CODLOG_S                      |     1 |  1860 |   322   (0)| 00:00:04 |     1 |1048575|
|* 12 |         INDEX RANGE SCAN                | CL_MESSAGE_DEMAND_ID_INDEX_S  |     1 |       |   321   (0)| 00:00:04 |     1 |1048575|
|  13 |    VIEW                                 | FINANCIAL_CODLOG              |     1 |  1645 |     1   (0)| 00:00:01 |       |       |
|  14 |     UNION-ALL                           |                               |       |       |            |          |       |       |
|  15 |      PARTITION RANGE ALL                |                               |     1 |  1883 |   195   (0)| 00:00:03 |     1 |1048575|
|  16 |       PARTITION HASH ALL                |                               |     1 |  1883 |   195   (0)| 00:00:03 |     1 |    16 |
|  17 |        TABLE ACCESS BY LOCAL INDEX ROWID| FINANCIAL_CODLOG_B            |     1 |  1883 |   195   (0)| 00:00:03 |     1 |1048575|
|* 18 |         INDEX RANGE SCAN                | FCL_MESSAGE_DEMAND_ID_INDEX_B |     1 |       |   193   (0)| 00:00:03 |     1 |1048575|
|  19 |      PARTITION RANGE ALL                |                               |     1 |  1631 |   226   (0)| 00:00:03 |     1 |1048575|
|  20 |       PARTITION HASH ALL                |                               |     1 |  1631 |   226   (0)| 00:00:03 |     1 |    16 |
|  21 |        TABLE ACCESS BY LOCAL INDEX ROWID| FINANCIAL_CODLOG_S            |     1 |  1631 |   226   (0)| 00:00:03 |     1 |1048575|
|* 22 |         INDEX RANGE SCAN                | FCL_MESSAGE_DEMAND_ID_INDEX_S |     1 |       |   225   (0)| 00:00:03 |     1 |1048575|
|  23 |    VIEW                                 | TRASH_CODLOG                  |     2 | 10242 |   772   (0)| 00:00:10 |       |       |
|  24 |     UNION-ALL                           |                               |       |       |            |          |       |       |
|  25 |      PARTITION RANGE ALL                |                               |     1 |  1584 |   322   (0)| 00:00:04 |     1 |1048575|
|  26 |       PARTITION HASH ALL                |                               |     1 |  1584 |   322   (0)| 00:00:04 |     1 |    32 |
|  27 |        TABLE ACCESS BY LOCAL INDEX ROWID| TRASH_CODLOG_S                |     1 |  1584 |   322   (0)| 00:00:04 |     1 |1048575|
|* 28 |         INDEX RANGE SCAN                | TCL_MESSAGE_DEMAND_ID_INDEX_S |     1 |       |   321   (0)| 00:00:04 |     1 |1048575|
|  29 |      PARTITION RANGE ALL                |                               |     1 |  1971 |   450   (0)| 00:00:06 |     1 |1048575|
|  30 |       PARTITION HASH ALL                |                               |     1 |  1971 |   450   (0)| 00:00:06 |     1 |    32 |
|  31 |        TABLE ACCESS BY LOCAL INDEX ROWID| TRASH_CODLOG_B                |     1 |  1971 |   450   (0)| 00:00:06 |     1 |1048575|
|* 32 |         INDEX RANGE SCAN                | TCL_MESSAGE_DEMAND_ID_INDEX_B |     1 |       |   449   (0)| 00:00:06 |     1 |1048575|
-----------------------------------------------------------------------------------------------------------------------------------------

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

   8 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  12 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  18 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  22 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  28 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  32 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')


далее вставляем подзапрос (и появляется IFFS)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
explain plan for
select t.MESSAGE_DEMAND_ID
  from codlog_all t
where t.MESSAGE_DEMAND_ID in (select 'bd0eff00d7177c4beed3dca0ad5d3bad' from dual)


select * from table( dbms_xplan.display() )

Код: 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.
Plan hash value: 3393341775

-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name                          | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                               |    44M|  1768M|  7647K  (1)| 25:29:29 |       |       |
|*  1 |  FILTER                     |                               |       |       |            |          |       |       |
|   2 |   VIEW                      | CODLOG_ALL                    |  4416M|   172G|  7647K  (1)| 25:29:29 |       |       |
|   3 |    UNION-ALL                |                               |       |       |            |          |       |       |
|   4 |     VIEW                    | CODLOG                        |  2217M|    45G|  3800K  (1)| 12:40:03 |       |       |
|   5 |      UNION-ALL              |                               |       |       |            |          |       |       |
|   6 |       PARTITION RANGE ALL   |                               |    61M|  1282M|   106K  (1)| 00:21:20 |     1 |1048575|
|   7 |        PARTITION HASH ALL   |                               |    61M|  1282M|   106K  (1)| 00:21:20 |     1 |    16 |
|   8 |         INDEX FAST FULL SCAN| CL_MESSAGE_DEMAND_ID_INDEX_B  |    61M|  1282M|   106K  (1)| 00:21:20 |     1 |1048575|
|   9 |       PARTITION RANGE ALL   |                               |  2156M|    36G|  3693K  (1)| 12:18:43 |     1 |1048575|
|  10 |        PARTITION HASH ALL   |                               |  2156M|    36G|  3693K  (1)| 12:18:43 |     1 |    32 |
|  11 |         INDEX FAST FULL SCAN| CL_MESSAGE_DEMAND_ID_INDEX_S  |  2156M|    36G|  3693K  (1)| 12:18:43 |     1 |1048575|
|  12 |     VIEW                    | FINANCIAL_CODLOG              |  1688M|    66G|  3185K  (1)| 10:37:04 |       |       |
|  13 |      UNION-ALL              |                               |       |       |            |          |       |       |
|  14 |       PARTITION RANGE ALL   |                               |    84M|  2672M|   150K  (1)| 00:30:05 |     1 |1048575|
|  15 |        PARTITION HASH ALL   |                               |    84M|  2672M|   150K  (1)| 00:30:05 |     1 |    16 |
|  16 |         INDEX FAST FULL SCAN| FCL_MESSAGE_DEMAND_ID_INDEX_B |    84M|  2672M|   150K  (1)| 00:30:05 |     1 |1048575|
|  17 |       PARTITION RANGE ALL   |                               |  1603M|    49G|  3034K  (1)| 10:06:59 |     1 |1048575|
|  18 |        PARTITION HASH ALL   |                               |  1603M|    49G|  3034K  (1)| 10:06:59 |     1 |    16 |
|  19 |         INDEX FAST FULL SCAN| FCL_MESSAGE_DEMAND_ID_INDEX_S |  1603M|    49G|  3034K  (1)| 10:06:59 |     1 |1048575|
|  20 |     VIEW                    | TRASH_CODLOG                  |   510M|    10G|   661K  (1)| 02:12:23 |       |       |
|  21 |      UNION-ALL              |                               |       |       |            |          |       |       |
|  22 |       PARTITION RANGE ALL   |                               |   486M|  3709M|   632K  (1)| 02:06:29 |     1 |1048575|
|  23 |        PARTITION HASH ALL   |                               |   486M|  3709M|   632K  (1)| 02:06:29 |     1 |    32 |
|  24 |         INDEX FAST FULL SCAN| TCL_MESSAGE_DEMAND_ID_INDEX_S |   486M|  3709M|   632K  (1)| 02:06:29 |     1 |1048575|
|  25 |       PARTITION RANGE ALL   |                               |    24M|   187M| 29534   (1)| 00:05:55 |     1 |1048575|
|  26 |        PARTITION HASH ALL   |                               |    24M|   187M| 29534   (1)| 00:05:55 |     1 |    32 |
|  27 |         INDEX FAST FULL SCAN| TCL_MESSAGE_DEMAND_ID_INDEX_B |    24M|   187M| 29534   (1)| 00:05:55 |     1 |1048575|
|* 28 |   FILTER                    |                               |       |       |            |          |       |       |
|  29 |    FAST DUAL                |                               |     1 |       |     2   (0)| 00:00:01 |       |       |
-----------------------------------------------------------------------------------------------------------------------------

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

   1 - filter( EXISTS (SELECT 0 FROM "SYS"."DUAL" "DUAL" WHERE :B1='bd0eff00d7177c4beed3dca0ad5d3bad'))
  28 - filter(:B1='bd0eff00d7177c4beed3dca0ad5d3bad')


Видим, что появился фильтр. Лечим его хинтом:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
explain plan for
select *
from codlog_all t2
where t2.MESSAGE_DEMAND_ID in
( select /*+ precompute_subquery */
'bd0eff00d7177c4beed3dca0ad5d3bad' from dual)

select * from table( dbms_xplan.display() )

Код: 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.
Plan hash value: 34159560

-----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                          | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                               |     6 | 30924 |  1646   (1)| 00:00:20 |       |       |
|   1 |  VIEW                                   | CODLOG_ALL                    |     6 | 30924 |  1646   (1)| 00:00:20 |       |       |
|   2 |   UNION-ALL                             |                               |       |       |            |          |       |       |
|   3 |    VIEW                                 | CODLOG                        |     2 | 10268 |   452   (0)| 00:00:06 |       |       |
|   4 |     UNION-ALL                           |                               |       |       |            |          |       |       |
|   5 |      PARTITION RANGE ALL                |                               |     1 |  2592 |   130   (0)| 00:00:02 |     1 |1048575|
|   6 |       PARTITION HASH ALL                |                               |     1 |  2592 |   130   (0)| 00:00:02 |     1 |    16 |
|   7 |        TABLE ACCESS BY LOCAL INDEX ROWID| CODLOG_B                      |     1 |  2592 |   130   (0)| 00:00:02 |     1 |1048575|
|*  8 |         INDEX RANGE SCAN                | CL_MESSAGE_DEMAND_ID_INDEX_B  |     1 |       |   129   (0)| 00:00:02 |     1 |1048575|
|   9 |      PARTITION RANGE ALL                |                               |     1 |  1860 |   322   (0)| 00:00:04 |     1 |1048575|
|  10 |       PARTITION HASH ALL                |                               |     1 |  1860 |   322   (0)| 00:00:04 |     1 |    32 |
|  11 |        TABLE ACCESS BY LOCAL INDEX ROWID| CODLOG_S                      |     1 |  1860 |   322   (0)| 00:00:04 |     1 |1048575|
|* 12 |         INDEX RANGE SCAN                | CL_MESSAGE_DEMAND_ID_INDEX_S  |     1 |       |   321   (0)| 00:00:04 |     1 |1048575|
|  13 |    VIEW                                 | FINANCIAL_CODLOG              |     2 | 10242 |   421   (0)| 00:00:06 |       |       |
|  14 |     UNION-ALL                           |                               |       |       |            |          |       |       |
|  15 |      PARTITION RANGE ALL                |                               |     1 |  1883 |   195   (0)| 00:00:03 |     1 |1048575|
|  16 |       PARTITION HASH ALL                |                               |     1 |  1883 |   195   (0)| 00:00:03 |     1 |    16 |
|  17 |        TABLE ACCESS BY LOCAL INDEX ROWID| FINANCIAL_CODLOG_B            |     1 |  1883 |   195   (0)| 00:00:03 |     1 |1048575|
|* 18 |         INDEX RANGE SCAN                | FCL_MESSAGE_DEMAND_ID_INDEX_B |     1 |       |   193   (0)| 00:00:03 |     1 |1048575|
|  19 |      PARTITION RANGE ALL                |                               |     1 |  1631 |   226   (0)| 00:00:03 |     1 |1048575|
|  20 |       PARTITION HASH ALL                |                               |     1 |  1631 |   226   (0)| 00:00:03 |     1 |    16 |
|  21 |        TABLE ACCESS BY LOCAL INDEX ROWID| FINANCIAL_CODLOG_S            |     1 |  1631 |   226   (0)| 00:00:03 |     1 |1048575|
|* 22 |         INDEX RANGE SCAN                | FCL_MESSAGE_DEMAND_ID_INDEX_S |     1 |       |   225   (0)| 00:00:03 |     1 |1048575|
|  23 |    VIEW                                 | TRASH_CODLOG                  |     2 | 10242 |   772   (0)| 00:00:10 |       |       |
|  24 |     UNION-ALL                           |                               |       |       |            |          |       |       |
|  25 |      PARTITION RANGE ALL                |                               |     1 |  1584 |   322   (0)| 00:00:04 |     1 |1048575|
|  26 |       PARTITION HASH ALL                |                               |     1 |  1584 |   322   (0)| 00:00:04 |     1 |    32 |
|  27 |        TABLE ACCESS BY LOCAL INDEX ROWID| TRASH_CODLOG_S                |     1 |  1584 |   322   (0)| 00:00:04 |     1 |1048575|
|* 28 |         INDEX RANGE SCAN                | TCL_MESSAGE_DEMAND_ID_INDEX_S |     1 |       |   321   (0)| 00:00:04 |     1 |1048575|
|  29 |      PARTITION RANGE ALL                |                               |     1 |  1971 |   450   (0)| 00:00:06 |     1 |1048575|
|  30 |       PARTITION HASH ALL                |                               |     1 |  1971 |   450   (0)| 00:00:06 |     1 |    32 |
|  31 |        TABLE ACCESS BY LOCAL INDEX ROWID| TRASH_CODLOG_B                |     1 |  1971 |   450   (0)| 00:00:06 |     1 |1048575|
|* 32 |         INDEX RANGE SCAN                | TCL_MESSAGE_DEMAND_ID_INDEX_B |     1 |       |   449   (0)| 00:00:06 |     1 |1048575|
-----------------------------------------------------------------------------------------------------------------------------------------

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

   8 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  12 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  18 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  22 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  28 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')
  32 - access("MESSAGE_DEMAND_ID"='bd0eff00d7177c4beed3dca0ad5d3bad')


далее пробуем расширить условие:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
explain plan for
select *
from codlog_all t2
where t2.MESSAGE_DEMAND_ID in
( select /*+ precompute_subquery */
'bd0eff00d7177c4beed3dca0ad5d3bad' from dual union all select '7098edbff730cfbfce09441b88bcbd08' from dual)

select * from table( dbms_xplan.display() )

Код: 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.
Plan hash value: 4228117697

---------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                    |    88M|   423G|   252M  (1)|841:46:05 |       |       |
|*  1 |  FILTER                  |                    |       |       |            |          |       |       |
|   2 |   VIEW                   | CODLOG_ALL         |  4416M|    20T|   252M  (1)|841:46:05 |       |       |
|   3 |    UNION-ALL             |                    |       |       |            |          |       |       |
|   4 |     VIEW                 | CODLOG             |  2217M|    10T|   138M  (1)|460:10:09 |       |       |
|   5 |      UNION-ALL           |                    |       |       |            |          |       |       |
|   6 |       PARTITION RANGE ALL|                    |    61M|   147G|  5478K  (1)| 18:15:42 |     1 |1048575|
|   7 |        PARTITION HASH ALL|                    |    61M|   147G|  5478K  (1)| 18:15:42 |     1 |    16 |
|   8 |         TABLE ACCESS FULL| CODLOG_B           |    61M|   147G|  5478K  (1)| 18:15:42 |     1 |1048575|
|   9 |       PARTITION RANGE ALL|                    |  2156M|  3734G|   132M  (1)|441:54:28 |     1 |1048575|
|  10 |        PARTITION HASH ALL|                    |  2156M|  3734G|   132M  (1)|441:54:28 |     1 |    32 |
|  11 |         TABLE ACCESS FULL| CODLOG_S           |  2156M|  3734G|   132M  (1)|441:54:28 |     1 |1048575|
|  12 |     VIEW                 | FINANCIAL_CODLOG   |  1688M|  8050G|    88M  (1)|293:44:03 |       |       |
|  13 |      UNION-ALL           |                    |       |       |            |          |       |       |
|  14 |       PARTITION RANGE ALL|                    |    84M|   148G|  5293K  (1)| 17:38:42 |     1 |1048575|
|  15 |        PARTITION HASH ALL|                    |    84M|   148G|  5293K  (1)| 17:38:42 |     1 |    16 |
|  16 |         TABLE ACCESS FULL| FINANCIAL_CODLOG_B |    84M|   148G|  5293K  (1)| 17:38:42 |     1 |1048575|
|  17 |       PARTITION RANGE ALL|                    |  1603M|  2435G|    82M  (1)|276:05:22 |     1 |1048575|
|  18 |        PARTITION HASH ALL|                    |  1603M|  2435G|    82M  (1)|276:05:22 |     1 |    16 |
|  19 |         TABLE ACCESS FULL| FINANCIAL_CODLOG_S |  1603M|  2435G|    82M  (1)|276:05:22 |     1 |1048575|
|  20 |     VIEW                 | TRASH_CODLOG       |   510M|  2436G|    26M  (1)| 87:51:54 |       |       |
|  21 |      UNION-ALL           |                    |       |       |            |          |       |       |
|  22 |       PARTITION RANGE ALL|                    |   486M|   717G|    24M  (1)| 82:06:53 |     1 |1048575|
|  23 |        PARTITION HASH ALL|                    |   486M|   717G|    24M  (1)| 82:06:53 |     1 |    32 |
|  24 |         TABLE ACCESS FULL| TRASH_CODLOG_S     |   486M|   717G|    24M  (1)| 82:06:53 |     1 |1048575|
|  25 |       PARTITION RANGE ALL|                    |    24M|    45G|  1725K  (1)| 05:45:01 |     1 |1048575|
|  26 |        PARTITION HASH ALL|                    |    24M|    45G|  1725K  (1)| 05:45:01 |     1 |    32 |
|  27 |         TABLE ACCESS FULL| TRASH_CODLOG_B     |    24M|    45G|  1725K  (1)| 05:45:01 |     1 |1048575|
|  28 |   UNION-ALL              |                    |       |       |            |          |       |       |
|* 29 |    FILTER                |                    |       |       |            |          |       |       |
|  30 |     FAST DUAL            |                    |     1 |       |     2   (0)| 00:00:01 |       |       |
|* 31 |    FILTER                |                    |       |       |            |          |       |       |
|  32 |     FAST DUAL            |                    |     1 |       |     2   (0)| 00:00:01 |       |       |
---------------------------------------------------------------------------------------------------------------

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

   1 - filter( EXISTS ( (SELECT /*+ PRECOMPUTE_SUBQUERY */ 'bd0eff00d7177c4beed3dca0ad5d3bad' FROM 
              "SYS"."DUAL" "DUAL" WHERE :B1='bd0eff00d7177c4beed3dca0ad5d3bad') UNION ALL  (SELECT 
              '7098edbff730cfbfce09441b88bcbd08' FROM "SYS"."DUAL" "DUAL" WHERE 
              :B2='7098edbff730cfbfce09441b88bcbd08')))
  29 - filter(:B1='bd0eff00d7177c4beed3dca0ad5d3bad')
  31 - filter(:B1='7098edbff730cfbfce09441b88bcbd08')


и получаем вовсе FTS. Что только не перепробовал - не могу добиться IRS, если в условии IN несколько значений. Писать PL\SQL под это хозяйство не хотелось бы.
Пробовал в частности старый добрый WITH (c materialize) и в связке с Cardinality, No_unnest. Ничего не помогает. Может есть какие-нибудь идеи?
...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369111
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
samatom,

да не надо упрощать в таких ситуациях, а надо сразу полностью все рассказывать и показывать.
Например, на моем тест-кейсе все работает ок:
ddl
Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
drop table test_a purge;
drop table test_b purge;
drop table test_c purge;
drop view test_view;
create table test_a(p_range,subp_hash,local_id, dummy)
partition by range(p_range) subpartition by hash (subp_hash)
  subpartitions 8
  (
    partition p1 values less than(1),
    partition p2 values less than(2),
    partition p3 values less than(3),
    partition p4 values less than(4)
  )
as
with ranges as (select level-1 p_range from dual connect by level<=4)
    ,hashes as (select level subp_hash from dual connect by level<=32)
    ,ids    as (select level local_id from dual connect by level<=1000)
select p_range,subp_hash,local_id, rownum 
from ranges
    ,hashes
    ,ids
/
create table test_b(p_range,subp_hash,local_id, dummy)
partition by range(p_range) subpartition by hash (subp_hash)
  subpartitions 8
  (
    partition p1 values less than(1),
    partition p2 values less than(2),
    partition p3 values less than(3),
    partition p4 values less than(4)
  )
as
with ranges as (select level-1 p_range from dual connect by level<=4)
    ,hashes as (select level subp_hash from dual connect by level<=32)
    ,ids    as (select level local_id from dual connect by level<=1000)
select p_range,subp_hash,local_id, rownum 
from ranges
    ,hashes
    ,ids
/
create table test_c(p_range,subp_hash,local_id, dummy)
partition by range(p_range) subpartition by hash (subp_hash)
  subpartitions 8
  (
    partition p1 values less than(1),
    partition p2 values less than(2),
    partition p3 values less than(3),
    partition p4 values less than(4)
  )
as
with ranges as (select level-1 p_range from dual connect by level<=4)
    ,hashes as (select level subp_hash from dual connect by level<=32)
    ,ids    as (select level local_id from dual connect by level<=1000)
select p_range,subp_hash,local_id, rownum 
from ranges
    ,hashes
    ,ids
/
create index test_a_local_id on test_a(local_id) local;
create index test_b_local_id on test_b(local_id) local;
create index test_c_local_id on test_c(local_id) local;
begin
   dbms_stats.gather_table_stats('','TEST_A');
   dbms_stats.gather_table_stats('','TEST_B');
   dbms_stats.gather_table_stats('','TEST_C');
end;
/
create view test_view as 
select 'a' tab, a.* from test_a a
union all
select 'b' tab, b.* from test_b b
union all
select 'c' tab, c.* from test_c c
/

результат
Код: 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.
select * from test_view tv where tv.local_id in (select 1 from dual
union all select 5 from dual)

Plan hash value: 3342833118

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name            | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | Pstart| Pstop | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                 |      1 |        |       |   584 (100)|          |       |       |    768 |00:00:00.01 |    1204 |       |       |          |
|   1 |  NESTED LOOPS                          |                 |      1 |    768 | 37632 |   584   (0)| 00:00:08 |       |       |    768 |00:00:00.01 |    1204 |       |       |          |
|   2 |   VIEW                                 | VW_NSO_1        |      1 |      2 |     6 |     4   (0)| 00:00:01 |       |       |      2 |00:00:00.01 |       0 |       |       |          |
|   3 |    HASH UNIQUE                         |                 |      1 |      2 |       |     4   (0)| 00:00:01 |       |       |      2 |00:00:00.01 |       0 |  2441K|  2441K|  611K (0)|
|   4 |     UNION-ALL                          |                 |      1 |        |       |            |          |       |       |      2 |00:00:00.01 |       0 |       |       |          |
|   5 |      FAST DUAL                         |                 |      1 |      1 |       |     2   (0)| 00:00:01 |       |       |      1 |00:00:00.01 |       0 |       |       |          |
|   6 |      FAST DUAL                         |                 |      1 |      1 |       |     2   (0)| 00:00:01 |       |       |      1 |00:00:00.01 |       0 |       |       |          |
|   7 |   VIEW                                 | TEST_VIEW       |      2 |      1 |    46 |   290   (0)| 00:00:04 |       |       |    768 |00:00:00.01 |    1204 |       |       |          |
|   8 |    UNION ALL PUSHED PREDICATE          |                 |      2 |        |       |            |          |       |       |    768 |00:00:00.01 |    1204 |       |       |          |
|   9 |     PARTITION RANGE ALL                |                 |      2 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |     4 |    256 |00:00:00.01 |     402 |       |       |          |
|  10 |      PARTITION HASH ALL                |                 |      8 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |     8 |    256 |00:00:00.01 |     402 |       |       |          |
|  11 |       TABLE ACCESS BY LOCAL INDEX ROWID| TEST_A          |     64 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |    32 |    256 |00:00:00.01 |     402 |       |       |          |
|* 12 |        INDEX RANGE SCAN                | TEST_A_LOCAL_ID |     64 |    128 |       |    20   (0)| 00:00:01 |     1 |    32 |    256 |00:00:00.01 |     146 |       |       |          |
|  13 |     PARTITION RANGE ALL                |                 |      2 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |     4 |    256 |00:00:00.01 |     401 |       |       |          |
|  14 |      PARTITION HASH ALL                |                 |      8 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |     8 |    256 |00:00:00.01 |     401 |       |       |          |
|  15 |       TABLE ACCESS BY LOCAL INDEX ROWID| TEST_B          |     64 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |    32 |    256 |00:00:00.01 |     401 |       |       |          |
|* 16 |        INDEX RANGE SCAN                | TEST_B_LOCAL_ID |     64 |    128 |       |    20   (0)| 00:00:01 |     1 |    32 |    256 |00:00:00.01 |     145 |       |       |          |
|  17 |     PARTITION RANGE ALL                |                 |      2 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |     4 |    256 |00:00:00.01 |     401 |       |       |          |
|  18 |      PARTITION HASH ALL                |                 |      8 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |     8 |    256 |00:00:00.01 |     401 |       |       |          |
|  19 |       TABLE ACCESS BY LOCAL INDEX ROWID| TEST_C          |     64 |    128 |  1920 |    97   (0)| 00:00:02 |     1 |    32 |    256 |00:00:00.01 |     401 |       |       |          |
|* 20 |        INDEX RANGE SCAN                | TEST_C_LOCAL_ID |     64 |    128 |       |    20   (0)| 00:00:01 |     1 |    32 |    256 |00:00:00.01 |     145 |       |       |          |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

  12 - access("A"."LOCAL_ID"="1")
  16 - access("B"."LOCAL_ID"="1")
  20 - access("C"."LOCAL_ID"="1")


86 rows selected.


PS. только не совсем верно план предикаты показывает, но не суть...
...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369141
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
samatom
Код: plsql
1.
2.
( select /*+ precompute_subquery */
'bd0eff00d7177c4beed3dca0ad5d3bad' from dual union all select '7098edbff730cfbfce09441b88bcbd08' from dual)

Код: plsql
1.
(select /*+ cardinality(1) */ * from (select 'bd0eff00d7177c4beed3dca0ad5d3bad' from dual union all select '7098edbff730cfbfce09441b88bcbd08' from dual))

?
...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369756
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

xtenderPS. только не совсем верно план предикаты показывает, но не суть...
Что не верно?
"1" alias поля из subquery с dual, все в порядке.
Код: plsql
1.
2.
3.
  12 - access("A"."LOCAL_ID"="1")
  16 - access("B"."LOCAL_ID"="1")
  20 - access("C"."LOCAL_ID"="1")
...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369760
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что у ТС 1M секций в каждой таблице никто не обратил внимания?
Сдается мне, трудновато это прожевать оптимизатору. А если там еще и глистограммы...
...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369764
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

power(2,20)-1 для interval типично.

Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
SQL> create table test_a(p_range,subp_hash,local_id, dummy)
  2  partition by range(p_range) interval(10) subpartition by hash (subp_hash)
  3    subpartitions 8
  4    (
  5  	 partition p1 values less than(1),
  6  	 partition p2 values less than(2),
  7  	 partition p3 values less than(3),
  8  	 partition p4 values less than(4)
  9    )
 10  as
 11  with ranges as (select level-1 p_range from dual connect by level<=4)
 12  	 ,hashes as (select level subp_hash from dual connect by level<=32)
 13  	 ,ids	 as (select level local_id from dual connect by level<=1000)
 14  select p_range,subp_hash,local_id, rownum
 15  from ranges
 16  	 ,hashes
 17  	 ,ids
 18  /

Table created.

SQL> create table test_b(p_range,subp_hash,local_id, dummy)
  2  partition by range(p_range) interval(10)subpartition by hash (subp_hash)
  3    subpartitions 8
  4    (
  5  	 partition p1 values less than(1),
  6  	 partition p2 values less than(2),
  7  	 partition p3 values less than(3),
  8  	 partition p4 values less than(4)
  9    )
 10  as
 11  with ranges as (select level-1 p_range from dual connect by level<=4)
 12  	 ,hashes as (select level subp_hash from dual connect by level<=32)
 13  	 ,ids	 as (select level local_id from dual connect by level<=1000)
 14  select p_range,subp_hash,local_id, rownum
 15  from ranges
 16  	 ,hashes
 17  	 ,ids
 18  /

Table created.

SQL> create table test_c(p_range,subp_hash,local_id, dummy)
  2  partition by range(p_range) interval(10)subpartition by hash (subp_hash)
  3    subpartitions 8
  4    (
  5  	 partition p1 values less than(1),
  6  	 partition p2 values less than(2),
  7  	 partition p3 values less than(3),
  8  	 partition p4 values less than(4)
  9    )
 10  as
 11  with ranges as (select level-1 p_range from dual connect by level<=4)
 12  	 ,hashes as (select level subp_hash from dual connect by level<=32)
 13  	 ,ids	 as (select level local_id from dual connect by level<=1000)
 14  select p_range,subp_hash,local_id, rownum
 15  from ranges
 16  	 ,hashes
 17  	 ,ids
 18  /

Table created.

SQL> create index test_a_local_id on test_a(local_id) local;

Index created.

SQL> create index test_b_local_id on test_b(local_id) local;

Index created.

SQL> create index test_c_local_id on test_c(local_id) local;

Index created.

SQL> begin
  2  	dbms_stats.gather_table_stats('','TEST_A');
  3  	dbms_stats.gather_table_stats('','TEST_B');
  4  	dbms_stats.gather_table_stats('','TEST_C');
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL> create view test_view as
  2  select 'a' tab, a.* from test_a a
  3  union all
  4  select 'b' tab, b.* from test_b b
  5  union all
  6  select 'c' tab, c.* from test_c c
  7  /

View created.

SQL> 
SQL> explain plan for
  2  select /*+
  3  PUSH_PRED(@"SEL$2A8DFB01" "TV"@"SEL$1" 1)
  4  */
  5  * from test_view tv where tv.local_id in (select 1 zyzy from dual
  6  --* from ( select 'a' tab, a."P_RANGE",a."SUBP_HASH",a."LOCAL_ID",a."DUMMY" from test_a a union all select 'b' tab, b."P_RANGE",b."SUBP_HASH",b."LOCAL_ID",b."DUMMY" from test_b b) tv where tv.local_id in (select 1 from dual
  7  union all select 5 from dual)
  8  /

Explained.

SQL> select * from table(dbms_xplan.display( format=> 'alias outline'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 480819474

----------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation				       | Name		 | Rows  | Bytes | Cost (%CPU)| Time	 | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT			       |		 |   768 | 37632 |   971   (1)| 00:00:01 |	 |	 |
|   1 |  NESTED LOOPS				       |		 |   768 | 37632 |   971   (1)| 00:00:01 |	 |	 |
|   2 |   VIEW					       | VW_NSO_1	 |     2 |     6 |     4   (0)| 00:00:01 |	 |	 |
|   3 |    HASH UNIQUE				       |		 |     2 |	 |     4   (0)| 00:00:01 |	 |	 |
|   4 |     UNION-ALL				       |		 |	 |	 |	      | 	 |	 |	 |
|   5 |      FAST DUAL				       |		 |     1 |	 |     2   (0)| 00:00:01 |	 |	 |
|   6 |      FAST DUAL				       |		 |     1 |	 |     2   (0)| 00:00:01 |	 |	 |
|   7 |   VIEW					       | TEST_VIEW	 |     1 |    46 |   483   (0)| 00:00:01 |	 |	 |
|   8 |    UNION ALL PUSHED PREDICATE		       |		 |	 |	 |	      | 	 |	 |	 |
|   9 |     PARTITION RANGE ALL 		       |		 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |1048575|
|  10 |      PARTITION HASH ALL 		       |		 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |     8 |
|  11 |       TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| TEST_A 	 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |1048575|
|* 12 |        INDEX RANGE SCAN 		       | TEST_A_LOCAL_ID |   128 |	 |    33   (0)| 00:00:01 |     1 |1048575|
|  13 |     PARTITION RANGE ALL 		       |		 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |1048575|
|  14 |      PARTITION HASH ALL 		       |		 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |     8 |
|  15 |       TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| TEST_B 	 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |1048575|
|* 16 |        INDEX RANGE SCAN 		       | TEST_B_LOCAL_ID |   128 |	 |    33   (0)| 00:00:01 |     1 |1048575|
|  17 |     PARTITION RANGE ALL 		       |		 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |1048575|
|  18 |      PARTITION HASH ALL 		       |		 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |     8 |
|  19 |       TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| TEST_C 	 |   128 |  1920 |   161   (0)| 00:00:01 |     1 |1048575|
|* 20 |        INDEX RANGE SCAN 		       | TEST_C_LOCAL_ID |   128 |	 |    33   (0)| 00:00:01 |     1 |1048575|
----------------------------------------------------------------------------------------------------------------------------------

...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369765
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGatepower(2,20)-1 для interval типично.
Спасибо, не знал
...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369852
Фотография samatom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicsamatom
Код: plsql
1.
2.
( select /*+ precompute_subquery */
'bd0eff00d7177c4beed3dca0ad5d3bad' from dual union all select '7098edbff730cfbfce09441b88bcbd08' from dual)

Код: plsql
1.
(select /*+ cardinality(1) */ * from (select 'bd0eff00d7177c4beed3dca0ad5d3bad' from dual union all select '7098edbff730cfbfce09441b88bcbd08' from dual))

?Спасибо, но, к сожалению, не помогает. =(
...
Рейтинг: 0 / 0
Не получается добиться Index Range Scan, может кто подскажет
    #39369965
Фотография samatom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТо, что у ТС 1M секций в каждой таблице никто не обратил внимания?
Сдается мне, трудновато это прожевать оптимизатору. А если там еще и глистограммы...
По-видимому так и есть - выяснили, что оптимизатору тяжело пушить предикаты к таблицам сквозь сложные вьюхи (в оригинальном запросе задействованы вьюхи с уровнем вложенности 2 и 3). Как только убираем вьюхи и вставляем вместо них таблицы - получаем желанные IRS.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не получается добиться Index Range Scan, может кто подскажет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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