`
sun4love
  • 浏览: 233555 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

实战分区表:SQL Server 2k5&2k8系列(三)

    博客分类:
  • db
阅读更多

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://terryli.blog.51cto.com/704315/169601
通过上2篇博文,我们了解了分区表的理论,这一节就开始实战。本篇博文的内容如下:
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,添加分区
由于目前我们只有三分分区,而这三个分区的区间如下:
文件组
分区
取值范围
FG1
1
(过去某年, 2003/01/01)
Fg2
2
[2003/01/01, 2004/01/01)
Fg3
3
[2004/01/01,未来某年)
 
所以假如到了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个分区,此时的区间如下:
文件组
分区
取值范围
FG1
1
(过去某年, 2003/01/01)
Fg2
2
[2003/01/01, 2004/01/01)
Fg3
3
[2004/01/01, 2005/01/01)
Fg2
4
[2005/01/01, 未来某年)
 
4,删除分区
删除分区又称为合并分区,假如我们想合并2002年的分区和2003年的分区到一个分区,我们可以用如下的代码:
USE Sales    
GO    
ALTER PARTITION FUNCTION pf_OrderDate() MERGE RANGE ('2003/01/01'
GO
 
执行完上面的代码,此时分区区间如下:
文件组
分区
取值范围
Fg2
1
[过去某年, 2004/01/01)
Fg3
2
[2004/01/01, 2005/01/01)
Fg2
3
[2005/01/01, 未来某年)
 
合并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

 

Great thanks 李涛

 

分享到:
评论

相关推荐

    MS SQL Server分区表、分区索引详解

    ### MS SQL Server 分区表、分区索引详解 #### 一、分区表简介 使用分区表的主要目的是为了改善大型表及具有多种访问模式的表的可伸缩性和可管理性。这里的“大型表”指的是数据量巨大的表,“访问模式”是指因不同...

    查看sqlserver表分区数据分布

    ### 查看SQL Server表分区数据分布 在SQL Server中,为了提高大型数据库的管理效率与查询性能,常常会采用表分区技术。通过合理地将一个表的数据分散到多个物理文件或文件组上,可以显著提升数据处理的速度。本文将...

    sqlServer数据库大表分区方案

    ### SQL Server 大表分区方案详解 #### 一、大表分区条件 在数据库管理过程中,随着业务数据的不断增长,单个表的数据量可能会变得非常庞大,这不仅会导致数据库性能下降,还会影响数据处理效率。为了有效解决这些...

    SQL Server分区表

    ### SQL Server 分区表知识点详解 #### 一、SQL Server 分区表概念 在数据库管理领域,特别是针对大型数据集的高效处理时,SQL Server 提供了一种名为“分区表”的强大工具。从 SQL Server 2005 开始,微软引入了...

    sqlserver2005表分区

    【SQL Server 2005 表分区】 分区表是SQL Server 2005提供的一种高级数据管理技术,主要用于优化大规模数据表的性能。当你的数据库中存在数据量巨大且查询频繁的表时,分区表能够显著提升查询效率,降低维护成本。...

    SQL Server 2005 中的分区表和索引

    ### SQL Server 2005 中的分区表和索引:深入解析 #### 分区的由来与演变 分区的概念在SQL Server的历史中占据着重要地位。从早期的SQL Server版本开始,数据库管理员就意识到,面对不断增长的数据量,传统的单一...

    SQL Server的升级之路系列课程(1):SQL Server 2005新特性及升级价值

    SQL Server 2005的发布标志着一个重要的里程碑,它引入了一系列创新功能,极大地提升了性能、可扩展性以及安全性。首先,让我们来看看一些关键的新特性: 1. **集成服务 (Integration Services)**:这是一个全新的...

    SQL SERVER 2008分区表快速创建.doc

    SQL Server 2008 分区表快速创建 SQL Server 2008 分区表快速创建是指在 SQL Server 2008 环境中快速创建分区表的过程。分区表是指将大型表分割成多个小表,以提高查询性能和数据管理效率。下面是快速创建分区表的...

    sqlserver 表分区 详解

    在SQL Server中,表分区是一种优化数据库性能的技术,尤其对于大型数据仓库系统,它能够显著提升数据查询和管理效率。本文将深入解析SQL Server表分区的概念、原理、优点、应用场景,以及实施步骤。 **1. 表分区的...

    SQLServer创建表分区脚本

    在SQL Server中,表分区是一种优化数据库性能的技术,它允许将大表的数据分布在多个物理存储上,以便于管理和查询。这种技术尤其适用于处理海量数据,因为它可以提高数据的读写速度,减少I/O操作,并简化维护任务。...

    SQL2008分区表的建立

    本文将详细介绍 SQL Server 中的分区表,包括分区表的概念、创建分区表、操作分区表、将普通表转换为分区表等内容。 一、分区表简介 分区表是 SQL Server 中的一种数据存储方式,它将大型表拆分成多个小的、独立的...

    sqlserver 2008创建表分区

    在SQL Server 2008中,创建表分区是一种优化大型数据库性能的技术。它通过将一个大表的数据分成多个逻辑部分,或者称为“分区”,来提高查询效率和管理大规模数据的便捷性。以下是对这个主题的详细解释: 一、表...

    SQL Server 2005内幕故事系列之一:SQL Server 2005 预览

    这个“SQL Server 2005内幕故事系列之一:SQL Server 2005 预览”可能是一个视频或文档集合,旨在揭示开发过程中的幕后细节,以及新功能的早期预览。 首先,SQL Server 2005的核心改进之一是引入了集成的服务...

    SQL Server 表分区操作详解

    SQL Server 表分区操作详解 SQL Server 表分区操作是数据库性能优化的重要一步骤。通过将表格分区到独立的文件组中,可以提高数据库的并行处理性能,从而优化查询性能。建立分区表需要创建文件组,而创建多个文件组...

    SQLServer2005分区表

    ### SQL Server 2005 分区表技术详解 #### 一、引言 随着数据库规模的不断扩大,数据管理和查询效率成为了重要的考虑因素。SQL Server 2005引入了一项重要的特性——**分区表**,它为解决大型表的性能和可管理性...

    sql server分区表实例

    SQL Server分区表是一种高效的数据管理策略,尤其适用于处理大数据量的场景。分区表将一个大表逻辑上划分为多个部分,每个部分称为一个分区,这些分区可以分别存储在不同的物理位置,以提高查询性能和数据管理效率。...

    SQL Server 2005 中的分区表和索引.doc

    SQL Server 2005 中的分区表和索引 SQL Server 2005 中的分区表和索引是改善大型表和具有各种访问模式的表的可伸缩性和可管理性的重要工具。分区可以将大型表分为更小、更容易管理的部分,提供一定的帮助。创建分区...

    Microsoft SQL Server开发源文件

    2. **数据库设计**:SQL Server支持规范化数据库设计,包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF),以及更高的BCNF(巴斯-科德范式)。正确设计数据库结构能确保数据的一致性和减少数据冗余。 3. **...

    sqlserver自动生成sql语句工具sqlserver转oracle

    例如,通过这样的工具,我们可以导出SQL Server中的表结构、索引、存储过程、触发器等对象的创建语句。 描述中提到的"sqlserver转oracle"则是指将SQL Server数据库的内容迁移到Oracle数据库的过程。这个过程涉及到...

Global site tag (gtag.js) - Google Analytics