概述

 
索引设计是数据库设计中比较重要的一个环节,对数据库的性能起着至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说“成也索引,败也索引”。在我经历过的,众多的数据库性能问题案例中,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. Linux下修改IP、DNS、路由命令行设置

    本文最后修改时间:20180313 一.快速修改,重启后设置就没了 ifconfig eth0 192.168.1.22 netmask 255.255.255.0 up route add defa ...

  2. 逻辑回归&线性回归

    # coding:utf-8 import numpy as np from sklearn import linear_model, datasets import matplotlib.pyplo ...

  3. Windows下cwrsync客户端与rsync群辉存储客户端数据同步

    cwRsync简介 cwRsync是Rsync在Windows上的实现版本,Rsync通过使用特定算法的文件传输技术,可以在网络上传输只修改了的文件. cwRsync主要用于Windows上的远程文件 ...

  4. OSPF单区域配置

    OSPF单区域配置 实验环境:华为模拟器eNSP 现在有这样一个拓扑图: 我想要让R1可以ping通R3,显然目前是不行的: <R1>ping 192.168.2.2 PING 192.1 ...

  5. Linux 小知识翻译 - 「别名」

    实际上,「别名」被用在多种场合下.比如「命令的别名」,「邮件地址的别名」等等. 所以,单独说「别名」的时候,根据不用的场合,代表的意思也不一样. 一般来说,「别名」是指意思差不多的东西. 「别名」的英 ...

  6. CMD(命令提示符)命令大全及网络安全课程中所用到的命令

    CMD命令大全详解: 1.arp -a 获得IP地址,MAC地址. 2.arp -d * 命令用于清空arp缓存表. 3.arp –s 网关IP 网关MAC 命令则是将网关IP地址与其相应的MAC地址 ...

  7. 【阿里八八】团队Alpha博客链接目录

    团队Alpha冲刺博客 阿里八八Alpha阶段Scrum(1/12) 阿里八八Alpha阶段Scrum(2/12) 阿里八八Alpha阶段Scrum(3/12) 阿里八八Alpha阶段Scrum(4/ ...

  8. 轻量级服务器部署方案 -(阿里云CenOS+宝塔)

    一台服务器部署多个应用.可部署前端工程.node服务.数据库等. 一.服务器选择合适的服务器,购买即可.服务器商1.阿里云 2.腾讯云 3.百度云 二.服务器管理面板-宝塔宝塔面板是一款服务器管理软件 ...

  9. CNAME记录和A记录

    主机名:host.abcd.com 别名:一台主机可以提供多种服务,比如http服务和mail服务. 访问http服务就可以使用域名:www.abcd.com 访问mail服务就可以使用域名:mail ...

  10. JS面向对象之工厂模式

    js面向对象 什么是对象 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个名字都映射到一个值. 简单来 ...