2013-10-22 78 views
1

請原諒我的英語。 我有兩個表,都是按日期間隔分區,但在不同的領域。 兩個表中都有大量的記錄(每個分區〜100kk)。 第一張表在快速分區表空間中保留最後3個(按日期)分區,其他分區分配在慢速分區表空間中。 另外我有一些系統,處理數據。它並行執行進程,每個通過select語句從第一個表中獲取數據,並將處理後的數據放入第二個表中。 所以我需要從第一個表中選擇數據只從「快速」(!)分區放到第二個表中。 但第二個表在其他(日期太)字段分區。當進程並行執行時,當不同的進程試圖將數據放入第二個表中的同一分區時,會發生死鎖。一次從多個分區中選擇

好的解決方案是,每個進程僅從第2個表中的「快速」分區(但所有這些分區都在一次)獲取數據。在這種情況下,每個進程將在一個分區中推送數據。但我不知道如何去做。

如果我讓

select t.field1, t.field2 from (select * from FIRST_TABLE partition("P1") union all 
select * from FIRST_TABLE partition("P2") union all 
select * from FIRST_TABLE partition("P3")) t 
where t.field3='someVal' --Indexed field in FIRST_TABLE 

將OracleDB的使用本地索引分區上的FIRST_TABLE解決where子句?這種方式將如何影響性能?

任何想法來解決我的問題?

PS關於如何從一個select語句中的多個分區中選擇數據有很多問題,但我沒有找到適合我的情況的答案。

+0

可能的重複[如何做一個SQL選擇多個分區?](http://stackoverflow.com/questions/4268139/how-does-one-do-a-sql-select-over-multiple-分區) – javaPlease42

回答

3

查詢分區表時,幾乎不希望使用PARTITION子句。您幾乎總是希望指定一個謂詞,允許Oracle自行進行分區修剪。

SELECT t.column1, t.column2 
    FROM first_table t 
WHERE t.partitioned_date_column >= <<date that delimits fast partitions>> 
    AND t.column3 = 'someVal' 

當指定在該表已分區上,Oracle可以自動確定哪個分區(多個)日期列謂詞需要訪問。

+0

+1打我吧;) – tbone

+0

如果我需要將舊分區中的一個移動到快速表空間並重新處理數據(對不起,我沒有寫關於這個限制的問題)?這種方式不允許定義分離的分區?沒有一個接一個地鋪設。 – Andrey

+0

@Andrey--我不確定這是怎麼改變的。你仍然想在'partitioned_date_column'上指定一個謂詞來指定哪些分區需要讀取。如果您說日期範圍可能不連續,那麼您可能需要一些謂詞「OR」,而不是「> =」,否則您可能需要一個「IN」列表。 –

0

你可以得到的僵局,如果你想在自己的並行執行三個查詢,例如在同一時間運行:

insert into t2 select from t1 partition ("P1"); 

,然後在另一個shell /窗/工作:

insert into t2 select from t1 partition ("P2") 

如果查詢

select * 
from t1 
where date_column_used_for_partition >= 3_dates_ago 

甲骨文將只選擇您需要的三個分區你不需要使用UNION

通過這種方式,您可以將您的INSERT INTO... SELECT語句放在一個查詢中,而且您不必擔心死鎖,Oracle引擎會知道第二個表的哪個分區必須插入數據,他將管理爲您插入。