Sql 重写查询的建议
我有一个包含100万条记录的表(TABLEA),记录从多个来源填充到此表(TABLEA)。Sql 重写查询的建议,sql,db2,Sql,Db2,我有一个包含100万条记录的表(TABLEA),记录从多个来源填充到此表(TABLEA)。 数据填充后,下游处理的记录 每当插入数据时,列标志的值都将为null,并且一旦其被下游处理,则列标志的值将为null 该标志的值将更新为Y 所以基本上我需要在下游处理记录之前进行检查 要求是,对于表A(FLAG='Y')和CODE='I'中已处理的记录,我需要进行检查 是否有其他具有相同COLB值且标志为null的记录。如果它在那里,我想更改代码class='D'(这意味着标记为删除)和标志=NULL 我
数据填充后,下游处理的记录 每当插入数据时,列标志的值都将为null,并且一旦其被下游处理,则列标志的值将为null 该标志的值将更新为Y 所以基本上我需要在下游处理记录之前进行检查 要求是,对于表A(FLAG='Y')和CODE='I'中已处理的记录,我需要进行检查 是否有其他具有相同COLB值且标志为null的记录。如果它在那里,我想更改代码class='D'(这意味着标记为删除)和标志=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值相同,因此在合并查询之后
这就是桌子的样子
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
您可以使用以下
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);
当索引包含所有3个字段时,可以加快搜索速度,因此db2可以对搜索进行索引扫描,并且只在需要更新时才需要对表空间进行读/写操作。谢谢,我将对此进行测试并查看性能。如果尚未设置,我认为可以通过使用另一个隔离级别(带RS/CS/UR)来加快搜索速度。。。