ORACLE中 大資料表的交叉資料集的查詢 SQL最佳化方法

來源:互聯網
上載者:User

由於最近要從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語句,也請大家積極跟帖,一同來完善我們的知識點。 當然大家有更好的辦法,也請寫在後的跟帖中,以達到在技術上的共同進步!!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.