`
SQL专家云技术团队
  • 浏览: 17559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL SERVER——索引的重要性

阅读更多

 

前面很多篇不管CPU、内存、磁盘、语句等等等都提到了索引的重要,我想刚刚开始学数据库的在校学生都知道索引对语句性能的重要性。但他们可能不知道,对语句的重要性就是对系统的重要性!

 

  • 开篇小测验

  下面这样一个小SQL 你该怎么样添加最优索引

  两个表上现在只有聚集索引

  bigproduct 表上已经有聚集索引 ProductID

 

  bigtransactionhistory 表上已经有聚集索引 TransactionID

  

select p.productnumber,p.reorderpoint,th.Quantity
from bigproduct as p
join bigtransactionhistory as th on th.productid=p.productid and th.TransactionDate > p.SellStartDate
where p.name in ('LL Crankarm1000','ML Crankarm1000') and th.TransactionDate > '2010-01-01'

 

 

 

  你是否一眼就能看出来呢?

  

  答案将在文章中逐步揭晓~~~

  • 简单粗暴的添加索引

  看过我前面文章的看官们一定会发现我很喜欢用“简单粗暴”这个词,一是因为词汇量小文笔也差,真心用不出高大上的词儿! 再一个,你们不喜欢简单粗暴么~~干货最重要,不是么?

  

  首先我们看一下没有优化前的执行计划

  

  

  

  clustered index scan 这其实就是表扫描,不是table scan 只是因为表上有聚集索引

  可以看出这个查询俩表都使用了表扫描!  

  

  where 条件添加索引

  首先大多数人都知道 where 条件中的字段需要添加索引! 我们添加一下看看效果创建 

  在 bigproduct 表上创建 name 列索引 ,在bigtransactionhistory表上创建 TransactionDate 列索引。

  再次执行语句看一下效果!

  

  

  

  添加where索引以后可以看到以下几个现象

  1. bigproduct 从原来的clustered index scan 变成 index seek
  2. 另外多出来个KEY Lookup(clustered)
  3. bigproduct 上添加的索引起了作用,逻辑读bigproduct 由 601 变成 10。
  4. bigtransactionhistory 没啥变化啊 还是clustered index scan

  

  解释一下出现的现象 : 首先一点bigproduct 边添加的where 条件索引,起到了作用,执行的时候不是全表扫描了,逻辑读有明显的下降,出现的 KEY Lookup 是因为选择(select)的列,在索引中没有,而需要通过聚集索引再查找一次,再找一次也意味着多一部分开销!

  那么同样添加了where 条件索引的bigtransactionhistory 表为什么没起作用呢? 那是因为SQL优化器在选择计划的时候认为,不使用TransactionDate 列索引查找效率会更好! 

  真的么? 我们来验证一下,通过指定选择索引,来让优化器选择索引查找!

  

 

  

 

   强制使用索引以后,可以看出逻辑读由 14W 变成1961W,语句时间也变得很长,这就是优化器为什么不选用你加的索引!优化器还是很智能的吧。

 

  高能预警:优化器可不是什么时候都这么智能的...由于缓存计划或优化器抽风等原因,也会出现优化器用了这种索引,导致你的语句奇慢,读飙升直接影响到你的内存、磁盘、CPU资源!另外如果这样一条语句是系统中一条很频繁运行的语句,你的系统就挂了!没错就挂了!这就是开篇抛出的问题就是因为一条语句!

 

 

  消灭Key Lookup 添加select 字段

   这就是传说中的覆盖索引! 

   看到执行计划中存在Key Lookup 而且消耗占比很高,如上面强制索引的计划,那么我们就要想到的 在索引中包含那些SELECT 的列!如果消耗低,逻辑读少,如上面bigproduct 表中的Key Lookup 就可以忽略(如果你追求完美,也一样优化就可以了)。

   包含列的图形化创建 : 

   

   

   语句创建就是 :

   

CREATE NONCLUSTERED INDEX TransactionDate
ON [dbo].[bigTransactionHistory] ([TransactionDate])

------INCLUDE 就是包含列
INCLUDE ([ProductID],[Quantity])
GO

 

 

 

 

   下面我们添加一下看看效果 :

   

 

   

 

  添加select 索引字段后可以看出的现象:

  1. 优化器自己选择了index seek
  2. bigtransactionhistory占比最高的Key Lookup消失了
  3. 逻辑读由原来无索引的14W变成1W
  4. bigtransactionhistory表还提示缺少索引?

   

   通过优化索引添加select 字段,我们看出语句又一次得到了提升 bigtransactionhistory 从表扫描变成索引查找,逻辑读由14W变成 1W!这是一个质的飞跃啊!

   那为什么还提示缺少索引呢? 创建一下试试吧!

  索引再优化加入表关联列

  按照提示我们创建索引 : 和上一个索引的不同 ProductID 列由包含列变成了索引列!

USE [AdventureWorks2012]
GO
CREATE NONCLUSTERED INDEX ProductID_TransactionDate
ON [dbo].[bigTransactionHistory] ([ProductID],[TransactionDate])
INCLUDE ([Quantity])

 

 

  我们看一下效果:

  

 

  

 

  再次优化索引以后可以看到以下几个现象

  1. bigtransactionhistory表还是索引查找index seek
  2. bigtransactionhistory依然没有了Key Lookup
  3. 两表关联的hash join 变成了nested loops
  4. 并行计划变成了串行
  5. 逻辑读又从1W 变成18

 

  又一次质的飞跃!读从原来的14W 变成1W 又变成18,这样大大减少了内存和IO的消耗,另外并行计划也变成了串行,无疑又减少了大量CPU的消耗!语句时间,我想这里就不用多说了吧?

  

  高能预警:这里所说的hash join,并行变串行,不懂的朋友可以在百度自行学习,这里只是针对当前语句的情况,不能一概而论!

 

 

 

  精简你的索引

  大家都知道,索引会导致update、insert、delete操作变慢!那么尽量精简你的索引就是一个很重要的话题了!

   上面的优化过程中我们创建了几个索引,以bigTransactionHistory为例来看一下:

  

   脚本这里就不贴了,其实我们最后创建的索引 ProductID_TransactionDate包含Quantity 已经包含了前两个索引,而且可以说无论任何类似语句都使用ProductID_TransactionDate包含Quantity 就可以了!

   那么我们就可以清除前两个索引!

    

  

 

  至此语句的优化算是结束了,留下的就是bigproduct 依然有一个Key Lookup可以优化,可以仿照上面的继续优化,这里就不细说了。语句只是经过了简单的索引优化就从一辆2手QQ变成了法拉利,是不是很神奇?

  这就是索引的重要性!

 

  开篇小测试你做对了么?如果没做对那么这么请你自行模拟一个场景再现本篇的话题吧!

 

-----------------------------------------------------------------------------------------------------

  总结 : 往往一个系统的整体缓慢都是因为索引问题导致的,优化索引是对你系统最简单的保养!

      不要小看一条语句的威力,一条语句足可以让你的系统彻底无法工作!

     

     一个问题随之而来语句一条一条漫无目的的优化么?我怎么找出系统的问题语句?怎么样的一个优先级? 

 

0
0
分享到:
评论

相关推荐

    数据库技术及应用——SQL Server课件 7索引.ppt

    【数据库技术及应用——SQL Server课件 7索引】 在数据库管理中,索引是一种至关重要的技术,特别是在SQL Server这样的关系型数据库管理系统中。索引的作用在于提高数据查询的效率,通过预先组织数据,使得数据库...

    sql server 数据库文件——图书订购

    这两个文件是SQL Server数据库不可或缺的部分,下面我们将深入探讨它们的功能和重要性。 1. **主数据文件(mdf)**: 主数据文件是数据库的主要组成部分,它存储了数据库的用户数据、系统表、索引和其他数据库对象...

    数据库应用技术——SQL Server 2000简明教程电子教案

    《数据库应用技术——SQL Server 2000简明教程》是一份专为学习和教学SQL Server 2000而设计的电子教案。SQL Server 2000是微软公司推出的一款关系型数据库管理系统(RDBMS),在当时广泛应用于企业级数据存储和管理...

    [信息系统开发教程——使用C#和SQL+Server+2005]

    《信息系统开发教程——使用C#和SQL Server 2005》是一份深入探讨如何结合C#编程语言与Microsoft SQL Server 2005数据库管理系统进行信息系统开发的教程。本教程旨在帮助开发者全面掌握这两项关键技术,从而构建高效...

    数据库应用技术SQL——server

    SQL Server是由微软公司开发的一款关系型数据库管理系统,它在企业级数据存储、管理和分析方面发挥着重要作用。SQL Server支持多种版本,如Express、Developer、Standard、Enterprise等,以满足不同规模和需求的组织...

    SQL Server管理基础——SQL Server速成最后一课,SQL Server必备工具,数据库安全与备份策略.pdf

    此外,文档还提到了使用T-SQL(Transact-SQL)的重要性。尽管不是硬性要求,但熟悉T-SQL对于执行数据库任务和优化操作来说将非常有利,尤其是对于创建数据库对象和配置数据导入导出等方面。 综上所述,文档覆盖了...

    数据库技术及应用——SQL Server 2005-电子教案

    《数据库技术及应用——SQL Server 2005》是一份深入探讨数据库管理和开发的教程,专注于Microsoft SQL Server 2005这一特定版本。SQL Server 2005是微软公司推出的一款强大的关系型数据库管理系统(RDBMS),在企业...

    数据库应用技术——SQL Server篇》 课件下载

    《数据库应用技术——SQL Server篇》是一门深入探讨SQL Server这一流行关系型数据库管理系统(RDBMS)的课程。SQL Server是微软公司推出的一款强大的数据库解决方案,广泛应用于数据存储、管理和分析。通过本课程,...

    数据库技术及应用——SQL Server课件 2SQL Server 系统概述.ppt

    在"数据库技术及应用——SQL Server课件 2SQL Server 系统概述.ppt"中,我们聚焦于SQL Server的特点、安装、体系结构以及其关键组件。 1. **SQL Server 的特点** - **用户界面良好**:SQL Server 提供了直观的图形...

    SQLPrompt v5.3.0.3支持SQLServer2012

    在SQLServer 2012环境下,这些重构操作将更加顺畅,同时考虑到2012版本引入的新特性,如AlwaysOn可用性组,SQLPrompt也能帮助管理与这些高级特性相关的代码。 再者,SQLPrompt的性能分析功能也是不可忽视的一部分。...

    SQL Server 实验指导书

    - **介绍**:本实验介绍了SQL Server 2005及其管理工具——SQL Server Management Studio的基本功能。 - **学习目标**: - 创建数据库。 - 查看数据库中的对象和默认表。 - 使用查询编辑器。 - 通过多种方式...

    存储基础知识——索引的本质

    在数据库系统中,索引被广泛应用于关系型数据库中,如MySQL、Oracle和SQL Server等,以加速查询性能。 索引的本质主要体现在以下几个方面: 1. 数据结构:索引通常基于特定的数据结构,如B树(B-Tree)、哈希表...

    SQL Server2000 SP4企业版精简版8M.rar

    这个"SQL Server 2000 SP4企业版精简版8M.rar"是一个压缩包,其中包含了SQL Server 2000的企业版精简版安装程序——"SQL Server 2000 SP4企业版精简版8M.exe"。"SP4"指的是Service Pack 4,这是SQL Server 2000的...

    MCSE官方模拟试题—— Microsoft SQL Server 2000系统管理.

    本资源“MCSE官方模拟试题——Microsoft SQL Server 2000系统管理”是针对SQL Server 2000的一款备考资料,由清华大学出版社发布,旨在帮助考生熟悉并掌握SQL Server 2000的系统管理工作。 SQL Server 2000是微软...

    ms sql server2000导入到ms sql server 2005

    2. **使用SQL Server Migration Assistant (SSMA)**:微软提供了一个工具——SQL Server Migration Assistant,专门用于从SQL Server 2000向更高版本迁移。SSMA可以分析源数据库的架构,转换为2005兼容的格式,并...

    大型数据库系统管理、设计与实例分析——基于SQL Server程序原代码

    总结来说,"大型数据库系统管理、设计与实例分析——基于SQL Server程序原代码"这个主题涵盖了数据库设计理论、SQL Server的使用、数据库管理系统的核心功能,以及实际案例的操作。深入学习这个主题,不仅可以提升...

    数据库应用技术——SQL Server 2000简明教程源代码

    《数据库应用技术——SQL Server 2000简明教程源代码》是一个针对初学者的教程,涵盖了数据库管理和开发的基础知识,特别强调了SQL Server 2000的应用。本教程通过PPT形式和配套的源代码,帮助学习者深入理解数据库...

    sqlserver课件 PPT

    《SQLServer数据库基础与应用——北大青鸟原版课件解析》 在信息化时代,数据库管理系统(DBMS)是支撑各类应用系统的核心技术之一,而SQL Server作为Microsoft公司推出的一款强大的关系型数据库管理系统,被广泛...

Global site tag (gtag.js) - Google Analytics