提高SQL性能。

[复制链接]
查看11 | 回复9 | 2016-1-7 20:57:31 | 显示全部楼层 |阅读模式
有两个表A ,B 。A表数据量在100万以上,B表在3千左右。结构如下:
A表: 全部为CHAR 索引(NO,KEY)上
NOKEY
FLAG
01 0000000001
0
01 0000000002
0
。。。
010000999999
0
020000000001
0
020000000002
0
。。。
020000999999
0
B表:CHAR (NO,KEY)
NOKEY
01 0000000001
01 0000000002
。。。
010000000999
010000002000
010000002001
。。。
010000002999
020000001000
020000001001
。。。
020000001999
现在要把A表中的数据不在B表中的数据找出来,并且把A表中FLAG设置为1。
我有个方法如下:花费时间大概在3-6分钟。
请问大家有更优化的方法没有?
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
方法如下:
update a set flag=1
where not exists(select 1 from b

where a.no=b.no

and a.key=b.key)
and flag=0
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
上面的那个我觉得肯定要比这个快。
update a set flag=1
where a.no not in (select b.no from b)

and a.key not in (select b.key from b)
是否还有其他方法?
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
还有一种方法是用游标
DECLARE
CURSOR MYCUR IS SELECT A。NO ,A。KEY FROM A;
BEGIN
FOR TMPCUR IN MYCUR
UPDATE A SET flag=1

where not exit(select 1 from b where b.no=tmpcur.no and b.key=tmpcur.key)
END;
这个也没有运行过,是个设想。我估算了以下,如果每条都取一次更新一次大约10-200MS
如果1000W的话我估计时间应该在10*10000000 MS 以上!
请问大哥们,能否把计算时间压缩到3分钟以内!
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
A表中大多数行都要修改, 可以不考虑FLAG的当前值, 全更新一次:
9i以上:
[php]
--
update a set flage = (
with my_qur as (
select a.rowid rid, decode(b.key, null, 1, 0) flag

from a, b

where a.no = b.no(+) and a.key = b.key(+)

)
select flag from my_qur where rid = a.rowid)
--
[/php]
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
现在要把A表中的数据不在B表中的数据找出来,并且把A表中FLAG设置为1。
----
如果同时在A,B表中,且A表中FLAG为1 的记录要不要处理?
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
若在B的NO, KEY上有联合索引, 也许这样会更快?
update a set flag = decode((select 'x' from b where no = a.no and key = a.key), null, 1, 0)
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
最初由 mychary 发布
[B]现在要把A表中的数据不在B表中的数据找出来,并且把A表中FLAG设置为1。
----
如果同时在A,B表中,且A表中FLAG为1 的记录要不要处理? [/B]

如果是FLAG是1了,就不处理了!
(其实处理里成1在结果上是一样的!)
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
最初由 xzw19820217 发布
[B]
如果是FLAG是1了,就不处理了!
(其实处理里成1在结果上是一样的!) [/B]

B表时否更新? 原来是1说明在B中不存在, 现在在B中有了, 是否改为0?
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
最初由 zuochc 发布
[B]
B表时否更新? 原来是1说明在B中不存在, 现在在B中有了, 是否改为0? [/B]

B表中没有FLAG字段,只有NO,KEY;而且他两是联合索引。
另外楼上几位师兄说的有点复杂,能否解释一下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行