本篇博文的內容如下:
1,建立分區表
2,查詢分區
3,歸檔數據
4,添加分區
5,刪除分區
6,查看元數據
PS下:最近收到很多朋友的消息和郵件,大多是關於數據庫的問題,沒有一一答覆,由於平時工作比較忙,博客更新的比較慢,在這裏說聲抱歉。
OK,我們以一個銷售數據庫場景開始分區表實戰。
第一步:建立我們要使用的數據庫,最重要的是建立多個文件組。
CREATE DATABASE Sales ON PRIMARY
( NAME = N'Sales', FILENAME = N'C:/Sales.mdf', SIZE = 3MB, MAXSIZE = 100MB, FILEGROWTH = 10% ), FILEGROUP FG1 ( NAME = N'File1', FILENAME = N'C:/File1.ndf', SIZE = 1MB, MAXSIZE = 100MB, FILEGROWTH = 10% ), FILEGROUP FG2 ( NAME = N'File2', FILENAME = N'C:/File2.ndf', SIZE = 1MB, MAXSIZE = 100MB, FILEGROWTH = 10% ), FILEGROUP FG3 ( NAME = N'File3', FILENAME = N'C:/File3.ndf', SIZE = 1MB, MAXSIZE = 100MB, FILEGROWTH = 10% ) LOG ON ( NAME = N'Sales_Log', FILENAME = N'C:/Sales_Log.ldf', SIZE = 1MB, MAXSIZE = 100MB, FILEGROWTH = 10% ) GO 第二步:建立分區函數,這裏我們建立三個分區。 how(如何對數據進行分區)
USE Sales
GO CREATE PARTITION FUNCTION pf_OrderDate (datetime) AS RANGE RIGHT FOR VALUES ('2003/01/01', '2004/01/01') --n不能超過 999,創建的分區數等於 n + 1 GO 第三步:創建分區方案,關聯到分區函數 。 where(在哪裏對數據進行分區)
USE Sales
GO CREATE PARTITION SCHEME ps_OrderDate AS PARTITION pf_OrderDate TO (FG1, FG2, FG3) GO 第四步:創建分區表。創建表並將其綁定到分區方案。這裏我們建立2個表,表的結構一樣。其中OrdersHistory表用於保存歸檔數據。
USE Sales
GO CREATE TABLE dbo.Orders ( OrderID int identity(10000,1), OrderDate datetime NOT NULL, CustomerID int NOT NULL, CONSTRAINT PK_Orders PRIMARY KEY (OrderID, OrderDate) ) ON ps_OrderDate (OrderDate) GO CREATE TABLE dbo.OrdersHistory ( OrderID int identity(10000,1), OrderDate datetime NOT NULL, CustomerID int NOT NULL, CONSTRAINT PK_OrdersHistory PRIMARY KEY (OrderID, OrderDate) ) ON ps_OrderDate (OrderDate) GO 通過以上四步,我們建立了分區表。接着我們要插入一些數據,來進行數據歸檔,分區查詢等。
向數據表中寫入2002年的範例數據
USE Sales
GO INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2002/6/25', 1000) INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2002/8/13', 1000) INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2002/8/25', 1000) INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2002/9/23', 1000) GO 向數據表中寫入2003年的範例數據
USE Sales
GO INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2003/6/25', 1000) INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2003/8/13', 1000) INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2003/8/25', 1000) INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2003/9/23', 1000) GO 我們可以用下面的代碼查詢這2表:
SELECT * FROM dbo.Orders
SELECT * FROM dbo.OrdersHistory 查詢的結果是Orders裏面有8行數據,而OrdersHistory還沒有數據。因爲我們還沒歸檔數據,所以OrdersHistory表還沒有數據。
插入完數據後,我們來做如下實驗:
1,查詢某個分區
這裏我們要用到$PARTITION 函數,這個函數可以幫助我們查詢某個分區的數據,還可以檢索某個值所隸屬的分區號。$PARTITION 函數的進一步細節可以查看MSDN
查詢已分區表Order的第一個分區,代碼如下:
SELECT *
FROM dbo.Orders WHERE $PARTITION.pf_OrderDate(OrderDate) = 1 查詢結果只包含2002年的數據,如下圖:
如果想獲得2003年的數據,需要如下的代碼:
SELECT *
FROM dbo.Orders WHERE $PARTITION.pf_OrderDate(OrderDate) = 2 我們還可以查詢某個分區有多少行數據,代碼如下:
SELECT $PARTITION.pf_OrderDate(OrderDate) AS Partition,
COUNT(*) AS [COUNT] FROM dbo.Orders GROUP BY $PARTITION.pf_OrderDate(OrderDate) ORDER BY Partition ; 我們還可以通過$PARTITION 函數獲得一組分區標示列值的分區號,例如獲得2002屬於哪個分區,代碼如下:
SELECT Sales.$PARTITION.pf_OrderDate('2002')
很明顯,2002年隸屬於第1個分區,因爲我們建立分區函數時用了RANGE RIGHT,所以返回1。你也可以把2002年換成2003,2004,2005,2009等等測試。你會發現,2003年屬於第2個分區,2004年以後的都屬於第3個分區。
2,歸檔數據
假如現在是2003年年初,那麼我們就可以把2002年所有的交易記錄歸檔到歷史訂單表HistoryOrder中。代碼如下:
USE Sales
GO ALTER TABLE dbo.Orders SWITCH PARTITION 1 TO dbo.OrdersHistory PARTITION 1 GO 此時如果我們再執行如下代碼:
SELECT * FROM dbo.Orders
SELECT * FROM dbo.OrdersHistory 便會發現,Orders 表只剩2003年的數據,而OrdersHistory表中包含了2002年的數據。
當然如果到了2004年年初,我們也可以歸檔2003年的所有交易數據。代碼如下:
USE Sales
GO ALTER TABLE dbo.Orders SWITCH PARTITION 2 TO dbo.OrdersHistory PARTITION 2 GO 3,添加分區
由於目前我們只有三分分區,而這三個分區的區間如下:
所以假如到了2005年年初,我們需要爲2005年的交易記錄準備分區,代碼如下:
USE Sales
GO ALTER PARTITION SCHEME ps_OrderDate NEXT USED FG2 ALTER PARTITION FUNCTION pf_OrderDate() SPLIT RANGE ('2005/01/01') GO ALTER PARTITION SCHEME ps_OrderDate NEXT USED FG2 用來指定新分區的數據存儲在那個文件。這裏NEXT USED FG2 代表我們將新分區的數據保存在FG2文件組中,當然我們也可以在原有數據庫上新建一個文件組,把新分區的數據保存在新文件組當中,這裏我們直接用FG2文件組。
ALTER PARTITION FUNCTION pf_OrderDate() SPLIT RANGE ('2005/01/01') 代表我們創建一個新分區,而這裏SPLIT RANGE ('2005/01/01')正是創建新分區的關鍵語法。
執行完上面的代碼之後,我們就有了4個分區,此時的區間如下:
4,刪除分區
刪除分區又稱爲合併分區,假如我們想合併2002年的分區和2003年的分區到一個分區,我們可以用如下的代碼:
USE Sales
GO ALTER PARTITION FUNCTION pf_OrderDate() MERGE RANGE ('2003/01/01') GO 執行完上面的代碼,此時分區區間如下:
合併2002和2003年的數據到2003年之後,我們執行如下代碼:
SELECT Sales.$PARTITION.pf_OrderDate('2003')
你會發現返回的結果是1。而原來返回的是2,原因是2002年以前數據所在的那個分區合併到了2003年這個分區中了。
假如此時我們執行如下代碼:
SELECT *
FROM dbo.OrdersHistory WHERE $PARTITION.pf_OrderDate(OrderDate) = 2 結果一行數據都沒返回,事實就這樣,因爲OrdersHistory 表中只存儲了2002和2003年的歷史數據,在沒有合併分區之前,執行上面的代碼肯定會查詢出2003年的數據,但是合併了分區之後,上面代碼實際查詢的是第二個分區中2004年的數據。
不過當我們改成如下的代碼:
SELECT *
FROM dbo.OrdersHistory WHERE $PARTITION.pf_OrderDate(OrderDate) = 1 便會查詢出8行數據,包括2002年和2003年的數據,因爲合併分區後2002年和2003年的數據都成了第1個分區的數據了。
通過圖形我們來回憶下歸檔數據、添加分區、合併分區。
5,查看元數據
我們可以通過以下三個視圖來觀察我們創建的分區函數,分區方案,邊界點值等。
select * from sys.partition_functions
select * from sys.partition_range_values select * from sys.partition_schemes 查詢的結果如下圖:
本文出自 “李濤的技術專欄” 博客,請務必保留此出處http://terryli.blog.51cto.com/704315/169601 本文出自 51CTO.COM技術博客 |
實戰分區表:SQL Server 2k5&2k8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.