2012-04-05 20 views
2

供應商在數據庫中實施分區時採取了哪些不同的方法?不同的SQL供應商如何進行分區?

這是響應marc_s的評論在這裏:Does partitioning in mysql create tables or merely virtual tables?

答案在鏈接到一本好書接受:)

+0

對於那些downvoted /選擇投票結束的人:如果每個供應商都採用不同的方式進行分區,那麼爲什麼這不是一個有效的問題? – 2012-04-05 20:39:18

+0

這不是我:-)只是想明白。也許它不是那麼多,它不是一個有效的問題;首先,這是不再與編程有關的邊緣(它實際上更像是一個數據庫架構問題 - >在dba.stackexchange.com上更好),其次,這是一個相當廣泛的問題 - 你可以撰寫關於該主題的全部**書籍**!所以也許這就是爲什麼有人認爲這個問題*過分廣泛*爲這個網站 – 2012-04-05 20:58:17

+1

@marc_s - 編輯的問題,以允許包括書籍:) – 2012-04-05 21:03:37

回答

1

的形式,我只能談談SQL服務器

每個分區在內部都是一個新的b-tree。查詢處理器創建一個幻想以擁有一個巨大的表。由於分區本身主要是透明優化器:(A,B)上聚合索引列P上的分區表作爲單個表出現(性能明智),因此幾乎沒有優化考慮到該表是分區的擁有集羣密鑰(P,A,B)。搜尋和掃描是這樣。

有分區是一個新的內部表,使得整體上分區批量操作容易:剛落分區或創建一個新的。如果模式完全相同,您甚至可以使用無關表交換分區! (ALTER TABLE SWITCH PARTITION)

有分區是B樹對維護含義:您可以將上不同的驅動器各個分區,或讓他們只讀和從備份排除。

1

您可以通過使用模擬分區:

  • 一組具有某種模式作爲分區命名錶;
  • 它們之上的一個視圖隱藏數據存儲的結構並將其作爲單個關係呈現;
  • 應用程序集成邏輯:使應用程序感知分區模型,並因此使用正確的表執行DDL語句。

此方法已與ORACLE 7.2一起使用(我可能在版本問題上錯了太多年),並且可以在任何支持視圖的數據庫中實現。如果視圖不存在,您可以在應用程序內創建一個特殊的函數/類來模仿視圖行爲。

儘管如此,由於存儲佈局在數據庫外部是可見的,所以它非常複雜且容易出錯。所以,如果可能的話,去一個本地或孤立的分區。

ORACLE支持從第8版開始的數據庫級分區,使存儲佈局完全隱藏在數據庫之外。

雖然PostgreSQL目前還沒有內置的分區支持,但這是一個work in progress now。另外,PostgreSQL已經具備了一系列有用的功能,使得僅僅進行數據庫分區成爲可能,隱藏了來自任何外部用戶的實現。您可以查看詳細信息here

相關問題