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

Код: 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
20.10.2015, 11:26
    #39081020
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
Оба 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
20.10.2015, 12:03
    #39081069
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
По мне, запрос маленький и скромный, никак не "монстрообразный". Разве что с 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
20.10.2015, 12:04
    #39081072
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
Код: 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
20.10.2015, 12:15
    #39081091
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
Мне он возможно он не такой монстрообразный, но заказчик считает, что нужно избавиться. На его основе будет писаться другой запрос, вот тогда он точно будет огромный. Ещё бы хотелось избавиться от AND A.COVAREA NOT IN (1823, 34)
...
Рейтинг: 0 / 0
20.10.2015, 12:47
    #39081121
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
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
20.10.2015, 13:06
    #39081150
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
Похоже на самое лучшее
(ещё можно AND B.COVAREA_PRODCODE IS NOT NULL убрать ввиду B.COVAREA_PRODCODE = C.PRODCODE?)
...
Рейтинг: 0 / 0
20.10.2015, 15:56
    #39081452
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
Mark Barinstein,

к сожалению резалтсет не такой как в первоначальном запросе
...
Рейтинг: 0 / 0
20.10.2015, 18:12
    #39081661
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
Пример покажите, 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
07.11.2015, 00:05
    #39097094
Сергей1977
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос db2
Давно искал, нужно для курсовой)
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос db2 / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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