网络编程
位置:首页>> 网络编程>> 数据库>> 在SQL Server 2000数据仓库中使用分区(2)

在SQL Server 2000数据仓库中使用分区(2)

作者:Alizze 来源:赛迪网 发布时间:2008-12-23 13:52:00 

标签:

您应该看到查询计划中仅包括表 1999。将该查询计划与主键已删除的相同表生成的查询计划相比较,我们会发现:表 2000 仍然被排除。将这些计划与在已删除 date_key 约束的架构上生成的查询计划进行对比。这些约束被删除的情况下,表 1999 和表 2000 都被包括在查询中。

请注意,在通常情况下,在大型表上执行查询时,使用“TOP N”语法是好的做法,因为它可以迅速返回结果并使用最少的服务器资源。查看分区表的查询计划时,这一点尤为重要,因为由“SELECT *”语句生成的查询计划很难解析。对于偶尔进行观察的人而言,尽管在查询执行期间,查询中仅使用相关的表,但表面看起来好象查询计划包括了 UNION ALL 视图的所有组件表。

将条件直接应用于事实表:

要获得最佳的查询性能,所有的查询都应将条件直接放在事实表中的筛选键上。将约束放在第二张表(例如日期矢量表)的查询将包括所有分区。对 UNION ALL 事实表的标准星号联合查询工作良好,将条件放在任意未分区的矢量表的属性上,以标准方式创建星号查询 WHERE 子句,包括分区矢量(日期)的属性。

在分区矢量架构上设计查询与在未分区的架构上设计完全一样,只不过将日期条件直接放在事实表中的日期键上时日期条件最为有效。

如果每一分区表的索引中的第一个列为带日期的簇索引,转到所有分区解析某一特定查询的开销相对较小。编写预定义的查询时应尽可能提高其效率,例如那些生成标准报表或渐变更新下行数据流数据库的查询。

分区键的选择

事实表可以在多个矢量上进行分区,但是大多数人可能仅按日期进行分区。如前面描述的,日期分区可以支持简单的“滚动窗口”管理, 较旧的分区甚至可以被保存在不同的位置,或者减少索引次数。同样,大多数对数据仓库的查询是按日期进行筛选的。

对于按日期分区的应用程序,决策变量为:

使多少数据保持联机状态?这项决策的主要依据是业务要求,同时要考虑保持大量数据联机的费效比。

如何设计日期键?数据仓库最好对矢量表和事实表使用代理键,这是得到广泛认可的。对于按日期分区的事实表,建议的做法为使用 yyyymmdd 形式的“智能”整数代理键。作为整数,与 8 字节的 datetime 相比较,该键仅使用 4 个字节。许多数据仓库使用 datetime 类型的自然日期键。

如何确定分区的大小?尽管上面的示例使用年分区,但大多数系统会划分得更细致,例如月、星期或天。尽管我们会注意到用户查询通常是按月或周进行的,但最重要的因素还是系统总体规模和可管理性。您可能还记得,任何一个 SQL 查询最多可以引用 256 张表。对于维护多于一个月的数据的数据仓库,按天来分区的 UNION ALL 视图会超过该界限。作为一个好的规则,如果事实表仅按日期分区,那么最好按星期分区。

定义分区的范围

BETWEEN 语法最直接、可读性最强、执行效率最高。以下述形式的按月分区为例:

date_key < 19990101

date_key BETWEEN 1990101 AND 19990131

date_key BETWEEN 19990201 AND 19990229

...

date_key BETWEEN 19991201 AND 19991231

date_key > 19991231

请注意其中的第一个和最后一个分区:即使您认为决不会有数据进入这些分区,这仍是一个定义分区的好方法,这样可以覆盖所有可能的日期值。同时,请注意尽管 1999 年不是闰年,但二月分区仍覆盖 2 月 29 日。该结构使设计创建分区和约束的应用程序时不需要判断是否为闰年。

随着时间流逝,要合并分区吗?为了使活动分区的数量最小,创建分区应用程序时,数据库管理员可以选择将日分区合并为星期分区或月分区。我们将在下面有关填充和维护分区的一节中详细讨论这种方法。

关于如何按日期分区的详细讨论同样适用于采用其他可能的分区键时的情形。

数据加载:如果新的数据具有与其他矢量对齐的明显倾向,或者例如,如果每个存储或附件是由不同的系统分发的,这些就是自然的分区键。

多维数据集数据查询:尽管并没有技术原因要求以相同的方式对关系型数据库和分析服务多维数据集进行分区,但这是通常采用的做法。如果做出这个假设,维护应用程序将得以简化。这样,即使关系型数据库的存在仅是用于填充分析服务多维数据集,在选择分区键时也应该考虑到一般的查询模式。

命名约定:命名水平分区事实表的成员表的规则应该从分区设计自然地引出。为获得最大的通用性,请在标题中使用完整的分区开始日期:即使分区每年进行一次,[sales_fact_yyyymmdd] 也比[sales_fact_yyyy] 好。

如果数据库支持多个大小的分区,命名约定应该反映每个分区的时间范围。例如,月分区使用 sales_fact_20001101m,日分区使用 sales_fact_20001101d。

成员表的名称对通过视图访问数据的最终用户是隐藏的,因此成员表的名称应该面向执行维护的应用程序。

下行数据流多维数据集的分区

如果关系型数据库仅用于支持分析服务多维数据集,就不必定义 UNION ALL 视图。这种情况下,该应用程序就不会受 256 个表的限制,但是建议您不要以这种无法定义 UNION ALL 视图的方式来对关系型数据仓库进行分区。

管理分区事实表

在分区管理已能够自动进行并通过测试之前,分区的数据仓库不应该正式投入使用。分区管理系统是一种简单的应用程序,该系统的一般要求在下面讨论。

假设分区是按日期进行

元数据

稳定的分区管理系统应由元数据驱动。只要确保能够编程访问元数据,就可以把元数据存储在任何位置。大多数数据仓库系统使用在数据仓库 SQL Server 或 Microsoft SQL Server Meta Data Services 上定义的自定义元数据表。

不论元数据的存储机制是什么,元数据的内容必须包括每个分区的以下信息:

分区名称:

1、创建分区的日期;

2、分区中数据的日期范围;

3、分区开始联机的日期(加入 UNION ALL 视图);

4、分区不再联机的日期(从视图中丢弃);

5、丢弃分区的日期。

作为数据仓库整个管理系统的一部分的其他元数据表,应该跟踪何时以及有多少数据被加载到每个分区。

创建新分区

分区管理系统的首要任务是创建新分区。应该安排周期性运行的任务,来创建用作下一个分区的新表。

执行该任务有许多有效的方式。建议的方法为使用 SQL-DMO(分布式管理对象)来创建与现有分区具有相同结构和索引的新表,但新表具有新的表名、索引名、分区键约束定义、文件组等等:

1、获取模板表定义(通常为最新的分区);

2、修改表和索引的 Name 属性,检查约束 Text 属性和其他属性;

使用 ADD 方法对表进行实例化,使用智能命名约定,用几行代码即可完成这项任务。

如本文后面将要讨论的那样,您的应用程序可以将分析服务分区用于数据仓库系统的多维数据集。如果这样,在 RDBMS 中创建分区的脚本和程序可以使用决策支持对象 (DSO) 继续创建相应的多维数据集分区。

填充分区

前面提到过,数据可以被加载入 UNION ALL 视图。理论上,这是表分区结构的一大功能,但在实践中不推荐将其用于数据仓库应用程序。不能将数据批量加载到 UNION ALL 视图;对于大到必须对表进行分区的数据仓库来说,加载进程将会太慢。

相反,数据仓库应用程序的设计必须使每一个周期都可以把数据快速加载到相应的目标表。如果数据分阶段应用程序在 SQL Server 数据转换服务 (DTS) 中实现,动态属性任务可以很容易地更改数据泵任务或批量插入任务的目标表的名称。

只要新分区没有加入 UNION ALL 视图,就不需要在系统停机时间加载数据。

数据仓库分阶段应用程序应该设计为可以处理不属于当前分区的新数据。如果数据仓库加载进程不是在一个夜晚完成,就可能发生这种特殊情况。其他系统要处理不断到来的旧数据。系统的设计必须考虑到这些例外情况的可能性、频率和数据量。

如果旧数据以足够低的量到达,最简单的设计就是使用可更新的 UNION ALL 视图来加载所有不属于当前分区的数据。

定义UNION ALL视图

一旦渐变加载成功完成,就必须重新修订 UNION ALL 视图。仍然建议使用 SQL-DMO 完成本任务:使用 ALTER 方法更改 VIEW 对象的 TEXT 属性。从上面所述的元数据表中导出视图定义中要包括的分区列表是最佳途径。

合并分区

表面上看来,将若干分区合并至单个较大分区似乎是多余的。不过,对于日加载量巨大同时加载窗口很小的数据仓库,通过下列措施可以显著改善加载性能:

1、用要加载的数据创建文本文件,按簇索引的顺序排序;

2、批量加载到空的日分区;

3、创建所有的非簇索引。

通过重新创建 UNION ALL 视图,使新分区保持联机。

通过自日分区插入、重新创建索引和重新生成 UNION ALL 视图,每周创建和填充新的周分区。然后就可以丢弃日分区。

数据变得陈旧后就移动至周甚至月分区,这样更多的分区可以联机保留在 UNION ALL 视图中。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com