前言

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

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

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

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返回所有列的速度快如此之多,通过以上默认使用索引、强制使用聚集索引、强制使用非聚集索引我们知道对于对于检索所有列结果集使用主键的聚集索引是最佳选择。

总结

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

最新文章

  1. React.js入门必须知道的那些事
  2. 佳能6d 魔灯
  3. NOIP 2015 游记
  4. X-UA-Compatible失效问题
  5. Java设计模式(七) 模板模式-使用钩子
  6. Empire C:游戏篇(1)
  7. floor相关
  8. spring源码深度解析-2功能扩展
  9. Servlet作业--实现注册和登录
  10. eclipse中的输入提示怎么设置
  11. DIR和dirent结构体
  12. oracle常见问题
  13. 初识QT
  14. Windows 2008 R2 域控制器防止意外删除现有OU的设置
  15. 章节四、1-if条件语句
  16. (网页)HTML5
  17. 十大web安全扫描工具
  18. golang的dlv调试工具print打印字符串显示more,无法显示更多
  19. .NET 线程池编程技术
  20. isnull和sum的关系

热门文章

  1. 编写模块时的声明(含MODULE_LICENSE等)(转)
  2. vc++元文件的保存,保存图形,重绘图形
  3. js replace 全部替换
  4. cent os 安装mariaDB / mySQL 之后初始化的命令
  5. leetCode笔记--(1)
  6. 02023_Arrays类的方法练习
  7. 【Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A】 Doggo Recoloring
  8. 【codeforces 799C】Fountains
  9. hibernate框架总结
  10. centos安装wget 及配置