powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Влияние функции на план запроса
11 сообщений из 11, страница 1 из 1
Влияние функции на план запроса
    #39595567
EgorDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как решить данную проблему.
Есть два практически идентичных запроса:
Код: plaintext
SELECT * FROM USR.USER_DD WHERE id >=(select get_id(sysdate-10) from dual) ORDER BY DATE_INSERT DESC
и
Код: plaintext
SELECT * FROM USR.USER_DD WHERE id >=663322731 ORDER BY DATE_INSERT DESC
Во втором случае вместо вызова функции указан id который получили из функции get_id.

Так вот во втором случае запрос выполняется моментально, в первом очень долго.
План выполнения первого

Код: plaintext
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.
SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor('f0gydtbzf1auk'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  f0gydtbzf1auk, child number 0
-------------------------------------
SELECT * FROM USR.USER_DD WHERE id >=(select
get_id(sysdate-10) from dual) ORDER BY DATE_INSERT DESC

Plan hash value: 3438224443

------------------------------------------------------------------------------------------------
| Id  | Operation            | Name            | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                 |       |       |       |  3365M(100)|          |
|   1 |  SORT ORDER BY       |                 |   582M|    10T|  4443G|  3365M  (1)|999:59:59 |
|*  2 |   VIEW               | USER_DD         |   582M|    10T|       |    11M  (1)| 37:03:02 |
|   3 |    UNION-ALL         |                 |       |       |       |            |          |
|   4 |     TABLE ACCESS FULL| USER_DD_2016_01 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL| USER_DD_2016_02 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|   6 |     TABLE ACCESS FULL| USER_DD_2016_03 |  4170 |  1384K|       |    68   (0)| 00:00:01 |
|   7 |     TABLE ACCESS FULL| USER_DD_2016_04 | 13596 |  4793K|       |   205   (1)| 00:00:03 |
|   8 |     TABLE ACCESS FULL| USER_DD_2016_05 |   166K|    62M|       |  2745   (1)| 00:00:33 |
|   9 |     TABLE ACCESS FULL| USER_DD_2016_06 |   226K|    86M|       |  3577   (1)| 00:00:43 |
|  10 |     TABLE ACCESS FULL| USER_DD_2016_07 |   249K|    89M|       |  3855   (1)| 00:00:47 |
|  11 |     TABLE ACCESS FULL| USER_DD_2016_08 |   378K|   139M|       |  6072   (1)| 00:01:13 |
|  12 |     TABLE ACCESS FULL| USER_DD_2016_09 |  1994K|   707M|       | 29675   (1)| 00:05:57 |
|  13 |     TABLE ACCESS FULL| USER_DD_2016_10 |  3104K|  1101M|       | 46585   (1)| 00:09:20 |
|  14 |     TABLE ACCESS FULL| USER_DD_2016_11 |  8898K|  3428M|       |   142K  (1)| 00:28:29 |
|  15 |     TABLE ACCESS FULL| USER_DD_2016_12 |    27M|    10G|       |   466K  (1)| 01:33:21 |
|  16 |     TABLE ACCESS FULL| USER_DD_2017_01 |    27M|    11G|       |   489K  (1)| 01:37:58 |
|  17 |     TABLE ACCESS FULL| USER_DD_2017_02 |    26M|    11G|       |   483K  (1)| 01:36:40 |
|  18 |     TABLE ACCESS FULL| USER_DD_2017_03 |    31M|    14G|       |   577K  (1)| 01:55:32 |
|  19 |     TABLE ACCESS FULL| USER_DD_2017_04 |    29M|    12G|       |   525K  (1)| 01:45:11 |
|  20 |     TABLE ACCESS FULL| USER_DD_2017_05 |    30M|    13G|       |   574K  (1)| 01:54:52 |
|  21 |     TABLE ACCESS FULL| USER_DD_2017_06 |    30M|    14G|       |   588K  (1)| 01:57:41 |
|  22 |     TABLE ACCESS FULL| USER_DD_2017_07 |    29M|    13G|       |   571K  (1)| 01:54:15 |
|  23 |     TABLE ACCESS FULL| USER_DD_2017_08 |    33M|    15G|       |   698K  (1)| 02:19:41 |
|  24 |     TABLE ACCESS FULL| USER_DD_2017_09 |    57M|    26G|       |  1115K  (1)| 03:43:07 |
|  25 |     TABLE ACCESS FULL| USER_DD_2017_10 |    60M|    27G|       |  1167K  (1)| 03:53:32 |
|  26 |     TABLE ACCESS FULL| USER_DD_2017_11 |    57M|    26G|       |  1138K  (1)| 03:47:45 |
|  27 |     TABLE ACCESS FULL| USER_DD_2017_12 |    62M|    29G|       |  1248K  (1)| 04:09:43 |
|  28 |     TABLE ACCESS FULL| USER_DD_2018_01 |    59M|    28G|       |  1178K  (1)| 03:55:45 |
|  29 |     TABLE ACCESS FULL| USER_DD_2018_02 |  2786K|  1344M|       | 55375   (1)| 00:11:05 |
|  30 |     TABLE ACCESS FULL| USER_DD_2018_03 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  31 |     TABLE ACCESS FULL| USER_DD_2018_04 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  32 |     TABLE ACCESS FULL| USER_DD_2018_05 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  33 |     TABLE ACCESS FULL| USER_DD_2018_06 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  34 |     TABLE ACCESS FULL| USER_DD_2018_07 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  35 |     TABLE ACCESS FULL| USER_DD_2018_08 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  36 |     TABLE ACCESS FULL| USER_DD_2018_09 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  37 |     TABLE ACCESS FULL| USER_DD_2018_10 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  38 |     TABLE ACCESS FULL| USER_DD_2018_11 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  39 |     TABLE ACCESS FULL| USER_DD_2018_12 |     1 | 20504 |       |     2   (0)| 00:00:01 |
|  40 |    FAST DUAL         |                 |     1 |       |       |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

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

   2 - filter("ID">=)


второго
Код: plaintext
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.
SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor(''));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  51xn2pc0tn5rd, child number 0
-------------------------------------
SELECT * FROM USR.USER_DD WHERE id >= 663322731 ORDER BY DATE_INSERT
DESC

Plan hash value: 1865384002

-----------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                    |       |       |    95 (100)|          |
|   1 |  SORT ORDER BY                 |                    |    36 |   720K|    95   (2)| 00:00:02 |
|   2 |   VIEW                         | USER_DD            |    36 |   720K|    94   (0)| 00:00:02 |
|   3 |    UNION-ALL                   |                    |       |       |            |          |
|   4 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_01    |     1 | 20504 |     0   (0)|          |
|*  5 |      INDEX RANGE SCAN          | USER_DD_2016_01_PK |     1 |       |     0   (0)|          |
|   6 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_02    |     1 | 20504 |     0   (0)|          |
|*  7 |      INDEX RANGE SCAN          | USER_DD_2016_02_PK |     1 |       |     0   (0)|          |
|   8 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_03    |     1 |   340 |     3   (0)| 00:00:01 |
|*  9 |      INDEX RANGE SCAN          | USER_DD_2016_03_PK |     1 |       |     2   (0)| 00:00:01 |
|  10 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_04    |     1 |   361 |     3   (0)| 00:00:01 |
|* 11 |      INDEX RANGE SCAN          | USER_DD_2016_04_PK |     1 |       |     2   (0)| 00:00:01 |
|  12 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_05    |     1 |   394 |     3   (0)| 00:00:01 |
|* 13 |      INDEX RANGE SCAN          | USER_DD_2016_05_PK |     1 |       |     2   (0)| 00:00:01 |
|  14 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_06    |     1 |   399 |     3   (0)| 00:00:01 |
|* 15 |      INDEX RANGE SCAN          | USER_DD_2016_06_PK |     1 |       |     2   (0)| 00:00:01 |
|  16 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_07    |     1 |   378 |     4   (0)| 00:00:01 |
|* 17 |      INDEX RANGE SCAN          | USER_DD_2016_07_PK |     1 |       |     3   (0)| 00:00:01 |
|  18 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_08    |     1 |   387 |     4   (0)| 00:00:01 |
|* 19 |      INDEX RANGE SCAN          | USER_DD_2016_08_PK |     1 |       |     3   (0)| 00:00:01 |
|  20 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_09    |     1 |   372 |     4   (0)| 00:00:01 |
|* 21 |      INDEX RANGE SCAN          | USER_DD_2016_09_PK |     1 |       |     3   (0)| 00:00:01 |
|  22 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_10    |     1 |   372 |     4   (0)| 00:00:01 |
|* 23 |      INDEX RANGE SCAN          | USER_DD_2016_10_PK |     1 |       |     3   (0)| 00:00:01 |
|  24 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_11    |     1 |   404 |     4   (0)| 00:00:01 |
|* 25 |      INDEX RANGE SCAN          | USER_DD_2016_11_PK |     1 |       |     3   (0)| 00:00:01 |
|  26 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2016_12    |     1 |   417 |     4   (0)| 00:00:01 |
|* 27 |      INDEX RANGE SCAN          | USER_DD_2016_12_PK |     1 |       |     3   (0)| 00:00:01 |
|  28 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_01    |     1 |   453 |     4   (0)| 00:00:01 |
|* 29 |      INDEX RANGE SCAN          | USER_DD_2017_01_PK |     1 |       |     3   (0)| 00:00:01 |
|  30 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_02    |     1 |   473 |     4   (0)| 00:00:01 |
|* 31 |      INDEX RANGE SCAN          | USER_DD_2017_02_PK |     1 |       |     3   (0)| 00:00:01 |
|  32 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_03    |     1 |   476 |     4   (0)| 00:00:01 |
|* 33 |      INDEX RANGE SCAN          | USER_DD_2017_03_PK |     1 |       |     3   (0)| 00:00:01 |
|  34 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_04    |     1 |   480 |     4   (0)| 00:00:01 |
|* 35 |      INDEX RANGE SCAN          | USER_DD_2017_04_PK |     1 |       |     3   (0)| 00:00:01 |
|  36 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_05    |     1 |   486 |     4   (0)| 00:00:01 |
|* 37 |      INDEX RANGE SCAN          | USER_DD_2017_05_PK |     1 |       |     3   (0)| 00:00:01 |
|  38 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_06    |     1 |   499 |     4   (0)| 00:00:01 |
|* 39 |      INDEX RANGE SCAN          | USER_DD_2017_06_PK |     1 |       |     3   (0)| 00:00:01 |
|  40 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_07    |     1 |   501 |     4   (0)| 00:00:01 |
|* 41 |      INDEX RANGE SCAN          | USER_DD_2017_07_PK |     1 |       |     3   (0)| 00:00:01 |
|  42 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_08    |     1 |   504 |     4   (0)| 00:00:01 |
|* 43 |      INDEX RANGE SCAN          | USER_DD_2017_08_PK |     1 |       |     3   (0)| 00:00:01 |
|  44 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_09    |     1 |   493 |     4   (0)| 00:00:01 |
|* 45 |      INDEX RANGE SCAN          | USER_DD_2017_09_PK |     1 |       |     3   (0)| 00:00:01 |
|  46 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_10    |     1 |   495 |     4   (0)| 00:00:01 |
|* 47 |      INDEX RANGE SCAN          | USER_DD_2017_10_PK |     1 |       |     3   (0)| 00:00:01 |
|  48 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_11    |     1 |   501 |     4   (0)| 00:00:01 |
|* 49 |      INDEX RANGE SCAN          | USER_DD_2017_11_PK |     1 |       |     3   (0)| 00:00:01 |
|  50 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2017_12    |     1 |   510 |     5   (0)| 00:00:01 |
|* 51 |      INDEX RANGE SCAN          | USER_DD_2017_12_PK |     1 |       |     4   (0)| 00:00:01 |
|  52 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_01    |     1 |   508 |     5   (0)| 00:00:01 |
|* 53 |      INDEX RANGE SCAN          | USER_DD_2018_01_PK |     1 |       |     4   (0)| 00:00:01 |
|  54 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_02    |     1 |   506 |     4   (0)| 00:00:01 |
|* 55 |      INDEX RANGE SCAN          | USER_DD_2018_02_PK |     1 |       |     3   (0)| 00:00:01 |
|  56 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_03    |     1 | 20504 |     0   (0)|          |
|* 57 |      INDEX RANGE SCAN          | USER_DD_2018_03_PK |     1 |       |     0   (0)|          |
|  58 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_04    |     1 | 20504 |     0   (0)|          |
|* 59 |      INDEX RANGE SCAN          | USER_DD_2018_04_PK |     1 |       |     0   (0)|          |
|  60 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_05    |     1 | 20504 |     0   (0)|          |
|* 61 |      INDEX RANGE SCAN          | USER_DD_2018_05_PK |     1 |       |     0   (0)|          |
|  62 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_06    |     1 | 20504 |     0   (0)|          |
|* 63 |      INDEX RANGE SCAN          | USER_DD_2018_06_PK |     1 |       |     0   (0)|          |
|  64 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_07    |     1 | 20504 |     0   (0)|          |
|* 65 |      INDEX RANGE SCAN          | USER_DD_2018_07_PK |     1 |       |     0   (0)|          |
|  66 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_08    |     1 | 20504 |     0   (0)|          |
|* 67 |      INDEX RANGE SCAN          | USER_DD_2018_08_PK |     1 |       |     0   (0)|          |
|  68 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_09    |     1 | 20504 |     0   (0)|          |
|* 69 |      INDEX RANGE SCAN          | USER_DD_2018_09_PK |     1 |       |     0   (0)|          |
|  70 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_10    |     1 | 20504 |     0   (0)|          |
|* 71 |      INDEX RANGE SCAN          | USER_DD_2018_10_PK |     1 |       |     0   (0)|          |
|  72 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_11    |     1 | 20504 |     0   (0)|          |
|* 73 |      INDEX RANGE SCAN          | USER_DD_2018_11_PK |     1 |       |     0   (0)|          |
|  74 |     TABLE ACCESS BY INDEX ROWID| USER_DD_2018_12    |     1 | 20504 |     0   (0)|          |
|* 75 |      INDEX RANGE SCAN          | USER_DD_2018_12_PK |     1 |       |     0   (0)|          |
-----------------------------------------------------------------------------------------------------

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

   5 - access("ID">=663322731)
   7 - access("ID">=663322731)
   9 - access("ID">=663322731)
  11 - access("ID">=663322731)
  13 - access("ID">=663322731)
  15 - access("ID">=663322731)
  17 - access("ID">=663322731)
  19 - access("ID">=663322731)
  21 - access("ID">=663322731)
  23 - access("ID">=663322731)
  25 - access("ID">=663322731)
  27 - access("ID">=663322731)
  29 - access("ID">=663322731)
  31 - access("ID">=663322731)
  33 - access("ID">=663322731)
  35 - access("ID">=663322731)
  37 - access("ID">=663322731)
  39 - access("ID">=663322731)
  41 - access("ID">=663322731)
  43 - access("ID">=663322731)
  45 - access("ID">=663322731)
  47 - access("ID">=663322731)
  49 - access("ID">=663322731)
  51 - access("ID">=663322731)
  53 - access("ID">=663322731)
  55 - access("ID">=663322731)
  57 - access("ID">=663322731)
  59 - access("ID">=663322731)
  61 - access("ID">=663322731)
  63 - access("ID">=663322731)
  65 - access("ID">=663322731)
  67 - access("ID">=663322731)
  69 - access("ID">=663322731)
  71 - access("ID">=663322731)
  73 - access("ID">=663322731)
  75 - access("ID">=663322731)


В чем разница планов я понимаю, меня интересует как заставить оптимизатор в первом случае сделать план запроса как во втором.
Используется Oracle 11.2.0.4 SE.

ps Нашел что-то подобное тут 19241726 , но решения там нет :(
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39595589
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgorDS,

Ты же понимаешь, что у тебя второй случай быстро выполнился именно для 663322731 и чем меньше будет это число, тем меньше разница с FTS?
Но если очень хочешь " в первом случае сделать план запроса как во втором ", добавь хинт index
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39595593
EgorDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл указать что USER_DD это view которая объединяет таблицы через union_all:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FORCE VIEW USR.USER_DD AS
select * from USER_DD_2016_01
union all
select * from USER_DD_2016_02
union all
.....
select * from USER_DD_2018_12
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39595599
EgorDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__|EgorDS,

Ты же понимаешь, что у тебя второй случай быстро выполнился именно для 663322731 и чем меньше будет это число, тем меньше разница с FTS?
Но если очень хочешь " в первом случае сделать план запроса как во втором ", добавь хинт index

Число 663322731 получено функцией get_id, т.е. во втором варианте вместо вызова функции подставляется ее результат.
hint index не подходит т.к. они имена index-ов разные иу разных таблиц, и во вторых в первом варианте идет начала union all и потом фильтр на значение, а во втором сначала выборка id>= 663322731 и только потом union all
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39595629
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgorDS,

Ну скушно тебе перечислять индексы, попробуй уменьшить стоимость их сканирования
Код: plsql
1.
OPT_PARAM('OPTIMIZER_INDEX_CACHING' 100) OPT_PARAM('OPTIMIZER_INDEX_COST_ADJ' 0)
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39595799
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
EgorDS,

подзапрос-то зачем втыкаете? оставьте одну функцию и не мучайтесь
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39595802
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
в крайнем случае если уж хотите подзапрос оставить, то перенесите его во FROM - оттуда оптимизатор сможет его трансформировать как надо:
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
  dd.* 
FROM USER_DD dd
   , (select get_id(sysdate-10) id from dual) ids
WHERE dd.id >= ids.id
ORDER BY DD.DATE_INSERT DESC


или если у вас динамика, то лепите как-то так:
Код: plsql
1.
2.
3.
4.
5.
SELECT
  dd.* 
FROM USER_DD dd
     join (select get_id(sysdate-10) id from dual) ids on dd.id >= ids.id
ORDER BY DD.DATE_INSERT DESC
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39595806
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
EgorDS,

с оригинальным же запросом даже не мучайся, никакие хинты тебе не помогут его трансформировать в то что нужно
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39596586
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю причина появления подзапроса, что прочитано про subquery caching, но не понято, что он только в части select работает
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39596632
EgorDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderEgorDS,

подзапрос-то зачем втыкаете? оставьте одну функцию и не мучайтесь
Моя вина, не указал что если оставить только функцию ничего не меняется - план такой же как и с запросом 1 в 1.
Я так понимаю надо копать в сторону associate statistics:
xtenderLeonid Kudryavtsev"Oracle умный" и вычислив обычные выражения, функцию и трогать не будетобычно по дефолту так и будет, т.к. оракл старается предикаты с функциями перемещать в конец всего FILTER
21165314
...
Рейтинг: 0 / 0
Влияние функции на план запроса
    #39599441
Sheldon Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgorDSМоя вина, не указал что если оставить только функцию ничего не меняется - план такой же как и с запросом 1 в 1 .
Я так понимаю надо копать в сторону associate statistics:

Код: 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.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set pagesize 0
SQL> set linesize 160
SQL> drop table test;

Table dropped.

SQL> create table test as select level a, level b, level c from dual connect by level<=100000;

Table created.

SQL> alter table test add primary key(a);

Table altered.

SQL> exec dbms_stats.gather_table_stats(ownname => user,tabname => 'TEST');

PL/SQL procedure successfully completed.

SQL> create or replace view vtest as
  2  select * from test union all
  3  select * from test union all
  4  select * from test union all
  5  select * from test union all
  6  select * from test union all
  7  select * from test union all
  8  select * from test union all
  9  select * from test union all
 10  select * from test union all
 11  select * from test union all
 12  select * from test
 13  /

View created.

SQL> create or replace function get_id(id in number) return number
  2  is
  3  begin
  4    return id;
  5  end get_id;
  6  /

Function created.

SQL> var id number
SQL> exec :id:=100000

PL/SQL procedure successfully completed.

SQL> select /*+ gather_plan_statistics*/ * from vtest t where t.a >= get_id(:id) order by b;
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000
    100000     100000     100000

11 rows selected.

SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
SQL_ID  8umuy903a8ccp, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/ * from vtest t where t.a >=
get_id(:id) order by b

Plan hash value: 2081637316

--------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                |      1 |        |     11 |00:00:00.01 |      33 |       |       |          |
|   1 |  SORT ORDER BY                 |                |      1 |  55000 |     11 |00:00:00.01 |      33 |  2048 |  2048 | 2048  (0)|
|   2 |   VIEW                         | VTEST          |      1 |  55000 |     11 |00:00:00.01 |      33 |       |       |          |
|   3 |    UNION-ALL                   |                |      1 |        |     11 |00:00:00.01 |      33 |       |       |          |
|   4 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|*  5 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|   6 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|*  7 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|   8 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|*  9 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  10 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 11 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  12 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 13 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  14 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 15 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  16 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 17 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  18 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 19 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  20 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 21 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  22 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 23 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
|  24 |     TABLE ACCESS BY INDEX ROWID| TEST           |      1 |   5000 |      1 |00:00:00.01 |    3 |          |       |          |
|* 25 |      INDEX RANGE SCAN          | SYS_C006580775 |      1 |    900 |      1 |00:00:00.01 |    2 |          |       |          |
--------------------------------------------------------------------------------------------------------------------------------------

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

   5 - access("A">="GET_ID"(:ID))
   7 - access("A">="GET_ID"(:ID))
   9 - access("A">="GET_ID"(:ID))
  11 - access("A">="GET_ID"(:ID))
  13 - access("A">="GET_ID"(:ID))
  15 - access("A">="GET_ID"(:ID))
  17 - access("A">="GET_ID"(:ID))
  19 - access("A">="GET_ID"(:ID))
  21 - access("A">="GET_ID"(:ID))
  23 - access("A">="GET_ID"(:ID))
  25 - access("A">="GET_ID"(:ID))


53 rows selected.

SQL>
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Влияние функции на план запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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