数据库性能调优是每一个优秀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 使用多个处理器对多个分区进行并行查询。你可以为在创建表的时候就定义分区的索引。 对小索引的搜索(seek)或者扫描(scan)要比扫描整个表或者一张大表上的索引要快很多。因此,当对大表进行查询,表分区可以产生相当大的性能提升。

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

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

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

你可以使用下面的查询来了解每一个分区中的行的个数:

select $PARTITION.TimeEntryDateRangePFN(time_entry_date) as Partition,count(*) as [COUNT]from fact_time_entrygroup by $PARTITION.TimeEntryDateRangePFN(time_entry_date)order by Partition

表分区对交易环境和数据仓库环境来说,都是一个重要的特征。数据仓库用户最主要的抱怨是移动事实表(fact table) 会花费太多时间。当装载数据到事实表的时候,用户查询(立方体处理查询)的性能会明显下降,甚至是完全无法成功。因此,装载大量的数据到事实表的时候常常需要停机。如果使用表分区,就不再出现这样的情况——确切的讲,你一眨眼的工夫就可以移动事实表。为了演示这是如何生效的,我使用上面例子中相同的分区函数和表结构来创建一个新的表,这个表叫做 fact_time_entry2。表的主键从五千万开始,这样 fact_time_entry2 就不会包含表fact_time_entry中已经有的数据。

现在我把 2007 年的数据移动到这张 fact_time_entry2 中。同时让我们假设 fact_time_entry 表中包含着 2007 年之前的数据。在 fact_time_entry2 表完成数据的转移,我执行下面的语句:

alter table [fact_time_entry2] switch partition 8 to [fact_time_entry] partition 8

这条语句将编号为8的分区,这个分区恰好包含着2007年的数据,从 fact_time_entry2 移动到了 fact_time_entry 表中,在我的笔记本电脑上,这个过程只花费了 3 毫秒。在这短短的 3 毫秒中,我的事实表就增加了五百万条记录! 的确,我需要在交换分区之前,将数据移动到中间表,但是我的用户不需要担心——事实表随时都可以查询! 在这幕后,实际上没有数据移动——只是两张表的元数据发生了变化。

我可以使用类似的查询删除事实表中不在需要的数据。例如,假设我们决定我们不再关心2004年的记录。下面的语句可以将这些记录转移到我们创建的工作表中:

alter table [fact_time_entry] switch partition 2 to [fact_time_entry2] partition 2

这样的语句依旧在毫秒级内完成了。现在,我可以删除 fact_time_entry2 或者将它移到其他的服务器上。我的事实表不会包含 2004 年的任何记录。这个分区还是需要在目的表中存在,而且它必须是空的。你不能将分区转移到一个包含重复数据的表中。 源表和目的表的分区必须一致,同时被转移的数据必须在同一个文件组中。 即使受到这么多的限制,转换分区和无需停机就可以移动数据表的功能必将让数据仓库的实现变的前所未有的轻松。

转载于:https://www.cnblogs.com/chuncn/archive/2009/02/20/1395161.html

SQL Server 2005 中处理表分区问题(分区表性能和分区切换)相关推荐

  1. 在SQL Server 2005中实现表的行列转换()

    PIVOT和UNPIVOT关系运算符是SQL Server 2005提供的新增功能,因此,对升级到SQL Server 2005的数据库使用PIVOT和UNPIVOT时,数据库的兼容级别必须设置为90 ...

  2. SQL Server 2005中的分区表(四):删除(合并)一个分区

    在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表: ...

  3. SQL Server 2005中专用管理员连接 (DAC) 使用技巧修改系统表的方法

    Server 2005 专用管理员连接 (DAC) 使用技巧 1 什么是专用管理员连接? SQL Server 2005 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用. 2 ...

  4. 访问MS Access 系统表 MSysObjects ,在SQL SERVER 2005中访问

    首先设置MS Access,给予访问MSysObjects 的权限 1. Open Microsoft Access 2. From the Tools menu, select the Option ...

  5. SQL Server 2005中的分区表

    SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表? SQL Server 2005中的分区表(二):如何添加.查询.修改分区表中的数据 SQL Serve ...

  6. SQL Server 2005 术语词汇表

    术语 定义 ActiveX 数据对象 (ActiveX Data Objects) 一种易于使用的应用程序编程接口 (API),用于封装 OLE DB 以在诸如 Visual Basic.Visual ...

  7. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?

    如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...

  8. SQL Server 2005 中的商务智能和数据仓库

    微软发布了SQL Server 2005,对于微软与BI来说这是一个非常重要的版本,它完善了微软在BI方面的产品线.SQL Server 2005以及 Visual Studio .net2005的整 ...

  9. SQL Server 2005中的分析服务功能[转]

    XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...

  10. Sql Server 2005 中的row_number() 分页技术

    原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储 CREAT ...

最新文章

  1. 动态规划面试常考:最短路径和
  2. MATLAB-数据类型
  3. mvp内粗泄露问题_如何在一小时内启动MVP服务器
  4. 获得手机屏幕相关参数
  5. WARNING: A newer version of conda exists.
  6. MYSQL - 存储过程学习笔记
  7. svm图像分割matlab,python实现
  8. xp我的计算机不在桌面怎么办,xp系统开机后不显示桌面怎么办|xp电脑开机不显示桌面解决方法...
  9. t480 拆触摸板_ThinkPad T480 如何关闭触摸板?
  10. 网络流(Network Flow)
  11. android qq 目录,手机qq存储路径在哪可以找到
  12. 【Unity3D】拖尾TrailRenderer
  13. Jackson ImmunoResearch普通羊驼血清说明书
  14. 暗影精灵8 pro安装ubuntu20.04后,没有wifi驱动
  15. layui layer诡异bug记录
  16. 计算机系统的储存单位及换算关系,计算机储存单位和换算关系
  17. 服务器系统没网灯在闪,电脑没网交换机灯全部一闪一闪的解决方法
  18. 官宣丨全球边缘计算大会参会指南出来啦!
  19. win10记住了远程连接密码,下次登录仍然需要输入密码
  20. 大数据分析岗位的就业前景

热门文章

  1. Red5服务器端报错:无法解析类型ResourcePatternResolver
  2. .NET简谈设计模式之(命令模式)
  3. LINUX修改网卡MAC地址
  4. python怎么关闭csv_Python2.7.1:如何打开、编辑和关闭CSV fi
  5. python 阿里云短信接口_阿里云短信接口怎么使用
  6. 计算机入门建模观后感,实习生revit学习心得-初学Revit有感
  7. kafka依赖_Kafka集群搭建及必知必会
  8. Debug日志正常,输出和HTML页面乱码
  9. 给ApplicationContext容器中添加组件的方法(@Bean的使用)
  10. [渝粤教育] 四川大学 西方经济学(微观) 参考 资料