表一: 父表 parent
1、ID varchar2(10) 主键
2、NAME VARCHAR2(100) 名称
表二: 子表 childen
1、ID VARCHAR2(10) 主键
2、PID VARCHAR2(10) 主表的表示
3、NAME VARCHAR2(100) 名称
父表存储父亲,子表存储孩子,然后通过pid和父表关联,查询需要的结果是找到尚未有孩子的父亲。
我们来看一下查询语句的写法:
select * from parent where id not in (select pid from childen)
这种标准的写法在子表存在50万条的记录的时候,查询时间超过了10秒,远远大于原来的sql server服务器的一秒。我在解决的时候想到了一个方法:
select * from parent where id in
( select id from parent minus select pid from childen )
正常理解下,这个语句应该更加费时,但是事实完全出乎意料,这条语句不仅仅在子表存在大量记录的情况下速度良好,在子表少量数据的情况下速度也非常的好,基本在1秒内完成。
select * from A
where id in(select id from B)
以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录.
它的查询过程类似于以下过程
List resultSet=[];
Array A=(select * from A);
Array B=(select id from B);
for(int i=0;i