如何找出 SQL Server 2008 资料库里是否建立了多余的索引

講到 SQL Server 2008 效能調校,這可是一門大大的學問,但是若能掌握一些基本的 SQL Server 資料庫運作原理,要能成為 SQL Server 效能調校的專家其實並不困難。我們都知道學習這些原理並不難,看書就會了,難的是如何才能在實務管理工作上真正的融會貫通、靈活運用這些已知的知識,再搭 配一些方便的工具幫你快速取得所要的重要資訊,進而做出效能調校的判斷與改善現有資料庫的效能問題。今天我打算來分享一個分析索引使用量統計的技巧,來改 善資料庫「寫入」效率的問題。

一般來說,我們在做資料庫效能調校時,都會想調整「讀取」資料的效能,也就是建立「非叢集索引」來縮短篩選與取得資料的時間。不過,建立過多的索引卻會導致資料寫入到資料庫時的效能變差 (註: 寫入資料包括 INSERT、UPDATE、DELETE 等操作),因為寫入資料表時,如果該資料表有建立非叢集索引的話,就會導致要多寫好幾份資料到資料庫中,因此越多的索引就會寫入越多的資料,相對的也會拉長寫入完成的時間,當應用程式或網站的流量一大,慢慢就會感受到效能變差的情況。

備註:由於改善「讀取」效能的技巧非常多,日後如果有機會我可以多分享一些關於這方面的調校技巧。

首先,我們先開啟 Management Studio,然後選取你要分析的資料庫,並且參考下圖打開該資料庫的【索引使用量統計資料】報表: ( 點圖可放大顯示 )

開啟報表後我們進一步展開「索引使用量統計資料」的資料,這時就能看到所有索引使用量的統計資料:

在這份報表裡,我挑選了一個資料表來分析該資料表所建立的所有索引的使用狀況,在這裡有四個重要的欄位可以進行分析,分別是 索引類型使用者搜尋次數使用者掃瞄次數使用者更新次數,這幾個欄位分別說明如下:

  • 索引類型:CLUSTERED 代表「叢集索引」,NONCLUSTERED 代表「非叢集索引」
  • 以下欄位所代表的數字都是從上次資料庫執行個體 (DB Instance) 開始執行後到現在為止的次數。
  • 使用者搜尋次數:該索引被真正使用到的次數,而且該索引回傳的資料沒有讀取整份索引的資料
  • 使用者掃瞄次數:該索引被完整掃瞄過的次數,也就是所謂的 索引掃瞄 (Index Scan) 的狀況。如果該索引屬於 叢集索引 的話,那就代表該表格被 表格掃瞄 (Table Scan) 的次數。通常這裡的數字越高也意味著這不是一個好的索引,應該可以進一步重新規劃索引。
  • 使用者更新次數:該索引被更新寫入的總次數,也就是當執行到 INSERT, UPDATE, DELETE 指令並且異動到該索引的次數。

接著我依據上圖的標號順序依序來解說如何進一步分析這些數字背後代表的意義:

  1. 這個索引的「使用者更新次數」為 166,903 次,代表從上次資料庫執行個體 (DB Instance) 開始執行後到現在為止該索引被更新寫入的總次數。而「使用者搜尋次數」有高達 1,331,587 次,這代表著這個索引有被充分利用到,這樣的索引才真正對應用程式查詢資料時有幫助。
  2. 這個索引的「使用者更新次數」為 166,903 次,但是「使用者搜尋次數」只有 29 次而已,這麼大的寫入量,相對於僅有 29 次的查詢有用到這個索引,這時就可以考慮是否要保留這個索引,因為這樣的索引會導致 SQL Server 在寫入資料時會多寫一份到這個索引來,而查詢資料時又不常會用到他,這樣就顯的有點多餘。
  3. 這個索引的「使用者更新次數」為 334,564 次,但是「使用者搜尋次數」竟然是 0,而且「使用者掃瞄次數」有 354 次,這代表寫入該索引的次數非常多,但是有效率的使用該索引為 0,而無效率的索引使用次數為 354 次,很明顯的這個索引可以重新設計過才對。
  4. 這個索引的「使用者更新次數」為 166,903 次,但是「使用者搜尋次數」與「使用者掃瞄次數」都是 0,這也意味著這個索引完全沒用到,建立他根本就是用來消耗 Disk I/O 資源的雞肋,應該于以立即刪除該索引才對!
  5. 這一條是「叢集索引」,更新次數與使用者搜尋次數都差不多,這點到還好,但是「使用者掃瞄次數」 有 18 次,這代表著從上次資料庫執行個體 (DB Instance) 開始執行後到現在為止總共有 18 次的機會執行到 Table Scan 的狀況,如果該資料表資料非常多,將會導致這 18 次的查詢效能低落,遇到這種情況也能進一步分析是否有更好的索引可以來建立(建立遺失索引)。

你可以仔細思考上述分析的過程,相信對你分析資料表中是否有多餘的索引的情況將很有幫助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值