【IT168 技术文档】每个月都会有新数据添加到庞大的Orders数据表中,此时如果只对这一个表进行操作,则更新索引的过程将严重制约性能并产生大量碎片。为了进行优化,我们将通过独立的两个表进行配合,即当有新数据产生时,将旧数据从分区表中切换出来,然后将新数据添加到分区表中。
整个过程包含如下几个步骤:
·准备好即将用于存放旧数据的表
·准备好存有新数据的表
·更改分区方案,以便使用新的文件组
·对分区函数进行更改,分裂出新的边界点
注意:前4步均为影响到实际的分区表
·切换进来新数据
·将旧数据切换出去
注意:第5步和第6步的顺序可以进行更改,且更改后执行速度更快
·合并边界点
·备份/删除旧数据
我们实验所用到的分区数据表中包含的数据,因此我们将把数据作为一个分区直接切换进来。当进行分区切换的时候,只有元数据会发生更改,真正的数据并不会产生移动,因此速度非常快。
1.在不影响当前OrdersRange 分区表的前提下,为新数据做好准备
(1)在Solution Explorer 窗口,双击打开Script4 – RollingRangeScenario.sql.
(2)新建一个文件组,用于存放新的数据
ALTER DATABASE AdventureWorks2008Test
ADD FILEGROUP [2004Q3]
GO
ADD FILEGROUP [2004Q3]
GO
(3)为文件组添加一个文件:
ALTER DATABASE AdventureWorks2008Test
ADD FILE
(NAME = N'2004Q3',
FILENAME = N'C:\AdventureWorks2008Test\2004Q3.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
TO FILEGROUP [2004Q3]
GO
ADD FILE
(NAME = N'2004Q3',
FILENAME = N'C:\AdventureWorks2008Test\2004Q3.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
TO FILEGROUP [2004Q3]
GO
(4)接下来,我们要新建一个未分区的数据表,用于存放分区数据表中新建分区中的数据。该未分区数据表必须与分区数据表具有完全一致的结构和聚集索引。此外,为了能够确保快速进行分区切换,还需要通过约束来确保此未分区数据表中的数据与分区数据表中新建分区的范围相吻合。接下来我们将创建该数据表,插入数据,并创建聚集索引
CREATE TABLE AdventureWorks2008Test.[dbo].[Orders2004Q3]
(
[OrderID] [int] NOT NULL,
[EmployeeID] [int] NULL,
[VendorID] [int] NULL,
[TaxAmt] [money] NULL,
[Freight] [money] NULL,
[SubTotal] [money] NULL,
[Status] [tinyint] NOT NULL ,
[RevisionNumber] [tinyint] NULL,
[ModifiedDate] [datetime] NULL,
[ShipMethodID] tinyint NULL,
[ShipDate] [datetime] NOT NULL,
[OrderDate] [datetime] NOT NULL
CONSTRAINT Orders2004Q3MinDate
CHECK (OrderDate >= '20040701'),
[TotalDue] [money] NULL
) ON [2004Q3]
GO
ALTER TABLE AdventureWorks2008Test.[dbo].[Orders2004Q3]
ADD CONSTRAINT Orders2004Q3MaxDate
CHECK (OrderDate < '20041001')
go
---------------------------------------------
-- Populate new table with Q3 2004 data.
---------------------------------------------
INSERT INTO AdventureWorks2008Test.[dbo].Orders2004Q3
SELECT o.[PurchaseOrderID]
, o.[EmployeeID]
, o.[VendorID]
, o.[TaxAmt]
, o.[Freight]
, o.[SubTotal]
, o.[Status]
, o.[RevisionNumber]
, o.[ModifiedDate]
, o.[ShipMethodID]
, o.[ShipDate]
, o.[OrderDate]
, o.[TotalDue]
FROM AdventureWorks2008.Purchasing.PurchaseOrderHeader AS o
WHERE o.OrderDate >= '20040701'
AND o.OrderDate < '20041001'
GO
---------------------------------------------
-- The table *must* have the same clustered
-- index definition!
---------------------------------------------
CREATE CLUSTERED INDEX Orders2004Q3CLInd
ON Orders2004Q3(OrderDate, OrderID)
ON [2004Q3]
GO
(
[OrderID] [int] NOT NULL,
[EmployeeID] [int] NULL,
[VendorID] [int] NULL,
[TaxAmt] [money] NULL,
[Freight] [money] NULL,
[SubTotal] [money] NULL,
[Status] [tinyint] NOT NULL ,
[RevisionNumber] [tinyint] NULL,
[ModifiedDate] [datetime] NULL,
[ShipMethodID] tinyint NULL,
[ShipDate] [datetime] NOT NULL,
[OrderDate] [datetime] NOT NULL
CONSTRAINT Orders2004Q3MinDate
CHECK (OrderDate >= '20040701'),
[TotalDue] [money] NULL
) ON [2004Q3]
GO
ALTER TABLE AdventureWorks2008Test.[dbo].[Orders2004Q3]
ADD CONSTRAINT Orders2004Q3MaxDate
CHECK (OrderDate < '20041001')
go
---------------------------------------------
-- Populate new table with Q3 2004 data.
---------------------------------------------
INSERT INTO AdventureWorks2008Test.[dbo].Orders2004Q3
SELECT o.[PurchaseOrderID]
, o.[EmployeeID]
, o.[VendorID]
, o.[TaxAmt]
, o.[Freight]
, o.[SubTotal]
, o.[Status]
, o.[RevisionNumber]
, o.[ModifiedDate]
, o.[ShipMethodID]
, o.[ShipDate]
, o.[OrderDate]
, o.[TotalDue]
FROM AdventureWorks2008.Purchasing.PurchaseOrderHeader AS o
WHERE o.OrderDate >= '20040701'
AND o.OrderDate < '20041001'
GO
---------------------------------------------
-- The table *must* have the same clustered
-- index definition!
---------------------------------------------
CREATE CLUSTERED INDEX Orders2004Q3CLInd
ON Orders2004Q3(OrderDate, OrderID)
ON [2004Q3]
GO