这条SQL如何写运行时间最短?

dgcat_6 2002-03-11 04:36:55
我有两个表 A ,B。其中A 表积累了大约1万多条记录,并且每天最少还有几十条记录生成 。根据业务需要,B表每天从A 表和其他表采集数据。我的问题是,我要把A表中已经被B 表采集过的记录屏蔽,而仅仅显示尚未被采集过的记录。
我知道可以这样写:
SELECT A.a ,A.b,A.c ...FROM A
WHERE A.a NOT IN (SELECT B.a FROM B )
AND <WHERE TJ>;
或者:
SELECT A.a ,A.b,A.c ...FROM A ,B
WHERE A.a =B.a(+) AND B.a IS NULL
AND <WHERE TJ>;
但经实践检验,速度都很慢。至少要等待3、4分钟。不知有什么更好的办法提高速度?
欢迎讨论。
...全文
12 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dgcat_6 2002-03-12
谢谢各位。首先,我的A、B都是有索引的。我试了 MINUS,快了一些。但没有质的飞跃。各位有更好的办法吗?
  • 打赏
  • 举报
回复
zhuzhichao 2002-03-11

not in是用不到索引的.
用你寫的外連接只要用到索引了就不會很慢.
  • 打赏
  • 举报
回复
zhuzhichao 2002-03-11

你肯定沒有對A,B上的a建索引.
或者根本沒有用到索引.
  • 打赏
  • 举报
回复
eygle 2002-03-11
用minus也比你用not in 快得多
你试试
select a.* from a
minus
select b.x from b
  • 打赏
  • 举报
回复
jornk 2002-03-11
建A,B的a上的INDEX
  • 打赏
  • 举报
回复
jornk 2002-03-11
试试看
select A.* from A
where exists (select * from B where B.a=A.a)
and <WHERE TJ>;

SELECT A.a ,A.b,A.c ...FROM A ,B
WHERE <WHERE TJ>;
AND A.a =B.a(+) AND B.a IS NULL
  • 打赏
  • 举报
回复
mycode 2002-03-11
首先,检查A表和B表是否在这段a上建立索引.
其次,由于你需要的是A表的记录,还要一种写法
select * from A
where a in (
select a from A
minus
select b from B)
And <WHERE TJ>;
可以试一试.
  • 打赏
  • 举报
回复
相关推荐
发帖
Sybase
加入

2589

社区成员

Sybase相关技术讨论区
社区管理员
  • Sybase社区
申请成为版主
帖子事件
创建了帖子
2002-03-11 04:36
社区公告
暂无公告