Sql Server 分區(qū)表
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
1. 分區(qū)表簡介 分區(qū)表在邏輯上是一個表,而物理上是多個表。從用戶角度來看,分區(qū)表和普通表是一樣的。使用分區(qū)表的主要目的是為改善大型表以及具有多個訪問模式的表的可伸縮性和可管理性。 分區(qū)表是把數(shù)據(jù)按設(shè)定的標(biāo)準(zhǔn)劃分成區(qū)域存儲在不同的文件組中,使用分區(qū)可以快速而有效管理和訪問數(shù)據(jù)子集。 1.1> 適合做分區(qū)表的情況 ◊ 數(shù)據(jù)庫中某個表的數(shù)據(jù)很多,在查詢數(shù)據(jù)時會明顯感覺到速度很慢,這個時候需要考慮分區(qū)表; ◊ 數(shù)據(jù)是分段的,如以年份為分隔的數(shù)據(jù),對于當(dāng)年的數(shù)據(jù)經(jīng)常進(jìn)行增刪改查操作,而對于往年的數(shù)據(jù)幾乎不做操作或只做查詢操作,這種情況可以使用分區(qū)表。對數(shù)據(jù)的操作如果只涉及一部分?jǐn)?shù)據(jù)而不是全部數(shù)據(jù)的情況可以考慮分區(qū)表,如果一張表的數(shù)據(jù)經(jīng)常使用且不管年份之類的因素經(jīng)常對其增刪改查操作則最好不要分區(qū)。 1.2> 分區(qū)表的優(yōu)點(diǎn) ◊ 分區(qū)表可以從物理上將一個大表分成幾個小表,但是從邏輯上來看還是一個大表。 ◊ 對于具有多個CPU的系統(tǒng),分區(qū)可以對表的操作通過并行的方式進(jìn)行,可以提升訪問性能。 2. 創(chuàng)建分區(qū)表步驟 創(chuàng)建分區(qū)表的步驟分為5步: (1)創(chuàng)建數(shù)據(jù)庫文件組 ?。?)創(chuàng)建數(shù)據(jù)庫文件 ?。?)創(chuàng)建分區(qū)函數(shù) ?。?)創(chuàng)建分區(qū)方案 ?。?)創(chuàng)建分區(qū)表 2.1> 創(chuàng)建數(shù)據(jù)庫文件組 新建示例數(shù)據(jù)庫Northwind,創(chuàng)建數(shù)據(jù)庫文件組和文件,添加文件組。
2.2> 創(chuàng)建數(shù)據(jù)庫文件 創(chuàng)建數(shù)據(jù)文件,并為數(shù)據(jù)文件分配文件組。
完成創(chuàng)建后的數(shù)據(jù)庫文件信息
通過SQL Server Profiler可以看到具體的創(chuàng)建數(shù)據(jù)庫的腳本如下: CREATE DATABASE [Northwind]
CONTAINMENT = NONE ON PRIMARY ( NAME = N'Northwind', FILENAME = N'F:\Database\Northwind\Northwind.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB ),
FILEGROUP [SECTION2010] ( NAME = N'Northwind_Data_2010', FILENAME = N'F:\Database\Northwind\Northwind_Data_2010.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ),
FILEGROUP [SECTION2011] ( NAME = N'Northwind_Data_2011', FILENAME = N'F:\Database\Northwind\Northwind_Data_2011.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ),
FILEGROUP [SECTION2012] ( NAME = N'Northwind_Data_2012', FILENAME = N'F:\Database\Northwind\Northwind_Data_2012.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ),
FILEGROUP [SECTION2013] ( NAME = N'Northwind_Data_2013', FILENAME = N'F:\Database\Northwind\Northwind_Data_2013.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ),
FILEGROUP [SECTION2014] ( NAME = N'Northwind_Data_2014', FILENAME = N'F:\Database\Northwind\Northwind_Data_2014.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) 查看數(shù)據(jù)庫文件組SQL語句: 2.3> 創(chuàng)建分區(qū)函數(shù) 創(chuàng)建分區(qū)函數(shù)Transact-SQL語法: CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )
[ ; ] 參數(shù): partition_function_name:分區(qū)函數(shù)的名稱。 分區(qū)函數(shù)名稱在數(shù)據(jù)庫內(nèi)必須唯一,并且符合標(biāo)識符的規(guī)則。 input_parameter_type:用于分區(qū)的列的數(shù)據(jù)類型。 當(dāng)用作分區(qū)列時,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、別名數(shù)據(jù)類型或 CLR 用戶定義數(shù)據(jù)類型外,所有數(shù)據(jù)類型均有效。 boundary_value:為使用 partition_function_name 的已分區(qū)表或索引的每個分區(qū)指定邊界值。 如果 boundary_value 為空,則分區(qū)函數(shù)使 partition_function_name 將整個表或索引映射到單個分區(qū)。 只能使用 CREATE TABLE 或 CREATE INDEX 語句中指定的一個分區(qū)列。 LEFT | RIGHT 指定當(dāng)間隔值由 數(shù)據(jù)庫引擎 按升序從左到右排序時,boundary_value [ ,...n ] 屬于每個邊界值間隔的哪一側(cè)(左側(cè)還是右側(cè))。 如果未指定,則默認(rèn)值為 LEFT。 示例:創(chuàng)建將用于Order表的分區(qū)函數(shù) CREATE PARTITION FUNCTION Function_DateTime ( DATETIME ) 完成創(chuàng)建分區(qū)函數(shù)之后,可以通過以下SQL語句查看已創(chuàng)建的分區(qū)函數(shù)情況。 SELECT * FROM sys.partition_functions 2.4> 創(chuàng)建分區(qū)方案 分區(qū)方案的作用是將分區(qū)函數(shù)生成的分區(qū)映射到文件組中去,分區(qū)方案是讓SQL Server將已分區(qū)的數(shù)據(jù)放在哪個文件組中。 在當(dāng)前數(shù)據(jù)庫中創(chuàng)建一個將已分區(qū)表或已分區(qū)索引的分區(qū)映射到文件組的方案。 已分區(qū)表或已分區(qū)索引的分區(qū)的個數(shù)和域在分區(qū)函數(shù)中確定。 必須首先在 CREATE PARTITION FUNCTION 語句中創(chuàng)建分區(qū)函數(shù),然后才能創(chuàng)建分區(qū)方案。 創(chuàng)建分區(qū)方案的Transact-SQL語法: CREATE PARTITION SCHEME partition_scheme_nameAS PARTITION partition_function_name[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )[ ; ] 參數(shù): partition_scheme_name:分區(qū)方案的名稱。 分區(qū)方案名稱在數(shù)據(jù)庫中必須是唯一的,并且符合標(biāo)識符規(guī)則。 partition_function_name:使用分區(qū)方案的分區(qū)函數(shù)的名稱。 分區(qū)函數(shù)所創(chuàng)建的分區(qū)將映射到在分區(qū)方案中指定的文件組。 partition_function_name 必須已經(jīng)存在于數(shù)據(jù)庫中。 單個分區(qū)不能同時包含 FILESTREAM 和非 FILESTREAM 文件組。 ALL:指定所有分區(qū)都映射到在 file_group_name 中提供的文件組,或映射到主文件組(如果指定了 [PRIMARY]。 如果指定了 ALL,則只能指定一個 file_group_name。 file_group_name | [ PRIMARY ] [ ,...n]:指定用來持有由 partition_function_name 指定的分區(qū)的文件組的名稱。 file_group_name 必須已經(jīng)存在于數(shù)據(jù)庫中。
示例:創(chuàng)建將用于Order表的分區(qū)方案 CREATE PARTITION SCHEME Scheme_DateTime 分區(qū)函數(shù)和分區(qū)方案創(chuàng)建之后,可以在數(shù)據(jù)庫的【存儲】中查看: 通過可以通過以下SQL語句查看已創(chuàng)建的分區(qū)方案: SELECT * FROM sys.partition_schemes 2.5> 創(chuàng)建分區(qū)表 CREATE TABLE [Order](
OrderID INT IDENTITY(1,1) NOT NULL,
UserID INT NOT NULL,
TotalAmount DECIMAL(18,2) NULL,
OrderDate DATETIME NOT NULL) ON Scheme_DateTime ( OrderDate ) 這里需要注意分區(qū)表不能再創(chuàng)建聚集索引,因?yàn)榫奂饕梢詫⒂涗浽谖锢砩享樞虼鎯?,而分區(qū)表是將數(shù)據(jù)存儲在不同的表中,這兩個概念是沖突的,所以在創(chuàng)建分區(qū)表時不能再創(chuàng)建聚集索引。 完成Order表創(chuàng)建之后,查看表的屬性,可以看到Order表已經(jīng)是分區(qū)表。 3. 操作分區(qū)表 3.1> Insert數(shù)據(jù) USE [Northwind] GO INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,10.00 ,'2009-10-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (1 ,20.50 ,'2009-12-31'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (2 ,40.00 ,'2010-01-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (3 ,40.00 ,'2010-10-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (4 ,50.00 ,'2011-10-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2012-10-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (5 ,60.00 ,'2012-10-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (6 ,70.00 ,'2013-10-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (10 ,90.00 ,'2014-10-20'); INSERT INTO [dbo].[Order] ([UserID],[TotalAmount] ,[OrderDate]) VALUES (9 ,100.00 ,'2015-10-20'); GO 3.2> 查詢數(shù)據(jù)所在物理分區(qū)表 在分區(qū)表中使用一般的SELECT語句無法知道數(shù)據(jù)是分別存放在哪幾個不同的物理表中,若要知道數(shù)據(jù)分別存放的物理表,可以使用$PARTITION函數(shù),該函數(shù)可以調(diào)用分區(qū)函數(shù)并返回?cái)?shù)據(jù)所在物理分區(qū)的編號。 $PARTITION的語法:$PARTITION.分區(qū)函數(shù)名(表達(dá)式) SELECT $PARTITION.Function_DateTime('2010-01-01') 查詢結(jié)果分區(qū)函數(shù)返回為1,說明2010-01-01的數(shù)據(jù)會存放在第1個物理分區(qū)表中。 使用$PARTITION函數(shù)可以具體知道每個物理分區(qū)表中存放了哪些記錄。 查看物理分區(qū)表中存放的記錄: SELECT * FROM [Order] WHERE $PARTITION.Function_DateTime(OrderDate) = 1 SELECT $PARTITION.Function_DateTime(OrderDate) AS 分區(qū)編號, COUNT(1) AS 記錄數(shù)
FROM [Order]GROUP BY $PARTITION.Function_DateTime(OrderDate) 3.3> 修改分區(qū)表數(shù)據(jù) UPDATE dbo.[Order] SET OrderDate='2015-01-01' WHERE OrderID = 3 4. 將普通表轉(zhuǎn)換為分區(qū)表 一般的普通表都是在主鍵上建聚集索引,記錄的物理保存位置由主鍵決定。 示例:創(chuàng)建一個Product普通表 CREATE TABLE Product
(
ProductID INT IDENTITY(1,1) NOT NULL,
ProductName VARCHAR(100) NOT NULL,
UnitPrice DECIMAL(18,2) NULL,
CreateDate DATETIME NOT NULL, CONSTRAINT PK_Product PRIMARY KEY CLUSTERED (ProductID)
) USE [Northwind] 查看表Product的屬性: 查看表Product的索引,可以看到PK_Product為聚集索引。 將普通表轉(zhuǎn)換為分區(qū)表的操作是先在普通表上刪除聚集索引,在創(chuàng)建一個新的聚集索引,在該聚集索引中使用分區(qū)方案。 在SQL Server中,主鍵字段上默認(rèn)創(chuàng)建聚集索引,刪除主鍵的聚集索引。 ALTER TABLE Product DROP CONSTRAINT PK_Product 重新創(chuàng)建主鍵非聚集索引 ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY NONCLUSTERED (ProductID ASC) 重新創(chuàng)建后的主鍵: 創(chuàng)建使用分區(qū)方案的聚集索引: CREATE CLUSTERED INDEX IX_CreateDate ON Product ( CreateDate )ON Scheme_DateTime ( CreateDate ) 調(diào)整后的Product表屬性: 調(diào)整后Product表記錄的物理保存情況: 5. 刪除(合并)一個分區(qū)表 刪除2012-01-01的分區(qū),修改分區(qū)函數(shù): ALTER PARTITION FUNCTION Function_DateTime() MERGE RANGE ('2012-01-01') 在修改了分區(qū)函數(shù)之后,與之關(guān)聯(lián)的分區(qū)方案也將同時自動調(diào)整。在執(zhí)行了上面合并分區(qū)的函數(shù)之后,查看分區(qū)方案的Create腳本。 CREATE PARTITION SCHEME [Scheme_DateTime] AS PARTITION [Function_DateTime] TO ([SECTION2010], [SECTION2011], [SECTION2013], [SECTION2014]) 合并分區(qū)之后,被合并的分區(qū)記錄也將被重新分配物理保存位置。 6. 添加分區(qū) 分區(qū)方案中指定的文件組個數(shù)比分區(qū)函數(shù)中指定的邊界數(shù)大1,為分區(qū)方案指定一個可用的文件組時,該分區(qū)方案并沒有立刻使用這個文件組,只是將文件組先備用著,等修改了分區(qū)函數(shù)之后分區(qū)方案才會使用這個文件組。如果分區(qū)函數(shù)沒有更改,分區(qū)方案中的文件組個數(shù)也不會更改。 添加分區(qū)所需要使用到的文件組可以使用之前合并分區(qū)之后沒有再使用的SECTION2012,也可以新建文件組。 ALTER DATABASE [Northwind] ADD FILEGROUP [SECTION2015] ALTER DATABASE [Northwind] ADD FILE (
NAME = N'Northwind_Data_2015',
FILENAME = N'F:\Database\Northwind\Northwind_Data_2015.ndf' ,
SIZE = 5120KB ,
FILEGROWTH = 1024KB
) TO FILEGROUP [SECTION2015] 為分區(qū)方案指定一個可用的文件組: ALTER PARTITION SCHEME Scheme_DateTime NEXT USED [SECTION2015] 修改分區(qū)函數(shù),添加分區(qū): ALTER PARTITION FUNCTION Function_DateTime() SPLIT RANGE('2015-01-01') 查看添加分區(qū)后的數(shù)據(jù)物理存儲: 該文章在 2024/7/22 11:27:07 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |