SQL Server 2005中处理表分区问题

2008-04-02 10:34:57来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  【IT专家网】数据库性能调优是每一个优秀SQL Server管理员最终的责任。虽然确保数据的安全和可用性是我们的最高的目标,但是假如数据库应用程式无法满足用户的需要,那么DBA们会因为性能低下的设计和实现而受到指责。SQL Server 2005在数据库性能方面得到了很多提高,尤其是表分区的技术。假如您还没不了解表分区的特征,那么请您花点时间读这篇文章。

  表分区的概念不是个新的概念;只要您当过一段时间的SQL Server DBA,那么您可能已对一些频繁访问的表进行过归档,当这个表中的历史数据变的不再经常被访问的时候。比如,假设您有一个打印时间报表的应用,您的报告很少会查询1995年的数据,因为绝大部分的预算规划会基于最近几年的数据。

  在SQL Server的早期版本中,您能够创建多个表。每一个表都具备相同的列结构,用来保存不同年份的数据。这样,当存在着对历史数据访问的必要的时候,您能够创建一个视图来对这些表进行查询处理。将数据保存在多个表中是很方便的,因为相对于查询时扫描整个大表,扫描小表会更快。但是这种好处只有在您预先知道哪些时间段的数据会被访问。同时,一旦数据过期,您还需要创建新表并且转移新产生的历史数据。

  SQL Server 7和SQL Server 2000支持分布式分区视图(distributed partitioned views,又称为物化视图,materialized views).分布式分区视图由分布于多台服务器上的、具备相同表结构的表构成,而且您还需要为每一个服务器增加链接服务器定义(linked server definitions),最后在其中一台服务器上创建一个视图将每台服务器上返回的数据合并起来。这里的设计思想是数据库引擎能够利用多台服务器的处理能力来满足查询。

  但是,分布式分区视图(DPV)受到很多限制,您能够在SQL Server的在线帮助文档中阅读到。虽然DPV在一些情况下能够提供性能上的提高,但是这种技术不能被广泛的应用。已被证实他们不能满足逐步增长的企业级应用的需要。何况,DPV的实现是个费力的过程,需要DBA进行很多工作。

  SQL Server 2005开始支持表分区,这种技术允许任何的表分区都保存在同一台服务器上。每一个表分区都和在某个文档组(filegroup)中的单个文档关联。同样的一个文档/文档组能够容纳多个分区表。

  在这种设计架构下,数据库引擎能够判定查询过程中应该访问哪个分区,而不用扫描整个表。假如查询需要的数据行分散在多个分区中,SQL Server使用多个处理器对多个分区进行并行查询。您能够为在创建表的时候就定义分区的索引。 对小索引的搜索或扫描要比扫描整个表或一张大表上的索引要快很多。因此,当对大表进行查询,表分区能够产生相当大的性能提升。

  现在让我们通过一个简单的例子来了解表分区是如何发挥作用的。在这篇文章中,我不想深入到分区的语法细节当中,这些您能够在SQL Server的在线帮助文档中找到。下面的例子基于存储着一个时间报表系统的数据的数据仓库。除了默认的文档组,我另外创建了7个文档组,每一个文档组仅包含一个文档,这个文档将存储由分区函数定义的一部分数据。

  为了测试表分区的性能提升,我向这个分区表中插入了一千五百万行,同时向另外一个具备相同表结构、但是没有进行分区的表插入了同样的数据。对分区表执行的INSERT语句运行的更快一些。甚至在我的内存不到1G的笔记本电脑上,对分区表的INSERT语句比不分区的表的INSERT语句要快上三倍。当然,查询的执行时间依据硬件资源的差异而任何变化,但是您还是能够在您的环境中感到不同程度的提升。

  我将检查更深入了一步,通过分别检查同一条返回任何行的、简单SELECT语句在分区表和非分区表上的执行计划,返回的数据范围通过WHERE语句来指定。同一条语句在这两个不同的表上有不同的执行计划。对于分区表的查询显示出一个嵌套的循环和索引的扫描。从本质上来说,SQL Server将两个分区视为单独的表,因此使用一个嵌套循环将他们连接起来。对非分区的表的同一个查询则使用索引扫描来返回同样的列。当您使用同样的分区策略创建多个表,同时在查询中连接这些表,那么性能上的提升会更加明显。

共2页。 1 2 :

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 深入了解SQL Server中方便的索引技术

下一篇: 如何改进SQL Server安全系统