SQLServer 执行计划的简单学习和与类型转换的影响


背景

最近一直在看SQLServer数据库
索引.存储.还有profiler的使用 并且用到了 deadlock graph
但是感觉还是不太深入
数据库的查询计划学习的还是太少.
正好同事说到了jdbc里面的 :sendStringParametersAsUnicode
参数的问题.
一直没搞明白影响程度, 所以想继续学习验证一下.

方式

-- 开启记录的事项
SET STATISTICS TIME ON
SET STATISTICS IO ON
SET STATISTICS PROFILE ON
-- 刷新缓存, 避免有影响.
dbcc dropcleanbuffers

验证思路

本次主要是想验证 where 条件后面 等于的字符串 在带不带 N 的影响. 

所以执行的SQL主要如下:
SET STATISTICS TIME ON
SET STATISTICS IO ON
SET STATISTICS PROFILE ON dbcc dropcleanbuffers
--- 第一个SQL
select id from xxx.tablename where id='b45db192-1392-4afd-954b-cb0b5c63abb0'
--- 第二个SQL
select id from xxx.tablename where id = N'b45db192-1392-4afd-954b-cb0b5c63abb0'

带 N 的执行时间

SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 SQL Server 执行时间:
CPU 时间不是在纤程模式下测量的,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 (1 行受影响)
表 'TMJSDATA'。扫描计数 1,逻辑读取 4 次,物理读取 4 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 (5 行受影响) (1 行受影响) SQL Server 执行时间:
CPU 时间不是在纤程模式下测量的,占用时间 = 89 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 SQL Server 执行时间:
CPU 时间不是在纤程模式下测量的,占用时间 = 0 毫秒。

不带N的执行情况

SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 SQL Server 执行时间:
CPU 时间不是在纤程模式下测量的,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 (1 行受影响)
表 'TMJSDATA'。扫描计数 0,逻辑读取 4 次,物理读取 4 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 (2 行受影响) (1 行受影响) SQL Server 执行时间:
CPU 时间不是在纤程模式下测量的,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。 SQL Server 执行时间:
CPU 时间不是在纤程模式下测量的,占用时间 = 0 毫秒。

分析-基础知识

预读:用于估计信息,去硬盘读取数据到缓存。
物理读:查询计划生成以后,如果发现缓存缺少所需要的数据,让缓存再次去读硬盘数据。
逻辑读:SQLSERVER去内存里的缓存取数据或者执行计划 SQLSERVER存储的最小单位是页,每一页大小为8K,即8*1024=8192字节,
SQLSERVER对页的读取是原子性的,即要么读完一页,要么完全不读。
即使仅仅要获得一条数据,也要读完该页,而页之间的数据组织结构为B树结构。所以SQLSERVER对于逻辑读,物理读,预读的单位是页。 扫描计数是指在SQL查询执行过程中,统计表或索引的扫描次数的过程。
扫描操作常常是影响查询性能的重要因素,因为扫描比索引查找更消耗资源。
官方文档里面的解释为:
扫描计数是在任何方向都达到叶级别后启动的查询/扫描数,目的在于检索用于构造输出的最终数据集的所有值。 在任意方向到达叶级别之后开始的搜索或扫描次数,搜索/扫描目的是检索所有用于构造输出的最终数据集的值。
如果使用的索引是主键上的唯一索引或聚集索引,且只搜索一个值,则扫描计数为 0。 例如,WHERE Primary_Key_Column = <value>。
当使用对非主键列定义的非唯一的聚集索引搜索一个值时,扫描计数为 1。 此过程的目的是针对你正在搜索的键值检查重复值。 例如,WHERE Clustered_Index_Key_Column = <value>。
当 N 为通过使用索引键定位键值后,在叶级别的左侧或右侧启动的不同查找或扫描数时,则扫描计数为 N

分析-简单结论

因为数据库表结构是 varchar 类型的 where条件强行指定 N之后
发现查询计划出现了偏差. 会多一次扫描计数, 并且执行的时间也会变长, 的确存在较严重的性能下降.
查询计划也复杂一些. 所以感觉类型转换在数据库的执行过程中还是存在较严重的性能风险
非常不建议使用. 建议还是固定好数据结构数据类型. 避免出现字段变更导致性能问题.

带-N 的查询结果


不带-N的执行计划

SQLServer 执行计划的简单学习和与类型转换的影响的更多相关文章

  1. mysql之优化器、执行计划、简单优化

    mysql之优化器.执行计划.简单优化 2018-12-12 15:11 烟雨楼人 阅读(794) 评论(0) 编辑 收藏 引用连接: https://blog.csdn.net/DrDanger/a ...

  2. SQLSERVER执行计划详解

    序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博 ...

  3. MySQL数据库执行计划(简单版)

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库执行计划简单版时间:2019年2月25日内容:MySQL数据库执行计划简单版重点:MySQL ...

  4. 看懂SqlServer执行计划

    在园子看到一篇SQLServer关于查询计划的好文,激动啊,特转载.原文出自:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.htm ...

  5. SqlServer 执行计划及Sql查询优化初探

    网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚至几MS的时间差的例子来证明着什么(有点可笑),让许 ...

  6. Oracle性能优化之oracle中常见的执行计划及其简单解释

    一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...

  7. SqlServer执行计划

    MSSQLSERVER执行计划详解 * from ServiceInvoke; --创建时间聚集索引扫描 * from AdoLog; --主键ID聚集索引扫描 --2.根据聚集索引排序-性能提升 - ...

  8. SQLServer 执行计划

    http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html#_label0   http://www.jb51.net/article ...

  9. SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

    我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...

  10. sqlser 2005 使用执行计划来优化你的sql

    一:sqlserver 执行计划介绍    sqlserver 执行计是在sqlser manager studio 工具中打开,是检查一条sql执行效率的工具.建议配合SET STATISTICS ...

随机推荐

  1. .net Core实战简单文件服务器

    首先新建一个ASP.NET Core 项目,选中空的模板,如下图所示 在NuGet包中添加Microsoft.AspNetCore.StaticFiles 添加好以后我们在Startup.cs中添加对 ...

  2. Java 中时间对象的序列化

    在 Java 应用程序中,时间对象是使用地比较频繁的对象,比如,记录某一条数据的修改时间,用户的登录时间等应用场景.在传统的 Java 编程中,大部分的程序员都会选择使用 java.uti.Date ...

  3. 一篇文章彻底搞懂TiDB集群各种容量计算方式

    背景 TiDB 集群的监控面板里面有两个非常重要.且非常常用的指标,相信用了 TiDB 的都见过: Storage capacity:集群的总容量 Current storage size:集群当前已 ...

  4. shared_ptr 自定义 deleter 删除器

    一些结论 如果 shared_ptr 管理的资源不是 new 分配的内存,才考虑自定义删除器,这也是为什么 make_shared 不支持自定义删除器的原因,因为 make_shared 就是通过 n ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (19)-- go语言的slice和rust语言的Vec的扩容流程是什么?

    go语言的slice和rust语言的Vec的扩容流程是什么? 文心一言: 在Go语言中,slice(切片)和Rust语言中的Vec都是用于存储一组固定长度的元素的数据结构.它们的扩容流程略有不同,下面 ...

  6. Java 展开或折叠PDF中的书签

    PDF中的书签功能可快速定位到指定阅读位置.对多层书签可根据阅读喜好设置层级展开或折叠.本文将通过Java程序代码介绍如何来实现PDF书签展开或折叠. 程序环境 Spire.Pdf.jar( 免费版3 ...

  7. 零代码修改,教你Spring Cloud应用轻松接入CSE

    摘要:本文介绍了Sermant Agent的接入原理和如何使用Sermant Agent无修改接入CSE. 本文分享自华为云社区<Spring Cloud应用零代码修改接入华为云微服务引擎CSE ...

  8. OLAP分析型应用场景中,数仓中vacuum为何对列存表无效

    摘要:对列存表执行vacuum为什么是无效的呢?其实这与列存表的存储结构以及数据写入方式有关. 本文分享自华为云社区<GaussDB(DWS)中vacuum为何对列存表无效?[这次高斯不是数学家 ...

  9. 云图说|云上应用监控神器——应用性能监控APM2.0

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 应用性能管理服务 ...

  10. 如何用AB测试完善产品激励体系

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 用户激励体系,也称用户激励机制,是为了让用户持续使用产品,而设计的一套对应规则.在用户激励体系建立过程中,产品可以 ...