2017-08-15 82 views
0

我一直在使用哈希partitons一個相當龐大的表:oracle多個散列分區平行嗎?

create table test 
(
     custid    VARCHAR2 (16) NOT NULL 
     ,channel    NUMBER(10) 
     ,agent_id    CHAR(8) 
     ,TIMESTAMP   DATE 
) cache 
PARTITION BY HASH(agent_id) 
(
partition e1 tablespace TD_RTDM, 
partition e12 tablespace TD_RTDM, 
partition e13 tablespace TD_RTDM, 
partition e14 tablespace TD_RTDM, 
partition e15 tablespace TD_RTDM, 
partition e16 tablespace TD_RTDM, 
partition e17 tablespace TD_RTDM, 
partition e18 tablespace TD_RTDM 
); 

此作品不錯,當我在AGENT_ID過濾。 現在我有一個新的水平,我需要過濾,其中不包括agent_id。所以我想我需要N個新的並行散列分區是這樣的:

create table test 
    (
      custid    VARCHAR2 (16) NOT NULL 
      ,channel    NUMBER(10) 
      ,agent_id   CHAR(8) 
      ,TIMESTAMP   DATE 
    ) cache 
PARTITION BY HASH(agent_id) 
(
partition e1 tablespace TD_RTDM, 
partition e12 tablespace TD_RTDM, 
partition e13 tablespace TD_RTDM, 
partition e14 tablespace TD_RTDM, 
partition e15 tablespace TD_RTDM, 
partition e16 tablespace TD_RTDM, 
partition e17 tablespace TD_RTDM, 
partition e18 tablespace TD_RTDM 
) 
PARTITION BY HASH(channel) 
(
partition e1 tablespace TD_RTDM, 
partition e12 tablespace TD_RTDM, 
partition e13 tablespace TD_RTDM 
); 

但這不起作用,因爲它顯然不允許有多個分區的語句。我GOOGLE了一下,發現了很多使用子分區的例子,但我認爲這不是我所需要的。

你有什麼想法,如何調整表以獲得兩個查詢性能?謝謝e。

+1

在'channel'上創建一個索引? –

+0

@戈登林諾肯定。我有充足的餘地。 – Ele

+0

本地或全局索引? –

回答

0

分區不一定是性能活動。

分區報價數據管理的優點,允許我們通過分區交換來加載數據子集或通過刪除分區來刪除它們。

分區也爲我們提供高可用性選項,前提是我們將分區分佈在多個表空間中。

現在,分區可以通過分區修剪或刪除來提高某些查詢的性能,但僅限於與分區鍵一致的查詢。其他查詢,與我們的分區策略相違背的查詢將執行中立或有時甚至比對未分區表更差的查詢。這是因爲分區是表的數據的物理組織。行按分區鍵順序分組。很明顯,數據不能同時以兩種不同的順序排序,這就是爲什麼你不能有並行分區鍵。

有沒有簡單的解決方案。 CHANNEL的全局索引可能會有所幫助,因爲它們忽略了分區鍵,但它們帶來了自己的負擔;有些地方禁止使用全局索引。子分區可以回答,但前提是密鑰內的密鑰有意義。用新的分區方案重建表格在理論上是可行的,但在現實生活中幾乎從未做過。試着在框外思考:也許一個單獨的表(可能是索引組織)可以幫助嗎?也許從這個不同的關鍵可能受益的查詢很少運行,他們不值得調整。

總之,您需要了解您的數據及其用例。

+0

耶謝謝。從用例的角度來看,我需要通道a)與agent_it並行,並且b)作爲子查詢。對於b)我認爲一個指數綽綽有餘。但是a)讓我很擔心,因爲表已經被agent_id分區了。所以只查詢頻道將需要搜索所有分區...... :( – Ele