我们推荐本文的读者已经阅读并且理解以下的文章:
◆使用一个Microsoft SQL Server 2000数据仓库中的分区- http://msdn.microsoft.com/library/default.asp?URL=/library/techart/PartitionsInDW.htm
◆SQL Server 2000 步进的批量导入案例学习 - SQL/2000/maintain/incbulkload.mspx">http://www.microsoft.com/technet/prodtechnol/SQL/2000/maintain/incbulkload.mspx
◆Kimberly L. Tripp 所作的SQL Server 2005 分区表和索引 -
SQLskills.com/resources/Whitepapers/Partitioning%20in%20SQL%20Server%202005%20Beta%20II.htm">http://www.SQLskills.com/resources/Whitepapers/Partitioning%20in%20SQL%20Server%202005%20Beta%20II.htm
本白皮书关注的重点是关系型数据仓库和表分区。它的目标读者是:
◆通过使用Microsoft SQL Server中的分区视图实现了分区的开发人员和数据库管理员。这类读者将会得益于SQL Server 2005中的分区优势以及关于滑动窗口实现和策略的部份。
◆在未来计划使用分区的开发人员和数据库管理员将会通过详细阅读本白皮书而获益非浅。
数据库和系统管理员将会得益于有关存储域网络管理以及优化I/O利用策略的部份。
内容列表
对一个关系型数据仓库进行分区
关于关系型数据仓库
分区的好处
在 SQL Server 7.0/2000中的分区技术
在SQL Server 2005中的分区技术
在SQL Server 2005中分区的优势
标识一个查询计划中的 Demand Parallelism
从SQL Server 2000的分区视图迁移到 SQL Server 2005 分区表/索引
影响关系型数据仓库分区的因素
数据量
数据导入
索引
数据老化
数据存档
查询性能
滑动窗口实现
交换分区的最佳实践
将数据存储到一个性价比高I/O子系统的技术
关系型数据仓库的分区策略
策略 I – 将一个分区绑定到它自己的文件组
策略Strategy II – 将两个或更多分区绑定到同样的文件组
哪个策略更好?
结论
附录 A: 性能数值
批量插入性能
转换性能
索引构建性能
数据库备份性能
老化数据到ATA 磁盘
附录 B: 平台列表
Microsoft 软件
服务器平台
存储
主机总线适配卡
存储管理软件
附录 C: 服务器体系结构
附录 D: EMC CLARiiON 存储
拓朴
附录 E: 存储隔离
配置你的存储
附录 F: 脚本
对一个关系型数据仓库进行分区
以下的部份将会简要的解释关系型数据仓库的概念,为关系型数据仓库进行分区的好处,以及迁移到Microsoft® SQL Server™ 2005分区的好处。
关于关系型数据仓库
关系型数据仓库提供了一个广泛的数据来源以及一个用来构建业务智能(BI)解决方案的体系结构。另外,关系型数据仓库可以为报表应用程序以及复杂且专用的SQL查询所用。
一个典型的关系型数据仓库是由维度表以及事实表组成的。维度表通常会比事实表小一些并且其中提供了关于解释事实的属性的详细信息。一个维度的例子是货物,商店和时间。事实表提供了对商业记录的描述,比如在所有商店中货物销售的信息。事实表通过最近收集到的数据进行不断的更新。
一个成功的关系型数据仓库解决方案的实现包括细致而长期的规划。以下列出了在构建一个关系型数据仓库时要考虑的要素:
◆数据量
◆数据导入窗口
◆索引维护窗口
◆工作负载特征
◆数据老化策略
◆存档和备份策略
◆硬件特征
这个文档后面的部份将会有对以上要素的详细讨论。
一个关系型数据仓库在实现时可以采用分区的方法或者一个(巨大)事实表的方法。对于使用分区还是不分区方式的设计选择主要依赖于前面列出的各个要素。关系型数据仓库可以从数据分区中获益。以下部份着重谈到了分区为关系型数据仓库带来的好处。
分区的好处
当组织中的数据库向上扩展并且包含了大量的数据时,非常关键的是保持其高可用性并同时适应对小的数据库维护窗口的需要。这些需求使得分区成为对于超大型数据库而言的一个量身定制的技术。分区技术所强调的关键问题是——通过将非常大的表分解成相对较小的分区从而使诸如数据导入,老化以及存档等重要任务的管理更易于进行。Microsoft SQL Server通过在SQL Server 7.0/2000中的分区视图以及在SQL Server 2005中添加的对分区表的支持提供了分区技术。
在 SQL Server 7.0/2000中的分区技术
SQL Server 7.0通过分区视图引入了对分区技术的支持。在SQL Server 2000中,这一功能进行了增强支持了可更新的分区视图。当事实表可以被自然的分割或者根据数据范围划分成单独的表时,对于关系型数据仓库而言分区视图技术是再合适不过的了。分区视图的基表可以被UNION来表示成一个统一的数据集。分区视图大大降低成本应用程序的复杂性,原因是物理实现被从应用程序数据访问方式中抽象了出来。
在SQL Server 2000中,分区视图可以被扩展到包括分布式分区视图,从而启用跨多个服务器/实例的数据库联合。有关分布式分区视图的讨论超出了本文的范围。对此更详细的讨论,请参阅微软开发人员网络(MSDN)上的“分布式分区视图”,地址是:SQL/evaluation/features/distpart.asp!href(http://www.microsoft.com/SQL/evaluation/features/distpart.asp">http://www.microsoft.com/SQL/evaluation/features/distpart.asp!href(http://www.microsoft.com/SQL/evaluation/features/distpart.asp.
在SQL Server 2005中的分区技术
在SQL Server 2005中通过使用表和索引的分区,可以降低在使用分区视图管理非常大的数据库时的复杂性。SQL Server 2005提供了用数据行作为最小的分区单位的水平范围分区功能。可以被分区的对象有:
◆基表
◆索引(聚簇和非聚簇的)
◆索引视图
范围分区是通过自定义的数据范围定义的表的分区。用户通过分界值,一个使用文件组映射的分区架构,以及映射到分区架构的表来定义分区函数。一个分区函数决定了一个表或索引中特定的一行所属于的分区。每个分区都是用一个通过一个分区架构映射到某个存储位置(文件组)的分区函数来定义的。对于在SQL Server 2005中实现分区的全面讨论,请参阅MSDN中的"SQL Server 2005 分区表和索引"。
以下部份阐述了SQL Server 2005中分区功能的优势并提供了将分区表迁移到SQL Server 2005的策略。
在SQL Server 2005中分区的优势
在SQL Server 2005中的表和索引的分区功能通过将其分解为更易管理的分区大大方便了对超大型数据库的管理。这一部份涉及了一些在针对关系型数据仓库的使用中分区表相对于分区视图的优势。
管理
一个使用分区视图的缺点是当你使用它的时候,数据库操作必须对单个的对象执行而不是对视图本身。举个例子,如果一个现存的索引必须被删除并且要创建一个新的索引,这些操作必须在每个相关的基表上执行。
在SQL Server 2005中,诸如索引维护这样的数据库操作是对分区表本身而不是底层的相关分区上进行的,因而在管理索引过程中大大减轻了负担。
更好的Parallelism机制
在SQL Server 2000中,操作是在单个表上执行的并且数据在一个分区视图的级别进行聚合。来自于基表中的行通过使用串联运算符进行汇集并显示视图。然后再在结果集数据上执行聚合。
在SQL Server 2005中,对分区表执行的查询使用了一个被称为demand parallelism的新的运算符。Demand parallelism受到系统资源和MAXDOP设置的影响。
使用分区表的查询将会比使用分区视图进行的同样查询更快的进行编译。当使用分区视图时查询的编译时间是与分区的数量成正比的,而使用分区表时查询的编译时间不会受到分区数量的影响。
在某些情况下,对分区视图进行查询可能会更好一些。以下描述了这样的情况:
◆当优化器选择使用demand parallelism时,parallelism的最小单位是一个分区。在SQL Server 2005中对一个分区表中的单个分区进行查询的性能可能不太好,原因是parallelism的级数被限制到了1。同样的查询如果对一个分区视图进行可能会好一些,原因是在一个分区内更好的parallelism
◆当分区的数量少于处理器的数量时使用分区视图会更好一些,原因是通过parallelism可以更好的使用处理器资源。当分区的数量大于处理器数量,而数据并不是在分区间平均分布时,对分区表查询的性能可能仍旧不太好
◆当分区中的数据分布不均时使用对分区视图的查询也会更好一些
标识一个查询计划中的 Demand Parallelism
下面是一个查询计划的示例,它是由一个加法聚合查询产生的。
划了红圈的部份标明了在查询计划中出现的demand parallelism。嵌套循环运算符左边的子demand parallelism是用分区ID来表示的。嵌套循环运算符右边的子demand parallelism是用分区表自身来表示的。在这张图表中,对于由左边的子demand parallelism所返回的每一个分区ID,一个并行的索引查找运算符对来自对应的分区中的行进行反复扫描。所有在嵌套循环运算符上进行的操作也受到由demand parallelism所建立的并行线程的数量的影响。左边的子demand parallelism表示了仅当分区剪切生效时,也就是当查询通过分区筛选结果时,被查询所影响的分区ID。
498)this.style.width=498;" border=0>
图表1:标识 demand parallelism