使用分区视图
分区视图允许将大型表中的数据拆分成较小的成员表。根据其中一列中的数据值范围,在各个成员表之间对数据进行分区。每个成员表的数据范围都在为分区依据列指定的 CHECK 约束中定义。然后定义一个视图,以使用 UNION ALL 将选定的所有成员表组合成单个结果集。引用该视图的 SELECT 语句为分区依据列指定搜索条件后,查询优化器将使用 CHECK 约束定义确定哪个成员表包含相应行。
注意 |
---|
对服务器上的数据进行分区的首选方法是通过分区表。有关详细信息,请参阅 已分区表和已分区索引。 |
例如,记录 1998 销售额的销售表已分区为 12 个成员表,每月一个表。每个成员表都具有对 OrderMonth 列定义的约束:
CREATE TABLE May1998sales
(OrderID INT,
CustomerID INT NOT NULL,
OrderDate DATETIME NULL
CHECK (DATEPART(yy, OrderDate) = 1998),
OrderMonth INT
CHECK (OrderMonth = 5),
DeliveryDate DATETIME NULL
CHECK(DATEPART(mm, DeliveryDate) = 5)
CONSTRAINT OrderIDMonth PRIMARY KEY(OrderID, OrderMonth)
)
填充 May1998sales 的应用程序必须确保 OrderMonth 列中所有行的值都为 5,并且订单日期指定 1998 年 5 月中的某一日期。这由表中定义的约束强制实现。
然后,定义一个视图,使该视图使用 UNION ALL 从作为单一结果集的所有 12 个成员表中选择数据:
CREATE VIEW Year1998Sales
AS
SELECT * FROM Jan1998Sales
UNION ALL
SELECT * FROM Feb1998Sales
UNION ALL
SELECT * FROM Mar1998Sales
UNION ALL
SELECT * FROM Apr1998Sales
UNION ALL
SELECT * FROM May1998Sales
UNION ALL
SELECT * FROM Jun1998Sales
UNION ALL
SELECT * FROM Jul1998Sales
UNION ALL
SELECT * FROM Aug1998Sales
UNION ALL
SELECT * FROM Sep1998Sales
UNION ALL
SELECT * FROM Oct1998Sales
UNION ALL
SELECT * FROM Nov1998Sales
UNION ALL
SELECT * FROM Dec1998Sales
例如,以下 SELECT 语句查询有关特定月的信息。
SELECT *
FROM Year1998Sales
WHERE OrderMonth IN (5,6) AND CustomerID = 64892
SQL Server 查询优化器可以识别 SELECT 语句中其搜索条件为仅引用 May1998Sales 表和 Jun1998Sales 表中的行。因此,它将其搜索范围限制在这些表。
要在分区视图上执行更新,分区依据列必须是基表主键的一部分。如果视图不可更新,可以对允许更新的视图创建 INSTEAD OF 触发器。应该在触发器中设计错误处理以确保不会插入重复的行。有关在视图上设计 INSTEAD OF 触发器的示例,请参阅设计 INSTEAD OF 触发器。
分区视图返回正确的结果并不一定需要 CHECK 约束。但是,如果未定义 CHECK 约束,则查询优化器必须搜索所有表,而不是只搜索符合分区依据列上的搜索条件的表。如果不使用 CHECK 约束,则视图的操作方式与使用 UNION ALL 的任何其他视图相同。查询优化器不能对存储在不同表中的值作出任何假设,也不能跳过对参与视图定义的表的搜索。
如果分区视图引用的所有成员表都在同一台服务器上,则该视图是本地分区视图。如果成员表在多台服务器上,则该视图是分布式分区视图。分布式分区视图可用于在一组服务器间分布系统的数据库处理负荷。有关详细信息,请参阅联合数据库服务器。
通过分区视图可以较轻松地独立维护成员表。例如,在某个阶段结束时可以执行下列操作:
可以更改当前结果的分区视图定义以添加最新的阶段并删除最早的阶段。
可以更改以前结果的分区视图定义以添加刚从当前结果视图中删除的阶段。也可以更新以前的结果视图以删除或存档该视图所包含的最早阶段。
将数据插入到分区视图中后,就可以使用 sp_executesql 系统存储过程创建 INSERT 语句,该语句包含在有许多并发用户的系统中重新使用几率较高的执行计划。
注意 |
---|
bcp 命令、BULK INSERT 和 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句均不支持向分区视图进行大容量导入。但是,您可以使用 INSERT 语句在分区视图中插入多个行。 |