天天看點

EDB和Oracle在分區剪裁實踐上的一點差别

前兩天碰到一個問題,在EDB資料庫中建立的一張分區表,需要使用分區本地索引和分區剪裁,但檢視執行計劃發現沒能用到分區剪裁的功能。

建立分區表:

建立主表和三個分區的本地索引:

執行以下帶有分區鍵的查詢語句,:

發現并沒有使用到分區剪裁:

EDB和Oracle在分區剪裁實踐上的一點差别

有點疑惑,明明用了分區鍵作為查詢條件,為什麼此處是掃描了所有分區?

分析:

其實這個問題說簡單也簡單,說麻煩也麻煩,主要還是細節和原理的了解。

上例中使用的分區規則是:

以bp_flight_date日期字段作為分區鍵,條件是LESS THAN(‘2015-NOV-02’)。但執行的查詢語句條件是:

對日期值是使用了to_date函數,并不是像分區規則中的“字元串”格式,有理由懷疑是因為兩者不統一,由于某些RULE導緻未能用到分區剪裁的功能。

接下來按照猜想改下查詢條件:

檢視執行計劃:

EDB和Oracle在分區剪裁實踐上的一點差别

現在已經隻掃描test_part_20151101這個分區,達到了分區剪裁的目的。

之是以有上面這些問題,可能還是源于Oracle的一些思維,在Oracle,意識當中将日期字段作為查詢條件就應該使用to_date()這類的函數

和上面相同的表結構在Oracle中的實作:

EDB和Oracle在分區剪裁實踐上的一點差别
EDB和Oracle在分區剪裁實踐上的一點差别

這裡看到執行計劃顯示還是用到了分區特性,并沒有執行全表掃描,其中Pstart和Pstop顯示的是KEY,表示是基于函數值的分區鍵。

那麼像EDB這樣建立一個不用to_date函數的分區表:

EDB和Oracle在分區剪裁實踐上的一點差别

直接報錯了,提示字段類型不比對,無法建立表。這也說明了在日期字段類型上,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 閉源”對待某個問題的一種态度。