1. 程式人生 > >SQL server 如何建立分割槽表

SQL server 如何建立分割槽表

一、分割槽表的定義:

        一般情況下,我們建立資料庫表時,表資料都存放在一個檔案裡。但是如果是分割槽表的話,表資料就會按照你指定的規則分放到不同的檔案裡,把一個大的資料檔案拆分為多個小檔案,還可以把這些小檔案放在不同的磁碟下由多個cpu進行處理。這樣檔案的大小隨著拆分而減小,還得到硬體系統的加強,自然對我們操作資料是大大有利的。所以大資料量的資料表,對分割槽的需要還是必要的,因為它可以提高select效率,還可以對歷史資料強行區分存檔,對於多渠道匯入資料時不容易鎖表。

二、建立分割槽表的步驟:

  • 1、建立資料庫檔案組
  • 2、建立資料庫檔案
  • 3、建立分割槽函式
  • 4、建立分割槽方案
  • 5、建立分割槽表

三、舉例說明:

還是拿出實際的例子來說明如何建立分割槽表吧。小公主,走起!

3.1、先建立一個新的資料庫mysqlDB,建立資料庫檔案組和檔案,新增檔案組。

3.2 建立資料檔案,併為資料檔案分配檔案組。

完成建立後的資料庫檔案資訊

建立資料庫檔案組和檔案,新增檔案組,併為資料檔案分配檔案組--SQL指令碼如下:

alter database mysqlDB add filegroup server2015
alter database mysqlDB add filegroup server2016
alter database mysqlDB add filegroup server2017
alter database mysqlDB add filegroup server2018
alter database mysqlDB add filegroup server2019
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2015',FILENAME=N'D:\DATEBASE\mysqlDB_2015.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2015 --檔案組
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2016',FILENAME=N'D:\DATEBASE\mysqlDB_2016.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2016
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2017',FILENAME=N'D:\DATEBASE\mysqlDB_2017.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2017
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2018',FILENAME=N'D:\DATEBASE\mysqlDB_2018.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2018
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2019',FILENAME=N'D:\DATEBASE\mysqlDB_2019.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2019

檢視資料庫檔案組SQL語句:

select *  from sys.filegroups

3.3 建立分割槽函式

建立分割槽函式Transact-SQL語法:

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ] 
FOR VALUES ( [ boundary_value [ ,...n ] ] ) [ ; ]

 引數:  
  partition_function_name:分割槽函式的名稱。 分割槽函式名稱在資料庫內必須唯一,並且符合識別符號的規則。
  input_parameter_type:用於分割槽的列的資料型別。 當用作分割槽列時,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、別名資料型別或 CLR 使用者定義資料型別外,所有資料型別均有效。
  boundary_value:為使用 partition_function_name 的已分割槽表或索引的每個分割槽指定邊界值。 如果 boundary_value 為空,則分割槽函式使 partition_function_name 將整個表或索引對映到單個分割槽。 只能使用 CREATE TABLE 或 CREATE INDEX 語句中指定的一個分割槽列。
  LEFT | RIGHT 指定當間隔值由 資料庫引擎 按升序從左到右排序時,boundary_value [ ,...n ] 屬於每個邊界值間隔的哪一側(左側還是右側)。 如果未指定,則預設值為 LEFT。

例項示範:

CREATE PARTITION FUNCTION PARTITION_FUNCTION_mysqlDB_date( DATETIME )
AS RANGE RIGHT
FOR VALUES( '2016-01-01','2017-01-01', '2018-01-01', '2019-01-01')

SELECT * FROM sys.partition_functions

完成建立分割槽函式之後,可以通過以下SQL語句檢視已建立的分割槽函式情況:

SELECT * FROM sys.partition_functions

3.4 建立分割槽方案

       分割槽方案的作用是將分割槽函式生成的分割槽對映到檔案組中去,分割槽方案是讓SQL Server將已分割槽的資料放在哪個檔案組中。
  在當前資料庫中建立一個將已分割槽表或已分割槽索引的分割槽對映到檔案組的方案。 已分割槽表或已分割槽索引的分割槽的個數和域在分割槽函式中確定。 必須首先在 CREATE PARTITION FUNCTION 語句中建立分割槽函式,然後才能建立分割槽方案。

       建立分割槽方案的Transact-SQL語法:

CREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )[ ; ]

引數:
  partition_scheme_name:分割槽方案的名稱。 分割槽方案名稱在資料庫中必須是唯一的,並且符合識別符號規則。
  partition_function_name:使用分割槽方案的分割槽函式的名稱。 分割槽函式所建立的分割槽將對映到在分割槽方案中指定的檔案組。 partition_function_name 必須已經存在於資料庫中。 單個分割槽不能同時包含 FILESTREAM 和非 FILESTREAM 檔案組。
  ALL:指定所有分割槽都對映到在 file_group_name 中提供的檔案組,或對映到主檔案組(如果指定了 [PRIMARY]。 如果指定了 ALL,則只能指定一個 file_group_name。
  file_group_name | [ PRIMARY ] [ ,...n]:指定用來持有由 partition_function_name 指定的分割槽的檔案組的名稱。 file_group_name 必須已經存在於資料庫中。
  如果指定了 [PRIMARY],則分割槽將儲存於主檔案組中。 如果指定了 ALL,則只能指定一個 file_group_name。 分割槽分配到檔案組的順序是從分割槽 1 開始,按檔案組在 [,...n] 中列出的順序進行分配。 在 [,...n] 中,可以多次指定同一個 file_group_name。 如果 n 不足以擁有在 partition_function_name 中指定的分割槽數,則 CREATE PARTITION SCHEME 將失敗,並返回錯誤。
  如果 partition_function_name 生成的分割槽數少於檔案組數,則第一個未分配的檔案組將標記為 NEXT USED,並且出現顯示命名 NEXT USED 檔案組的資訊。 如果指定了 ALL,則單獨的 file_group_name 將為該 partition_function_name 保持它的 NEXT USED 屬性。 如果在 ALTER PARTITION FUNCTION 語句中建立了一個分割槽,則 NEXT USED 檔案組將再接收一個分割槽。 若要再建立一個未分配的檔案組來擁有新的分割槽,請使用 ALTER PARTITION SCHEME。
  在 file_group_name[ 1,...n] 中指定主檔案組時,必須像在 [PRIMARY] 中那樣分隔 PRIMARY,因為它是關鍵字。

例項示範:

CREATE PARTITION SCHEME PARTITION_SCHEME_mysqlDB_date
AS PARTITION PARTITION_FUNCTION_mysqlDB_date
TO (SERVER2015, SERVER2016, SERVER2017, SERVER2018, SERVER2019 )

SELECT * FROM sys.partition_schemes

分割槽函式和分割槽方案建立之後,可以在資料庫的【儲存】中檢視:

通過可以通過以下SQL語句檢視已建立的分割槽方案:

SELECT * FROM sys.partition_schemes

3.5 建立分割槽表(test_table)

CREATE TABLE [test_table]
(
statdate DATETIME NOT NULL,
tableid int not null,
table_name varchar(20) null,
) ON PARTITION_SCHEME_mysqlDB_date ( statdate )

完成test_table表建立之後,查看錶的屬性,可以看到test_table表已經是分割槽表。

四、驗證分割槽表是否可行:

向測試表test_table插入資料,檢視分割槽效果。

INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2015-10-10','6','test6');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2016-12-31','2','test2');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2017-01-20','3','test3');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2018-10-20','4','test4');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2019-10-20','5','test5');
SELECT $PARTITION.PARTITION_FUNCTION_mysqlDB_date(statdate) AS 分割槽編號, COUNT(1) AS 記錄數 
FROM [test_table]
GROUP BY $PARTITION.PARTITION_FUNCTION_mysqlDB_date(statdate)