第一章
1、什麼是分區
2、爲什麼要把表進行分區
3、怎麼把表進行分區
----------------------------------------華麗的分割線-----------------------------------------
1、什麼是分區
簡單的理解就是把一個數據庫表分成若干個小的數據庫表。
舉個例子:一個進貨表中有10條數據(主鍵ID自增長),我們可以按照個數進行分區,把ID 1-3的放一個表中,4-6的放一個表中,7-10的放一個表中;這樣,我們就相當於把這個進貨表分成了3個小表(即3個區)。當我們在通過ID進行查詢的時候,如查詢ID=5,這樣就會只查詢ID爲4-6所在的表,表中的數據量由原來的10個變成了現在的3個,數據量小了,查詢速度自然也就快了。
有人會說,我可以直接建立3張表(即進貨表a、進貨表b、進貨表c),也能達到上面的效果。
這就是我要說的把表進行分區和建立真實表的區別,如果按照上面所說,建立了3張進貨表,當我們在使用和查詢的時候就需要操作三張表,對於程序員來說是件很麻煩的事兒,而且極易出現錯誤。
用分區就完全解決了上面的問題,表面上我們把進貨表分成了3部分,但從邏輯上看他依然是一張表,對於程序員使用上來說就是一張表。
----------------------------------------華麗的分割線-----------------------------------------
2、爲什麼要把表進行分區
當數據量超大、且查詢起來很慢的時候,我們就要考慮優化了;把表進行分區就是優化的一種。通過對錶進行分區,可以大大的節省時間,當然也並不是所有的表進行分區之後都能達到優化的作用,反之還會使速度變慢,開銷變大。下面會舉例說明。
那麼,什麼樣的表適合分區呢?
1、數據量超級大,大到個人感覺查詢起來較慢的數據量。(沒有具體數字,個人感覺百萬級數據的表算是大的了)
2、一部分數據不經常使用,例如幾十年的歷史數據,在查詢的時候只需要查詢進一兩年的數據;即數據庫表中有經常不用的數據。(要是一直不用,建議對數據進行封存),要是這個表中的數據經常使用,即使有千萬或是過億的數據,也不要進行表分區,不然會更慢的。
3、表分區和一些索引是有衝突的,對於表來說,分區要是優於索引的話,可以進行分區。(下面會有具體例子證明)
----------------------------------------華麗的分割線-----------------------------------------
3、怎麼把表進行分區
①、創建分區函數
②、創建分區方案
③、創建數據庫表使用分區方案
①、創建分區函數
創建分區函數,是爲了告訴SQL Server我們以什麼樣的條件對錶進行分區的。
還是以上面進貨表(a表)爲例,把ID 1-3的放一個表中,4-6的放一個表中,7-10的放一個表中。代碼如下:
--創建分區函數(分成三個區,1區小於等於3的、2區大於3小於等於6的、3區大於6的)
CREATE PARTITION FUNCTION partfunA (int)
AS RANGE LEFT FOR VALUES (3,6)
註釋:
1、CREATE PARTITION FUNCTION partfunA(int) 是創建分區函數名爲partfunA的分區函數,分區的條件爲(int)型
2、AS RANGE LEFT FOR VALUES(3,6)是將表按照條件(1區小於等於3的、2區大於3小於等於6的、3區大於6的)分成3個區;LEFT或RIGHT是條件(即3和6),放在左/右邊的分區(這裏用LEFT,id爲3的數據就放在第一分區裏,id爲6的數據放在第二分區裏)
圖1
如圖1所示,創建後會在數據庫存儲下分區函數下出現 partfunA 分區函數
②、創建分區方案
創建分區方案,是將分區函數生成的分區映射到文件組中去。分區方案是爲了告訴SQL Server將已分區的數據放在哪個文件組中。代碼如下:
--創建分區方案(將已分區的數據放在主文件裏,三個區都放在主文件裏)
CREATE PARTITION SCHEME partschA
AS PARTITION partfunA
TO ([Primary],[Primary],[Primary])
註釋:
1、CREATE PARTITION SCHEME partschA是創建一個名爲partschA的分區方案。
2、AS PARTITION partfunA是使用partfunA分區函數。
3、TO ([Primary],[Primary],[Primary])把partfunA分區函數劃分出來的數據存放在文件組中(這裏都存放在主數據文件中)
圖2
如圖2所示,創建後會在數據庫存儲下分區方案下出現 partschA 分區方案
③、創建數據庫表使用分區方案
創建數據庫表,並且使用分區方案。代碼如下:
--創建數據庫表a,並使用分區方案partschA
if object_id('[a]') is not null drop table [a]
go
create table [a]
(
[ID] int,
[品名] varchar(6),
[入庫數量] int,
[入庫時間] datetime
) on partschA(ID)
註釋:
1、on partschA(ID)對a表使用partschA分區方案
右鍵點擊表a屬性-常規,如下圖:
圖3
如圖3所示,創建的表a已經進行了分區。