热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

重建索引提高SQLServer性能

大多数sqlserver(WINDOWS平台上强大的数据库平台)表需要索引来提高数据的访问速度,如果没有索引,sqlserver(WINDOWS平台上强大的数据库平台)要进行表格扫描读取表中的每一个记录才能找到索要的数据。索引可以分为簇索引和非簇索引,簇索引通过重排表

大多数sql server (WINDOWS平台上强大的数据库平台) 表需要索引来提高数据的访问速度,如果没有索引,sql server (WINDOWS平台上强大的数据库平台) 要进行表格扫描读取表中的每一个记录才能找到索要的数据。索引可以分为簇索引和非簇索引,簇索引通过重排表


  大多数sql server(WINDOWS平台上强大的数据库平台)表需要索引来提高数据的访问速度,如果没有索引,sql server(WINDOWS平台上强大的数据库平台)要进行表格扫描读取表中的每一个记录才能找到索要的数据。索引可以分为簇索引和非簇索引,簇索引通过重排表中的数据来提高数据的访问速度,而非簇索引则通过维护表中的数据指针来提高数据的索引。
  
  索引的体系结构:
  
  为什么要不断的维护表的索引?首先,简单介绍一下索引的体系结构。sql server(WINDOWS平台上强大的数据库平台)在硬盘中用8KB页面在数据库文件内存放数据。缺省情况下这些页面及其包含的数据是无组织的。为了使混乱变为有序,就要生成索引。生成索引后,就有了索引页和数据页,数据页保存用户写入的数据信息。索引页存放用于检索列的数据值清单(关键字)和索引表中该值所在纪录的地址指针。索引分为簇索引和非簇索引,簇索引实质上是将表中的数据排序,就好像是字典的索引目录。非簇索引不对数据排序,它只保存了数据的指针地址。向一个带簇索引的表中插入数据,当数据页达到100%时,由于页面没有空间插入新的的纪录,这时就会发生分页,sql server(WINDOWS平台上强大的数据库平台) 将大约一半的数据从满页中移到空页中,从而生成两个半的满页。这样就有大量的数据空间。簇索引是双向链表,在每一页的头部保存了前一页、后一页地址以及分页后数据移动的地址,由于新页可能在数据库文件中的任何地方,因此页面的链接不一定指向磁盘的下一个物理页,链接可能指向了另一个区域,这就形成了分块,从而减慢了系统的速度。对于带簇索引和非簇索引的表来说,非簇索引的关键字是指向簇索引的,而不是指向数据页的本身。
  
  为了克服数据分块带来的负面影响,需要重构表的索引,这是非常费时的,因此只能在需要时进行。可以通过DBCC SHOWCONTIG来确定是否需要重构表的索引。下面举例来说明DBCC SHOWCONTIG和DBCC REDBINDEX的使用方法。以sql server(WINDOWS平台上强大的数据库平台)自带的northwind数据作为例子
  
  带开sql server(WINDOWS平台上强大的数据库平台)的Query analyzer输入命令:
  
  use pubs
  
  declare @table_id int
  
  set @table_id=object_id('tbldlvinfoback')
  
  dbcc showcontig(@table_id)
  
  这个命令显示pubs数据库中的tbldlvinfoback表的分块情况,结果如下:
  
  DBCC SHOWCONTIG 正在扫描 'tblDlvInfoback' 表...
  表: 'tblDlvInfoback'(1797581442);索引 ID: 0,数据库 ID: 5
  已执行 TABLE 级别的扫描。
  - 扫描页数.....................................: 197214
  - 扫描扩展盘区数...............................: 24659
  - 扩展盘区开关数...............................: 24658
  - 每个扩展盘区上的平均页数.....................: 8.0
  - 扫描密度[最佳值:实际值]....................: 99.97%[24652:24659]
  - 扩展盘区扫描碎片.............................: 15.46%
  - 每页上的平均可用字节数.......................: 374.6
  - 平均页密度(完整)...........................: 95.37%
  DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
  
  通过分析这些结果可以知道该表的索引是否需要重构。表1.1描述了每一行的意义描述
  
  Pages Scanned          表或索引中的长页数
  
  Extents Scanned         表或索引中的长区页数
  
  Extent Switches         DBCC遍历页时从一个区域到另
  
  一个区域的次数
  
  Avg. Pages per Extent            相关区域中的页数
  
  Scan Density                  Best Count是连续链接时的理想区
  
  [Best Count:Actual Count]        域改变数,Actual Count是实际区
  
  域改变数,Scan Density为100%
  
  表示没有分块。
  
  Logical Scan Fragmentation      扫描索引页中失序页的百分比
  
  Extent Scan Fragmentation        不实际相邻和包含链路中所有链
  
  接页的区域数
  
  Avg. Bytes Free per Page         扫描页面中平均自由字节数
  
  Avg. Page Density (full)           平均页密度,表示页有多满
  
  从上面命令的执行结果可以看的出来,Best count为3 而Actual Count为5这表明orders表有分块需要重构表索引。下面通过DBCC DBREINDEX来重构表的簇索引。
  
  同样在Query Analyzer中输入命令:
  
  use northwind
  
  dbcc dbreindex('northwind.dbo.orders',pk_orders,90)
  
  执行结果:
  
  DBCC execution completed. If DBCC printed error messages, contact your system administrator.
  
  Dbcc dbreindex参数说明:第一个参数为要重构的表明。第二个参数为需要重构的索引表识,‘’表示所有的索引。第三个参数为页的填充因子,填充因子越大,页越满。
  
  然后再用DBCC SHOWCONTIG查看重构簇索引后的结果:
  
  use northwind
  
  declare @table_id int
  
  set @table_id=object_id('orders')
  
  dbcc showcontig(@table_id)
  
  返回结果如下:
  
  DBCC SHOWCONTIG scanning 'Orders' table...
  
  Table: 'Orders' (21575115); index ID: 1, database ID: 6
  
  TABLE level scan performed.
  
  - Pages Scanned................................: 22
  
  - Extents Scanned..............................: 3
  
  - Extent Switches..............................: 2
  
  - Avg. Pages per Extent........................: 7.3
  
  - Scan Density [Best Count:Actual Count].......: 100.00% [3:3]
  
  - Logical Scan Fragmentation ..................: 0.00%
  
  - Extent Scan Fragmentation ...................: 33.33%
  
  - Avg. Bytes Free per Page.....................: 869.2
  
  - Avg. Page Density (full).....................: 89.26%
  
  DBCC execution completed. If DBCC printed error messages, contact your system administrator.
  
  通过结果我们可以看到Scan Denity为100%表没有分块不需要重构表索引了。如果重构表的簇索引Scan Denity还小于100%的话可以重构表的全部索引。命令如下:
  
  --use northwind
  
  --dbcc dbreindex('northwind.dbo.orders',’’,90)
  
  使用作业定时重构索引:
  
  如果你的数据库访问非常频繁的话,非常容易出现数据分块的现象,因此你可以利用作业来帮你在系统相对空闲的时候重构你的索引。
  
  为什么要不断的维护表的索引?首先,简单介绍一下索引的体系结构。sql server(WINDOWS平台上强大的数据库平台)在硬盘中用8KB页面在数据库文件内存放数据。缺省情况下这些页面及其包含的数据是无组织的。为了使混乱变为有序,就要生成索引。生成索引后,就有了索引页和数据页,数据页保存用户写入的数据信息。索引页存放用于检索列的数据值清单(关键字)和索引表中该值所在纪录的地址指针。索引分为簇索引和非簇索引,簇索引实质上是将表中的数据排序,就好像是字典的索引目录。非簇索引不对数据排序,它只保存了数据的指针地址。向一个带簇索引的表中插入数据,当数据页达到100%时,由于页面没有空间插入新的的纪录,这时就会发生分页,sql server(WINDOWS平台上强大的数据库平台) 将大约一半的数据从满页中移到空页中,从而生成两个半的满页。这样就有大量的数据空间。簇索引是双向链表,在每一页的头部保存了前一页、后一页地址以及分页后数据移动的地址,由于新页可能在数据库文件中的任何地方,因此页面的链接不一定指向磁盘的下一个物理页,链接可能指向了另一个区域,这就形成了分块,从而减慢了系统的速度。对于带簇索引和非簇索引的表来说,非簇索引的关键字是指向簇索引的,而不是指向数据页的本身。
  
  为了克服数据分块带来的负面影响,需要重构表的索引,这是非常费时的,因此只能在需要时进行。可以通过DBCC SHOWCONTIG来确定是否需要重构表的索引。下面举例来说明DBCC SHOWCONTIG和DBCC REDBINDEX的使用方法。以sql server(WINDOWS平台上强大的数据库平台)自带的northwind数据作为例子
  
  带开sql server(WINDOWS平台上强大的数据库平台)的Query analyzer输入命令:
  
  use pubs
  
  declare @table_id int
  
  set @table_id=object_id('tbldlvinfoback')
  
  dbcc showcontig(@table_id)
  
  这个命令显示pubs数据库中的tbldlvinfoback表的分块情况,结果如下:
  
  DBCC SHOWCONTIG 正在扫描 'tblDlvInfoback' 表...
  表: 'tblDlvInfoback'(1797581442);索引 ID: 0,数据库 ID: 5
  已执行 TABLE 级别的扫描。
  - 扫描页数.....................................: 197214
  - 扫描扩展盘区数...............................: 24659
  - 扩展盘区开关数...............................: 24658
  - 每个扩展盘区上的平均页数.....................: 8.0
  - 扫描密度[最佳值:实际值]....................: 99.97%[24652:24659]
  - 扩展盘区扫描碎片.............................: 15.46%
  - 每页上的平均可用字节数.......................: 374.6
  - 平均页密度(完整)...........................: 95.37
推荐阅读
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 如何在联想win10专业版中修改账户名称
    本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 电脑公司win7剪切板位置及使用方法
    本文介绍了电脑公司win7剪切板的位置和使用方法。剪切板一般位于c:\windows\system32目录,程序名为clipbrd.exe。通过在搜索栏中输入cmd打开命令提示符窗口,并输入clip /?即可调用剪贴板查看器。赶紧来试试看吧!更多精彩文章请关注本站。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
author-avatar
手机用户2502904233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有