⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 41068.htm

📁 一本很基础的SQL讲解
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<P>老化的数据可以被存档并且可以通过还原相应的备份在必要时取回,或者它也可以被移动到一个更低持久性,但更大I/O承受能力的始终可用以进行用户查询的子系统。</P>
<P>下面的图表展示了一个来自我们的测试场景的滑动窗口具体实现。在我们的测试场景中,从分布在全国的商店那里收集与消费者相关的销售数据。数据被导入,纯化,以及聚合来为商业决策提供支持。在我们的测试场景中,一个分区逻辑的代表了一周的有效数据。当前,八周的有效数据被标识为活动的。活动的数据比老化的数据的查询频率高很多。当有新的数据进来,老化的数据就会移出。这儿有一条业务规则表明老化的数据应当保持在线但是应当存储在一个经济有效的I/O子系统中。</P>
<P><A href="/files/uploadimg/20070227/1712312.jpg" target=_blank><IMG height=897 alt="" src="/files/uploadimg/20070227/1712312.jpg" width=450 border=0></A>&nbsp;</P>
<P><STRONG>图表2:滑动窗口方案</STRONG></P>
<P>在SQL Server 2000中,滑动窗口可以使用分区视图来实现。缺点是分区视图必须被重新绑定来包括进在UNION视图中的新生成的数据。重新绑定需要一个元数据锁并且可能会被任何对现存视图或者基表的访问所阻塞。</P>
<P>通过对使用Transact-SQL语句将分区交换进和交换出的支持SQL Server 2005提供了一个对滑动窗口方案的更佳实现。交换分区需要在分区表上放置一个架构锁。当没有其它的进程在分区表上获取了一个表级别的锁时分区可以被交换进和交换出。如果分区被其它的进程使用或者如果其它的进程已经在分区表上获取了一个表级别的锁,交换分区的构建进程将会等待直到其它进程已经释放了锁。分区交换是一个对元数据的操作因而非常快速。</P>
<P>下面的步骤可以用来在SQL Server 2005中使用分区表实现一个滑动窗口方案:</P>
<P>◆创建分区函数,架构以及带有适当分界点和关联文件组的表。然后按照下面描述的四个步骤来执行初始导入<BR>◆创建代表单个分区的表<BR>◆分别地填充表<BR>◆向表中添加约束检查来将数据值绑定到对应的范围上并且创建适当的索引。SQL Server 2005在创建分区表后创建初始索引时提供了一个额外的选项<BR>◆将新近填充好的表交换进分区表的每一个分区<BR>◆在初始导入之后,在一个表中任何新导入和交换进来的数据都不会成为分区表的一部份。一旦数据已经就绪,在设置好适当的分界点后表就可以被交换进分区表<BR>◆类似的,老化数据可以被移动到更经济有效的I/O子系统但是仍然在线并保持可用状态</P>
<P>接下来的部份涉及了一些针对分割分区表以及将分区交换进分区表的最佳实践。</P>
<P>#p#</P>
<P><STRONG>交换分区的最佳实践</STRONG></P>
<P>只有当目标表或者分区是空的时滑动窗口方案才工作。例如,如果一个分区“P”属于分区表“PT”,它必须被交换出到表“T”,随后目标表“T”必须被清空。类似的,当将表“T”交换进分区表“PT”的分区“P”,目标分区“P”应当是空的。</P>
<P>当跨分区的数据移动被最小化时,滑动窗口方案工作最佳。下面的代码定义了分区函数和分区架构。当在这个分区架构上创建一个表时,分区表将会包括三个分区。第一个分区将会包含带有<=200401的键值的数据;第二个带有>200401 且 <=200403的键值;第三个带有>200403的键值。</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>CREATE PARTITION FUNCTION SALES_MONTHLY_PARTITION_FUNCTION (INT)<BR>AS RANGE LEFT FOR VALUES ( 200401, 200403 )<BR>GO<BR>CREATE PARTITION SCHEME SALES_MONTHLY_PARTITION_SCHEME AS </P><P>  PARTITION SALES_MONTHLY_PARTITION_FUNCTION ALL TO ([PRIMARY])<BR>GO<BR>CREATE TABLE t<BR>(<BR>&nbsp;col1&nbsp;&nbsp;&nbsp;INT<BR>)ON SALES_MONTHLY_PARTITION_SCHEME(col1)<BR>GO</P></PRE></TD></TR></TBODY></TABLE></P>
<P>当使用ALTER PARTITION函数的分割功能添加一个值为200402的新分界时,行会在相应的分区间移动。</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>ALTER PARTITION FUNCTION PARTITION_FUNCTION()<BR>SPLIT RANGE (200402)<BR>GO</P></PRE></TD></TR></TBODY></TABLE></P>
<P>通过在原始的位置删除行以及在新的位置添加行,行可以在分区间移动。和此次交换有关的分区在这一期间是不可访问的。在这个例子中,新建的第二个分区将会拥有在键值范围>200401 且 <=200402内的数据。带有对应键值的数据被从第二个分区中删除并且插入到新的分区。新的分区(>200401 且 <=200402)以及第三个分区(>200402 且 <=200403)在这一期间是无法访问的。</P>
<P>在我们的消费者场景中,新的数据是通过在活动的结尾处分割分区函数来添加的。老的数据是通过在老化的结尾处合并分区函数来删除的。这种实现滑动窗口的方式消除了在交换进和交换出分区时的跨分区的数据移动,也就是说,新的数据被批量的导入到一个表中并且随后通过在活动的结尾处分割它来交换进分区表,具体如下所示:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>ALTER TABLE NEW_PARTITION SWITCH TO PARTITIONED_TABLE PARTITION </P><P>  $partition.WEEK_PARTITION_FUNCTION (200404)<BR>GO</P></PRE></TD></TR></TBODY></TABLE></P>
<P>对于更多的信息,请参阅在SQL Server联机丛书中的“设计分区来管理数据子集”</P>
<P><STRONG>将数据存储到一个性价比高I/O子系统的技术</STRONG></P>
<P>一个滑动窗口的具体实现可以通过将老化的数据滑动到一个性价比高的I/O子系统中来进行扩展。例如,在我们的测试场景中,我们将老化的数据从一个高性能的I/O子系统滑出到了一个没有同等高的性能但较为经济的I/O子系统中。特殊的滑动窗口实现可能无法通过在SQL Server中的备份与还原操作来完成。有一些替换的方式可以实现这样一个策略:</P>
<P>◆如果源文件是可用的,将数据导入到位于性价比高的I/O子系统的其它表中。重建索引。删除老的分区并且将新近导入的表添加到分区表中。无论你的数据集的大小,down机时间将会是交换分区所需要的时间,可以忽略不计。<BR>◆如果导入的过程中包含了转换,在性价比高的I/O子系统上,通过使用一个SELECT/INTO查询从老化的分区提取数据来创建新表并重建索引应当更为有效。down机时间将会是交换分区所需要的时间。</P>
<P><STRONG>关系型数据仓库的分区策略</STRONG></P>
<P>接下来的部份阐述了对你的关系型数据仓库进行分区的两个主要策略。该部份将会讨论这些策略是如何作用于影响分区的要素的。</P>
<P><STRONG>策略 I – 将一个分区绑定到它自己的文件组</STRONG></P>
<P>一个分区可以使用以下的步骤被逻辑的绑定到一个文件组:</P>
<P>◆创建带有多个文件组的数据库,每一个文件组将会逻辑的对应一个分区<BR>◆每个文件组中有一个文件。文件组可以包含一个或多个物理文件,并且这些文件可以在一个或多个逻辑卷/物理磁盘上创建<BR>◆创建分区函数并将分界点映射到相应的文件组,使用分区架构来创建一个在文件组和分区之间的一一对应的关系</P>
<P>关于如何基于这个策略来实现分区的示例代码请参阅附录D</P>
<P><A href="/files/uploadimg/20070227/1712313.jpg" target=_blank><IMG height=117 alt="" src="/files/uploadimg/20070227/1712313.jpg" width=450 border=0></A>&nbsp;</P>
<P><STRONG>图表3:将分区映射到其自身的文件组</STRONG></P>
<P><STRONG>策略Strategy II – 将两个或更多分区绑定到同样的文件组</STRONG></P>
<P>第二个策略是将一个或者多个分区映射到同样的文件组。文件组可以由一个(或者多个)分布在跨越一个(或者多个)逻辑卷/物理磁盘的物理文件来组成。对于基于这个策略实现分区的示例代码,请参阅附录D</P>
<P><A href="/files/uploadimg/20070227/1712314.jpg" target=_blank><IMG height=110 alt="" src="/files/uploadimg/20070227/1712314.jpg" width=450 border=0></A>&nbsp;</P>
<P><STRONG>图表4:将两个或更多的分区映射到同一个文件组</STRONG></P>
<P>#p#</P>
<P><STRONG>哪个策略更好?</STRONG></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -