Производительность запросов DB2 - PullRequest
0 голосов
/ 04 июля 2019

Цель запроса ниже состоит в том, чтобы объединить одну и ту же таблицу с двумя различными типами источников и выяснить, где совпадает N_ID или L_ID.Приведенный ниже запрос выполняется на сервере SQL через 2 минуты, тогда как когда я выполняю тот же запрос в DB2, он занимает 1 час.Было бы хорошо, если кто-то может помочь улучшить производительность.Решат ли проблему столбцы индекса или есть какой-то другой способ, которым мне нужно переписать запрос.У нас около 17 миллионов записей с источником E и около 2 миллионов записей с источником <> 'E'.Я использую DB2 10.5.В настоящее время нет индекса для этих таблиц

    select ID from TABLE where N_ID  in(select N_ID from TABLE where N_ID in(
select aa.N_ID from
(select N_ID from TABLE where SOURCE<>'E')aa
INNER JOIN
(select N_ID from TABLE where SOURCE='E' )bb
on aa.N_ID=bb.N_ID))
 UNION 
 select ID from TABLE where L_ID in(
(select aa.L_ID from
(select L_ID from TABLE where SOURCE<>'E')aa
INNER JOIN
(select L_ID from TABLE where SOURCE='E' )bb
on aa.L_ID=bb.L_ID ))

Теперь я переписываю вышеупомянутый запрос таким образом, чтобы он завершался за 7 минут

select ID from TABLE where N_ID in(
select aa.N_ID from
(select SRC.N_ID from TABLE SRC,TABLE REF 
where SRC.SOURCE<>'E' and REF.SOURCE='E' and
SRC.N_ID=REF.N_ID)aa)

 UNION ALL

select INT_CIL_ID from TABLE where LEI_CODE in(
select aa.LEI_CODE from
(select SRC.LEI_CODE from TABLE SRC,TABLE REF 
where SRC.SOURCE<>'E' and REF.SOURCE='E' and
SRC.LEI_CODE=REF.LEI_CODE)aa)

В аналогичной заметке IУ меня такая же проблема с приведенным ниже запросом, где на сервере sql он работает за 3 минуты, а DB2 работает вечно.

select aa.ID from 
(select case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from TABLE where SOURCE<>'EXTERNAL')aa
INNER JOIN
(select case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from TABLE where SOURCE='EXTERNAL' )bb
on  
aa.O_NAME=bb.O_NAME
UNION
select bb.ID from 
(select  case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from .TABLE where SOURCE<>'EXTERNAL')aa
INNER JOIN
(select case 
when L_NAME is not null then L_NAME
When L_NAME is null then O_NAME
else L_NAME
END O_NAME,ID,FIRSTNAME,SecondName from .TABLE where SOURCE='EXTERNAL' )bb
on  
aa.O_NAME=bb.O_NAME
UNION
select ID from TABLE where replace(FIRSTNAME,' ','') in(
select distinct aa.FIRSTNAME from
(select distinct replace(FIRSTNAME,' ','')FIRSTNAME from TABLE where SOURCE<>'EXTERNAL' and FIRSTNAME is not null)aa
INNER JOIN
(select distinct replace(FIRSTNAME,' ','')FIRSTNAME from TABLE where SOURCE='EXTERNAL' and FIRSTNAME is not null)bb
on aa.FIRSTNAME=bb.FIRSTNAME)
...