Chinaunix首页 | 论坛 | 博客
  • 博客访问: 484230
  • 博文数量: 1496
  • 博客积分: 79800
  • 博客等级: 大将
  • 技术积分: 9940
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 13:22
文章分类

全部博文(1496)

文章存档

2011年(1)

2008年(1495)

我的朋友

分类:

2008-09-09 13:25:29


  该文详细介绍实现分区表的过程以及有助于完成此过程的功能。逻辑流程如下:
  

  
图:创建分区表或索引的步骤

  
  确定是否应为对象分区
  
  虽然分区可以带来众多的好处,但也增加了实现对象的管理费用和复杂性,这可能是得不偿失的。尤其是,您可能不需要为较小的表或目前满足性能和维护要求的表分区。前面提到的销售方案使用分区减轻了移动行和数据的负担,但在决定是否实现分区时,您应考虑您的方案是否存在这种负担。
  
  确定分区键和分区数
  
  如果您正在尝试改善大型数据子集的性能和可管理性,并且已经定义了访问模式,则可以使用范围分区减少数据争用的情况,同时减少只读数据不需要分区时的维护工作。要确定分区数,应先评估您的数据中是否存在逻辑分组和模式。如果您通常一次只处理这些已定义子集中的少数几个,则应定义范围以隔离查询,使其只处理相应的数据(即,只处理特定的分区)。
  
  确定是否应使用多个文件组
  
  为了有助于优化性能和维护,应使用文件组分离数据。文件组的数目一定程度上由硬件资源决定:一般情况下,文件组数最好与分区数相同,并且这些文件组通常位于不同的磁盘上。但是,这主要适用于打算对整个数据集进行分析的系统。如果您有多个 CPU,SQL Server 则可以并行处理多个分区,从而大大缩短处理大量复杂报表和分析的总体时间。这种情况下,可以获得并行处理以及在分区表中移入和移出分区的好处。
  
  创建文件组
  
  如果需要为多个文件放置一个分区表以获得更好的 I/O 平衡,则至少需要创建一个文件组。文件组可以由一个或多个文件构成,而每个分区必须映射到一个文件组。一个文件组可以由多个分区使用,但是为了更好地管理数据(例如,为了获得更精确的备份控制),应该对分区表进行设计,以便只有相关数据或逻辑分组的数据位于同一个文件组中。使用 ALTER DATABASE,可以添加逻辑文件组名,然后添加文件。要为 AdventureWorks 数据库创建名为 2003Q3 的文件组,请按以下方式使用 ALTER DATABASE:
  ALTER DATABASE AdventureWorks ADD FILEGROUP [2003Q3]
  
  创建文件组后,使用 ALTER DATABASE 将文件添加到该文件组中。
  ALTER DATABASE AdventureWorks
  ADD FILE
  (NAME = N'2003Q3',
  FILENAME = N'C:\AdventureWorks\2003Q3.ndf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB)
  TO FILEGROUP [2003Q3]
  
  通过在 CREATE TABLE 的 ON 子句中指定一个文件组,可以为文件创建一个表。但是,如果表未分区,则不能为多个文件组创建一个表。要为一个文件组创建表,请使用 CREATE TABLE 的 ON 子句。要创建分区表,必须先确定分区的功能机制。进行分区的标准以分区函数的形式从逻辑上与表相分离。此分区函数作为独立于表的定义存在,而这种物理分离将起到帮助作用,因为多个对象都可以使用该分区函数。因此,为表分区的第一步是创建分区函数。
  
  为范围分区创建分区函数
  
  范围分区必须使用边界条件进行定义。而且,即使通过 CHECK 约束对表进行了限制,也不能消除该范围任一边界的值。为了允许定期将数据移入该表,需要创建最后一个空分区。
  
  在范围分区中,首先定义边界点:如果存在五个分区,则定义四个边界点值,并指定每个值是第一个分区的上边界 (LEFT) 还是第二个分区的下边界 (RIGHT)。根据 LEFT 或 RIGHT 指定,始终有一个空分区,因为该分区没有明确定义的边界点。
  
  具体来讲,如果分区函数的第一个值(或边界条件)是 '20001001',则边界分区中的值将是:
  
  对于 LEFT
  第一个分区是所有小于或等于 '20001001' 的数据
  第二个分区是所有大于 '20001001' 的数据
  
  对于 RIGHT
  第一个分区是所有小于 '20001001' 的数据
  第二个分区是所有大于或等于 '20001001' 数据
  
  由于范围分区可能在 datetime 数据中进行定义,因此必须了解其含义。使用datetime具有某种含义:即总是同时指定日期和时间。未定义时间值的日期表示时间部分为“0”的 12:00 A.M。如果将 LEFT 与此类数据结合使用,则日期为 10 月 1 日 12:00 A.M. 的数据将位于第一个分区,而 10 月份的其他数据将位于第二个分区。从逻辑上讲,最好将开始值与 RIGHT 结合使用,而将结束值与 LEFT 结合使用。下面的三个子句将创建逻辑上相同的分区结构:
  RANGE LEFT FOR VALUES ('20000930 23:59:59.997',
  '20001231 23:59:59.997',
  '20010331 23:59:59.997',
  '20010630 23:59:59.997')
  
  或
  RANGE RIGHT FOR VALUES ('20001001 00:00:00.000', '20010101 00:00:00.000', '20010401 00:00:00.000', '20010701 00:00:00.000')
  
  或
  RANGE RIGHT FOR VALUES ('20001001', '20010101', '20010401', '20010701')
  
  注意:此处使用 datetime 数据类型确实增加了一定的复杂性,但您需要确保设置正确的边界情况。请注意使用 RIGHT 的简单性,因为默认时间为 12:00:00.000 A.M。对于 LEFT,复杂性增加是因为 datetime 数据类型具有精度。必须选择 23:59:59.997 的原因在于,datetime 数据无法保证毫秒级别的精度。相反,datetime 数据的精度在 3.33 毫秒内。使用 23:59:59.999 这个确切的时间值是不行的,因为该值将被舍入到最接近的时间值,即第二天的 12:00:00.000 A.M。由于进行了这种舍入,将无法正确定义边界。对于 datetime 数据,必须对明确提供的毫秒值加倍小心。
  
  注意:分区函数还允许将函数作为分区函数定义的一部分。您可以使用 DATEADD(ms,-3,'20010101'),而不是使用 '20001231 23:59:59.997' 明确定义时间。
  
  要在四个活动分区(每个分区代表一个日历季度)中四分之一的 Orders 数据,并创建第五个分区以备将来使用(还是作为占位符,用于在分区表中移入和移出数据),请将 LEFT 分区函数与以下四个边界条件结合使用:
  CREATE PARTITION FUNCTION OrderDateRangePFN(datetime)
  AS
  RANGE LEFT FOR VALUES ('20000930 23:59:59.997',
  '20001231 23:59:59.997',
  '20010331 23:59:59.997',
  '20010630 23:59:59.997')
  
  记住,定义四个边界点将创建五个分区。通过查看以下数据集检查此分区创建的数据集:
  
  边界点 '20000930 23:59:59.997' 作为 LEFT(设置模式):
  最左侧的分区将包含所有小于或等于 '20000930 23:59:59.997' 的值
  
  边界点 '20001231 23:59:59.997':
  第二个分区将包含所有大于 '20000930 23:59:59.997' 但小于或等于 '20001231 23:59:59.997' 的值
  
  边界点 '20010331 23:59:59.997':
  第三个分区将包含所有大于 '20001231 23:59:59.997' 但小于或等于 '20010331 23:59:59.997' 的值
  
  边界点 '20010630 23:59:59.997':
  第四个分区将包含所有大于 '20010331 23:59:59.997' 但小于或等于 '20010630 23:59:59.997' 的值
  
  最后,第五个分区将包含所有大于 '20010630 23:59:59.997' 的值。
  
  创建分区架构
  
  创建分区函数后,必须将其与分区架构相关联,以便将分区定向至特定的文件组。定义分区架构时,即使多个分区位于同一个文件组中,也必须为每个分区指定一个文件组。对于前面创建的范围分区 (OrderDateRangePFN),存在五个分区;最后一个空分区将在 PRIMARY 文件组中创建。因为此分区永远不包含数据,所以不需要指定特殊的位置。
  CREATE PARTITION SCHEME OrderDatePScheme
  AS
  PARTITION OrderDateRangePFN
  TO ([2000Q3], [2000Q4], [2001Q1], [2001Q2], [PRIMARY])
  
  注意:如果所有分区都位于同一个文件组中,则可以使用以下更简单的语法:
  CREATE PARTITION SCHEME OrderDatePScheme
  AS
  PARTITION OrderDateRangePFN
  ALL TO ([PRIMARY])
  
  创建分区表
  
  定义分区函数(逻辑结构)和分区架构(物理结构)后,即可创建表来利用它们。表定义应使用的架构,而架构又定义函数。要将这三者结合起来,必须指定应该应用分区函数的列。范围分区始终只映射到表中的一列,此列应与分区函数中定义的边界条件的数据类型相匹配。另外,如果表应明确限制数据集(而不是从负无穷大到正无穷大),则还应添加 CHECK 约束。
  CREATE TABLE [dbo].[OrdersRange]
  (
  [PurchaseOrderID] [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 OrdersRangeYear
  CHECK ([OrderDate] >= '20030701'
  AND [OrderDate] <= '20040630 11:59:59.997'),
  [TotalDue] [money] NULL
  )
  ON OrderDatePScheme (OrderDate)
  GO
  
  建立索引:是否分区?
  
  默认情况下,分区表中创建的索引也使用相同的分区架构和分区列。如果属于这
【责编:admin】

--------------------next---------------------

阅读(82) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~