2013-08-26 64 views
2

我理解範圍分區的概念。如果我有一個日期列,並根據月份對該列進行分區,那麼如果我的查詢有一個where子句只過濾了一個月,那麼我可以打一個特定的分區並獲取我的數據,而不會打滿整個表。oracle如何管理散列分區

在Oracle文檔中,我讀到如果像'month'這樣的邏輯分區不可用(例如,在名爲customer id的列上進行分區),則使用散列分區。那麼這將如何工作? Oracle會隨機分配數據並將其分配給不同的分區,併爲每個分區分配一個哈希碼?

但是在這種情況下,當新的數據進入時,oracle如何知道在哪個分區放置新數據?而當我查詢數據,似乎沒有辦法避免擊中多個分區?

回答

3

」oracle如何知道在哪個分區放置新數據?「

the documentation

Oracle數據庫使用線性散列算法,並防止數據 從特定分區中的羣集,則應該由二的冪定義 數目的分區(例如,2 ,4,8)。

至於你的其他問題......

「當我查詢的數據,似乎是沒有辦法避免撞到多個 分區?」

如果您正在搜索單個客戶ID,則沒有。 Oracle的哈希算法是一致的,所以具有相同分區密鑰的記錄最終會在同一個分區中(顯然)。但是,如果您正在尋找上個月的所有新客戶那麼是的。 Oracle的散列算法將努力平均分配記錄,以便最新記錄遍佈整個表格。

所以真正的問題是,爲什麼我們選擇分區表?性能往往是至少令人信服的原因來分區。更好的理由包括

  • 可用性每個分區可以駐留在不同的表空間。因此,表空間的問題將取出表的數據的一部分,而不是整個事物。
  • 管理分區提供了一種將整個表格作業拆分爲明確批次的機制。分區交換可以更容易批量加載數據。

至於性能,記錄的物理共址可以加快一些查詢 - 那些查詢是通過定義的鍵範圍搜索記錄。但是,任何不匹配查詢粒度的查詢都不會比非分區表執行得更快(甚至可能執行得更慢)。

哈希分區不太可能提供性能優勢,恰恰是因爲它將整個表中的密鑰洗牌。它將提供分區的可用性和可管理性好處(但顯然不適用於分區交換)。

+0

謝謝。「可用性每個分區可以駐留在不同的表空間上」 - 因此每個表空間可以駐留在不同的機器上?這是否像分片? – Victor

3

散列不是隨機的,它將數據劃分爲可重複的(但可能難以預測的)方式,以便相同的ID將始終映射到相同的分區。

Oracle使用散列算法,應該通常在分區之間均勻分佈數據。 「