2013-05-14 104 views
2

我有一個包含以下各列的父表:
- PARENT_ID:UUID
- EVENT_DATE:TIMESTAMP
- DATA_COLUMN1:VARCHAR2(255)
- DATA_COLUMN2:VARCHAR2(255)的Oracle 11g引用分區和索引

表格是EVENT_DATE分區的範圍。數據只保留一個月,最後一個分區每天都會丟失。

按照我的理解,使用PK的全局索引會導致在刪除分區時性能低於標準。這意味着此表的PK必須基於PARENT_ID + EVENT_DATE以創建本地索引。

我有第二個表是第一個孩子(通過一對多關係)。它具有以下欄目:
- CHILD_ID:UUID
- PARENT_ID:UUID - FK到父表
- DATA_COLUMN3:VARCHAR2(255)
- DATA_COLUMN4:VARCHAR2(255)

進行分區子表,我決定使用參考分區。它的一大優點是:它不需要複製子表中的分區鍵。然而,根據我的推理,實現這一目標的唯一方法是通過全球指數。這是我的思路:

  1. 對於父表的唯一索引是本地的,PK必須包括分區鍵,例如,活動日期。
  2. 外鍵約束不能只引用部分PK。因此,子表必須包含PARENT_ID和EVENT_DATE列。

更重要的是,我也讀了「當使用引用分區,大多數子表的索引 應定義爲全球性的,除非有令人信服的理由 對於給定的索引被定義爲本地的。」 (http://www.nocoug.org/download/2010-05/Zitelli-Reference_Partitioning_NoCOUG.pdf)。

我錯過了一些東西,或者有沒有辦法使用引用分區沒有全局索引或複製數據?
有關如何引用分區如何與本地/全局索引一起使用的解釋將非常感謝!

回答

1

你理解正確。如果你想創建一個引用分區,你需要定義一個有效的FK。在你的情況下 - parent_id和event_id都需要存在於子表中。

Ref分區適用於當您想根據不在子表中的那些PK根據列而不是對錶進行分區的情況。這不是你的情況 - 你可以在兩個表上應用範圍分區並獲得最大修剪。

子表中的event_date不是多餘的 - 它是模型所需的 - 您需要在子表中爲每個實例 parent_id + event_date設置data_columns 3/4。

關於在ref分區表中的子表上的本地索引 - 我的邏輯說得完全相反。如果我有一個ref分區,我打算進行最大修剪,這意味着我希望在每個查詢中儘可能少地訪問分區。在這種情況下,我會希望本地索引,而不是全球。

你說過「使用PK的全局索引會導致在刪除分區時性能低於標準」。當您從表中刪除分區時,所有全局索引都將失效,您將不得不重建它們。這是關於DDL更改的唯一性能影響。分區表上的PK必須是全局的,所以你在這裏沒有任何選擇。

0

雖然上面的答案已經回答了,但你認爲:'外鍵約束不能只引用部分PK。因此,子表必須包含PARENT_ID和EVENT_DATE列。'

我相信FK可以引用PK的一部分,如果你的屬性被定義爲唯一約束&我在你的例子中看到了這一點。

實施例:

表A(訂單ID,訂購日期,客戶ID) PF - >的OrderID,訂購日期

表B(訂單ID,項ID)

在表B中,單編號可以是FK如果OrderID在表A中定義爲唯一。

我希望這有助於。