Предложение по переписыванию запроса - PullRequest
0 голосов
/ 13 июля 2020

У меня есть таблица (TABLEA) с 1 миллионом записей, и записи заполняются из нескольких источников в эту таблицу (TABLEA). после того, как данные заполнены, записи обрабатываются нижестоящим.

Каждый раз, когда данные вставляются, значение столбца FLAG будет нулевым, а после его обработки в нисходящем потоке значение FLAG будет обновлено как Y.

Итак, в основном у меня есть требование проверять, прежде чем записи будут обрабатываться ниже по потоку.

Требование состоит в том, что для уже обработанных записей в TABLEA (FLAG = 'Y') и CODE = 'I' мне нужно проверить есть ли какие-либо другие записи с таким же значением для COLB, где FLAG равен нулю. Если он там, я хочу изменить CODE = 'D' (что означает, что он помечен для удаления) и FLAG = NULL

Я пишу слияние для этого, и его выполнение занимает около 3 часов. Я попытался объяснить план, и он не дал мне никаких рекомендаций. Так что можно ли переписать этот запрос.

MERGE INTO TABLEA SRC
using
(select COLB from TABLEA where FLAG IS NULL) TGT
on(SRC.COLB=TGT.COLB and SRC.FLAG is not null and SRC.CODE='I')
when matched then update set 
CODE='D',FLAG = NULL;
commit;

Это моя входная запись, и перед выполнением запроса на слияние

COLA     COLB  CODE FLAG
 -------------- --------- ---- ----
 10001   3060   I    Y
 10002   3548   I    Y
 10003   3566   I    Y
 10004   5093   I    Y
 10005   3548   I    Y
 10008   3060   I    NULL

Мой вывод должен выглядеть примерно так, как показано ниже. Здесь значение COLB одинаково для первой записи (уже обработанной) и последней записи (еще не обработанной), поэтому после запроса на слияние TABLEA выглядит так

COLA     COLB  CODE FLAG
 -------------- --------- ---- ----
 10001   3060   D    NULL
 10002   3548   I    Y
 10003   3566   I    Y
 10004   5093   I    Y
 10005   3548   I    Y
 10008   3060   I    NULL

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете использовать следующий оператор UPDATE:

update tablea a
set code = 'D', flag = null
where flag = 'Y' and code = 'I'
  and exists (
    select 1 from tablea b where b.colb = a.colb and b.flag is null
  );

Чтобы [существенно] повысить производительность, вы можете создать следующие индексы:

create index ix1 on tablea (flag, code);

create index ix2 on tablea (colb, flag);
0 голосов
/ 13 июля 2020

У вас может быть ускорение, когда индексы содержат все 3 поля, поэтому db2 может сканировать индексы для поиска и ему нужно читать / писать в табличном пространстве только тогда, когда требуется обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...