浅析SQL Server的聚焦使用索引和查询执行计划

所属分类: 数据库 / MsSql 阅读数: 1077
收藏 0 赞 0 分享

前言

上一篇《浅析SQL Server 聚焦索引对非聚集索引的影响》我们讲了聚集索引对非聚集索引的影响,对数据库一直在强调的性能优化,所以这一节我们统筹讲讲利用索引来看看查询执行计划是怎样的,简短的内容,深入的理解。

透过索引来看查询执行计划

我们首先来看看第一个例子

1、默认使用索引

USE TSQL2012
GO
SELECT orderid 
FROM Sales.Orders
SELECT * 
FROM Sales.Orders

上述我们看到第2个查询的所需要的开销是第1个查询开销的3倍,当然其中也涉及到第1个查询只是返回一列而第2个查询返回所有列,这其中也耗费一小部分性能。对于SQL Server查询而言,它内部会利用索引来走最短的路径获取最优的性能。我们能够注意到即使将orderid作为主键,但是返回数据并不是采用的主键所自动生成的聚集索引而是非聚集索引。相信有很多人主观上觉得返回主键而且查询没有查询条件应该是走主键的聚集索引,但是有时候事实并非如此,上一篇我们已经讨论过这个问题,不再叙述。在第2个查询中利用*返回数据则是利用主键的聚集索引。

2、强制主键使用聚集索引

强制使用索引我们利用With(index(索引名称))来创建,如下:

USE TSQL2012
GO
SELECT orderid 
FROM Sales.Orders WITH(INDEX(PK_Orders))
SELECT * 
FROM Sales.Orders WITH(INDEX(PK_Orders))

我们从上可以看出默认返回主键列时利用非聚集索引,这里我们强制让它走聚集索引,而对于第2个查询就不用说了,此时二者的开销是相当的。

3、强制使用非聚集索引

我们继续往下看,对查询强制使用非聚集索引查找,如下:

USE TSQL2012
GO
SELECT orderid 
FROM Sales.Orders WITH(INDEX(idx_nc_custid))
SELECT * 
FROM Sales.Orders WITH(INDEX(idx_nc_custid))

由上可见,二者开销区别之大,对于使用非聚集索引查询1返回单列,而查询2返回所有列的速度快如此之多,通过以上默认使用索引、强制使用聚集索引、强制使用非聚集索引我们知道对于对于检索所有列结果集使用主键的聚集索引是最佳选择。

总结

通过上述演示我们知道即使创建了聚集索引也不会利用聚集索引检索结果,有时候使用非聚集索引比使用聚集索引会提供更好的性能,当然不能一概而论,二者皆有使用场景。当每一次面试时谈到数据库优化时,第一想到的是索引,然后就没有下文了,如何使用索引,怎么在不同场景使用不同的索引呢?在任何数据库中索引一直都是一个很大的话题且是一个复杂的内容,复杂的内容皆是由简单堆积而成,我们必须如蜗牛般去慢慢研究,抽茧剥丝,最终才会有一个好的效果。简短的内容,深入的理解。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多支持脚本之家!

更多精彩内容其他人还在看

SQL Substring提取部分字符串

SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分。这个函数的名称在不同的资料库中不完全一样
收藏 0 赞 0 分享

用户"sa"登陆失败 SQLServer 错误18456的解决方法

sqlserver下用sa登录提示18456错误的解决方法。
收藏 0 赞 0 分享

drop,truncate与delete的区别

这里说的delete是指不带where子句的delete语句
收藏 0 赞 0 分享

SQL语句查询数据库中重复记录的个数

一个sql语句:一个表test有四个字段id,a,b,c,如果表中的记录有三个字段a,b,c都相等,则说明这条记录是相同的,求相同的记录的个数 。
收藏 0 赞 0 分享

SQL 导入导出Excel数据的语句

从Excel文件中,导入数据到SQL数据库中,很简单
收藏 0 赞 0 分享

可以获取客户端的IP地址的sql语句

利用SQL语句得到客户端的IP地址的代码
收藏 0 赞 0 分享

SQL 根据汉字获取全拼的代码

SQL 根据汉字获取全拼(有些字还没有添加上去,请自已加上去,涂聚文注)
收藏 0 赞 0 分享

sqlserver exists,not exists的用法

exists,not exists的使用方法示例,需要的朋友可以参考下。
收藏 0 赞 0 分享

sqlserver substring函数使用方法小结

在操作sqlserver时候用到了substring函数,特整理一些实例,需要的朋友可以参考下。
收藏 0 赞 0 分享

sql 判断数据库,表,存储过程等是否存在的代码

sql下用了判断各种资源是否存在的代码,很实用。需要的朋友可以参考下。
收藏 0 赞 0 分享
查看更多