可伸縮性性是數據庫管理系統的一個很重要的方面,在SQL Server 2005中可伸縮性方面提供了表分區功能。 其實對於有關係弄數據庫產品來說,對錶、數據庫和服務器進行數據分區的從而提供大數據量的支持並不是什麼新鮮事,但 SQL Server 2005 提供了一個新的體系結構功能,用於對數據庫中的文件組進行表分區。水平分區可根據分區架構,將一個表劃分爲幾個較小的分組。表分區功能是針對超大型數據庫(從數百吉字節到數千吉字節或更大)而設計的。超大型數據庫 (VLDB) 查詢性能通過分區得到了改善。通過對廣大分區列值進行分區,可以對數據的子集進行管理,並將其快速、高效地重新分配給其他表。 設想一個大致的電子交易網站,有一個表存儲了此網站的歷史交易數據,這此數據量可能有上億條,在以前的SQL Server版本中存儲在一個表中不管對於查詢性能還是維護都是件麻煩事,下面我們來看一下在SQL Server2005怎麼提高性能和可管理性:
-- 創建要使用的測試數據庫,Demo
USE [master]
IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'DEMO')
DROP DATABASE [DEMO]
CREATE DATABASE [DEMO]
--由於表分區使用使用新的體系結構,使用文件組來進行表分區,所以我們創建將要用到的6個文件組,來存儲6個時間段的交易數據[<2000],[ 2001], [2002], [2003], [2004], [>2005]
ALTER DATABASE Demo ADD FILEGROUP YEARFG1;
ALTER DATABASE Demo ADD FILEGROUP YEARFG2;
ALTER DATABASE Demo ADD FILEGROUP YEARFG3;
ALTER DATABASE Demo ADD FILEGROUP YEARFG4;
ALTER DATABASE Demo ADD FILEGROUP YEARFG5;
ALTER DATABASE Demo ADD FILEGROUP YEARFG6;
-- 下面爲這些文件組添加文件來進行物理的數據存儲
ALTER DATABASE Demo ADD FILE (NAME = 'YEARF1', FILENAME = 'C:/ADVWORKSF1.NDF') TO FILEGROUP YEARFG1;
ALTER DATABASE Demo ADD FILE (NAME = 'YEARF2', FILENAME = 'C:/ADVWORKSF2.NDF') TO FILEGROUP YEARFG2;
ALTER DATABASE Demo ADD FILE (NAME = 'YEARF3', FILENAME = 'C:/ADVWORKSF3.NDF') TO FILEGROUP YEARFG3;
ALTER DATABASE Demo ADD FILE (NAME = 'YEARF4', FILENAME = 'C:/ADVWORKSF4.NDF') TO FILEGROUP YEARFG4;
ALTER DATABASE Demo ADD FILE (NAME = 'YEARF5', FILENAME = 'C:/ADVWORKSF5.NDF') TO FILEGROUP YEARFG5;
ALTER DATABASE Demo ADD FILE (NAME = 'YEARF6', FILENAME = 'C:/ADVWORKSF6.NDF') TO FILEGROUP YEARFG6;
-- HERE WE ASSOCIATE THE PARTITION FUNCTION TO
-- THE CREATED FILEGROUP VIA A PARTITIONING SCHEME
USE DEMO;
GO
-------------------------------------------------------
-- 創建分區函數
-------------------------------------------------------
CREATE PARTITION FUNCTION YEARPF(datetime)
AS
RANGE LEFT FOR VALUES ('01/01/2000'
,'01/01/2001'
,'01/01/2002'
,'01/01/2003'
,'01/01/2004')
-------------------------------------------------------
-- 創建分區架構
-------------------------------------------------------
CREATE PARTITION SCHEME YEARPS
AS PARTITION YEARPF TO (YEARFG1, YEARFG2,YEARFG3,YEARFG4,YEARFG5,YEARFG6)
-- 創建使用此Schema的表
CREATE TABLE PARTITIONEDORDERS
(
ID INT NOT NULL IDENTITY(1,1),
DUEDATE DATETIME NOT NULL,
) ON YEARPS(DUEDATE)
--爲此表填充數據
declare @DT datetime
SELECT @DT = '1999-01-01'
--start looping, stop at ending date
WHILE (@DT <= '2005-12-21')
BEGIN
INSERT INTO PARTITIONEDORDERS VALUES(@DT)
SET @DT=dateadd(yy,1,@DT)
END
-- 現在我們可以看一下我們剛纔插入的行都分佈在哪個Partition
SELECT *, $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS
--我們可以看一下我們現在PARTITIONEDORDERS表的數據存儲在哪此partition中,以及在這些分區中數據量的分佈
SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('PARTITIONEDORDERS')
--
--現在我們設想一下,如果我們隨着時間的流逝,現在已經到了2005年,按照我們先前的設定,我們想再想入一個分區,這時是不是重新創建表分區架構然後重新把數據導放到新的分區架構呢,答案是完全不用。下面我們就看如果新加一個分區。
--更改分區架構定義語言,讓下一個分區使用和現在已經存在的分區YEARFG6分區中,這樣此分區就存儲了兩段partition的數據。
ALTER PARTITION SCHEME YEARPS
NEXT USED YEARFG6;
--更改分區函數
ALTER PARTITION FUNCTION YEARPF()
SPLIT RANGE ('01/01/2005')
--現在我們可以看一下我們剛纔插入的行都分佈在哪個Partition?
SELECT *, $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS
--我們可以看一下我們現在PARTITIONEDORDERS表的數據存儲在哪此partition中,以及在這些分區中數據量的分佈
SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('PARTITIONEDORDERS')