powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли это оптимизировать ?
3 сообщений из 3, страница 1 из 1
Можно ли это оптимизировать ?
    #39472501
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
SQL> explain plan for select gen.*
  2  from
  3  (
  4   SELECT
  5      g1.object_id as lot_object_id
  6    ,(case when g1.parent_object_type = 5 then g2.parent_object_id else g1.parent_object_id end) as parent_lot_object_id
  7    FROM
  8     MTL_OBJECT_GENEALOGY g1
  9    ,MTL_OBJECT_GENEALOGY g2
 10    where g1.object_type = 1
 11    and g1.object_id = g2.parent_object_id (+)
 12  ) gen
 13  start with gen.lot_object_id = 12036699
 14  connect by nocycle  prior gen.lot_object_id = gen.parent_lot_object_id;

Объяснено.

SQL> SET LINESIZE 130
SQL> SET PAGESIZE 0
SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);
Plan hash value: 4170120223                                                                                                       
                                                                                                                                  
-----------------------------------------------------------------------------------------------------------------                 
| Id  | Operation                     | Name                    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |                 
-----------------------------------------------------------------------------------------------------------------                 
|   0 | SELECT STATEMENT              |                         |    57M|  1421M|       |   584K (82)| 00:59:43 |                 
|*  1 |  CONNECT BY WITH FILTERING    |                         |       |       |       |            |          |                 
|*  2 |   HASH JOIN OUTER             |                         |    55 |  1320 |       |    14   (8)| 00:00:01 |                 
|*  3 |    TABLE ACCESS BY INDEX ROWID| MTL_OBJECT_GENEALOGY    |     6 |   108 |       |    10   (0)| 00:00:01 |                 
|*  4 |     INDEX RANGE SCAN          | MTL_OBJECT_GENEALOGY_N1 |    11 |       |       |     3   (0)| 00:00:01 |                 
|*  5 |    INDEX RANGE SCAN           | MTL_OBJECT_GENEALOGY_N2 |    10 |    60 |       |     3   (0)| 00:00:01 |                 
|*  6 |   HASH JOIN                   |                         |    57M|  2022M|       |   113K  (5)| 00:11:34 |                 
|   7 |    CONNECT BY PUMP            |                         |       |       |       |            |          |                 
|*  8 |    HASH JOIN OUTER            |                         |   104M|  2385M|   309M|   111K  (4)| 00:11:25 |                 
|*  9 |     TABLE ACCESS FULL         | MTL_OBJECT_GENEALOGY    |    10M|   185M|       | 50249   (3)| 00:05:09 |                 
|  10 |     TABLE ACCESS FULL         | MTL_OBJECT_GENEALOGY    |    21M|   123M|       | 50158   (2)| 00:05:08 |                 
-----------------------------------------------------------------------------------------------------------------                 
                                                                                                                                  
Predicate Information (identified by operation id):                                                                               
---------------------------------------------------                                                                               
                                                                                                                                  
   1 - access(CASE "G1"."PARENT_OBJECT_TYPE" WHEN 5 THEN "G2"."PARENT_OBJECT_ID" ELSE                                             
              "G1"."PARENT_OBJECT_ID" END =PRIOR "G1"."LOT_OBJECT_ID")                                                            
   2 - access("G1"."OBJECT_ID"="G2"."PARENT_OBJECT_ID"(+))                                                                        
   3 - filter("G1"."OBJECT_TYPE"=1)                                                                                               
   4 - access("G1"."OBJECT_ID"=12036699)                                                                                          
   5 - access("G2"."PARENT_OBJECT_ID"(+)=12036699)                                                                                
   6 - access("connect$_by$_pump$_004"."prior gen.lot_object_id "=CASE "G1"."PARENT_OBJECT_TYPE" WHEN 5                           
              THEN "G2"."PARENT_OBJECT_ID" ELSE "G1"."PARENT_OBJECT_ID" END )                                                     
   8 - access("G1"."OBJECT_ID"="G2"."PARENT_OBJECT_ID"(+))                                                                        
   9 - filter("G1"."OBJECT_TYPE"=1)                                                                                               
                                                                                                                                  
Note                                                                                                                              
-----                                                                                                                             
   - automatic DOP: skipped because of IO calibrate statistics are missing                                                        

35 строк выбрано.

SQL> spool off



Можно ли это оптимизировать ?

при условии что
1) start with может быть не 1 запись как тут, а скажем 100, даже до 1000
т.е. start with gen.lot_object_id in select (......)
2) фуллскан таблицы 10 мин. (26 млн записей)
3) а мне нужно чтоб весь запрос работал не дольше 10 мин, лучше если еще меньше
4) object_type только 1 и 5, других нет
...
Рейтинг: 0 / 0
Можно ли это оптимизировать ?
    #39472532
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grok,
разбей на 2
первый с g1.object_type = 1 второй с g1.parent_object_type = 5
потом объедини.
...
Рейтинг: 0 / 0
Можно ли это оптимизировать ?
    #39472549
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grok,

если этой записью Вы соединяетесь один к одному
Код: plsql
1.
 11    and g1.object_id = g2.parent_object_id (+)



то можно переписать так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select gen.*
from
(
 SELECT g1.object_id as lot_object_id
,(case when g1.parent_object_type = 5 then g1.object_id else g1.parent_object_id end) as parent_lot_object_id
FROM
MTL_OBJECT_GENEALOGY g1
where g1.object_type = 1
) gen
start with gen.lot_object_id = 12036699
connect by nocycle  prior gen.lot_object_id = gen.parent_lot_object_id;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли это оптимизировать ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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