powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запросов
3 сообщений из 3, страница 1 из 1
Оптимизация запросов
    #32176123
Major_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имею три медленных запроса.Кто-нибудь может дать советы по оптимизации?
1.
Код: 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.
select distinct '|' as CatID,MFNAME from DESCFULLTEXT
	union
	select distinct CONCAT(p.PID,'|') as CatID,MFNAME from DESCFULLTEXT d1, 
 	(select TRIM(ID) As PID,NVL(NAME,Description) as PDesc, NAME as PDescA from cds_Cctde c, ALTCATNAME a  where  length(Trim(ID))=  1  AND a.CatID (+) = c.ID)  p 
	where p.PID = SUBSTR(d1.CatID, 1 , 1 )  
	union
	select distinct CONCAT('|',CatID) as CatID,MFNAME from DESCFULLTEXT WHERE  CatID != 'XX' 
	union
	select distinct CONCAT(SUBSTR(d2.CatID, 1 , 1 ),CONCAT('|',d2.CatID)) as CatID,d2.MFNAME from DESCFULLTEXT d2 
      where d2.CatID != 'XX' 
	ORDER BY CatID,MFNAME;  
Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 332  Card= 19682  Bytes
          = 237098 )

    1      0    SORT (UNIQUE) (Cost= 267  Card= 19682  Bytes= 237098 )
    2      1      UNION-ALL
    3      2        INDEX (FULL SCAN) OF 'IDX_MFNAME_DESCFULLTEXT' (NON-UN
          IQUE) (Cost= 49  Card= 15494  Bytes= 154940 )

    4      2        NESTED LOOPS (Cost= 40  Card= 155  Bytes= 3100 )
    5      4          NESTED LOOPS (OUTER) (Cost= 2  Card= 1  Bytes= 8 )
    6      5            INDEX (FULL SCAN) OF 'PK_CDS_CCTDE' (UNIQUE) (Cost
          = 26  Card= 1  Bytes= 4 )

    7      5            TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card= 8 
           2  Bytes= 328 )

    8      4          TABLE ACCESS (FULL) OF 'DESCFULLTEXT' (Cost= 38  Card=
           15494  Bytes= 185928 )

    9      2        TABLE ACCESS (FULL) OF 'DESCFULLTEXT' (Cost= 38  Card= 15 
           310  Bytes= 183720 )

   10      2        TABLE ACCESS (FULL) OF 'DESCFULLTEXT' (Cost= 38  Card= 15 
           310  Bytes= 183720 )

2.
Код: 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.
select '|' as MfNAME,PID as CATID, PDesc AS CATNAME from
        (select TRIM(ID) As PID,NVL(NAME,Description) as PDesc from cds_Cctde c, ALTCATNAME a  where  length(Trim(ID))=  1  AND a.CatID (+) = c.ID)  p,
        descfulltext d
        where PID = SUBSTR(d.CatID, 1 , 1 )
    union
    select distinct CONCAT('|',d.MFNAME)as MfNAME,SUBSTR(d.CatID, 1 , 1 ) as CATID,PDesc AS CATNAME from
        (select TRIM(ID) As PID,NVL(NAME,Description) as PDesc from cds_Cctde c, ALTCATNAME a  where  length(Trim(ID))=  1  AND a.CatID (+) = c.ID)  p,
         descfulltext d
        where PID(+) = SUBSTR(d.CatID, 1 , 1 )
    union
    select distinct CONCAT(d1.CatID,CONCAT('|',d.MfNAME))as MfNAME, PID as CATID,PDesc AS CATNAME  from 
          (select TRIM(ID) As PID,NVL(NAME,Description) as PDesc from cds_Cctde c, ALTCATNAME a  where  length(Trim(ID))=  1  AND a.CatID (+) = c.ID)  p,
          descfulltext d, descfulltext d1
          where PID = SUBSTR(d.CatID, 1 , 1 ) and PID= SUBSTR(d1.CatID, 1 , 1 )
    union
    select distinct CONCAT(d.CatID,'|') as MfNAME, PID as CATID,PDesc AS CATNAME  from 
          (select TRIM(ID) As PID,NVL(NAME,Description) as PDesc from cds_Cctde c, ALTCATNAME a  where  length(Trim(ID))=  1  AND a.CatID (+) = c.ID)  p,
          descfulltext d
          where PID = SUBSTR(d.CatID, 1 , 1 )      
    ORDER by MfNAME,CatID;
Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 975  Card= 19603  Bytes
          = 1600632 )

    1      0    SORT (UNIQUE) (Cost= 672  Card= 19603  Bytes= 1600632 )
    2      1      UNION-ALL
    3      2        NESTED LOOPS (Cost= 3  Card= 155  Bytes= 14570 )
    4      3          NESTED LOOPS (OUTER) (Cost= 2  Card= 1  Bytes= 92 )
    5      4            TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Card= 1 
          Bytes= 46 )

    6      4            TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card= 8 
           2  Bytes= 3772 )

    7      3          INDEX (FULL SCAN) OF 'IDX_CATID_DESCFULLTEXT' (NON-U
          NIQUE) (Cost= 4  Card= 15494  Bytes= 30988 )

    8      2        HASH JOIN (OUTER) (Cost= 45  Card= 15494  Bytes= 883158 )
    9      8          TABLE ACCESS (FULL) OF 'DESCFULLTEXT' (Cost= 38  Card=
           15494  Bytes= 185928 )

   10      8          VIEW (Cost= 2  Card= 1  Bytes= 45 )
   11     10            NESTED LOOPS (OUTER) (Cost= 2  Card= 1  Bytes= 92 )
   12     11              TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Card=
           1  Bytes= 46 )

   13     11              TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card
          = 82  Bytes= 3772 )

   14      2        HASH JOIN (Cost= 42  Card= 24016  Bytes= 2545696 )
   15     14          NESTED LOOPS (Cost= 3  Card= 155  Bytes= 14570 )
   16     15            NESTED LOOPS (OUTER) (Cost= 2  Card= 1  Bytes= 92 )
   17     16              TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Card=
           1  Bytes= 46 )

   18     16              TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card
          = 82  Bytes= 3772 )

   19     15            INDEX (FULL SCAN) OF 'IDX_CATID_DESCFULLTEXT' (NON
          -UNIQUE) (Cost= 4  Card= 15494  Bytes= 30988 )

   20     14          TABLE ACCESS (FULL) OF 'DESCFULLTEXT' (Cost= 38  Card=
           15494  Bytes= 185928 )

   21      2        NESTED LOOPS (Cost= 3  Card= 155  Bytes= 14570 )
   22     21          NESTED LOOPS (OUTER) (Cost= 2  Card= 1  Bytes= 92 )
   23     22            TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Card= 1 
          Bytes= 46 )

   24     22            TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card= 8 
           2  Bytes= 3772 )

   25     21          INDEX (FULL SCAN) OF 'IDX_CATID_DESCFULLTEXT' (NON-U
          NIQUE) (Cost= 4  Card= 15494  Bytes= 30988 ) 

3.
Код: 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.
select distinct '|' as MfNAME, CID as CATID,CDesc AS CATNAME from
    (select TRIM(ID) AS CID,NVL(NAME,Description) as CDesc from cds_Cctde c1, ALTCATNAME a1 where  exists (SELECT  1  from descfulltext where c1.ID=CatID) AND a1.CatID (+) = c1.ID) c
  	union
  	select distinct CONCAT('|',SUBSTR(CID, 1 , 1 )) as MfNAME,CID as CATID,CDesc AS CATNAME from
        (select TRIM(ID) AS CID,NVL(NAME,Description) as CDesc from cds_Cctde c1, ALTCATNAME a1 where  exists (SELECT  1  from descfulltext where c1.ID=CatID)  AND a1.CatID (+) = c1.ID) c
  	union
  	select distinct CONCAT(d.MFNAME,CONCAT('|',SUBSTR(CID, 1 , 1 ))) as MFNAME,CID as CATID,CDesc AS CATNAME from
         (select TRIM(ID) AS CID,NVL(NAME,Description) as CDesc from cds_Cctde c1, ALTCATNAME a1 where  exists (SELECT  1  from descfulltext where c1.ID=CatID)  AND a1.CatID (+) = c1.ID) c,
        descfulltext d
        where CID = d.CatID
  	union
  	select distinct CONCAT(d.MFNAME,'|') as MFNAME, d.CATID, CDesc as CATNAME from 
  	  (select TRIM(ID) AS CID,NVL(NAME,Description) as CDesc from cds_Cctde c1, ALTCATNAME a1 where  exists (SELECT  1  from descfulltext where c1.ID=CatID)  AND a1.CatID (+) = c1.ID) c,
        descfulltext d
        where CID (+) =  d.CatID 
    ORDER BY MFNAME,CatID;
Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 83494  Card= 35255  Byt
          es= 2957692 )

    1      0    SORT (UNIQUE) (Cost= 83145  Card= 35255  Bytes= 2957692 )
    2      1      UNION-ALL
    3      2        NESTED LOOPS (Cost= 4  Card= 12705  Bytes= 1194270 )
    4      3          HASH JOIN (OUTER) (Cost= 3  Card= 82  Bytes= 7544 )
    5      4            TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Card= 82 
           Bytes= 3772 )

    6      4            TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card= 8 
           2  Bytes= 3772 )

    7      3          INDEX (RANGE SCAN) OF 'IDX_CATID_DESCFULLTEXT' (NON-
          UNIQUE)

    8      2        NESTED LOOPS (Cost= 4  Card= 12705  Bytes= 1194270 )
    9      8          HASH JOIN (OUTER) (Cost= 3  Card= 82  Bytes= 7544 )
   10      9            TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Card= 82 
           Bytes= 3772 )

   11      9            TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card= 8 
           2  Bytes= 3772 )

   12      8          INDEX (RANGE SCAN) OF 'IDX_CATID_DESCFULLTEXT' (NON-
          UNIQUE)

   13      2        HASH JOIN (Cost= 48  Card= 1968513  Bytes= 208662378 )
   14     13          TABLE ACCESS (FULL) OF 'DESCFULLTEXT' (Cost= 38  Card=
           15494  Bytes= 185928 )

   15     13          NESTED LOOPS (Cost= 4  Card= 12705  Bytes= 1194270 )
   16     15            HASH JOIN (OUTER) (Cost= 3  Card= 82  Bytes= 7544 )
   17     16              TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Card=
           82  Bytes= 3772 )

   18     16              TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Card
          = 82  Bytes= 3772 )

   19     15            INDEX (RANGE SCAN) OF 'IDX_CATID_DESCFULLTEXT' (NO
          N-UNIQUE)

   20      2        HASH JOIN (OUTER) (Cost= 58  Card= 1968513  Bytes= 11220524 
           1 )

   21     20          TABLE ACCESS (FULL) OF 'DESCFULLTEXT' (Cost= 47  Card=
           15494  Bytes= 185928 )

   22     20          VIEW (Cost= 4  Card= 12705  Bytes= 571725 )
   23     22            NESTED LOOPS (Cost= 4  Card= 12705  Bytes= 1194270 )
   24     23              HASH JOIN (OUTER) (Cost= 3  Card= 82  Bytes= 7544 )
   25     24                TABLE ACCESS (FULL) OF 'CDS_CCTDE' (Cost= 1  Car
          d= 82  Bytes= 3772 )

   26     24                TABLE ACCESS (FULL) OF 'ALTCATNAME' (Cost= 1  Ca
          rd= 82  Bytes= 3772 )

   27     23              INDEX (RANGE SCAN) OF 'IDX_CATID_DESCFULLTEXT' (
          NON-UNIQUE)
...
Рейтинг: 0 / 0
Оптимизация запросов
    #32176403
ituser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wmesto distinct => group by
...
Рейтинг: 0 / 0
Оптимизация запросов
    #32185224
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хороший вопрос

общие правила оптимизации запросов
1. cобираем статистику используя dbms_utility.analyze_schema
2. вместо union стараемся использовать union all
3. стараемся не использовать условие 'не равно' по тем столбцам где есть индекс
4. стараемся не использовать в условиях where вызов внешних функций (написанных вами в каких то пакетах)
5. вместо distinct лучше используем group by (причем смотрим на параметр в ora.ini sort_area_size)
6. смотрим на структуру бд и анализируем почему какие-то индексы не используются (желательно чтобы не было full table scan по большим таблицам)
7. если уж после этого ничего не помогло начинаем использовать хинты
у меня самые любимые --+ ordered use_nl
8. не забываем что explan plan хорошо, но tkprof все равно надо запустить и посмотреть что он скажет

p.s. в вашем случае я бы попробовал сделать function based index по полям из которых вы делаете TRIM и SUBSTR
или поменял бы структуру бд, так чтобы не надо было вызывать эти функции
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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