1. 程式人生 > >Sqlserver分表(水平分表)

Sqlserver分表(水平分表)

原文:https://blog.csdn.net/exceptionalboy/article/details/78851327
先搬過來,留著以後可能用

需求說明:

將資料庫Demo中的表按照日期欄位進行水平分割槽分表。要求資料檔案按一年一個檔案儲存,且分割槽的分割點會根據時間的增長自動新增(例如現在是2017年1月1日,將其作為一個分割點,即將2017年1月1日之前的資料儲存到資料檔案A中,將2017年1月1日的之後的資料儲存到資料檔案B中;當時間到2018年1月1日時,自動將2018年1月1日新增為一個新的分割槽分割點,並將2017年1月1日至2018年1月1日的資料儲存在資料檔案B中,將2018年1月1日之後的資料儲存在一個新的資料檔案C中,以此類推)。

需求實現

  1. 分割槽原理:
    要實現這一功能,首先要了解資料庫對水平分割槽表進行分割槽儲存的原理。
    所謂水平分割槽分表,就是把邏輯上的一個表,在物理上按照你指定的規則分放到不同的檔案裡,把一個大的資料檔案拆分為多個小檔案,還可以把這些小檔案放在不同的磁碟下。這樣把一個大的檔案拆分成多個小檔案,便於我們對資料的管理。

  2. 分割槽的優點
    存檔,比如將銷售記錄中1年前的資料分到一個專門存檔的伺服器中
    便於管理,比如把一個大表分成若干個小表,則備份和恢復的時候不再需要備份整個表,可以單獨備份分割槽
    提高可用性,當一個分割槽跪了以後,只有一個分割槽不可用,其它分割槽不受影響
    提高效能,這個往往是大多數人分割槽的目的,把一個表分佈到不同的硬碟或其他儲存介質中,會大大提升查詢的速度.

  3. 實現思路
    ① 建立資料庫
    ② 在建立的資料庫中新增檔案組
    ③ 在檔案組中新增新的檔案
    ④ 定義分割槽函式
    ⑤ 定義分割槽架構
    ⑥ 定義分割槽表
    ⑦ 定義代理作業,自動新增分割槽分割點
    ⑧ 測試資料

注意:

分割槽表依賴於分割槽架構,而分割槽架構又依賴與分割槽函式,所以在穿件分割槽函式、分割槽架構、分割槽表是要按照對應的順序建立。

分割槽函式並不屬於具體的分割槽架構和分割槽表,它們之間僅僅是使用關係。

分割槽表只能在建立的時候指定為分割槽表

實現步驟

原博主整理了兩種,通過程式碼和sqlserver2012 Management Studio介面建立,下面先放程式碼:
3.1.1 建立資料庫
新建資料庫,並將其命名為Demo

3.1.2 新增檔案組

程式碼格式:

ALTER DATABASE <資料庫名稱> ADD FILEGROUP<檔案組名>

程式碼示例:

ALTER DATABASE DemoADD FILEGROUP DemoFileGroup

3.1.3 新增檔案

程式碼格式:

ALTER DATABASE <資料庫名稱> ADD FILE <資料標識> TO FILEGROUP<檔案組名稱>

注意:資料標識中name為邏輯檔名、filename為物理檔案路徑名、size為檔案初始大小(單位:kb/mb/gb/tb)、filegrowth為檔案自動增量(單位:kb/mb/gb/tb)、maxsize為檔案增大的最大大小(單位:kb/mb/gb/tb/unlimited)

程式碼示例:

ALTER DATABASEDemo ADD FILE (

   NAME='DemoFile1',

FILENAME='D:\ProgramFiles\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\DemoFile1.mdf',

   SIZE=5MB,

   FILEGROWTH=5MB)

   TOFILEGROUP DemoFileGroup

在此我們重複執行示例程式碼,在示例檔案組下新增三個檔案。

3.1.4 定義分割槽函式
分割槽函式是用於判定資料行該屬於哪個分割槽,通過分割槽函式中設定邊界值來使得根據行中特定列的值來確定其分割槽。

程式碼格式:

CREATE PARTITIONFUNCTION partition_function_name( input_parameter_type )

   ASRANGE [ LEFT | RIGHT ]

   FORVALUES ( [ boundary_value [ ,...n ] ] )

   [ ; ]

其中“LEFT”和“RIGHT”決定了“VALUES”中的邊界值被劃分到哪一個分割槽中(即,邊界值屬於左側分割槽還是右側分割槽)。

程式碼示例:

CREATE PARTITIONFUNCTION DemoPartitionFunction( datetime2(0) )

   ASRANGE RIGHT

   FORVALUES ('2016-01-01 00:00:00','2017-01-01 00:00:00')

檢視分割槽函式是否建立成功:

SELECT * FROM sys.partition_functions

3.1.5 定義分割槽架構
定義完分割槽函式僅僅是知道了如何將列的值區分到了不同的分割槽,而每個分割槽的儲存方式,則需要分割槽構架來定義。分割槽構架僅僅是依賴分割槽函式.分割槽構架中負責分配每個區屬於哪個檔案組,而分割槽函式是決定如何在邏輯上分割槽。

程式碼格式:

CREATE PARTITIONSCHEME partition_scheme_name

   ASPARTITION partition_function_name

   [ ALL ]TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )

   [ ; ]

程式碼示例:

CREATE PARTITIONSCHEME DemoPartitionScheme

   ASPARTITION DemoPartitionFunction

   TO ( DemoFileGroup,[PRIMARY],DemoFileGroup)

檢視分割槽架構是否建立完成:

SELECT * FROM sys.partition_schemes

3.1.6 定義分割槽表
表在建立的時候就已經決定是否是分割槽表了。雖然在很多情況下都是你在發現已經表已經足夠大的時候才想到要把表分割槽,但是分割槽表只能夠在建立的時候指定為分割槽表。

程式碼格式:

CREATE TABLEtable_name(

...

) ONpartition_scheme_name(column_name)

程式碼示例:

CREATE TABLEDemoTable(

demo_id BIGINT,

demo_date datetime2(0),

demo_desc varchar(50)

) ONDemoPartitionScheme(demo_date)

通過圖形化介面建立

3.2.1 建立資料庫
右鍵點選“資料庫”,選擇第一項“新建資料庫(N)…”,新建資料庫,如圖1所示:

圖1  新建資料庫

3.2.2 建立檔案組
右鍵資料庫Demo,選擇“屬性”,如圖2所示:

圖2  資料庫屬性介面

在屬性介面中,點選箭頭所示的“檔案組”選項,進入檔案組編輯介面,如圖3所示:

圖3  檔案組管理介面

在檔案組管理介面中點選箭頭①所示的“新增”選項,新增新的檔案組,介面中會出現箭頭②所示的屬性框,並鍵入對應的屬性值,之後點選“確定”,完成新建檔案組。

3.2.3 新增檔案
和新增檔案組的方式一樣,右鍵資料庫Demo,選擇“屬性”,開啟資料庫屬性介面,這次選擇“檔案”,開啟檔案管理介面,如圖4所示:

圖4  檔案管理介面

在檔案管理介面中,點選箭頭①所示的“新增”選項,新增新的檔案,在新新增的箭頭②所示的區域,根據實際需求,填寫對應的檔案屬性值,填寫完成後點選“確定”。其中,一個檔案組中可以新增多個檔案,即“檔案組”屬性的值是可以重複的。

3.2.4 定義分割槽表
在SQL Server 2012 Management Studio的介面中,找到目標資料庫下的“表”選單,右鍵點選,選擇“新建資料庫表”,開啟新建資料庫表介面,新建一個分割槽表。如圖5所示:

圖5  新建資料庫表

3.2.5 新增分割槽函式和分割槽架構
完成新建分割槽表後,我們就可以在分割槽表上新增分割槽函式和分割槽架構了。右鍵點選分割槽表,選擇“儲存”,然後選擇“建立分割槽”,開始新增分割槽函式和分割槽架構,如圖6所示:

圖6  新建分割槽介面

點選“下一步”,如圖7所示:

圖7  選擇分割槽列

在圖7所示的介面中,勾選分割槽列,勾選完成後,選擇“下一步”,如圖8所示:

圖8  填寫分割槽函式

在圖8所示的介面填寫分割槽函式名稱,填寫完成後點選“下一步”,如圖9所示:

圖9  填寫分割槽架構

在圖9所示的介面中填寫需要建立的分割槽架構的名稱,填寫完成後點選“下一步”,如圖10所示:

圖10  指定檔案組

如圖10所示,按照圖示箭頭步驟,一步步設定檔案組引數。首先選擇分割槽邊界值劃分在左邊界分割槽還是右邊界分割槽,然後進行第二步,設定分割槽所屬檔案組,再設定分割槽邊界值(該值要與分割槽表的分割槽欄位型別對應),最後點選“預計儲存空間(E)”對其他引數進行自動填充。設定完成後點選“下一步”,如圖11所示:

圖11  指令碼設定

在圖11所示的介面中,根據實際需求完成最後的設定(一般不做設定),然後點選“完成”,在下一個介面中再次點選“完成”,然後等待資料庫執行操作,最後關閉介面。

分割槽完成後,右鍵點選分割槽表,選擇“屬性”,然後選擇“儲存”,開啟如圖12所示介面:

圖12  表分割槽檢視

從圖12中可以看到資料庫表已經完成分割槽。

動態新增分割點

要完成動態的向分割槽函式中新增分割點的功能,首先我們來理一下思路:首先我們要向檔案組中新增一個新的檔案或者直接新增一個新的檔案組,新增完成後,需要修改分割槽架構,來告知資料庫新分的分割槽資料儲存到那個檔案或者檔案組中,最後在分割槽函式中新增新的分割點,完成動態新增分割槽分割點的功能。
根據這個思路,寫了一個儲存過程,用於動態的新增分割點:

CREATE proc[dbo].[Demo_FileGroup_Add]

as

declare

@file_name varchar(20),--要新增的檔名稱

@add_sql nvarchar(max)--在檔案組下新增新檔案的SQL語句

begin  

set @file_name='DemoFile'+left((convert(varchar,(DATEADD(yy, DATEDIFF(yy,0,(DATEADD(YY,1,GETDATE()))), 0)),120)),4)--動態拼接檔名

set @add_sql='

ALTER DATABASE Demo ADD FILE (

NAME='[email protected]_name+',

FILENAME=''D:\ProgramFiles\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\'[email protected]_name+'.mdf'',

SIZE=5MB,

FILEGROWTH=5MB)

TO FILEGROUP DemoFileGroup'

--select @add_sql

Exec [email protected]_sql--執行向檔案組中新增檔案的SQL語句

alter partitionscheme DemoPartitionSchemenext used 'DemoFileGroup' --告知資料庫新建立的分割槽放在哪個檔案組(修改分割槽架構)

alter partitionfunction DemoPartitionFunction() split range (CONVERT(VARCHAR,DATEADD(yy, DATEDIFF(yy,0,(DATEADD(YY,1,GETDATE()))), 0),120))--在分割槽函式中新增分割點

end

    注意:在執行該儲存過程之前,一定要確保檔案組中沒有即將新增的檔案,並且在分割槽函式中,沒有要新增的分割點,否則會報錯,儲存過程不能執行。

分割槽分表理解

分割槽分表分為垂直分割槽分表和水平分割槽分表,總結如下:

垂直分割槽分表是在SQL Server 2005之前大量使用的,垂直分表相對很少見到和用到,因為這可能是資料庫設計上的問題了。如果資料庫中一張表有部分欄位幾乎從不不更改但經常查詢,而部分欄位的資料頻繁更改,這種設計放到同一個表中就不合理了,相互影響太大了。在已存在改情況的表的時候,可以考慮按列拆分表,即垂直拆分。拆分完成後,通過分表之間設定外來鍵關聯,然後建立檢視和觸發器等對錶進行增、刪、改、查操作。

而水平分割槽分表是SQL Server2005之後被大量使用的。其原理就是將邏輯上的一個表,在物理上拆分,將資料儲存在不同的檔案組中