扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源:开发者在线 2007年08月29日
在这篇文章中,我将向您介绍如何修改数据分区来有效地添加新的数据。
分区
分区是指将一个很大的数据表中的一些数据行存储到其它的数据表中。这样做可以为数据库的管理带来便利,还有助于提高数据库的性能;而对于用户而言,他们实际上还是在操作一个大型的数据表。分区的另外一个优势还在于可以向分区中添加和删除数据。
分区转换
分区功能用于映射数据表的字段值来定义分区,在创建分区的时候这些值都已经定义好了。但是,如果您需要改变现有的分区来加载新的数据、移动现有的数据或者删除数据呢?分区转换可以实现在一个或多个分区数据表中移动大量数据的功能。
实例
分区经常用于存储存档数据,比如将数据从您的联机事务处理数据库移动到您的数据仓库等等。我们接下来展示的这个例子是将MP3播放器产品数据导入到SalesHistoryArchive数据表,我们假定MP3播放器的产品销售数据存储在名为MP3Import的表格中。
以下的SQL语句创建了相关的数据库对象,包括分区函数、分区模式还有SalesHistoryArchive数据表。
CREATE PARTITION FUNCTION [pf_Product_Partition](VARCHAR(10)) AS RANGE LEFT
FOR VALUES (N'BigScreen', N'Computer', N'PoolTable')
Go
CREATE PARTITION SCHEME [ps_Product_Scheme] AS PARTITION [pf_Product_Partition]
ALL TO ([PRIMARY])
GO
IF OBJECT_ID('SalesHistoryArchive')>0
DROP TABLE [SalesHistoryArchive];
GO
CREATE TABLE [dbo].[SalesHistoryArchive]
(
[SaleID] [int] IDENTITY(1,1),
[Product] [varchar](10) NULL,
[SaleDate] [datetime] NULL,
[SalePrice] [money] NULL
)ON [ps_Product_Scheme](Product)
GO
DECLARE @i SMALLINT
SET @i = 1
WHILE (@i <=10000)
BEGIN
INSERT INTO SalesHistoryArchive(Product, SaleDate, SalePrice)
VALUES('Computer', DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) + (@i + 57))
INSERT INTO SalesHistoryArchive(Product, SaleDate, SalePrice)
VALUES('BigScreen', DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) + (@i + 13))
INSERT INTO SalesHistoryArchive(Product, SaleDate, SalePrice)
VALUES('PoolTable', DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) + (@i + 29))
SET @i = @i + 1
END
GO
现在我们有了示例的数据,下面就可以查看导入数据的细节了,首先将要导入的MP3播放器产品数据放在SalesHistoryArchive数据表中,该数据表目前处于分区状态,我希望MP3播放器的产品数据可以放在一个新的单独的分区,为了实现这一点,我需要改变SalesHistoryArchive数据表上使用的分区函数。
ALTER PARTITION FUNCTION [pf_Product_Partition] ()
SPLITRANGE ('MP3Player')
运行以下的查询来验证新的分区已经添加到SalesHistoryArchive数据表中了。
SELECT * From sys.partitions
WHERE OBJECT_NAME(object_id) = 'SalesHistoryArchive'
这样,数据就可以直接插入到SalesHistoryArchive数据表,而所有的MP3播放器都可以放在单独的分区中。SQL Server 2005的一项重要特色就是可以简单而快速地将一个表格中的数据转移到另外一个表格中。之所以可以实现快速转换是因为只改变了SQL Server的元数据,而并没有移动物理数据。以下的代码创建了MP3Import数据表,我假定这些数据来自外部的数据来源。
CREATE TABLE [dbo].MP3Import
(
[SaleID] [int] IDENTITY(1,1),
[Product] [varchar](10) NULL,
[SaleDate] [datetime] NULL,
[SalePrice] [money] NULL
)ON [ps_Product_Scheme](Product)
GO
ALTER TABLE MP3Import
ADD CONSTRAINT ck_Product CHECK(Product = 'MP3Player')
GO
在这些代码中,有两点需要注意。首先,MP3Import数据表的结构和SalesArchiveHistory数据表是一样的,而且,MP3Import数据表使用了和SalesArchiveHistory数据表相同的分区模式。当然,使用相同的分区模式并不是必须的,但是这样做会简单些。另外,我创建了一个检查点来约束只有MP3播放器才会会被导入到表格中,这也可以保证在我转换数据的时候可以导入到我指定的分区中。
下一步就是将数据加载到数据表:
DECLARE @i SMALLINT
SET @i = 1
WHILE (@i <=10000)
BEGIN
INSERT INTO MP3Import(Product, SaleDate, SalePrice)
VALUES('MP3Player', DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) + (@i + 57))
SET @i = @i + 1
END
GO
我希望将MP3Import数据表中的数据转移到SalesHistoryArchive数据表中。在以前的SQL Server版本中,需要通过INSERT语句来想数据表添加数据,但是在SQL Server 2005中,只需要使用SWITCH语句来移动数据指针将其指向SalesHistoryArchive数据表。在以下的代码中,我改变了MP3Import表格,并将存储在第三分区中的数据转移到SalesHistoryArchive数据表中。
ALTER TABLE MP3Import
SWITCH PARTITION 3 TO SalesHistoryArchive PARTITION 3
以下的查询显示了SalesHistoryArchive数据表在第三分区拥有10000条记录,因为我们不再需要MP3Import表格中的数据了,我可以使用DROP命令将这个表格从数据库中删除。
DROP TABLE MP3Import
因为我已经将数据指针与SalesHistoryArchive数据表中的新分区进行了关联,所以可以将MP3Import数据表安全地删除。
转换还是不转换?
这篇文章介绍了利用SQL Server分区的特色功能向数据表中添加数据的方法。尽管分区的优势很明显,当并不是在所有的情况下都适用,您需要对具体的情况进行测试和分析来决定是否进行分区和分区转换。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。