對於大表的資料處理,我們很容易想到對錶進行分割槽,其實就是將乙個表的資料按照某乙個可以進行分段處理的字段進行擷取拆分,(「儲存的時候通過這個字段觀察,表資料是一段一段的效果」),分別存放在不同的檔案組,檔案組又分別存放在不同的硬碟上,這樣通過提高系統的i/o來提高系統對資料處理的效能。
這裡只記錄如何進行分割槽處理操作的步驟,簡單的說就5步:
新增檔案組 > 新增檔案 > 建立分割槽函式 > 建立分割槽方案(架構) > 建立分割槽表
假定已經建立了test庫,有乙個表uploadfiles存放上傳檔案的記錄,按照上傳的時期對錶進行分割槽。
1 新增檔案組 >
/*----給test庫新增3個檔案組fg1,fg2,fg3----
*/alter
database
test
addfilegroup
[fg1];
alter
database
test
addfilegroup
[fg2];
alter
database
test
addfilegroup
[fg3];
2 新增檔案 >
/*----給3個檔案組分別新增3個檔案datafg1.ndf、datafg2.ndf、datafg3.ndf,存放在不同位置,這裡用d,e,f盤模擬三塊硬碟----
*/alter
database
test
addfile
(name=n
'datafg1
',filename=n
'd:/data1/datafg1.ndf
',size
=3072kb,filegrowth
=1024kb)
tofilegroup
[fg1];
alter
database
test
addfile
(name=n
'datafg2
',filename=n
'e:/data2/datafg2.ndf
',size
=3072kb,filegrowth
=1024kb)
tofilegroup
[fg2];
alter
database
test
addfile
(name=n
'datafg3
',filename=n
'f:/data3/datafg3.ndf
',size
=3072kb,filegrowth
=1024kb)
tofilegroup
[fg3];
3 建立分割槽函式 >
/*----就是資料插入不同分割槽的分段依據,這裡有三個分割槽,
第一分區:20000101以前的資料
第二分割槽:20000101——20020101這間的資料
第三分割槽:20020101以後的資料-------
*/create
partition
function
[datapartitionrange](
datetime
) as
range
right
forvalues('
20000101',
'20020101
') ;
/*----說明:range right表示:
邊界值20000101屬於第二分割槽,
邊界值20020101屬於第三分割槽,
如果是range left表示:
邊界值20000101屬於第一分區,
邊界值20020101屬於第二分割槽,
以此類推----*/
4 建立分割槽方案(架構) >
/*----供表uploadfiles依賴的系統架構,這個架構又依賴上面的分割槽函式,
將分割槽函式的分割槽分別存放在不同的檔案組(資料檔案)----
*/create
partition scheme
[datapartitionscheme]as
partition
[datapartitionrange]to
( [fg1], [
fg2], [
fg3]
) ;
5 建立分割槽表
/*----建立依賴上面分割槽方案的分割槽表,insert資料的時候會根據分割槽方案按uploaddate將記錄存放在不同的檔案組下----
*/create
table
uploadfiles([
id][int
]identity(1
, 1)not
null
, --
自動編號
[filename][
nvarchar](
50)
null
, --
檔名[content][
nvarchar](
500)
null
, --
檔案描述
[uploaddate][
datetime
]not
null
--上傳日期)on
datapartitionscheme(uploaddate) ;
模擬插入500w條資料
這裡可以看出,雖然id是自動編號但並不連續,是因為資料插入的時候已經根據uploaddate進行了分割槽,這前10條是分割槽1裡的資料,下面再看看各分割槽的資料分布情況:
--檢視分割槽資料分布情況
select$partition.
[datapartitionrange
](uploaddate) as[
分割槽編號],
min(uploaddate) as[
上傳最小時期],
max(uploaddate) as[
上傳最大時期],
count(*)
as[分割槽下記錄數
] from
uploadfiles
group
by$partition.
[datapartitionrange
](uploaddate)
orderby[
分割槽下記錄數]
測試環境:windows 2003 server + sql server 2005
SQL Server 2005 修改表結構
為表新增具有預設值的一列 if not exists select from syscolumns where name website and objectproperty id,isusertable 1 and object name id tbbrowser begin alter tabl...
sql server2005取得表描述
select fldname a.name,priname case when columnproperty a.id,a.name,isidentity 1 then else end,idname case when exists select 1 from sysobjects where x...
SqlServer2005分頁方案
插入測試資料200w條,可能會很久 create table student id int primary keyidentity 1 1 name nvarchar 50 age int insert student name,age values name 18 while select cou...