有两个百万级的大表a,b, 其中a表有数据两百多万条。b表有1千多万条。a表为主表。
现在需要关联两个表查询是否存在满足条件的记录
select count(a.id) from a,b where a.id=b.id and b.cate="+cateid+"
select a.* from a,b where a.id=b.id and b.cate=="+cateid+"
这两个表主要执行的sql为select操作 ,查询得到的结果一般都在几万条以上
请教如何提高效率。
另外我看了论坛上http://topic.csdn.net/t/20051111/15/4387478.html的文章,对与
select count(a.id) from a,b where a.id=b.id and ....
和
select 1 from dual
where exists (select 1 from a,b where a.id=b.id and ...);
得到的结果是完全不一样的,不明白楼主说用后一种方法解决了效率的问题
现在需要关联两个表查询是否存在满足条件的记录
select count(a.id) from a,b where a.id=b.id and b.cate="+cateid+"
select a.* from a,b where a.id=b.id and b.cate=="+cateid+"
这两个表主要执行的sql为select操作 ,查询得到的结果一般都在几万条以上
请教如何提高效率。
另外我看了论坛上http://topic.csdn.net/t/20051111/15/4387478.html的文章,对与
select count(a.id) from a,b where a.id=b.id and ....
和
select 1 from dual
where exists (select 1 from a,b where a.id=b.id and ...);
得到的结果是完全不一样的,不明白楼主说用后一种方法解决了效率的问题
1.在A,B的ID上建索引
2.where条件的执行顺序是:从where语句条件的最后一个开始逐渐执行,因此希望楼主把能把范围缩小到最小的条件放在where语句的最后,具体条件,楼主可以根据自己的情况自己写。 3. ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
例如:
表 TAB1 16,384 条记录
表 TAB2 1 条记录
选择TAB2作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒
选择TAB2作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒