专栏首页有关SQLSQL 运行时性能统计信息的获取

SQL 运行时性能统计信息的获取

打个招呼,这一篇可能不适合 CRUD Boy/Girl. 纯做增删改查的 SQL 编码师可能会觉得偏难。

假设如下的存储过程,有两段 SQL 查询组成。执行时发现,响应很慢。

请问你该怎么办?

有同学说,看阻塞情况,这样的:

记得我在知识星球中,发过这样的题目:

找到伤害你的元凶了,该报仇报仇,该抱怨就抱怨。

又有同学说,看执行计划,这样的:

这两种做法都可以尝试,且对调优也有相当的帮助。但今天要探讨的是另外一种方法,运行时获取性能统计信息。这些统计信息包含了编译及执行流失总时间,CPU 执行时间,磁盘 IO 开销。知道了这些有什么用之类的问题,请充分发挥你的想象力。最直接的一点,你可以知道前面存储过程中哪段 SQL 执行的最慢,需要全身心的解决这段 SQL 查询效率。这仅从看查询执行流失总时间即可清晰得做出判断。

获取统计信息的做法:

set statistics time on set statistics io on

统计信息都打出来了,熟快熟慢不难分解。

IO的读取和存储结构有紧密的关系。数据行是存储在数据页上的,一个页在 SQL Server 中是 8K(其他数据库比 SQL Server 灵活的地方在于数据页大小可调,比如 Oracle 就是,8K, 32K,64K, Hadoop 也是,64MB, 128MB;根据应用选择最恰当的存储单元),读取的页数乘以 8K 就是读取的数据量。越大耗时越长,也就表明这地方要加索引或采用其他优化方法。而磁盘针头读取一般以扇区为单位,512K 也就是 64 个数据页为一次读的最大量,不管是查多少条数据,哪怕一条数据,耗费的都是 512K. 经常郁闷的查几条数据,却耗时那么长,原理就在这儿。明面上查一条数据,其实把很多数据页上的数据都拉到内存里了。这叫预读,Read Ahead.

获取运行时执行计划

有了性能统计信息,我们的矛头指向哪儿就有了明确的目标了。接下来就可以分析这段 SQL 的执行计划了。有时候这段 SQL 非常复杂,你不想复制出来重新单步调执行计划,那么可以采用运行时查看执行计划,这有点 Oracle 的文本执行计划的意思。针对存储过程的多段 SQL 来说,精确获取某段慢查询的执行计划,能更好的提供优化策略。

这时候你需要这命令:

set statistics profile on

比如 PhysicalOp 中出现了 Index Scan ,说明索引效率不高,想办法转换成 Index Seek.

当然,在调试的时候,千万别直接修改原存储过程。建议在原存储过程名后加上_pt (performance tunning 缩写), 在需要的 SQL 段落前加上 print ' xxx begins...' 以明确统计信息的步骤对象归属。

好了,祝你下次遇到多段 SQL 调优时,“目光远大,心狠手辣” (来自二爷语录)

本文分享自微信公众号 - 有关SQL(SQLHub),作者:Lenis

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 移动下SQL中的表位置,性能提高18倍

    平日里2-3秒搞定的SQL,这会非得弄个7-8秒。timeout更是频频爆出。搞得办公室怨叫声此起彼伏,真有点《生命协奏曲》的味道。

    Lenis
  • 零基础 SQL 数据库小白,从入门到精通的学习路线与书单

    我观察了 865 个 SQL 入门者,发现大家在学习 SQL 的时候,最大的问题不是 SQL 语法,而是对 SQL 原理的不熟悉。

    Lenis
  • SQL 的编译原理,了解下?

    一大帮子的开发,窝在一处办公,想想这酸爽,谁见谁愁。L 早已下楼去星巴克加冰了,剩下小 C 在对付 同样焦灼的 Support.

    Lenis
  • 一个写SQL语句的便利工具

    前言 我们平时会经常写SQL语句,这个过程我有一个痛点 我一直使用的数据库工具是 Sequel Pro,在写SQL时有点不方便,主要是对表明和字段名的自动提示支...

    dys
  • 如何向奶奶解释SQL与NoSQL的区别

    最近Medium上出现了一个面试题:如何向你奶奶解释SQL和NoSQL的区别。我看作者是用自己的结构化的家族谱来比喻sql和nosql的区别的,写的挺好就是有点...

    Jean
  • 安装SQL Server 2005 遇到的问题及解决方法

    Windows无法启动SQL Server FullText Search(MSSQLSERVER)服务(位于本地计算机上) 错误 1075:服务不存在,或已...

    飞奔去旅行
  • WEB攻击手段及防御第2篇-SQL注入

    概念 SQL注入即通过WEB表单域插入非法SQL命令,当服务器端构造SQL时采用拼接形式,非法SQL与正常SQL一并构造并在数据库中执行。 简单的SQL注入的...

    Java技术栈
  • 验证GaussDB T 闪回事务查询功能;闪回表功能强劲闪回TRUNCATE

    总的来说,gaussdb100 T 是可以支持闪回事务查询。 二、GaussDB T 的 Flashback Table 功能非常强劲可以闪回TRUNCATE...

    数据和云
  • 数据库监控断点业务中断的一种案例及分析

    问题已经分析出来了,就是某个SQL阻塞了其他请求,那么如何找到这条SQL呢?有两种方式

    于航
  • 【数据库智能管家DBbrain】深入揭秘DBbrain智能优化引擎

    为了便于大家理解DBbrain的SQL优化功能的使用场景和设计背景,先简单聊一聊SQL性能较差与数据库性能联系——我们通常把性能较差的SQL称之为慢SQL,一般...

    迪B哥

扫码关注云+社区

领取腾讯云代金券