如轉載,請注明出處: http://blog.csdn.net/robinson_0612/archive/2009/11/07/4783702.aspx
?
????? 隨著當今數據庫的容量越來越快的朝著在大型數據庫或超大型數據庫的發展,對于數據庫中的大型表以及具有各種訪問模式的表的可伸縮性和可管理性運行環境變得尤為重要,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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
