SQL SERVER执行计划和索引优化基础

一、如何打开执行计划?

在Microsoft SQL Server Management Studio中打开“包括实际的执行计划”(快捷键:Ctrl+M),执行SQL语句就可以看到实际的执行计划(图文格式,非常直观),这无疑是最友好的查阅方式。

二、如何看懂实际执行计划?

执行复杂的脚本之后,看到的执行计划,很多人直接懵圈了,这些图文到底是什么含义呢,又该如何优化呢?

下面将列举常见的执行计划操作:

Table Scan(全表扫描):如果你的表数据量非常小,表扫描是可以的,并且可能性能会比其他扫描方式好一些;如果是一张大表,这时你必须要优化索引了。大数据量时,全表扫描,性能消耗是非常明显的。

Clustered Index Scan(聚集索引扫描):一般来讲,此时也应该优化查询语句和索引。出现聚集索引扫描,可能因为返回数据的行或列过多、或者没有明确的WHERE条件触发索引。此类扫描,应当考虑创建合适的索引、增加更加严格的返回列限定、缩小查询的数据范围以控制返回行数。

Index Seek(索引查找):此时性能是比较好的,表示使用了非聚集索引查找。

Clustered Index Seek(聚集索引查找):使用聚集索引(主键)查找,实际上这是SQL Server能做的最快的索引查找类型。

Bookmark Lookup(书签查找):也是应当考虑优化的。在SELECT、JOIN、WHERE的字段中都无法使用非聚集索引来满足查找,查询优化器不得不使用额外的聚集索引查找满足查询需求的字段此时可能会引起书签查找,不过查询优化器可能也会使用Clustered Index Scan来替代书签查找。还有一个可能引起书签查找的原因是SELECT * FROM …,所以任何情况下使用SELECT * 都是不建议的。

Stream Aggregate(流聚合):使用了SQLSERVER的聚合函数时,会引起流聚合操作。比如:COUNT,MAX,MIN,AVG,DISTINCT,SUM等。

Compute Scalar(计算标量):使用COUNT计数时,会引起该操作;

Sort(排序):当使用了无索引的字段排序时,可能会引起Sort操作;此时应该考虑是否需要该排序操作,或采用其他创建索引的字段排序。如确实无法改变,则建议在排序字段添加索引。

三、常见的索引优化规则

1,所有的索引优化都是取决于数据量大小,数据量极小时,可不考虑创建索引,创建了索引反而引起性能下降;

2,频繁查询、排序或者使用的条件字段,建议使用索引优化;如:存在自增主键时,如果使用创建时间排序,尽量优化为使用主键排序;

3,WHERE条件中的表达式尽量放在操作符之后。常见的条件操作符有:=、>、<、!=、BETWEEN AND 等;

举例:DATEPART(YEAR,CreateTime)>=2017 应该优化为:CreateTime>’2017-01-01 00:00:00’;LEN(ParamValue)=0 应该优化为:0=LEN(ParamValue);

4,存在的值重复性较高的字段,不建议创建索引,如:状态标识列;

5,经常组合使用的多个条件字段,应该创建复合索引;

6,减少LIKE的使用,LIKE在使用通配符开头(如:LIKE ‘%A%’)不会使用索引查询;

7,大字段禁止创建索引;

8,不能滥用索引,必须根据实际需要是创建和维护。索引会引起磁盘和数据维护的开销,要知道,服务器的硬盘是非常可贵的。

附:好玩的系统查询脚本

1,查询引用了某个字符的数据库对象,适用于查找使用了某个字段的存储过程、视图等;

SELECT  so.name, sc.text FROM   dbo.syscomments sc , dbo.sysobjects so

WHERE   sc.id = so.id AND sc.text LIKE ‘%PlatValue%‘

--AND so.xtype = ‘p‘ --xtype表示对象类型,p为存储过程

ORDERBY name

2,查询某个表的表结构

SELECT  sc.name, st.name AS [DataType], sc.prec

FROM    syscolumns sc

INNER JOIN systypes st ON st.xusertype = sc.xusertype

WHERE   sc.id = OBJECT_ID(‘PlatParam‘)

时间: 2024-10-14 21:38:10

SQL SERVER执行计划和索引优化基础的相关文章

SQL Server执行计划那些事儿(3)——书签查找

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. 在刚开始工作时候,总以自己有个“高科技”的工作,而感到特别神气,经常在其他人面前说一些让别人觉得高大上的措辞,到后来会在学妹面前炫耀的讲一下SQL Server的执行计划,这个时候别说执行计划了,就是SQL的优化对我来说还是个新鲜的事物,总是以自己能正确查出结果而沾沾自喜.然而,当真有不经世事的学妹

SQL Server执行计划那些事儿(2)——查找和扫描

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. 开门见上,直接入题 在查看执行计划时候,你是否曾经也和我一样,有这样的疑惑呢?查找和扫描究竟是什么,以及他们的在查询性能上有什么区别.下面分享下我的理解. 扫描和查找是SQL Server从表或索引中读取数据所采用的迭代器,又因为经常在执行计划中看到,因此理解他们之间的区别,对我们优化查询有很重要的

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要. 目录 概述 基础概念 怎样缓存执行计划 SQL Server自动删除执行计划 重新编译执行计划 测试 执行计划相关系统视图 手动清空缓存执行计划 测试索引更改对执

浅析SQL SERVER执行计划中的各类怪相

在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解: 1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描? 2:同一条SQL语句,查询条件的取值不同,它的执行计划会一致吗? 3: 同一条SQL语句,其执行计划会变化,为什么 4: 在查询条件的某个或几个字段上创建了索引,执行计划就一定会走该索引吗? 5:同时存在几个索引,SQL语句会走那个索引? ..............................................

引用:初探Sql Server 执行计划及Sql查询优化

原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划. 网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚至几MS的时

sql server 执行计划(execution plan)介绍

sql server 执行计划(execution plan)介绍 大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是sql server 执行计划 sql server 执行计划的大致使用 学习计划 1.什么是sql server 执行计划 执行计划是查询优化器对我们提交的T-SQL查询请求的最有效方法的的执行结果,执行计划可以告诉我们查询是如何

SQL Server 执行计划操作符详解(2)——串联(Concatenation )

本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻想一下是干嘛的.其实还是挺直观,就是把东西连起来,那么下面我们来看看到底连什么?怎么连?什么时候连? 简介: 串联操作符既是物理操作符,也是逻辑操作符,在中文版SQL Server的图形化执行计划中称为"串联",在其他格式及英文版本中称为"Concatenation".

SQL Server执行计划的理解

原文:SQL Server执行计划的理解 要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. 名词解析: 扫描:逐行遍历数据. 先建立一张表,并给大家看看大概是什么样子的. CREATE TABLE Person( Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50) NULL, Age int NULL

SQL Server 执行计划中的扫描方式举例说明

原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的语句,点击Ctrl+L执行 2.示例student表,id,name,addressid上建立聚集索引Name建索引address无索引 3.区别1. [Table Scan]:遍历整个表,查找所有匹配的记录行.这个操作将会一行一行的检查,当然,效率也是最差的.以无索引字段为条件,按存放顺序一个个查,where address='123' 2. [I