SQLServer2005表分区知识点摘要
1、??????????? 準備條件
SQLSERVER2005數據庫服務器。
首先在192.168.1.200上創建數據庫LeeTest,然后向數據庫增加文件組FG1,FG2,FG3,FG4,FG5。再向每個文件組中增加文件。參考SQL語句如下:
CREATE DataBase LeeTest
Alter DataBase LeeTest Add FileGroup [FG1]
Alter DataBase LeeTest Add File(Name=f1,FileName=' F:\LEETESTDATA\f1.ndf',size=100MB,MaxSize=500MB,Filegrowth=10MB) ????? to FileGroup FG1
文件f1.ndf之前在目錄F:\LEETESTDATA下不能存在。
同樣放在給文件組F2—F5增加文件。一個文件組可以包含多個文件。
2、??????????? 創建分區函數
CREATE Partition Function RangeByID(bigint) AS Range left For values(1000,2000,3000)。則表將會分為4個區,第一個區存儲的數據是分區列小于等于1000的,第二個區存儲的是1001—2000的,第三個區2001—3000的,第四個區3001及以上的。
3、??????????? 創建分區架構
CREATE Partition Scheme RangeByIDScheme AS Partition? RangeByID To([FG1],[FG2],[FG3],[FG4])。物理存儲上的四個區。
4、??????????? 創建表及分區
CREATE TABLE [dbo].[OrderInfo](
??? [SequenceID] [bigint] IDENTITY(1,1) NOT NULL,
??? [OrderID] [bigint] Primary Key NOT NULL,
??? [OrderInfo] [varchar](500) COLLATE Chinese_PRC_CI_AS NOT NULL,
??? [Source] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
?) ON [RangeByIDScheme]([OrderID])
現在可以向表里插入5000行數據
Declare @seq int
SET @seq = 0
while(@seq<=5000)
Begin
insert into OrderInfo values(@seq,@seq+'01','00')
??? set @seq = @seq+1
end
使用如下語句查看分區存儲情況:
select $partition.RangeByID(OrderInfo.OrderID)? ParNum, count(*) ,Min(OrderID) , Max(OrderID)
from OrderInfo
group by $partition.RangeByID(OrderINfo.OrderID)
order by ParNum
5、? 分區更改
拆分分區:
將來OrderInfo表數據量必然會增加,OrderID也會增長,如增長到6000,則可以在分區。分區前,首先要給分區架構指定下一個可用的文件組。
ALTER PARTITION SCHEME RangeByIDScheme NEXT USED [ FG5 ]
拆分分區
ALTER PARTITION FUNCTION RangeByID()? SPLITRANGE ( 5000 )
合并分區:
ALTER PARTITION FUNCTION RangeByID()? MERGE? RANGE ( 2000 )?
此時,1001—2000與2001—3000的2個區合并為一個。按照SQLServer2005聯機叢書說明:刪除一個分區并將該分區中存在的所有值都合并到剩余的某個分區中。RANGE (boundary_value) 必須是一個現有邊界值,已刪除分區中的值將合并到該值中。如果最初保存 boundary_value 的文件組沒有被剩余分區使用,也沒有使用 NEXT USED 屬性進行標記,則將從分區方案中刪除該文件組。合并的分區駐留在最初不保存 boundary_value 的文件組中。我的理解,最初保存分區【1001-2000】的文件組FG2將會被從分區方案中除掉,除非ALTER PARTITION SCHEME RangeByIDScheme NEXT USED [ FG2 ]。
6、? 索引在分區中的處理
除了對表的數據集進行分區之外,還可以對索引進行分區。使用相同的函數對表及其索引進行分區通常可以優化性能。當索引和表按照相同的順序使用相同的分區函數和列時,表和索引將對齊。如果在已經分區的表中建立索引,SQL Server 會自動將新索引與該表的分區架構對齊,除非該索引的分區明顯不同。當表及其索引對齊后,SQL Server 則可以更有效地將分區移入和移出分區表,因為所有相關的數據和索引都使用相同的算法進行劃分。
如果定義表和索引時不僅使用了相同的分區函數,還使用了相同的分區架構,則這些表和索引將被認為是按存儲位置對齊。按存儲位置對齊的一個優點是,相同邊界內的所有數據都位于相同的物理磁盤上。在這種情況下,可以單獨在某個時間段內執行備份操作,還可以根據數據的變化在備份頻率和備份類型方面改變您的策略。如果連接或收集了相同文件或文件組中的表和索引,則可以發現更多的好處。SQL Server 可以通過在多個分區中并行操作來獲益。在按存儲位置對齊和多 CPU 的情況下,每個處理器都可以直接處理特定的文件或文件組,而不會與數據訪問產生任何沖突,因為所有需要的數據都位于同一個磁盤上。這樣,可以并行運行多個進程,而不會相互干擾。
上面的一段話是我摘抄的,我的理解是,如果找不出索引分區的劣處,就使用它。
對已存在數據表的分區解決方案
1、??????????? ????? 通過更改聚集索引所在文件組移動表到新文件組(分區)實現現有表分區??
以OrderInfo表為例:
????????????? 如果當初表創建在[Primary]文件組上,且有聚集索引CLS_Index_Source,索引建立在Source列上。
????????????? 則通過如下SQL分區
drop index CLS_Index_Source on OrderInfo
create clustered index CLS_Index_Source on OrderInfo(Source)
on RangeByIDScheme(OrderId)
如果想把表切換回Primary文件組,則通過如下SQL:
drop index CLS_Index_Source on OrderInfo
create clustered index CLS_Index_Source on OrderInfo(Source)
on [Primary]
2、? ?現有表普通索引的處理
建議刪除。通過重建聚集索引實現數據切換, 不刪除普通索引會導致普通索引被重建。
PUser表的分區
我在建立OrderInfo表時,有些地方按照Puser表結構,如主鍵不是聚集的,聚集索引不再唯一列上等,所以,OrderInfo表的分區方案對Puser表的分區有參考意義。但是,OrderInfo表數據量較小(10000條一下),而Puser表即將達到1000W條,大數據量情況下索引的重建以及分區的變更都會出現難以預料的問題,還需要制定詳細的分區方案以及風險規避方法。
建議PuserExtend,PuserLinkinfo使用與Puser表相同的分區架構。
轉載于:https://www.cnblogs.com/sun1987/archive/2011/06/21/2086068.html
總結
以上是生活随笔為你收集整理的SQLServer2005表分区知识点摘要的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Firefox v5 正式版
- 下一篇: loadrunner 录制 odbc 迭