前兩天碰到一個問題,在EDB資料庫中建立的一張分區表,需要使用分區本地索引和分區剪裁,但檢視執行計劃發現沒能用到分區剪裁的功能。
建立分區表:
建立主表和三個分區的本地索引:
執行以下帶有分區鍵的查詢語句,:
發現并沒有使用到分區剪裁:

有點疑惑,明明用了分區鍵作為查詢條件,為什麼此處是掃描了所有分區?
分析:
其實這個問題說簡單也簡單,說麻煩也麻煩,主要還是細節和原理的了解。
上例中使用的分區規則是:
以bp_flight_date日期字段作為分區鍵,條件是LESS THAN(‘2015-NOV-02’)。但執行的查詢語句條件是:
對日期值是使用了to_date函數,并不是像分區規則中的“字元串”格式,有理由懷疑是因為兩者不統一,由于某些RULE導緻未能用到分區剪裁的功能。
接下來按照猜想改下查詢條件:
檢視執行計劃:
現在已經隻掃描test_part_20151101這個分區,達到了分區剪裁的目的。
之是以有上面這些問題,可能還是源于Oracle的一些思維,在Oracle,意識當中将日期字段作為查詢條件就應該使用to_date()這類的函數
和上面相同的表結構在Oracle中的實作:
這裡看到執行計劃顯示還是用到了分區特性,并沒有執行全表掃描,其中Pstart和Pstop顯示的是KEY,表示是基于函數值的分區鍵。
那麼像EDB這樣建立一個不用to_date函數的分區表:
直接報錯了,提示字段類型不比對,無法建立表。這也說明了在日期字段類型上,EDB和Oracle的一點不同。
總結:
1. EDB中分區鍵是日期字段,VALUES LESS THAN(‘2015-11-01’)可以使用字元串格式,但Oracle則會報ORA-01861的錯誤,不支援這種建立方式。
2. EDB對使用分區鍵的查詢語句,如果日期條件的格式和分區規則中不同,例如分區規則是’2015-NOV-01’或’2015-11-01’,但查詢條件使用to_date(‘2015-11-01’,’yyyy-mm-dd’),則不會用到分區剪裁的特性,而是掃描所有分區。對于Oracle,在建立分區規則時就已經做了嚴格限制,是以不存在日期條件的格式和分區規則中不一緻的情況。這兩種方式說不上孰好孰壞,EDB是更自由,但需要人為注意書寫的正确,Oracle則是嚴謹,好處是避免了人為使用出錯的可能,間接上可能也反映出了“社群 VS 商業”、“開源 VS 閉源”對待某個問題的一種态度。