SQL Server中语句的自动参数化
来源:互联网 发布:c语言 项目开发实例 编辑:程序博客网 时间:2024/04/28 11:38
use mastergoif exists(select * from sys.databases where name = 'test') drop database testgo--创建数据库create database testif exists(select * from sys.tables where name = 't') drop table tgo--1.创建表tcreate table t(i int);--2.添加100000条记录,消耗56秒declare @i int;declare @sql varchar(1000);set @i = 1set @sql = '';while @i <= 100000beginset @sql = 'insert into t values(' + cast(@i as varchar) +')'begin tranexec(@sql) commit tran set @i = @i + 1 end--3.1查询的统计信息--但发现没有返回记录select st.text, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text, qs.*from sys.dm_exec_query_stats qscross apply sys.dm_exec_sql_text(qs.sql_handle) stwhere cast(st.text as varchar) like '%insert into t values%'--3.2查询的统计信息--有返回,说明SQL Server在执行动态生成的语句时,已经参数化了--execution_count字段的值为100000select st.text, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text, qs.*from sys.dm_exec_query_stats qscross apply sys.dm_exec_sql_text(qs.sql_handle) stwhere cast(st.text as varchar) like '%insert into%'--3.3 查看数据库是否强制参数化--并没有强制参数化,说明上面是系统自动对语句进行参数化了select name, is_parameterization_forced --返回0,说明并没有强制参数from sys.databaseswhere name = 'test'--3.4 再次执行后,再次执行3.2后发现,execution_count为100001insert into t values(100001)--3.5 这次在语句中加了空格,execution_count为100002insert into t values( 100002 )--3.5 这次在语句中加了架构--返回2条记录,一条为100002,另一个为1--虽然2条数据的sql_handle、plan_handle都不相同,但是query_hash、query_plan_hash相同insert into dbo.t values( 100003 )--3.6 显示缓存的执行计划--返回2条数据,一条为100002,一个为1--缓存对象类型为编译计划,对象类型为Preparedselect *from sys.dm_exec_cached_plans cpcross apply sys.dm_exec_sql_text(cp.plan_handle) stwhere st.text like '%insert into%'
最后总结一下:
1.对于一些比较简单的语句,SQL Server能自动进行参数化,会自动忽略空格。
2.但当语句有不同时,比如加了对象所属的架构后,系统就没办法进行参数化了,但很有意思的是query_hash和query_plan_hash都相同,也就是说明本质上这些查询都是一样的。
所以可以通过group by这些hash值,计算编译了多少次。
- SQL Server中语句的自动参数化
- Sql Server中sql语句自动换行
- SQL Server 中使用参数化Top语句
- SQL Server 中使用参数化Top语句
- SQL Server中常用的SQL语句
- SQL Server中常用的SQL语句
- 动态执行带参数的sql语句,适用于sql server
- 如何在SQL Server中从触发器中获取引发该触发器的SQL语句内的相应参数?
- ASP.NET参数化SQL语句(SQL SERVER)
- 解决 JMeter 中 SQL 语句参数化的问题
- sql语句中参数的使用
- 在SQL语句中“?”参数的使用
- C#中SQL语句的参数写法
- Sql Server中自动序号的方法
- SQL SERVER 中自动编号的字段
- SQL SERVER中带参数的返回
- SQL SERVER中带参数的返回
- SQL SERVER中带参数的返回
- HDU--2952 -- Counting Sheep [广搜]
- 学生信息管理系统(一)
- 如果这点困难都克服不了,我们什么也就不必想不必做了
- 日积月累--小技巧之二
- iOS SDK:那些关于iOS调试的技巧
- SQL Server中语句的自动参数化
- 编程之美 求数组中的最长递增子序列
- Hadoop安装记录及测试
- 排序算法--选择排序
- android Dalvik虚拟机工作原理介绍
- 买电脑经验总结
- 都是360捣的鬼
- ios 随机数
- 【创业版】《漫漫邮子路(二)--睿泰集团总裁的求学与创业:艾顺刚》