'數據庫表分區是怎麼回事?'

"

數據庫表分區是怎麼回事?


"

數據庫表分區是怎麼回事?


數據庫表分區是怎麼回事?


大家好,這一期呢,我們來說一下,數據庫表索引的分區。講解這個問題,對於不同的數據庫可能有一些技術細節上的不同,因此我們以某個數據庫比如sql server為例來探討這個問題。

分區後的數據和索引分散到多個文件組裡面,因此可以說這些數據是平行並列分佈的,每組中的行都對應特定的那個分區。這些索引和表的分區都必須存在一個數據庫裡面。因此,在外部程序看來,不管內部有多少個分區,在外面看來就是一個數據表或者索引

那麼表或者索引的分區有什麼好處呢?好處主要是兩個方面,一個是管理起來比較容易,另一個方面是性能上更好一些。

相較於訪問整表而言,訪問某個分區的數據當然更快更有效率

我們設想一下有這麼一個案例,有一個表它有多個分區,這些分區對應的都是不同的文件組,而這些文件組呢又會分散到不同的硬盤上。

如果我們在排序的時候,一個硬盤一個硬盤的去訪問的話,性能上就會很低

改善性能的話,我們可以使用RAID對分散到多個硬盤上的數據文件,同時進行訪問。

再來說一下數據加鎖的情況。在有多個分區的情況下,我們只需要對某個分區進行加鎖,而不需要對整張表進行加鎖,這樣也可以提高操作的效率。這要在創建表的時候,修改表的屬性,把lock_escalation這個選項設置為Auto

下面是數據分區的幾個重要概念。

首先是分區函數。分區函數用來定義如何進行分區。首先它定義了我們需要分多少個區。這些區的邊界在哪裡。打個比方說, 一張用戶表中包含了用戶的註冊時間,註冊地域等等信息。那我們可以以時間為參考創建分區。可以以月為單位或者以年為單位進行分區,這主要取決於你到底有多大的數據量。在這種情況下,時間,也就是某個月的起始與終止,或者某個年的起始與終止,作為數據邊界的參考。

其次是分區列。分區列會被上面的分區函數拿來用作進行表和索引的分區。這個列必須被明確的標註為persisted。 理論上講所有可以用作索引定義的列都可以當做分區列

再次就是對應的索引。索引和原始表的分區函數,必須滿足如下條件, 分區函數的參數必須具有相同的數據類型他們必須具有相同數量的分區,他們必須具有相同的數據邊界

通俗的講,數據進行了分區,索引的分區必須跟數據的分區進行對應,這樣才可以提高效率

簇索引進行分區。當簇索引的鍵值並非唯一的時候,簇索引的鍵值並不需要指定包含分區列,在這種情況下,sql server 會缺省的把分區列添加到簇索引的鍵值中。如果簇索引的鍵值是唯一的,你必須顯性的指定簇索引的鍵值包含分區列

對非簇索引進行分區。當對於一個鍵值唯一的非簇索引進行分區時索引鍵值必須包含分區列當索引值不唯一時,數據庫會缺省的讓索引鍵值包含分區列

接下來說一下非對應索引的情況。這種索引主要是獨立於相關的數據表之外。主要是兩種情況,一是這種索引有獨立的分區定義,二是這種索引被放置在一個單獨的文件組中。這種索引在如下情況下非常有用:

. 數據源表沒有分區

. 索引鍵是唯一的,並且不包含分區列

. 你會在數據源表上進行非常複雜的多表聯合操作

性能的考量上。並不是說分區越多,性能就越好。這些分區都會影響到內存的消耗,CPU的繁忙程度。所以你在使用分區的時候,要找到你的平衡點

具體的參數參考可以查找對應數據庫的開發文檔

以上是我對這個話題一點心得看法。僅供參考,歡迎討論, 歡迎拍磚。

"

相關推薦

推薦中...