2014-04-03 32 views
2

我創建了一個分區表作爲如何有效地利用oracle數據庫中的表分區?

CREATE TABLE orders_range(order_id NUMBER 
         ,client_id NUMBER 
         ,order_date DATE) 
    PARTITION BY RANGE(order_date) 
    (PARTITION orders2011 VALUES LESS THAN (to_date('1/1/2012','dd/mm/yyyy')) 
    ,PARTITION orders2012 VALUES LESS THAN (to_date('1/1/2013','dd/mm/yyyy')) 
    ,PARTITION orders2013 VALUES LESS THAN (MAXVALUE)); 

當我選擇使用

SELECT * FROM ORDERS_RANGE partition(orders2011); 

記錄說明計劃的CPU成本是75 但是當我使用where子句中去普通查詢cpu成本只有6,那麼表現分區的優勢是什麼? 任何人都可以詳細解釋我嗎?

在此先感謝。

+1

您可能想要指定使用哪個RDBMS。 – Vatev

+0

你使用哪些WHERE子句?桌上有沒有索引? –

回答

1

首先,您通常不能直接比較針對兩個不同對象運行的兩個不同計劃的cost。完全有可能一個成本爲10,000的計劃的運行速度比成本爲10的另一個計劃的運行速度快得多。您可以比較兩個不同計劃的cost在單個10053跟蹤中的單個SQL語句(只要您記得這些是估計值,如果優化器估計錯誤,那麼很多cost值都不正確,優化器可能會選擇效率較低的計劃)。如果您正在嘗試計算優化程序在特定步驟中使用的算法,但是這非常不尋常,則可以比較兩個不同查詢之間的cost

其次,在你的例子中,你沒有插入任何數據。一般來說,如果你打算對一個表進行分區,你這樣做是因爲你在這個表中有多個GB的數據。如果你比較像

SELECT * 
    FROM unpartitioned_table_with_1_billion_rows 

VS

SELECT * 
    FROM partitioned_table_with_1_billion_rows 
WHERE partition_key = date '2014-04-01' -- Restricts the data to only 10 million rows 

的分區方法將很明顯,更高效並非最不重要的是,因爲你只在4月1分區讀10萬行,而而不是表中的10億行。

如果表中沒有數據,那麼可能針對分區表的查詢效率稍低一點,因爲在解析查詢的過程中需要做更多的事情。但是,從0行表中讀取0行幾乎不會花費時間,因此解析時間的差異可能無關緊要。

通常,您不會使用ORDERS_RANGE partition(orders2011)語法來訪問數據。除了對分區名稱進行硬編碼之外,這意味着你經常使用動態SQL來組裝查詢,你會做更多的解析,並且會給共享池帶來更大的壓力如果有人改變了桌子上的分區,你會冒險犯錯。提供關於分區鍵的謂詞以及讓Oracle計算出如何適當修剪分區更有意義。換句話說,

SELECT * 
    FROM orders_range 
WHERE order_date < date '2012-01-01' 

將是一個更明智的查詢。

+0

非常感謝Justin Cave爲您提供明智的答案。 – user3493717