原文:SQL Server中语句的自动参数化



  1. use master
  2. go
  3. if exists(select * from sys.databases where name = 'test')
  4. drop database test
  5. go
  6. --创建数据库
  7. create database test
  8. if exists(select * from sys.tables where name = 't')
  9. drop table t
  10. go
  11. --1.创建表t
  12. create table t(i int);
  13. --2.添加100000条记录,消耗56秒
  14. declare @i int;
  15. declare @sql varchar(1000);
  16. set @i = 1
  17. set @sql = '';
  18. while @i <= 100000
  19. begin
  20. set @sql = 'insert into t values(' + cast(@i as varchar) +')'
  21. begin tran
  22. exec(@sql)
  23. commit tran
  24. set @i = @i + 1
  25. end
  26. --3.1查询的统计信息
  27. --但发现没有返回记录
  28. select st.text,
  29. SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
  30. ((CASE qs.statement_end_offset
  31. WHEN -1 THEN DATALENGTH(st.text)
  32. ELSE qs.statement_end_offset
  33. END - qs.statement_start_offset)/2) + 1) AS statement_text,
  34. qs.*
  35. from sys.dm_exec_query_stats qs
  36. cross apply sys.dm_exec_sql_text(qs.sql_handle) st
  37. where cast(st.text as varchar) like '%insert into t values%'
  38. --3.2查询的统计信息
  39. --有返回,说明SQL Server在执行动态生成的语句时,已经参数化了
  40. --execution_count字段的值为100000
  41. select st.text,
  42. SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
  43. ((CASE qs.statement_end_offset
  44. WHEN -1 THEN DATALENGTH(st.text)
  45. ELSE qs.statement_end_offset
  46. END - qs.statement_start_offset)/2) + 1) AS statement_text,
  47. qs.*
  48. from sys.dm_exec_query_stats qs
  49. cross apply sys.dm_exec_sql_text(qs.sql_handle) st
  50. where cast(st.text as varchar) like '%insert into%'
  51. --3.3 查看数据库是否强制参数化
  52. --并没有强制参数化,说明上面是系统自动对语句进行参数化了
  53. select name,
  54. is_parameterization_forced --返回0,说明并没有强制参数
  55. from sys.databases
  56. where name = 'test'
  57. --3.4 再次执行后,再次执行3.2后发现,execution_count为100001
  58. insert into t values(100001)
  59. --3.5 这次在语句中加了空格,execution_count为100002
  60. insert into t values( 100002 )
  61. --3.5 这次在语句中加了架构
  62. --返回2条记录,一条为100002,另一个为1
  63. --虽然2条数据的sql_handle、plan_handle都不相同,但是query_hash、query_plan_hash相同
  64. insert into dbo.t values( 100003 )
  65. --3.6 显示缓存的执行计划
  66. --返回2条数据,一条为100002,一个为1
  67. --缓存对象类型为编译计划,对象类型为Prepared
  68. select *
  69. from sys.dm_exec_cached_plans cp
  70. cross apply sys.dm_exec_sql_text(cp.plan_handle) st
  71. where st.text like '%insert into%'

最后总结一下:

1.对于一些比较简单的语句,SQL Server能自动进行参数化,会自动忽略空格。

2.但当语句有不同时,比如加了对象所属的架构后,系统就没办法进行参数化了,但很有意思的是query_hash和query_plan_hash都相同,也就是说明本质上这些查询都是一样的。

所以可以通过group by这些hash值,计算编译了多少次。

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

SQL Server中语句的自动参数化的更多相关文章

  1. 使用sql语句创建修改SQL Server标识列(即自动增长列)

    一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...

  2. SQL Server中常用的SQL语句(转):

    SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...

  3. SQL Server中的SQL语句优化与效率问题

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  4. SQL Server中常用的SQL语句

    1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例 ...

  5. SQL Server中CURD语句的锁流程分析

    我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...

  6. SQL Server中怎么查看每个数据库的日志大小,以及怎么确定数据库的日志文件,怎么用语句收缩日志文件

    一,找到每个数据库的日志文件大小 SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace) DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文 ...

  7. (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务)

    (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务) 1.概念:隐式事务,显式事务,自动提交事务 2.操作:如何设置事务模式 3.存储过程中的事务 XACT_ABORT 1 ...

  8. SQL Server中的SQL语句优化与效率

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  9. SQL Server中一些有用的日期sql语句

    SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...

随机推荐

  1. OpenTK学习笔记(2)-工作窗口的三种方法创建方法(winfrom窗体控件形式创建)

    参考资料: https://social.msdn.microsoft.com/Forums/zh-TW/1b781685-c670-4338-953d-1957a8f24a66/opentkglco ...

  2. ArcGIS 10.5 tensorflow安装日记

    ArcGIS 10.5 tensorflow安装日记 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com Datetime: 2019年5月27日星期一 Os: w ...

  3. WhereHows编译时报错EINVRES Request to https://bower.herokuapp.com/packages/ace-builds failed with 502

    先说明一下,简单点讲就是bower的仓库地址换掉了.解决方案如下: 在.bowerrc文件中增加这么一句: { "registry": "https://registry ...

  4. 转:android DownloadManager: java.lang.SecurityException: Invalid value for visibility: 2

    1.问题描述 今天使用Android系统的DownloadManager进行下载操作时,爆了如下所示的错误: java.lang.RuntimeException: Unable to start s ...

  5. main方法的详解

    格式 * public static void main(String[] args) {} 针对格式的解释 public 被jvm调用,访问权限足够大. static 被jvm调用,不用创建对象,直 ...

  6. asyncio与gevent并发性能测试

    asyncio与gevent并发性能测试 在对网站进行扫描或者暴破时需要对网站进行高并发操作,然而requests+concurrent多线程性能上不太理想,了解到python用得比较多的并发库有as ...

  7. load ifc

    void setRootNode( osg::Group* root ) { m_main_view->setSceneData( root ); if( m_hud_camera ) { ro ...

  8. xshell6破解4窗口限制

    资源路径: 链接: https://pan.baidu.com/s/11zumNoaIN1AF_YhmiPGWdA 提取码: nfs9 破解方法 先卸载系统中已经安装的xshell与xftp 然后安装 ...

  9. 关于做移动端ui自动化测试使用PC代理网络会出现的问题

    无论是手动操作app还是ui脚本操作app,只要你使用了代理网络,第一次请求的时长会耗时特别长,所以在移动端测试时尽量不要使用代理网络,减少不必要的麻烦

  10. PAT 甲级 1062 Talent and Virtue (25 分)(简单,结构体排序)

    1062 Talent and Virtue (25 分)   About 900 years ago, a Chinese philosopher Sima Guang wrote a histor ...