隨着當今數據庫的容量越來越快的朝着在大型數據庫或超大型數據庫的發展,對於數據庫中的大型表以及具有各種訪問模式的表的可伸縮性和可管理性運行環境變得尤爲重要,SQL server從SQL server 7.0的分區視圖到SQL server 2000中的分區視圖中到SQL server 2005所使用的分區表,不斷改善大型表所面臨的性能、阻塞、備份空間、時間、運營成本等。當表和索引非常大的時候,通過分區表的實現,可以將數據分爲更小,更易於管理,獲得更好的可操作性能。本實驗介紹基於已存在的表來如何創建分區,管理分區。
一、實驗目的:對於已經存在的表且不斷增大的情況下構建分區表,管理分區表,提高其性能。
二、主要步驟:對於已經存在的表,我們可以採取以下步驟來對其創建分區表
1.創建分區函數
2.創建分區架構並關聯到分區函數
3.刪除已經存在的聚集索引
4.基於分區架構重建聚集索引
三、實驗環境:
1. windows xp pro (英文版) + sp2
2. SQL server 2005 Developer + sp3
3.實驗數據庫Performance,此數據庫參照實驗二:SQL server 2005高可用性之----數據庫鏡像中的生成腳本生成數據庫,本實驗對其數據庫的存放做了調整,將數據和日誌文件存放在D:\SQL_Data\Performance目錄下。
4.對已存在要創建的分區表爲:Performance數據庫下的Orders表.
5.對Orders表中的orderdate列按年進行水平分區
四、具體試驗步驟:
1.創建分區函數
確定分區的數目及分區的列,列的數據類型。本例將Orders表的orderdate按年份水平分五個區,則需要定義四個邊界點值。如下,
use Performance;
go
Create partition function
Part_func_orders(datetime) as
range left
for values('20021231 23:59:59.997',
'20031231 23:59:59.997',
'20041231 23:59:59.997',
'20051231 23:59:59.997');
go
--或者使用range right來創建分區函數
Create partition function
Part_func_orders(datetime) as
range right
for values('20030101 00:00:00.000',
'20040101 00:00:00.000',
'20050101 00:00:00.000',
'20060101 00:00:00.000');
go
/*分區值的表示範圍(使用range left)
–infinity < x1 <= 20021231
20030101 < x2 <= 20031231
20040101 < x3 <= 20041231
20050101 < x4 <= 20051231
20060101 < x5 <= +infinity
infinity本應當爲20020101或20061231,此處僅用於說明表示範圍
----------------------------------------------------------
分區值的表示範圍(使用range right)
–infinity < x1 < 20030101
20030101 <= x2 < 20040101
20040101 <= x3 < 20050101
20050101 <= x4 < 20060101
20060101 <= x5 < +infinity
通過以上分析表明當range中使用left時,分區的範圍右邊爲小於等於values所指定的值,
當range中使用right時,分區範圍左邊爲大於等於values所指定的值。
規律:在使用 LEFT 分區函數時,第一個值將作爲第一個分區中的上邊界。在使用 RIGHT 分區函數時,第一個值將作爲第二個分區的下邊界*/
2. 添加文件組和文件
針對所創建的分區來創建文件組和文件,我們可以創建五個文件組,五個不同的ndf文件來存放不同年份的orders,可以放置於不同的磁盤來減少I/O的開銷,也可以在一個文件組中創建多個文件來存放不同年份的orders,本例創建了四個文件組,其中有一年的orders放置到了Primary組中。
alter database Performance
add filegroup [FG1];
go
alter database Performance
add filegroup [FG2];
go
alter database Performance
add filegroup [FG3];
go
alter database Performance
add filegroup [FG4];
go
alter database Performance
add file
(name = FG1_data,filename = 'D:\SQL_Data\Performance\FG1_data.ndf',size = 3MB)
to filegroup [FG1];
alter database Performance
add file
(name = FG2_data,filename = 'D:\SQL_Data\Performance\FG2_data.ndf',size = 3MB)
to filegroup [FG2];
alter database Performance
add file
(name = FG3_data,filename = 'D:\SQL_Data\Performance\FG3_data.ndf',size = 3MB)
to filegroup [FG3];
alter database Performance
add file
(name = FG4_data,filename = 'D:\SQL_Data\Performance\FG4_data.ndf',size = 3MB)
to filegroup [FG4];
go
3. 創建分區架構並關聯到分區函數
Create partition scheme Part_func_orders_scheme
as partition Part_func_orders
to ([FG1],[FG2],[FG3],[FG4],[Primary]);
go
4.重建索引(刪除聚集索引以及需要分區字段的索引後重建該類索引,表被按分區值將分配到各文件組)
EXEC sp_helpindex N'orders' --查看orders中使用的索引
drop index idx_cl_od
on orders;
go
create clustered index idx_cl_od
on orders(orderdate)
on Part_func_orders_scheme(orderdate);
go
5. 查看分區的相關情況
--查看分區及分區範圍的情況
select * from sys.partitions where object_id = object_id('orders');
select * from sys.partition_range_values;
--查看分區架構情況
select * from sys.partition_schemes;
--查看某一特定分區列值屬於哪個分區
select Performance.$partition.Part_func_orders('20050325') as partition_num;
--查看某一特定分區的記錄
select * from orders where Performance.$partition.Part_func_orders(orderdate) = 2
--查看各分區所包含的記錄數
select $partition.Part_func_orders(orderdate) as partition_num,
count(*) as record_num
from orders
group by $partition.Part_func_orders(orderdate)
order by $partition.Part_func_orders(orderdate);
6.分區的管理
--增加分區值,增加分區之前應先增加或設置新分區使用的文件組
alter database Performance
add filegroup [FG5];
go
alter database Performance
add file
(name = FG5_data,filename = 'D:\SQL_Data\Performance\FG5_data.ndf',size = 3MB )
to filegroup [FG5];
go
alter partition scheme Part_func_orders_scheme
next used [FG5];
go
alter partition function Part_func_orders()
split range('20061231 23:59:59.997')
go
insert into orders
select 10000001,'C0000012906',213,'I','20070101','a'
union all select 10000002,'C0000019995',213,'I','20070109','a'
union all select 10000003,'C0000019996',410,'I','20070512','a';
go
select * from orders where Performance.$partition.Part_func_orders(orderdate) = 6
--合併分區
--合併分區後,以下將新增的三條記錄放到了第5個分區中
alter partition function Part_func_orders()
merge range('20061231 23:59:59.997');
go