分区技巧

来源:互联网 发布:360网速测试器mac 编辑:程序博客网 时间:2024/04/29 06:09
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

分区视图允许各机构调节各自系统以处理大量数据。这种功能使您能够在多个表之间对数据进行分区;在逻辑上通过视图把各个表联合起来,使分区尽可能对用户与开发人员透明。以前发表的几篇文章(包括我和KalenDelaney发表的两篇,其中一篇“分布式分区视图”2000年8月发表,InstantDocID9086,另一篇“查询分布式分区视图”2000年9月发表,InstantDocID9097)曾经介绍了分区视图。SQLServer联机丛书(BOL)也涉及到一些基础知识。在这篇文章中,我与您分享一些您可能不曾注意到的技巧,包括使用EnterpriseManager对分区进行架构更改的负作用,如何绕过对通过分区视图向表中插入数据的方式的限制,以及在分区标准中使用常量所引起的问题。

EnterpriseManager中更改分区

我极为提倡使用T-SQL,甚至是对于您通过EnterpriseManager能轻易执行的任务。除了可提高T-SQL技能,这种方法使我更好地明白我所做的操作并予以更多控制。另外,EnterpriseManager并不总是以最有效的方式执行任务。例如,从EnterpriseManager对分区进行架构更改,会降低分区的性能与功能。为处理这个问题,首先运行清单1中的脚本来创建分区Orders2000、Orders2001与Orders2002,以及可更新的分区视图Orders。

首先,需确保在检索期间Orders在可更新性与分区消除方面提供全面的分区功能。分区排除是指SQLServer只访问符合查询筛选标准的相关分区。用以下三个定单填充Orders。因为每个分区承载不同年份的行,所以各定单要放到不同的分区中:

INSERTINTOOrders(orderid,customerid,orderdate)VALUES(1,'aaaa','20000109')INSERTINTOOrders(orderid,customerid,orderdate)VALUES(2,'aaaa','20010118')INSERTINTOOrders(orderid,customerid,orderdate)VALUES(3,'aaaa','20020212')

正如在BOL???ù?è???????ù?Orders分区视图满足了可更新性的所有要求,所以INSERT语句很成功。现在,为了验证在数据检索期间是否发生了分区排除,将STATISTICSIO设置为打开,并且将QueryAnalyzer中Query菜单下的ShowExecutionPlan选项设置为打开。注意,通过将这个选项设置为打开,当运行查询时,您请求优化器生成并使用的实际计划。此选项与DisplayEstimatedExecutionPlan选项(不运行查询,只显示估计计划)形成对比。

为了测试分区排除,对Orders发出下面的SELECT语句,来只检索2000年1月份的数据:

SETSTATISTICSIOONSELECT*FROMOrdersWHEREorderdate>='20000101'ANDorderdate<'20000201'

注意在STATISTICSIO结果中,SQLServer物理上只访问了Orders2000;针对其他所有分区的I/O数量为0:

Table'Orders2002'.Scancount0,logicalreads0,...Table'Orders2001'.Scancount0,logicalreads0,...Table'Orders2000'.Scancount1,logicalreads2,...

在图形执行计划中,把鼠标指针悬停在三个群集索引搜索运算符处。注意,在黄色详细资料框中,实际执行的只有Orders2000分区计划中的分支(执行数目:1);而其他的则没有被执行(执行数目:0)。

现在,假设必须把customerid列从varchar(5)增大到varchar(10)。使用T-SQL可以编写一个简短、有效的脚本。这是因为SQLServer不需要在物理上访问每行以增大varchar列,而只是在元数据中表达这个更改,所以这个脚本可以在瞬间运行。运行以下代码执行更改:

ALTERTABLEOrders2000ALTERCOLUMNcustomeridVARCHAR(10)NOTNULLALTERTABLEOrders2001ALTERCOLUMNcustomeridVARCHAR(10)NOTNULLALTERTABLEOrders2002ALTERCOLUMNcustomeridVARCHAR(10)NOTNULL1

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击