概述

 
索引设计是数据库设计中比较重要的一个环节,对数据库的性能起着至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说“成也索引,败也索引”。在我经历过的,众多的数据库性能问题案例中,80% 系统都存在索引不合理的问题.
 
 

为什么需要索引

 
数据在磁盘上是以块的形式存储的。为确保对磁盘操作的原子性,访问数据的时候会一并访问所有数据块。磁盘上的这些数据块与链表类似,即它们都包含一个数据段和一个指针,指针指向下一个节点(数据块)的内存地址,而且它们都不需要连续存储(即逻辑上相邻的数据块在物理上可以相隔很远)。
鉴于很多记录只能做到按一个字段排序,所以要查询某个未经排序的字段,就需要使用线性查找,即要访问N/2个数据块,其中N指的是一个表所涵盖的所有数据块。如果该字段是非键字段(也就是说,不包含唯一值),那么就要搜索整个表空间,即要访问全部N个数据块。
然而,对于经过排序的字段,可以使用二分查找,因此只要访问log2 N个数据块。同样,对于已经排过序的非键字段,只要找到更大的值,也就不用再搜索表中的其他数据块了。这样一来,性能就会有实质性的提升。
举个例子,我们使用微软的示例数据库, 对于下面的查询:
select SalesOrderDetailID FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID=61026
1.SalesOrderDetailID 列没有索引
查询会进行全表扫描。逻辑读如下图:
 
表的数据页数如下所示,两者是几乎相等的。说明他对每个数据页都进行需要读取一次。

2.SalesOrderDetailID 建立索引,逻辑读取仅2次。
因为log2 1246 是等于10.28. 最大的逻辑读取次数是11.
 

利用EXPERT找到缺失索引

 
既然索引对我们如此重要,那么我们如何去快速,方便的找到需要的索引呢。利用体检专家可以轻松做到。

1.通过执行计划

在执行计划选项卡,对于查询语句,如果存在缺失索引,体检专家会在缺失索引列上打钩,如图所示。
同时列出SQL了 语句执行次数和执行时间。
 

2.通过数据库

在数据库选项卡中,选中缺失索引,体检专家会自动列出数据库中所有的缺失索引。
 
 

生成脚本

在找到缺失索引后可以通过体检专家自动生成脚本。执行计划中也可以类似的生成脚本。
 
 

如何建立

 
通过体检专家可以轻松找到系统中缺失的索引。但对于系统中大量的缺失索引,我们如何去选择呢?

1.执行计划中的缺失索引

具体的值,根据业务不同可能有些不同。但是执行次数越多,执行时间越长,影响百分比越大,就越要建立索引。我的建议是:执行次数每天超过200,执行时间超过1000ms,影响百分比超过50%。
 

2.数据库中缺失索引

平均影响百分比越大,平均用户开销越大,用户查找次数越大,那么就越需要建立。
同样给出我的建议值:影响百分比50%,用户开销1,用户查找次数每天200

总结

贴图是来自北京某银行系统。系统长时间语句非常多,严重影响前端用户体验。对系统第一轮优化,通过体检专家建立合适的索引后,系统的整体性能提升超过50%以上。
 
 
 文章用到的 Expert FOR SQLSERVER 工具下载链接:http://zhuancloud.com/ReceptionViews/Install.html
 
 

EXPERT FOR SQL SERVER诊断系列--索引的更多相关文章

  1. Expert for SQL Server 诊断系列

    Expert for SQL Server 诊断系列 Expert 诊断优化系列------------------锁是个大角色   前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库 ...

  2. SQL SERVER全面优化-------Expert for SQL Server 诊断系列

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  3. SQL SERVER全面优化-------索引有多重要?

    想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...

  4. SQL Server 深入解析索引存储(下)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

  5. Sql Server来龙去脉系列之四 数据库和文件

        在讨论数据库之前我们先要明白一个问题:什么是数据库?     数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...

  6. Sql Server来龙去脉系列之三 查询过程跟踪

    我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更 ...

  7. Sql Server来龙去脉系列之二 框架和配置

    本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...

  8. Sql Server来龙去脉系列之一 目录篇

    从工作一直到现在都没怎么花功夫深入学习下Sql Server数据库,在使用Sql Server时90%的时间基本上都是在接触T-SQL,所以数据库这块基本上属于菜鸟级别.至于数据库的底层框架以及运行机 ...

  9. SQL Server编程系列(1):SMO介绍

    原文:SQL Server编程系列(1):SMO介绍 续篇:SQL Server编程系列(2):SMO常用对象的有关操作 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己 ...

随机推荐

  1. HttpClient与浏览器调用服务接口差异

    我用httpclient访问接口,统计图有些不均匀,差距较大 ,有时只有几十毫秒,下图看到这种情况占多数,600-800毫秒之间的算是浏览器正常的产生调用接口的时间耗时 然后用jmeter跑时都是均值 ...

  2. 慕学在线网0.2_users表设计(1)

    1.Django App设计: users-用户管理(任何web中,users表都是第一个被设计的) course-课程管理 organization-机构和教师管理 operation-用户操作管理 ...

  3. [20171124]手工使用Seed_Database.dfb和Seed_Database.ctl建库.txt

    [20171124]手工使用Seed_Database.dfb和Seed_Database.ctl建库.txt --//昨天看yueli34的帖子,链接http://www.itpub.net/thr ...

  4. 减少MySQL主从延迟的神器--并行复制大揭密

    1. 简介 MySQL 5.6引入了基于schema的并行复制,即如果binlog events操作的是不同schema的对象,不是DDL,且操作的对象没有对其他schema的foreign key关 ...

  5. fedora 28 重新生成 /boot/grub2/grub.cfg

    使用情景: 之前电脑安装了windows 7/ fedora 28 双系统,由于特殊原因,需要删除 windows 系统.在格式化硬盘后,我们还需要跟新 grub2 的启动条目:删除grub 启动的界 ...

  6. C#生成真值表

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 06LaTeX学习系列之---TeXstudio的使用

    目录 目录 前言 (一)TeXstudio的认识 1.TeXstudio的安装 2.TeXstudio的优点 3.Texstudio的界面 (二)TeXstudio的编译与查看 (三)TeXstudi ...

  8. 关于解决Python中requests模块在PyCharm工具中导入问题

    问题引入: 今天在学习Python网络请求的时候,导入requests模块时一直报红色波浪线,如图: 反复折腾,一直以为自己没有安装requests模块,反复安装反复卸载: 安装方法: 首先 cd 进 ...

  9. 计算器和Menu

    MainActivity.java import android.app.Activity; import android.content.Intent; import android.os.Bund ...

  10. Hunter -- 批量文件管理工具

    一个简单工具, 用来进行批量文件的重命名, 更改后缀, 搜索特定后缀, 等 下载地址:http://download.csdn.net/download/kuangsun/7545179