SQL Server中语句的自动参数化
-
use master
-
go
-
-
if exists(select * from sys.databases where name = 'test')
-
drop database test
-
go
-
-
--创建数据库
-
create database test
-
-
if exists(select * from sys.tables where name = 't')
-
drop table t
-
go
-
-
-
--1.创建表t
-
create table t(i int);
-
-
-
--2.添加100000条记录,消耗56秒
-
declare @i int;
-
declare @sql varchar(1000);
-
-
set @i = 1
-
set @sql = '';
-
-
while @i <= 100000
-
begin
-
set @sql = 'insert into t values(' + cast(@i as varchar) +')'
-
begin tran
-
-
exec(@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 qs
-
cross apply sys.dm_exec_sql_text(qs.sql_handle) st
-
where cast(st.text as varchar) like '%insert into t values%'
-
-
-
-
--3.2查询的统计信息
-
--有返回,说明SQL Server在执行动态生成的语句时,已经参数化了
-
--execution_count字段的值为100000
-
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 qs
-
cross apply sys.dm_exec_sql_text(qs.sql_handle) st
-
where cast(st.text as varchar) like '%insert into%'
-
-
-
--3.3 查看数据库是否强制参数化
-
--并没有强制参数化,说明上面是系统自动对语句进行参数化了
-
select name,
-
is_parameterization_forced --返回0,说明并没有强制参数
-
from sys.databases
-
where name = 'test'
-
-
-
--3.4 再次执行后,再次执行3.2后发现,execution_count为100001
-
insert into t values(100001)
-
-
--3.5 这次在语句中加了空格,execution_count为100002
-
insert 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
-
--缓存对象类型为编译计划,对象类型为Prepared
-
select *
-
from sys.dm_exec_cached_plans cp
-
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
-
where st.text like '%insert into%'
-
-
最后总结一下:
1.对于一些比较简单的语句,SQL Server能自动进行参数化,会自动忽略空格。
2.但当语句有不同时,比如加了对象所属的架构后,系统就没办法进行参数化了,但很有意思的是query_hash和query_plan_hash都相同,也就是说明本质上这些查询都是一样的。
所以可以通过group by这些hash值,计算编译了多少次。
SQL Server中语句的自动参数化的更多相关文章
- 使用sql语句创建修改SQL Server标识列(即自动增长列)
一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...
- SQL Server中常用的SQL语句(转):
SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...
- SQL Server中的SQL语句优化与效率问题
很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...
- SQL Server中常用的SQL语句
1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例 ...
- SQL Server中CURD语句的锁流程分析
我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...
- SQL Server中怎么查看每个数据库的日志大小,以及怎么确定数据库的日志文件,怎么用语句收缩日志文件
一,找到每个数据库的日志文件大小 SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace) DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文 ...
- (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务)
(4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务) 1.概念:隐式事务,显式事务,自动提交事务 2.操作:如何设置事务模式 3.存储过程中的事务 XACT_ABORT 1 ...
- SQL Server中的SQL语句优化与效率
很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...
- SQL Server中一些有用的日期sql语句
SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...
随机推荐
- C++ .h 与 .hpp 的区别
原文地址:http://blog.csdn.net/f_zyj/article/details/51735416 .hpp,本质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件, ...
- SQL中如何使用方向键——lrwrap
Linux alias命令用于设置指令的别名. 用户可利用alias,自定指令的别名.若仅输入alias,则可列出目前所有的别名设置.alias的效力仅及于该次登入的操作.若要每次登入是即自动设好别名 ...
- protobuf protocol-buffers 序列化数据 gobs pickling string XML 用C实现的cPickle比pickle快1000倍 protobuf2 protobuf3 差异
场景: 浏览器请求--->python数据生成--->python-生成excel--->浏览器下载excel 目标: 重构为 浏览器请求--->python数据生成---&g ...
- ISO/IEC 9899:2011 条款5——5.2.2 字符显示语义
5.2.2 字符显示语义 1.活动位置是在一个显示设备上的位置,由fputc函数所输出的下一个字符会出现在那个位置上.写一个打印字符(由isprint函数)到显示设备的意图是为了在活动位置上显示那字符 ...
- CGI "Internal Server Error"
在安裝 CGI 程式時如果設定錯誤,便會看到 "500 Internal Server Error" 訊息,一般常見的錯誤可以用以下方法解決: 1. CGI 程式的權限需要設定為 ...
- LeetCode_107. Binary Tree Level Order Traversal II
107. Binary Tree Level Order Traversal II Easy Given a binary tree, return the bottom-up level order ...
- [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /usr/local/nginx/conf/nginx.conf:1
带有sudo 权限执行就可以了
- linux 运维指令
[root@yan- ~] # uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令 [root@yan- ~] # head -n /etc/issue # 查看操作系统版本 ...
- 设置滑动TabBar的显示和隐藏
代码如下: //设置滑动的判定范围 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint ...
- java基础系列(一):Number,Character和String类及操作
这篇文章总结了Java中最基础的类以及常用的方法,主要有:Number,Character,String. 1.Number类 在实际开发的过程中,常常会用到需要使用对象而不是内置的数据类型的情形.所 ...
