这条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分钟。不知有什么更好的办法提高速度?
欢迎讨论。
...全文
31 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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>;
可以试一试.

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧