powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос db2
10 сообщений из 10, страница 1 из 1
Помогите оптимизировать запрос db2
    #39080962
telal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите оптимизировать запрос. Выглядит он монстрообразно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select distinct  PUBLSEQ from PUBLCOVER P
      WHERE EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA = 1823
        )
      AND NOT EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA NOT IN (1823, 34)
        )



Очень бы хотелось избавиться от EXISTS или NOT EXISTS , оставив один из них.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081020
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оба EXISTS Можно вынести в WITH. Первый присоединить JOIN'ом, второй LEFT JOIN'ом с условием, что второй не имеет соответствующих записей:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH oneWith(PUBLSEQ) as (
SELECT A.PUBLSEQ FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA = 1823
),
twoWith(PUBLSEQ) as (
SELECT A.PUBLSEQ FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA NOT IN (1823, 34)
)
select distinct  PUBLSEQ from PUBLCOVER P
      JOIN oneWith W1 on W1.PUBLSEQ = P.PUBLSEQ
      LEFT JOIN twoWith W2 on W2.PUBLSEQ = P.PUBLSEQ
WHERE W2.PUBLSEQ is null



Ну и неплохо было бы избавиться от NOT IN
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081069
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По мне, запрос маленький и скромный, никак не "монстрообразный". Разве что с ANSI-джойнами он читался бы намного лучше (чтобы условия соединения были отдельно от условий фильтрации и рядом с соответствующими таблицами).

Код: sql
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.
select distinct  PUBLSEQ 
from PUBLCOVER P
WHERE
  EXISTS
      ( 
        SELECT * 
        FROM PUBLCOVER A
           join XCOVERAREA B on A.COVAREA = B.COVAREA
           join XPRODCODEDICT C on B.COVAREA_PRODCODE = C.PRODCODE
        WHERE 
           A.PUBLSEQ = P.PUBLSEQ
           AND A.COVER_STATUS = 'Y'
           AND A.COVAREA = 1823
           AND B.COVAREA_PRODCODE IS NOT NULL
           AND C.STATUS = 'A'
       )
      AND NOT EXISTS(
        SELECT * 
        FROM PUBLCOVER A
           join XCOVERAREA B on A.COVAREA = B.COVAREA
           join XPRODCODEDICT C on B.COVAREA_PRODCODE = C.PRODCODE
        WHERE 
           A.PUBLSEQ = P.PUBLSEQ
           AND A.COVER_STATUS = 'Y'
           AND A.COVAREA NOT IN (1823, 34)
           AND B.COVAREA_PRODCODE IS NOT NULL
           AND C.STATUS = 'A'
      )


В постановке задачи не хватает определений ключей, потому что хочется выкинуть "PUBLCOVER A" - это возможно при соблюдении некоторых условий (хотя. правда, они здесь вряд ли выполняются).

вот это
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
        select A.COVAREA
        FROM PUBLCOVER A
           join XCOVERAREA B on A.COVAREA = B.COVAREA
           join XPRODCODEDICT C on B.COVAREA_PRODCODE = C.PRODCODE
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND C.STATUS = 'A'


очевидный "кандидат" на "вьюху", но запрос такой маленький, что вроде бы и не стоит этим заниматься.

Замена not exists на left join с is null может ускорить, замедлить или не сказаться никак - это надо проверять, сравнивать планы и время выполнения. В любом случае, design adivsor (db2advis) рулит.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081072
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select A.COVAREA
        FROM PUBLCOVER A
           join XCOVERAREA B on A.COVAREA = B.COVAREA
           join XPRODCODEDICT C on B.COVAREA_PRODCODE = C.PRODCODE
        WHERE 
           A.COVER_STATUS = 'Y'
           B.COVAREA_PRODCODE IS NOT NULL
           C.STATUS = 'A'


то бишь
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081091
telal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне он возможно он не такой монстрообразный, но заказчик считает, что нужно избавиться. На его основе будет писаться другой запрос, вот тогда он точно будет огромный. Ещё бы хотелось избавиться от AND A.COVAREA NOT IN (1823, 34)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081121
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
telal,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select publseq
FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
group by publseq
having 
    count(case covarea when 1823 then 1 end) > 0
and count(case when covarea not in (1823, 34) then 1 end) = 0
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081150
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на самое лучшее
(ещё можно AND B.COVAREA_PRODCODE IS NOT NULL убрать ввиду B.COVAREA_PRODCODE = C.PRODCODE?)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081452
telal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

к сожалению резалтсет не такой как в первоначальном запросе
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39081661
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример покажите, a la
Код: sql
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.
with
  PUBLCOVER(PUBLSEQ, COVER_STATUS, COVAREA) as (
    values
      (1,'Y',1823),             -- да, 1823 есть, других нет
      (1,'Y',1823),             -- да, 1823 есть, других нет (дубль)
      (2,'Y',1823), (2,'Y',34), -- да, 1823 есть, 34 есть, других нет
      (3,'Y',1823), (3,'Y',24), -- нет, есть не-1823 и не-34
      (4,'Y',1825), (4,'Y',34), -- нет, есть не-1823 и не-34
      (5,'Y',1825),             -- нет, есть не-1823 и не-34
      (6,'Y',1823), (6,'Y',34), -- нет, есть не-1823 и не-34
      (6,'Y',1825),
      (7,'Y',34)                -- нет, 1823 нет, 34 есть, других нет
  ),
  XCOVERAREA(COVAREA, COVAREA_PRODCODE) as (
    values
       (1823,'X'),
       (1825,'X'),
       (24,'X'),
       (34,'X')
  ),
  XPRODCODEDICT(PRODCODE, STATUS) as (
    values('X','A')
  )
select distinct  PUBLSEQ from PUBLCOVER P
      WHERE EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA = 1823
        )
      AND NOT EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA NOT IN (1823, 34)
        ) 
@

with
  PUBLCOVER(PUBLSEQ, COVER_STATUS, COVAREA) as (
    values
      (1,'Y',1823),             -- да, 1823 есть, других нет
      (1,'Y',1823),             -- да, 1823 есть, других нет (дубль)
      (2,'Y',1823), (2,'Y',34), -- да, 1823 есть, 34 есть, других нет
      (3,'Y',1823), (3,'Y',24), -- нет, есть не-1823 и не-34
      (4,'Y',1825), (4,'Y',34), -- нет, есть не-1823 и не-34
      (5,'Y',1825),             -- нет, есть не-1823 и не-34
      (6,'Y',1823), (6,'Y',34), -- нет, есть не-1823 и не-34
      (6,'Y',1825),
      (7,'Y',34)                -- нет, 1823 нет, 34 есть, других нет
  ),
  XCOVERAREA(COVAREA, COVAREA_PRODCODE) as (
    values
       (1823,'X'),
       (1825,'X'),
       (24,'X'),
       (34,'X')
  ),
  XPRODCODEDICT(PRODCODE, STATUS) as (
    values('X','A')
  )
select publseq
FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
group by publseq
having 
    count(case a.covarea when 1823 then 1 end) > 0
and count(case when a.covarea not in (1823, 34) then 1 end) = 0
@
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос db2
    #39097094
Сергей1977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давно искал, нужно для курсовой)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос db2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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