SQL Server中语句的自动参数化
时间:2021-07-01 10:21:17
帮助过:48人阅读
mastergo if exists(select * from sys.databases where name = ‘test‘) drop database testgo create database test if exists(select * from sys.tables where name = ‘t‘) drop table tgo create table t(i int); declare @i int;declare @sql varchar(1000); set @i = 1set @sql = ‘‘; while @i <= 100000begin set @sql = ‘insert into t values(‘ + cast(@i as varchar) +‘)‘ begin tran exec(@sql) commit tran set @i = @i + 1 end 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%‘ 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%‘ select name, is_parameterization_forced from sys.databaseswhere name = ‘test‘ insert into t values(100001) insert into t values( 100002 ) insert into dbo.t values( 100003 ) select *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值,计算编译了多少次。
不想长大啊
发布了416 篇原创文章 ·
获赞 135 ·
访问量 94万+
他的留言板
关注
SQL Server中语句的自动参数化
标签:cache 计算 信息 offset 原创文章 commit hidden 自动 访问量