深入淺出分區表與分區索引之一:表分區介紹

前言


很多的技術人員總是特別青睞“分區表”,每每談及分區的時候,很多人都喜歡說這樣的話語“表中的數據已經達到了千萬級別,要搞分區…”。很多人以爲:分區就一定可以提升性能;很多人以爲:表中的記錄上千萬就必須得分區;很多人認爲:分區是很好,是個神器,可以搞定很多的問題。


於是很多技術人員就開始搞分區,花了很大的精力和很多的時間做分區。他們沒有對分區對數據庫的影響和維護成本做評估,也就是說,在分區之前無法肯定分區一定可以帶來好處,很多時候都是帶着猜測和碰運氣的心理,很多人都是聽信一些“傳說”,最後導致很多的問題。


在我們團隊與技術人員交流的流程中,我們也發現很多上述的誤解。因爲我們AgileSharp團隊已經爲很多的企業和項目做了數據庫優化方面的東西,對分區也有些理解和經驗,這裏和大家分享一下,希望朋友理智的對待“分區”這個事物。


言歸正傳,表分區可以使得一個很大的數據表已經其上的索引更加容易進行管理,同時,它也可以適當的提升一些基於條件過濾的查詢的性能。我們本系列文章將會講述分區表的涵蓋的各個方面,包括:分區函數與分區方案的設計策略,同時,我們還會討論分區的刪除,分區的並行問題,索引分區的維護等問題。


概述


當一個數據表中的數據不斷的增長,到裏面的數據的大小達到了上百GB甚至更大的時候,加載新數據,刪除舊的數據,維護索引會變得更加困難。先不談其他的因素的影響,就當單純就表的大小而已,就會使得上述操作花費更多的時間。SQL Server引入表分區來試圖解決上述問題,從而使得數據更好的被管理。


分區的概念其實是很容易理解的,就是把一個大的表進行拆分,把表中的數據和索引分佈到很多不同的分區中,從而使得一些數據維護操作變得更加在每個分區上面進行,而不是總是在整表上面進行。其實這就有點分而治之的意思。除此之外,SQL Server的優化器可以更加查詢選擇合適的分區,這樣在一定程度上面提示了性能。


接下來的文章涵蓋了使用在SQL Server 2005(以及以後的版本)中的分區表和索引的策略和最佳實踐。其目的是爲數據倉庫和OLTP系統的數據庫架構師,開發人員和管理員提供從中級到高級的參考材料。

爲什麼要分區


什麼是分區?爲什麼要使用分區?簡單的回答是:爲了改善大型表以及具有各種訪問模式的表的可伸縮性和可管理性。通常,創建表是爲了存儲某種實體(例如客戶或銷售)的信息,並且每個表只具有描述該實體的屬性。一個表對應一個實體是最容易設計和理解的,因此不需要優化這種表的性能、可伸縮性和可管理性,尤其是在表變大的情況下。

大型表是由什麼構成的呢?超大型數據庫 (VLDB) 的大小以數百 GB 計算,甚至以 TB 計算,但這個術語不一定能夠反映數據庫中各個表的大小。大型數據庫是指無法按照預期方式運行的數據庫,或者運行成本或維護成本超出預定維護要求或預算要求的數據庫。這些要求也適用於表;如果其他用戶的活動或維護操作限制了數據的可用性,則可以認爲表非常大。

例如,如果性能嚴重下降,或者每天、每週甚至每個月的維護期間有兩個小時無法訪問數據,則可以認爲銷售表非常大。有些情況下,週期性的停機時間是可以接受的,但是通過更好的設計和分區實現,通常可以避免或最大程度地減少這種情況的發生。雖然術語 VLDB 僅適用於數據庫,但對分區來說,瞭解表的大小更重要。

除了大小之外,當表中的不同行集擁有不同的使用模式時,具有不同訪問模式的表也可能會影響性能和可用性。儘管使用模式並不總是在變化(這也不是進行分區的必要條件),但在使用模式發生變化時,通過分區可以進一步改善管理、性能和可用性。還以銷售表爲例,當前月份的數據可能是可讀寫的,但以往月份的數據(通常佔表數據的大部分)是隻讀的。在數據使用發生變化的類似情況下,或在維護成本隨着在表中讀寫數據的次數增加而變得異常龐大的情況下,表響應用戶請求的能力可能會受到影響。相應地,這也限制了服務器的可用性和可伸縮性。 

此外,如果以不同的方式使用大量數據集,則需要經常對靜態數據執行維護操作。這可能會造成代價高昂的影響,例如性能問題、阻塞問題、備份(空間、時間和運營成本),還可能會對服務器的整體可伸縮性產生負面影響。

分區可以帶來什麼幫助?

當表和索引變得非常大時,分區可以將數據分爲更小、更容易管理的部分,從而提供一定的幫助。本文重點介紹橫向分區,在橫向分區中,大量的行組存儲在多個相互獨立的分區中。分區集的定義根據需要進行自定義、定義和管理。Microsoft SQL Server 2005 允許您根據特定的數據使用模式,使用定義的範圍或列表對錶進行分區。SQL Server 2005 還圍繞新的表和索引結構設計了幾種新功能,爲分區表和索引的長期管理提供了大量的選項。 

此外,如果具有多個 CPU 的系統中存在一個大型表,則對該表進行分區可以通過並行操作獲得更好的性能。通過對各個並行子集執行多項操作,可以改善在極大型數據集(例如數百萬行)中執行大規模操作的性能。通過分區改善性能的例子可以從以前版本中的聚集看出。例如,除了聚集成一個大型表外,SQL Server 還可以分別處理各個分區,然後將各個分區的聚集結果再聚集起來。

在 SQL Server 2005 中,連接大型數據集的查詢可以通過分區直接受益;SQL Server 2000 支持對子集進行並行連接操作,但需要動態創建子集。在 SQL Server 2005 中,已分區爲相同分區鍵和相同分區函數的相關表(如 Order 和 OrderDetails 表)被稱爲已對齊。當優化程序檢測到兩個已分區且已對齊的表連接在一起時,SQL Server 2005 可以先將同一分區中的數據連接起來,然後再將結果合併起來。這使 SQL Server 2005 可以更有效地使用具有多個 CPU 的計算機。 

表分區


在SQL Server中,對於分區有兩種方式,一種是表外分區,另外一種就是表內分區。我們把一個大的數據表中的數據拆分到很多的不同的結構相同的物理表中,這就是所謂的“表外分區”;同時,我們還可以把一個大的表就在表內進行分區,我們常常談到的表分區就是這個概念。


一般而言,有兩個主要的方法可以把一個表中的數據拆分到多個表中:


1.這個方法也稱之爲水平拆分,就是選擇表中一部分數據,然後將之放在其他的表中。這個時候就要考慮是查詢和數據操作如何在這些拆分後的表上面進行。此時,如果去修改程序肯定會造成很大的影響,爲了表的拆分對程序那邊保持透明,我們必須在這些表上面去建立一個視圖,所有的數據操作都在這個視圖上面進行,這就是所謂的“分區視圖”。在分區視圖中,我們必須手動應用所需的一些數據的約束,並且維護也將變得複雜和費時。



2.第二種方法就是所謂的“垂直拆分”。主要基於表中的列進行拆分,如果表中有20列,如A-T,我們根據相關的業務和數據的使用,我們把A-H拆分到一個單獨的表中,把I-M拆分到另外一個表中,N-T拆分到一個表中。這裏需要注意的就是:拆分後面的每個表中的數據的條數是一樣的,只是列不同,並且每個表中主鍵都是一樣的,這主要是爲了確保後續數據操作的方便。一般而言,我們還是會在這些表上面去建立一個視圖,從而使得程序那邊依然保持不變。在SQL Server中,沒有提供內在的垂直拆分的機制,如果要實現,就需要我們自己規劃。



SQL Server的表分區不同於上述兩種方法,因爲它主要是由一個單一的表進行分區,不參與多個物理表。當表被創建爲一個分區表時,SQL Server會自動將正確的數據行放在不同的分區表中,SQL Server維護幕後的分區和一切操作。我們可以執行單獨的分區維護操作,並可以使得過濾查詢只能訪問正確的分區。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章