2010-11-29 101 views
5

上下文:Oracle 10數據庫。在這種情況下使用分區是個好主意嗎?

在一個相當大的表(數百萬條記錄)中,我們最近開始發現一些性能問題。該表有一些特殊的行爲/條件。

  • 其主要是寫一次,然後永遠不會在第一天左右,從0..N分類記錄(可以稱之爲列級)再次
  • 改變。記錄可能在第一天被重新分類幾次
  • 新條目被添加爲0級意思是「尚未分類」
  • 每小時左右一個進程對新的reocrds進行分類並給它們一個新類,從1..N
  • 所有的讀者都只能在類感興趣1
  • 所有記錄超過一天年長很難改變自己的階級,> 1是越來越乾淨了幾日現在

,後因爲大多數訪問完成對於第1類,該欄通常涉及查詢(第1類)以及其他條件附件。我們在類列上有一個索引,然後在某些其他列上有一個索引。

對我的問題:我們現在正在考慮按類別劃分該表格。據我所瞭解,這會使索引/處理數據的速度更快,因爲class = 1已經與其餘數據分離,因此訪問它隱含地更有效。它是否正確?

如果您同意這是一個好主意,我會進一步閱讀主題!

感謝 乾杯

更新2010.11.30

非常感謝您的輸入。我不知道它有一個額外的選項:)謝謝指出(在我投入太多時間之前)。但除了許可證問題之外,在我看來,分區在這方面不一定是一個好的解決方案。

回答

4

哪些操作正在經歷緩慢並且您能夠確定這些操作爲什麼很慢?

如果按類進行分區,則會減慢更新行的類的過程。由於這會迫使一行從一個分區移動到另一個分區,因此您可以將更新從第一個分區轉換爲刪除,並將插入轉換爲第二個分區。如果您的每小時處理速度很慢,而且速度很慢,因爲需要一些時間才能找到所有新記錄,這裏的性能折衷可能是相當合理的。如果你的小時過程很慢,因爲需要花時間計算新類應該是什麼並且更新所有行,但是這種折衷可能是一個非常糟糕的主意。

由於分區是企業版許可證之上的額外成本選項,因此我建議您確保不能使用某些基於函數的索引以相對較低的成本獲得大多數目標性能改進。如果,例如,您有兩個基於函數的索引

CREATE INDEX idx_new_entries 
    ON your_table((CASE WHEN class = 0 THEN primary_key ELSE null END)); 

CREATE INDEX idx_class1_entries 
    ON your_table((CASE WHEN class = 1 THEN primary_key ELSE null END)); 

與一對夫婦的意見

CREATE VIEW vw_new_entries 
AS 
SELECT (CASE WHEN class = 0 THEN primary_key ELSE null END) primary_key, 
     <<list of columns>> 
    FROM your_table 
WHERE class = 0 

CREATE VIEW vw_class1_entries 
AS 
SELECT (CASE WHEN class = 1 THEN primary_key ELSE null END) primary_key, 
     <<list of columns>> 
    FROM your_table 
WHERE class = 1 

那麼任何疑問,針對在PRIMARY_KEY過濾新視圖將使用基於函數的沿索引反過來只會索引基礎表中的適當行。這可能允許您提高查找性能,而無需訴諸分區。

-1

葉普,聽起來像個好主意。

雖然有更好的選擇,但一個簡單的修復是分區。

+1

分區 - 至少對於Oracle來說 - 是一個代價昂貴的選擇,在任何情況下都不合適。 – APC 2010-11-29 19:52:59

3

MB表格有多大?什麼是增長率?您是在清除數據還是計劃清除數據?現在桌上有哪些索引?你能給我們樣品表定義嗎?分區是一個額外的許可選項。你是否證實有人會爲此付錢?

,最重要的是,請提供樣品查詢

您提供什麼是沒有足夠的信息基礎上做出決定。

相關問題