日期:2014-05-18  浏览次数:20434 次

SQL2005表分区的一个问题,请高手帮帮忙,谢谢!
我在一个大容量表上建成了分区表,分区字段为一个时间类型的字段(FWriteTime)。
我现在碰到的问题是
        我在查询的时候,一定要用到分区字段(FWriteTime)吗?如果不用,会不会降低速度?


------解决方案--------------------
--引用SQL SERVER2000帮助
使用分区视图
分区视图允许将大型表中的数据拆分成较小的成员表。根据其中一列中的数据值范围,将数据在各个成员表之间进行分区。每个成员表的数据范围都在为分区列指定的 CHECK 约束中定义。然后定义一个视图,以使用 UNION ALL 将选定的成员表组合成单个结果集。引用该视图的 SELECT 语句为分区列指定搜索条件后,查询优化器将使用 CHECK 约束定义确定哪个成员表包含这些行。

例如,记录 1998 年销售额的 sales 表分区成 12 个成员表,每个月是一个成员表。每个成员表在 OrderMonth 列上都定义了约束:

CREATE TABLE May1998Sales
(OrderID INT PRIMARY KEY,
CustomerID INT NOT NULL,
OrderDate DATETIME NULL
CHECK (DATEPART(yy, OrderDate) = 1998),
OrderMonth INT
CHECK (OrderMonth = 5),
DeliveryDate DATETIME NULL,
CHECK (DATEPART(mm, OrderDate) = 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 表中的行,从而将其搜索范围限制在这些表上。

分区视图返回正确的结果并不一定非要 CHECK 约束。但是,如果未定义 CHECK 约束,则查询优化器必须搜索所有表,而不是只搜索符合分区列上的搜索条件的表。如果不使用 CHECK 约束,则视图的操作方式与带有 UNION ALL 的任何其它视图相同。查询优化器不能对存储在不同表中的值作出任何假设,也不能跳过对参与视图定义的表的搜索。

如果分区视图所引用的所有成员表都在同一服务器上,则该视图是本地分区视图。如果成员表在多台服务器上,则该视图是分布式分区视图。分布式分区视图可用于在一组服务器间分布系统的数据库处理工作量。

分区视图使独立地维护成员表变得更容易。例如,在某个阶段结束时:

可以更改当前结果的分区视图定义以添加最新的阶段和除去最早的阶段。


可以更改以前结果的分区视图定义以添加刚从当前结果视图中除去的阶段。也可以更新以前的结果视图以删除或存档该视图所包含的最早阶段。
将数据插入到分区视图中后,就可以使用 sp_executesql 系统存储过程创建 INSERT 语句,该语句带有在有许多并发用户的系统中重新使用几率较高的执行计划。


------解决方案--------------------
查询中可以不用分区列

默认情况下, 普通索引会与你的数据分区对齐(除非你为索引指定另外的分区方案). 所以走普通索引也会从分区表获益.

但不走索引的话, 是表扫描的方案, 如果你的服务器是多CPU, 而且不同的数据分区在不同的物理磁盘上, 则表扫描会在多个分区上并行, 这样也能从分区表获益