公眾號:pythonislover

Python大數據與SQL優化筆記

前面我們討論過小表和大表直接連接的優化,是用的BROADCAST方式來進行優化的,文尾也說過這種方式不能用在大表之上。那麼今天我們說說如果是大表與大表直接的優化。

下面先準備環境

SQL> create table t2 as
select * from dba_objects
union all
select * from dba_objects
union all
select * from dba_objects
union all
select * from dba_objects
union all
select * from dba_objects;

SQL> create table t3 as select * from t2;

Table created.

假設上面的t2, t3表分別是5G,8G,這種情況下,t2表作為相當較小的表要先HASH 進內存就是PGA,然後與t3表匹配,但是一般我們的PGA是不能完容納下t2表的,這種情況下,會出現on disk hash join, 就是連接操作不是完全在內存進行了,這樣會對性能造成很大的影響。

今天說的就是針對上面的這種情況下,出現on disk hash join,我們該怎麼去優化。

我們想想能不能把2個大表都切開,按批次去hash join,這種方式就是我們說的HASH HASH方式。

原來的SQL

select * from t2,t3 where t2.object_id = t3.object_id

在經過HASH HASH演算法之後,變成了如下,假設我們開4個並行的話

select * from t2_1,t3_1 where t2_1.object_id = t3_1.object_id
union all
select * from t2_2,t3_2 where t2_2.object_id = t3_2.object_id
union all
select * from t2_3,t3_3 where t2_3.object_id = t3_3.object_id
union all
select * from t2_4,t3_4 where t2_4.object_id = t3_4.object_id

下面我們看看實際的執行計劃如何

SQL> explain plan for
select /*+ parallel(4) use_hash(t2,t3) pq_distribute(t3 hash,hash) */ * from t2,t3 where t2.object_id = t3.object_id; 2

Explained.

我們看執行計劃中出現了 PX SEND HASH的關鍵字

這樣就達到了我們的想要的結果。

這裡留一個小彩蛋,如果是超級大表和超級大表的連接,我們就算用HASH HASH 的方式,也是不太理想的,那我們又該怎麼優化,大家可以想想,我們以後再說

今天就說到這裡,個人意見,望指正。


推薦閱讀:
相关文章