ORACLE中 大数据表的交叉数据集的查询 SQL优化方法

时间:2021-07-31 14:34:24

由于最近要从2个大表中A(几万条),B(几百万条记录)中查询其中的交集部分,用关联字段的关联查询,太慢,总结出另一个可以解决办法的比较高效语句,特拿来与大家分享,不多说了,下边详细介绍一下我的思路(我的需求是B表的排行,并从A中取部分显示字段信息,以便导出到EXCEL中浏览):

1、先从B表中查询出结果集写入临时表Temp中,

   假语句:insert into  temp(field1,field2,field3....) select field1,field2, sum(field3) as aa from 表B    where   条件。。。 group by field1,field2

  实例Eg:insert into sa_sale_order(barcode,sellprice1,sumqty) select a.tsxpluno,a.tsxpc,sum(tsxqty) as aa from sa_sale_ct a where (1=1) and '+SEARCH_STR    +' group by a.tsxpluno,a.tsxpc ';

2、然后再通过比较 A与Temp相应的记录,同时更新Temp表中的其它字段(从A中取得)[A与Temp通过id关联],在此注明一下,用update来更新时,只能一条条的更新,不然会导致死机。

假语句:update Temp Set  Field4=(select Field4 from 表A where Temp.id=表A.id)

实例Eg:update sa_sale_order  a  set goodsid=(select goodsid from hq_goods  b  where  .barcode=b.barcode)';

 update sa_sale_order a set goodsname=(select goodsname from hq_goods b where a.barcode=b.barcode)';

3、经过第2步的更新后,临时表中的数据字段都全赋了值后,即可查询出来 排序数据来,在些oracle中要用到ROWNUM来选用排序中的前、后N名。

假语句:select * from (select * from Temp  order by  desc/asc ) where ROWNUM<=100

实例Eg:select * from (select * from sa_sale_order order by sumqty '+order_str +' ) where  ROWNUM<=100 其中Order_str是通过条件来传递的排序(DESC、ASC)

以上是本人从工作中总结出的一点知识,在此,如果大家如果有对第2步 进行数据更新,有更好的方法或SQL语句,也请大家积极跟帖,一同来完善我们的知识点。 当然大家有更好的办法,也请写在后的跟帖中,以达到在技术上的共同进步!!