指定分区架构的完整语法如下:
ALTER TABLE Orders ADD CONSTRAINT OrdersPK PRIMARY KEY CLUSTERED (OrderDate, OrderID) ON TwoYearDateRangePScheme(OrderDate) GO ALTER TABLE dbo.OrderDetails ADD CONSTRAINT OrderDetailsPK PRIMARY KEY CLUSTERED (OrderDate, OrderID, LineNumber) ON TwoYearDateRangePScheme(OrderDate) GO
连接分区表连接对齐的表时,SQL Server 2005 提供了通过一个或多个步骤连接表的选项,通过此选项,可以先连接各个分区,然后将子集加起来。不管如何连接分区,SQL Server 都会评估是否可以实现某种程度的分区消除。
分区消除在下面的查询中,数据是从上一个方案中创建的 Orders 和 OrderDetails 表中查询的。该查询将只返回第三个季度的信息。通常,第三个季度包含订单处理较慢的月份,但在 2004 年,这些月份是订单最多的一些月份。在本例中,我们关心的是第三季度的 Products 趋势(订购的数量及其订单日期)。为了确保连接对齐的分区表时能够受益于分区消除,必须指定每个表的分区范围。在本例中,因为 Orders 表的主键是 OrderDate 和 OrderID 的组合键,这些表之间的连接显示表之间的 OrderDate 必须相等。SARG(搜索参数)将应用于两个分区表。检索此数据的查询如下:
SELECT o.OrderID, o.OrderDate, o.VendorID, od.ProductID, od.OrderQty FROM dbo.Orders AS o INNER JOIN dbo.OrderDetails AS od ON o.OrderID = od.OrderID AND o.OrderDate = od.OrderDate WHERE o.OrderDate >= '20040701' AND o.OrderDate <= '20040930 11:59:59.997' GO
如图 14 所示,查看实际或预测的示例输出时,要查看一些关键元素:首先(使用 SQL Server Management Studio),将光标悬停在所访问的表上时,您会看到“Estimated Number of Executions”或“Number of Executions”。在本例中,可以看到一个季度或三个月的数据。每个月都有自己的分区,而且查看此数据时可以看到执行了三次:每个表一次。
图 14 :执行次数如图 15 所示,SQL Server 正在消除所有不需要的分区,并且只选择包含正确数据的分区。请查看“Argument”部分中的 PARTITION ID:([PtnIds1017]),了解正在评估的内容。您可能想知道“PtnIds1017”表达式是从哪里来的。这是此查询中访问的分区的逻辑表示。如果您将光标悬停在示例顶部的“Constant Scan”上,您会发现它显示了参数 VALUES(((21)), ((22)), ((23)))。这代表分区号。
图 15 :分区消除要验证每个分区并且只验证这些分区中存在的数据,请使用前面使用的查询(经过稍微修改)访问分区的新的内置系统函数:
SELECT $partition.TwoYearDateRangePFN(o.OrderDate) AS [Partition Number] , min(o.OrderDate) AS [Min Order Date] , max(o.OrderDate) AS [Max Order Date] , count(*) AS [Rows In Partition] FROM dbo.Orders AS o WHERE $partition.TwoYearDateRangePFN(o.OrderDate) IN (21, 22, 23) GROUP BY $partition.TwoYearDateRangePFN(o.OrderDate) ORDER BY [Partition Number] GO
此时,您可以从图形上识别分区消除。可以对分区表和索引使用其他的优化方法,尤其是在它们与您要连接的表对齐的情况下。SQL Server 可以通过先连接每个分区来执行多个连接。
预先连接对齐的表在同一个查询中,SQL Server 不仅消除分区,还分别在其余分区之间执行连接。除了查看每个表访问的执行次数之外,请注意与合并连接相关的信息。如果将光标悬停在合并连接的上方,您会发现合并连接执行了三次。
图 16 :连接分区表在图 16 中,请注意执行了额外的嵌套环连接。看上去这是在合并连接后发生的,但实际上,分区 ID 已经传递给每个表搜索或扫描操作;最后这个连接只是将两个分区数据集连接起来,确保每个数据集都符合一开始(在“Constant Scan”表达式中)定义的分区 ID。
滑动窗口方案
当下一个月的数据(在本例中是 2004 年 10 月)可用时,将按特定的操作顺序使用现有的文件组、移入和移出数据。而在本销售方案中,目前 FG1 中的数据是 2002 年 10 月的数据。现在 2004 年 10 月的数据是可用的,因此,根据可用空间和存档要求,您有两个选择。记住,要将分区从表中快速移入或移出,移动操作必须只更改元数据。特别是,必须在要移入或移出的同一个文件组中创建新表(源或目标,即伪造的分区)。如果您打算继续使用相同的文件组(本例中为 FG1),则需要确定如何满足空间和存档要求。当表中没有完整的两个年度的数据时,为了最大程度地缩短时间,并且如果拥有足够的空间,您可以将当前数据(2004 年 10 月)加载到 FG1 中,而无需删除要存档的数据(2002 年 10 月)。但是,如果没有足够的空间同时保留当前月份和要存档的月份,则需要先移出旧的分区(然后再删除它)。
不管怎样,存档应该很容易,并且可能已经完成。好的存档做法是,加载和移入新分区之后立即备份文件组,而不要等到打算移出分区时再进行备份。例如,如果 RAID 阵列出现故障,则可以恢复文件组,而无需重新生成或重新加载数据。具体到本例中,因为数据库是最近才分区的,所以您可能已经在分区结构稳定后执行了完整的备份。当然,完整的数据库备份并非唯一的选择。在 SQL Server 2005 中可以实现各种各样的备份策略,而且许多备份策略都可以为备份和恢复提供更好的准确性。因为这么多的数据都是不变的,所以您可以在加载后备份各个文件组。实际上,这应该是滚动分区策略的一部分。有关详细信息,请参见 SQL Server Books Online的“Administering SQL Server”中的“File and Filegroup Backups”部分。
现在,策略已经就位,您需要了解确切的处理过程和语法。语法和步骤数可能看起来很复杂,但每个月的处理过程都是相同的。通过使用动态 SQL 执行,您可以按照以下步骤轻松地使此过程自动化:
•
管理将要移入的分区的分段表。
•
管理将要移出的分区的第二个分段表。
•
将旧数据移出分区表,并将新数据移入分区表。
•
删除分段表。
•
备份文件组。
后面各节详细介绍了每个步骤的语法和最佳做法,还提供了注释,以帮助您通过动态 SQL 执行使此过程自动化。
管理将要移入的分区的分段表
1.
创建分段表(将来的伪造分区)。这个分段表必须有一个约束,将其数据限制为只对要创建的分区有效的数据。为了获取更好的性能,将数据加载到未建立索引且未应用约束的堆中,然后在将表移入分区表之前添加约束(参见步骤 3)WITH CHECK。
CREATE TABLE SalesDB.[dbo].[OrdersOctober2004] ( [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, [TotalDue] [money] NULL ) ON [FG1] GO
在自动化过程中: 此表很容易创建,因为它总是代表当前月份。根据进程运行的时间,使用 DATENAME(m, getda






