天天看點

四、實體優化(5)表和索引分區

一、概念

  可以使用 SSMS或 Transact-SQL 在 SQL Server 2005 及後續版本中建立已分區表或索引。 已分區表和索引中的資料水準劃分到可分散到資料庫的多個檔案組的單元中。分區可以使大型表和索引更易于管理并且更靈活。

  通過對大型表或索引進行分區,可以具有以下可管理性和性能優點。

(1)可以快速、高效地傳輸或通路資料的子集,同時又能維護資料收集的完整性。 例如,将資料從 OLTP 加載到 OLAP 系統之類的操作僅需幾秒鐘即可完成,而如果不對資料進行分區,執行此操作需要幾分鐘或幾小時。

(2)可以更快地對一個或多個分區執行維護操作。 這些操作的效率更高,因為它們僅針對這些資料子集,而非整個表。 例如,您可以選擇在一個或多個分區中壓縮資料,或者重新生成索引的一個或多個分區。

(3)可以根據經常執行的查詢類型和硬體配置,提高查詢性能。 例如,在兩個或更多的已分區表中的分區列相同時,查詢優化器可以更快地處理這些表之間的同等聯接查詢,因為可以聯接這些分區本身。

  當 SQL Server 針對 I/O 操作執行資料排序時,它會首先按分區對資料進行排序。 SQL Server 每次通路一個驅動器,這樣可能會降低性能。 為了提高資料排序性能,可以通過設定 RAID 将多個磁盤中的分區資料檔案條帶化。 這樣一來,盡管 SQL Server 仍按分區對資料進行排序,但它可以同時通路每個分區的所有驅動器。

  此外,可以通過對在分區級别而不是整個表啟用鎖更新來提高性能。 這可以減少表上的鎖争用。 

二、建立表和索引分區

  本例中,将對一個名為“銷售訂單表”的基表建立表和索引分區。建立已分區表或索引通常包含四個操作: 

1.  準備檔案組和檔案

  建立将持有分區方案所指定的分區的檔案組和相應的檔案。

(1)使用SSMS

四、實體優化(5)表和索引分區
四、實體優化(5)表和索引分區

(2)使用T-SQL

USE [master]

GO

ALTER DATABASE [db01] ADD FILEGROUP [FG2012]

ALTER DATABASE [db01] ADD FILEGROUP [FG2011]

ALTER DATABASE [db01] ADD FILEGROUP [FG2010]

ALTER DATABASE [db01] ADD FILEGROUP [FGHistory]

ALTER DATABASE [db01] ADD FILE ( NAME = N'FG2012_data', FILENAME = N'C:\test\FG2012_data.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG2012]

ALTER DATABASE [db01] ADD FILE ( NAME = N'FG2011_data', FILENAME = N'C:\test\FG2011_data.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG2011]

ALTER DATABASE [db01] ADD FILE ( NAME = N'FG2010_data', FILENAME = N'C:\test\FG2010_data.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG2010]

ALTER DATABASE [db01] ADD FILE ( NAME = N'FGHistory_data', FILENAME = N'C:\test\FGHistory_data.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FGHistory]

2. 分區函數

  建立一個分區函數,該函數根據指定列的值将表或索引的各行映射到分區。每個分區函數都要指定一個名稱和一個資料類型。 

USE db01

CREATE PARTITION FUNCTION partfunc(datetime) AS

RANGE RIGHT FOR VALUES('2010-1-1', '2011-1-1', '2012-1-1')

  注意:如果分區函數中的任何行具有帶 Null 值的分區列,會将這些行配置設定到最左側分區。 但是,如果将 NULL 指定為邊界值并訓示 RIGHT,則最左側的分區仍為空,NULL 值位于第二個分區。 

  可以通過以下指令來檢視上述分區函數的結果。

select * from sys.partition_range_values 

3. 分區方案

  建立一個将已分區表或已分區索引的分區映射到新檔案組的分區方案。分區方案為存儲提供了一個替代定義。可以定義一個分區方案來包含一個或多個檔案組。

CREATE PARTITION SCHEME partscheme AS

PARTITION partfunc TO

(FGHistory, FG2010, FG2011, FG2012)

  可以通過以下指令檢視分區架構。

select * from sys.partition_schemes 

4. 建立分區表

  建立表,并指定分區方案作為存儲位置。 

CREATE TABLE 銷售訂單表

  (訂單編号      INT,

   客戶編号      INT      NOT NULL,

   訂單日期      DATETIME      NOT NULL,

   CONSTRAINT pk_orders PRIMARY KEY CLUSTERED(訂單日期,訂單編号) )

ON partscheme(訂單日期)

5.建立索引

  和建立分區表相似,為了對索引進行分區,要在ON子句中指定一個分區方案。

CREATE NONCLUSTERED INDEX idx_orderID

ON 銷售訂單表(訂單編号) ON partscheme(訂單日期)

三、管理分區

  在前面的練習中,已經将銷售訂單按年份分割為“2010年之前”、“2010年”、“2011年”、“2012年及以後”,共4個分區。

  本例中,要将最後一個分區拆分為“2012年”和“2013年及以後”;然後将“2010年之前”的資料移動到另一個“銷售曆史表”,最後将最前面2個分區合并為“2011年”之前。

1. 準備檔案組和檔案

ALTER DATABASE [db01] ADD FILEGROUP [FG2013]

ALTER DATABASE [db01] ADD FILE ( NAME = N'FG2013_data', FILENAME = N'C:\test\FG2013_data.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG2013]

2. 修改分區架構

  修改分區方案,在檔案組設定Next Used标志,

ALTER PARTITION SCHEME partscheme Next Used FG2013

3. SPLIT

  SPLIT從分區函數中引入一個新的邊界點。

ALTER PARTITION FUNCTION partfunc() SPLIT RANGE('2013-1-1')

select * from sys.partition_range_values

4. 建立“銷售曆史表”

CREATE TABLE 銷售曆史表

   訂單日期      DATETIME      NOT NULL

   CONSTRAINT ck_orderdate CHECK (訂單日期<'2010-1-1') 

   CONSTRAINT pk_orderhistory PRIMARY KEY CLUSTERED(訂單日期,訂單編号) )

ON FG2010

  注意:源表和目标表必須共享同一個檔案組。

5. SWITCH

  使用SWITCH運算符将“2010年之前”分區從“銷售訂單表”分離,把它連接配接到“銷售曆史表”。 http://technet.microsoft.com/zh-cn/library/ms191160(v=sql.105).aspx

ALTER TABLE 銷售訂單表

SWITCH PARTITION 2 TO 銷售曆史表

6. MERGE

  MERGE從分區函數中删除‘2010-1-1’邊界點。

ALTER PARTITION FUNCTION partfunc()

MERGE RANGE ('2010-1-1')

四、限制和局限

1. 命名空間

  分區函數和方案的作用域被限制為在其中建立它們的資料庫。 在該資料庫内,分區函數駐留在與其他函數的命名空間不同的一個單獨命名空間内。 

2. 版本限制

  僅Enterprise Edition允許表和索引分區。

3. 分區數量

  SQL Server 2012 在預設情況下支援多達 15,000 個分區。 在早期版本中,預設情況下,分區數限制為 1000 個。 

本文結語:

  表和索引分區可以使資料水準劃分,并分散到資料庫的多個檔案組的單元中,使大型表和索引更易于管理并且更靈活。

PTO