SQL Server 2005 关系数据库引擎包含一些对数据仓库样式应用程序设计和维护大有帮助的功能。这些功能包括:
• |
对于超大型的表而言,表分区可快速数据的加载速度,并简化维护过程。 |
• |
轻松创建报告服务器 |
• |
Transact-SQL 方面的改进包括新增的数据类型和新增的分析功能 |
• |
联机索引操作 |
• |
细化备份/还原操作 |
• |
快速初始化文件 |
报告服务器
要想将关系操作报告从事务处理数据库中分离出来,经常采用的一项技术便是维护一台报告服务器。报告服务器对事务处理数据库映像的维护一般都有一定的时间延迟,通常截止到前一天。报告服务器多用于报告功能和数据仓库提取。
Microsoft SQL Server 2005 新增了两项功能,使报告服务器的创建和维护过程变得更加简单。SQL Server 报告服务器的延迟时间与以前相比大大缩短。同时,报告服务器被设计为充当事务处理系统的备选系统。
要创建报告服务器,先要创建一个数据库镜像,这是 SQL Server 2005 的新增功能,它为系统的高可用性提供了一个紧急备用系统。更多信息,请阅读联机丛书的“数据库镜像概念”主题。数据库镜像不能够直接查询,这时第二个新增功能就能派上用场了。
在镜像上创建一个数据库视图。数据库视图是数据库在某个时点的只读副本。数据库视图并非数据库的完整副本;极为节省空间。多个数据库视图还是可以同时共存,虽然维护数据库视图会对数据库视图所基于的事务处理数据库产生一定的影响。更多信息,请阅读联机丛书的“了解数据库视图”主题。
通过在数据库镜像上创建数据库视图,您可轻松为系统的高可用性创建备用服务器,此服务器还可用作报告服务器,起着双重作用。
表分区
分区表和分区索引将数据分割到多个水平单元中,以便于将行组映射到单独的分区中。而对数据执行操作(如查询)时,又可以将整个表或索引作为一个整体来执行。
分区可以:
• |
改善数据表和索引的可管理性。 |
• |
改善多 CPU 机器上的查询性能。 |
在关系型数据仓库中,事实数据表比较适合应用表分区,而按日期范围分区又是最常见的分区策略。
正如联机从书的“创建分区表和索引”主题中所描述的,定义分区表可分为三个步骤:
1. |
创建一个分区函数,指定使用此函数的表如何分区。 |
2. |
创建一个分区方案,指定应用此分区函数的分区在文件组上的位置。 |
3. |
使用此分区方案创建一个表或索引。 |
多个表可以使用同一个分区方案。
本文讨论了事实数据表的“范围”分区,但其目的并非是针对表分区的完整讨论或教程。有兴趣的读者请参阅 SQL Server 联机丛书。
最常用的分区方案是按日期范围(如年、季、月或甚至天)对事实数据表进行分区。在大多数情况下,对大型事实数据表进行日期分区可以提供良好的可管理性收益。为了改善查询性能,应尽量使用相同的分区方案对时间维度表进行分区。
• |
分区表和未分区表的行为方式相同。 |
• |
针对表的查询能够得到正确解析。 |
• |
针对表的直接插入、更新和删除会被自动解析到适当的分区。 |
使用数据表分区快速加载数据
许多数据仓库应用程序都力求在越来越小的加载窗口中加载越来越多的数据量。典型的流程是这样的,先从几个源系统中提取数据开始,接下来便是在这些系统间清理、转换、合成和合理化数据。数据管理应用程序被限制为在加载窗口中完成整个提取、转换和加载流程。通常,系统的业务用户都强烈要求将数据仓库查询时的不可用时间降至最低。在设计时,数据管理应用程序的“写入”步骤(即将新数据插入到现有数据仓库的步骤)必须在短时间内完成,且要最小化对用户造成的影响。
为了非常快速地加载数据,数据库恢复模型必须为“批量记录”恢复模式或“简单”恢复模式,而数据表必须为空,或是包含数据但不包含索引。如果满足这些条件,不作记录的加载便成为可能。在 SQL Server 2000 中,分区表出现以前,这些条件通常只在初始历史数据仓库加载中才能满足。一些具有大型数据仓库的客户已通过在分散的物理表上搭建 UNION ALL 视图,构建了一个准分区结构;这些数据表都使用不记录技术填充每个加载周期。这一方法并不尽如人意,而 SQL Server 2005 分区表则提供了更为优秀的功能。
在 SQL Server 2005 中,您不能直接在分区中执行不记录加载。但是,却可以将数据加载到将调用伪分区的单独表中。在特定条件下,您可以用执行速度极快的元数据操作将伪分区切换到分区表中。此技术可满足我们的两个要求:
• |
最小化整体加载时间:在不作记录的情况下执行伪分区加载,以及 |
• |
最小化对最终用户的影响,并确保数据仓库的完整性:伪分区可以在用户查询数据仓库时被加载。在执行分区切换之前,数据管理应用程序会等到所有事实数据表全部加载完毕为止。分区切换的执行速度非常快,反应时间通常不到一秒。 |
此外,伪分区还可作为单独的表进行备份,从而改善系统的可管理性。
使用表分区快速删除数据
许多数据仓库在数据仓库中保留了一个详细活动数据的滑动窗口。例如,事实数据表可能包含三年、五年或十年的数据。每到一个时间周期,便从数据表中删除最旧的数据。持续删除数据的主要原因在于要提高查询性能并最小化存储成本。
SQL Server 2005 分区使大型分区事实数据表中旧数据的删除倍加轻松。如上所述,简单地创建一个空白伪分区,然后将其切换到分区表中。分区表在其曾植入分区的地方有一个空白分区;伪分区在其曾为空白的地方包含数据。用户可以根据需要对伪分区进行适当的备份、截断或删除。
或者,您还可以选择重新定义分区函数,将所有空白分区合并到一个分区中。
Transact-SQL 方面的改进
新的数据类型
SQL Server 2005 中有一些很重要的新类型,这些类型对数据仓库大有裨益:
• |
Varchar(max)、nvarchar(max) 和 varbinary(max) 支持 2GB 的数据,对于 text、ntext 和 image 数据类型非常有用。这些扩展的字符类型可能对在数据仓库中保存扩展的元数据和其他说明性信息非常有用。 |
新的分析功能
许多新分析功能都提供了 Transact-SQL 中的基本分析功能。这些功能在那些允许用户查询关系数据库,而不是通过 Analysis Services 排他查询数据的数据仓库中非常有用。另外,在数据中转过程中,这些复杂的计算常被用来开发有价值的数据属性。
ROW_NUMBER。返回结果集的连续行号。
RANK。返回行在结果集中的等级。在通常情况下,RANK 值与有序数据集上的 ROW_NUMBER 值相同。但对于那些彼此之间有关联的行来说,则是所有具有相同排序值的行都有相同的等级。而下一个等级则又与 ROW_NUMBER 值相同。换句话说,如果在第一个位置存在双向关联,那么行 1 和行 2 的 RANK 就都为 1,而行 3 的 RANK 则为 3。不存在 RANK 为 2 的行。
DENSE_RANK。返回行在结果集中的等级。DENSE_RANK 函数与 RANK 相似,只是去除了 RANK 函数所留下的空隙。在上面的示例中,行 1 和行 2 的 RANK 为 1,而行 3 的 RANK 则为 2。
NTILE。将有序集分成指定数量、大小近似相等的组。
在 SQL Server 2005 Beta 2 中还不能使用这些函数。
PIVOT 和 UNPIVOT 操作符
PIVOT 操作符可以按查询中的中断值旋转结果集,从而使您可以生成交叉数据报告。例如,如果表中在两个不同的行中包含 "Actuals" 和 "Budgets" 数据,则使用 PIVOT 操作符将可以生成带有 [Actuals] 和 [Budgets] 列的交叉数据报告。
与之相似,UNPIVOT 操作符可以将一行拆分为若干行。在此示例中,带有 [Actuals] 和 [Budgets] 列的行集可以被转换为包含这些值的多个行。
在以前的 SQL Server 版本中,用户能够编写复杂的 Transact-SQL Select 语句来旋转数据。PIVOT 和 UNPIVOT 操作符则为数据旋转提供了更为简单的机制。
递归查询
在许多方案中,“递归查询”都是非常有用的。SQL Server 2005 中的新增功能令递归查询成为可能,虽然此项功能还不是十分简单易用。
递归查询是针对自联接表的查询。自联接表的两个常见示例有保存员工及其经理信息的数据表,和保存材料清单的数据表。在 AdventureWorks 数据库的 Employee 表中对自联接数据表进行了说明。
查询自联接表的直接关系通常十分简单,如查询直接向经理报告的员工数量。但是,如果要回答“经理的组织中有多少名员工?”这样一个问题却十分困难。
SQL Server 2005 中的关系数据库功能解决了这一问题,这一功能被称为“递归通用表表达式”。“附录”中包含一个递归查询的示例,该示例回答了以上定义的问题。联机丛书的 "WITH <common_table_expression>" 主题中包含更多的相关信息。