数据仓库:事实表的水平分区
分区是管理大型数据库表的有效手段。表的水平分区是对表的行进行分区,分区后表的行会被划分为若干不重叠的小单元。通过FOR VALUES语句可以为这些分区单元指定边界范围值。要将事实表进行水平分区,我们首先需要创建一个分区函数和一个分区方案,然后再创建分区表。
MyDateRangePF是分区函数的名称。在本例的环境中,分区列通常是datetime数据类型的列,例如本例中为Date_of_Event列。将datetime记录分离为不重叠的组很简单。例如,如果业务规则和已知的业务查询都表明按照销售事件发生的日期来分割表是合理的话,那么你就可以将数据分割成两年一组,就像上面的分区函数命令中所示。
(datetime)指定了分区列的数据类型,而RANGE LEFT规定了FOR VALUES所定义的边界日期属于每个边界值间隔的哪一侧。在范围分区中,如果要分为四个分区,就定义三个边界值,设置边界值有两种方法:RANGE LEFT或RANGE RIGHT。RANGE LEFT指定每个值为每个分区的上边界,而RANGE RIGHT则指定每个值为下一个分区的下边界。例如,上面的RANGE LEFT分区函数将数据分为四个分区,每个分区的取值范围如下表所示。如果用RANGE RIGHT来替代上述命令的RANGE LEFT,而使用相同的边界值,那么其分区取值范围会发生变化,见下表。
|
分区 |
P1 |
P2 |
P3 |
P4 |
|
RANGE LEFT 取值范围 |
<= |
> <= |
> <= |
> |
|
RANGE RIGHT 取值范围 |
< |
>= < |
>= < |
>= |
从上面的表格可以看出,如果销售事件发生的日期是2005年1月1日,那么对于RANGE LEFT分区函数,你会在第二个分区中找到这条记录,而对于RANGE RIGHT分区函数,则要在第三个分区中找到该记录。为了数据的一致性,也为了方便查询,建议对所有创建的分区表都统一选择其中一种方法设置边界值。
每一个分区的取值范围都在FOR VALUES语句明确规定了其边界值。注意,如果你使用datetime数据类型作为边界值,则必须为日期时间设定一个国际标准,特别是对在不同的时区都有分部的企业来说更是如此。SQL Server将美国英语作为该会话的默认语言,如果实际使用的是其他语言,必须创建用户自定义函数将不同的日期格式转换为美国英语格式,并在FOR VALUES子句中引用该自定义函数。
创建分区方案
现在分区函数已经创建完毕,接下来要创建一个分区方案。分区方案可以将以分区表或已分区索引的分区映射到不同的文件组,可以使用以下命令创建分区方案:
CREATE PARTITION SCHEME MyPartitionScheme
AS MyDateRangePF
TO (MyFilegroup1, MyFilegroup2, MyFilegroup3, MyFilegroup4, MyFilegroup5)
MyPartitionScheme是分区方案的名称,而MyDateRangePF则是使用该分区方案的分区函数的名称。该命令将分区函数所创建的分区映射到指定的一个或多个文件组。在上面的例子中,对分区按照Date_of_Event列使用分区函数MyDateRangePF的表的分区会按照下表所示分配到各个文件组:
|
分区 |
P1 |
P2 |
P3 |
P4 |
|
RANGE LEFT 取值范围 |
<= |
> <= |
> <= |
> |
|
文件组 |
MyFilegroup1 |
MyFilegroup2 |
MyFilegroup3 |
MyFilegroup4 |
上面的CREATE PARTITION FUNCTION命令包含了三个边界值和四个分区。不管分区是按照RANGE RIGHT还是RANGE LEFT创建的,分区数都比边界值数大1,每个表最多可以有1000个分区。那么为什么在本例中,分区数只有四个,却设置了五个文件组而不是四个呢?在SQL Server中,当分区数少于文件组数的时候,会将第一个没有分配分区的文件组标记为NEXT USED,作为候选待用文件组,如本例中的MyFilegroup5。下面我们来看看在分区方案中,这个NEXT USED文件组是如何使用的而其重要性又有多大。
- 本文关键词:

