各位,大家好!
本人现在接到一个需求,要高效的实现一个数据提取清单!
具体情况是这样的,有表Table_A和Table_B。
表Table_A和Table_B都有字段C_num,C_Date,C_chanel.其中C_num是主键。并表的数据的数量级都是20W以上。每天都有新的数据插入这两张表。
现在要查询出当天之前Table_B没有而Table_A有的记录。
我写的查询语句是
select a.C_num, a.C_Date, a.C_chanel
from Table_A a
where a.C_Date < sysdate
and not exists
(select 'X' from Table_B t where t.C_num = a.C_num)
但要花费890S以上的时间,请问下各位大虾,有没有更高效的查询方法?谢谢!
本人现在接到一个需求,要高效的实现一个数据提取清单!
具体情况是这样的,有表Table_A和Table_B。
表Table_A和Table_B都有字段C_num,C_Date,C_chanel.其中C_num是主键。并表的数据的数量级都是20W以上。每天都有新的数据插入这两张表。
现在要查询出当天之前Table_B没有而Table_A有的记录。
我写的查询语句是
select a.C_num, a.C_Date, a.C_chanel
from Table_A a
where a.C_Date < sysdate
and not exists
(select 'X' from Table_B t where t.C_num = a.C_num)
但要花费890S以上的时间,请问下各位大虾,有没有更高效的查询方法?谢谢!
from Table_A a LEFT OUTER JOIN Table_B b
on (a.C_num = b.C_num)
WHERE a.C_Date < sysdate
AND b.C_num IS NULL;
一楼的写法似乎有点问题,
and b.C_Num is null这一句会不会先过虑掉b表的再做left join?
有没有高人帮忙解答一下
create table t_a
(c_num NUMBER,
c_date DATE);--建立表t_b
create table t_b
(c_num NUMBER,
c_date DATE);--向表t_a插入数据
INSERT INTO t_a
SELECT rownum, CREATED FROM user_objects WHERE rownum <= 10;--向表t_b插入数据
INSERT INTO t_b
SELECT rownum, CREATED FROM user_objects WHERE rownum <= 5;--两表外连接,查询a表所有的数据及b表对应的数据
SELECT a.c_num, a.c_date, b.c_num, b.c_date
FROM t_a a LEFT OUTER JOIN t_b b
ON (a.c_num = b.c_num);--两表外连接,查询a表所有的数据而b表没有的数据
SELECT a.c_num, a.c_date, b.c_num, b.c_date
FROM t_a a LEFT OUTER JOIN t_b b
ON (a.c_num = b.c_num)
WHERE b.c_num IS NULL;
我认为像这样的查询not in 的效率是最低的,其次是外连接。再就是not exists 。
不过实践是检验真理的唯一标准,楼上帅哥的方法我会试一下的。
再次感谢您的热心帮助!
我认为像这样的查询not in 的效率是最低的,其次是外连接。再就是not exists 。
不过实践是检验真理的唯一标准,楼上帅哥的方法我会试一下的。
再次感谢您的热心帮助!
我认为像这样的查询not in 的效率是最低的,其次是外连接。再就是not exists 。
不过实践是检验真理的唯一标准,楼上帅哥的方法我会试一下的。
再次感谢您的热心帮助!
两个表中的c_num 是主键,C_Date 上建立索引了吗?
但我需要的是将运行数据压缩在5分钟之内。不知道有没有办法。改加索引我没权限。再就是库中没有Table_B这个表。库中的Table_B是通过DBLink来查的。谢谢各位的帮助!
select /*+driving_site(a)*/ a.C_num, a.C_Date, a.C_chanel
from Table_A a
where not exists(select 1 from Table_B t where t.C_num = a.C_num)
and a.C_Date < sysdate
from Table_B b, Table_A a
where a.C_num = b.C_num(+) AND
NVL(b.C_num, 0) = 0 AND
a.C_Date < sysdate
然后在Table_B上建函数索引NVL(b.C_num, 0)
我觉得你说的和写的不是一个意思啊?
你写的是当天之前Table_A有而Table_B没有的记录吧!
from table_A a,table_b b
where a.c_num = b.c_num(+)
and b.c_num is null
and a.c_date < sysdate