2014-09-25 32 views
1

我有一個表的列表分區兩列MY_ID(整數值1,2,3,5,8 ... 1100),RUN_DATE(過去幾天)的順序。Oracle強制分區修剪在條件

我的查詢是

select * from my_partitioned_table 
where run_date = '10-sep-2014' 
and my_id in (select my_id from mapping_table where category = 1) 
; 

這是要爲全表掃描,具有如下解釋計劃。

PX RECEIVE  115K 4M 600  1,01 PCWP    
PX SEND BROADCAST :TQ10000 115K 4M 600  1,00 P->P BROADCAST  
PX BLOCK ITERATOR  115K 4M 600  1,00 PCWC    
TABLE ACCESS FULL MAPPING_TABLE 115K 4M 600  1,00 PCWP  
PX BLOCK ITERATOR  1G 412G 34849 1,01 PCWC  1 16 
TABLE ACCESS FULL MY_PARTITIONED_TABLE 1G 412G 34849 1,01 PCWP  KEY  KEY 

我該如何強制它只訪問某些分區而不是進行全表掃描?

對不起,我對Oracle提示並不陌生,以前找不到具體問題。

+1

請向我們展示表格的結構,請 – zaratustra 2014-09-25 13:11:56

回答

2

該查詢計劃表明它正在追蹤my_partitioned_table的一個(或多個)分區。所以分區修剪已經發生了。

當您發佈解釋計劃時,您已經切斷了列標題(這對獲取固定寬度版本也有幫助)。但最後兩列幾乎肯定是開始和結束分區。當您看到KEY作爲開始或結束分區時,這意味着Oracle正在確定它在運行時實際需要掃描的一組分區。在這種情況下,它需要確定子查詢將返回的一組my_id值,然後才能確定需要訪問來自表中的哪些分區。 TABLE ACCESS FULL位僅表示它將對其需要訪問的分區執行完整掃描。

+0

在執行查詢後,是否可以準確知道實際掃描了哪些分區?感謝您的快速回答。 – androboy 2014-09-25 16:06:11

+0

@androboy - 我不知道有一種方法可以將信息從我的腦海中取出,儘管如果您追蹤執行,幾乎可以肯定地從跟蹤文件中推斷出它。根據您的環境,您還可以通過查看會話正在進行的讀取次數以及對各個分段進行的讀取次數進行扣除。 – 2014-09-25 17:05:45