`
javababy1
  • 浏览: 1182393 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

测试sp_executesql和exec的性能差别

阅读更多
sp_executesql扩展存储过程与t-sql的execute功能相似,但有一点不同,通过sp_executesql执行的执行计划会被缓存起来,可重复使用。
测试:nz.perfectaction nzperfect@gmail.com 下面测试sp_executesql和exec的性能差别 Create DATABASE T_DB
GO
USE T_DB
GO
Create TABLE TB
(ID INT IDENTITY(1,1) PRIMARY KEY,NAME VARCHAR(20))
GO
Insert INTO TB Select 'A'
Insert INTO TB Select 'B'
Insert INTO TB Select 'C'
Insert INTO TB Select 'D'
Insert INTO TB Select 'E'
Insert INTO TB Select 'F'
GO
--清除缓存中所有元素
DBCC FREEPROCCACHE
--查看T_DB数据库使用的缓存
Select SQL AS EXEC_SQL,OBJTYPE AS EXEC_TYPE,* FROM MASTER..SYSCACHEOBJECTS Where DBID=DB_ID('T_DB')
AND SQL LIKE '%Select * FROM TB Where NAME%' AND SQL NOT LIKE '%SYSCACHEOBJECTS%'
ORDER BY SQL
结果为空,
--测试使用EXEC,执行下面sql语块
DECLARE @SQL VARCHAR(2000)
DECLARE @NAME VARCHAR(20)
DECLARE @I INT
SET @I=1
WHILE @I<=6
BEGIN
IF @I=1 SET @NAME='A' IF @I=2 SET @NAME='B' IF @I=3 SET @NAME='C'
IF @I=4 SET @NAME='D' IF @I=5 SET @NAME='E' IF @I=6 SET @NAME='F'
SET @SQL = 'Select * FROM TB Where NAME = '''+@NAME+''''
EXEC(@SQL)
SET @I = @I + 1
END
--查看T_DB数据库使用的缓存
Select SQL AS EXEC_SQL,OBJTYPE AS EXEC_TYPE,* FROM MASTER..SYSCACHEOBJECTS Where DBID=DB_ID('T_DB')
AND SQL LIKE '%Select * FROM TB Where NAME%' AND SQL NOT LIKE '%SYSCACHEOBJECTS%'
ORDER BY SQL
结果有六条记录如图:
这说明sql server 对于exec执行的sql语句,即使where字段是同一个,但值不一样,每次都需要重新编译,而使用不同的缓存。
--测试使用SP_EXECUTESQL,执行下面sql语块
DECLARE @SQL NVARCHAR(2000)
DECLARE @NAME NVARCHAR(20)
DECLARE @I INT
SET @I=1
WHILE @I<=6
BEGIN
IF @I=1 SET @NAME='A' IF @I=2 SET @NAME='B' IF @I=3 SET @NAME='C'
IF @I=4 SET @NAME='D' IF @I=5 SET @NAME='E' IF @I=6 SET @NAME='F'
SET @SQL = 'Select * FROM TB Where NAME = @NAME'
EXEC SP_EXECUTESQL @SQL,N'@NAME NVARCHAR(20)',@NAME
SET @I = @I + 1
END
--查看缓存
Select SQL AS EXEC_SQL,OBJTYPE AS EXEC_TYPE,* FROM MASTER..SYSCACHEOBJECTS Where DBID=DB_ID('T_DB')
AND SQL LIKE '%Select * FROM TB Where NAME%' AND SQL NOT LIKE '%SYSCACHEOBJECTS%'
ORDER BY SQL
结果除了刚才的六条记录,又增加一条记录如图:
如上图,说明sql server 对于sp_executesql执行的sql语句,只要where字段是相同的,尽管值不同,都不再需要重新编译,而执行使用同一个缓存计划。
--测试完毕
Drop DATABASE T_DB
GO
Drop TABLE TB
GO
总结,sp_executesql执行计划会被缓存,而execute不可以,如果大量重复查询,sp_executesql比execute更能提高数据库性能。
分享到:
评论

相关推荐

    SQL Server EXEC和sp_executesql的区别

    SQL Server EXEC和sp_executesql的区别

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别.doc

    通过上面的例子已经很清晰的表明了,在执行动态SQL 语句的时候,EXEC 和 SP_EXECUTESQL 的区别了,来总结一下: 1、 性能: 官方描述:sp_executesql stmt 参数中的 Transact-SQL 语句或批处理在执行 sp_execute...

    SQLServer:探讨EXEC与sp_executesql的区别详解

    摘要1,EXEC的使用2,sp_executesql的使用MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用...

    系统存储过程,sp_executesql

    系统存储过程,sp_executesql 语言在这里! sp_executesql 执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。 语法 sp_executesql [@stmt =] stmt...

    在sp_executesql中使用like字句的方法

    declare @LikeSql nvarchar(32);–定义一个like变量,如果是存储过程,此处可以存储过程的参数 set @LikeSql = ‘someword%’;...—使用@LikePar变量进行参数化 exec sp_executesql @SelectSql ,N’@LikePa

    sql.rar_exec select_select_sql select from exec_普通sql大全

    Exec sp_executesql N select * from tableName -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: declare @fname varchar(20) set @fname = FiledName Select @...

    sp_executesql 使用复杂的Unicode 表达式错误的解决方法

    代码如下: DECLARE @MyName NVARCHAR(100) DECLARE @FieldName SYSNAME = N’Name’ EXECUTE sp_executesql N’SELECT TOP 1 @OutputName = [‘+ @FieldName +’] FROM [dbo].[Member]’, N’@OutputName NVARCHAR...

    SQLServer动态SQL语句的用法

    exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name 因此,动态 SQL 语句可以根据不同的情况生成不同的 SQL 语句,提高查询效率和灵活性。同时,需要注意动态 SQL 语句中的变量类型,...

    动态SQL语句基本语法。动态SQL语句基本语法

    Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select ...

    带TOP参数的存储过程

    --exec sp_executesql @sql, N'@whereName nvarchar(10)' , @whereName --end CREATE PROCEDURE [dbo].[GetData2] @tbName nvarchar(10), @topnum nvarchar(10) AS BEGIN declare @sql nvarchar(50); set @...

    SQL动态查询语句大全.docSQL动态查询语句大全.docSQL动态查询语句大全.doc

    SQL 动态查询语句大全 SQL 动态查询语句是数据库管理系统中非常重要的一部分,它...动态 SQL 语句可以提高查询效率和灵活性,但需要正确地使用 Exec 和 sp_executesql 语句,并且需要注意 Identity 列的使用和重置。

    SQLPrompt_7.3.0.681

    Inline EXEC function now unwraps sp_executesql statements (UserVoice) Option to align datatypes and constraints now applies to computed columns (Forum post) Fix for CTE not formatting (Forum post) ...

    SqlServer中用exec处理sql字符串中含有变量的小例子

    ) 代码如下:declare @tssj nvarchar(100) — 外部变量declare @Sql_Sql nvarchar(100) — 存sql字符串变量 set @Sql_Sql =N’select @tssj=jpk from b where bzmc=”中国”’EXEC sp_executesql @Sql_Sql,N’@...

    SQL2005工作经验

    exec sp_executesql @s与Exec(@s)的区别; SQL 2005新增的几个函数之学习; 多数据库查询; 利用NEWID函数来取随机记录; 利用ROW_NUMBER方法分页; 在数据库中处理字符串数组; ......

    数据库基础知识.docx

    本文将详细介绍数据库基础知识,包括SQL常用对象的整理、系统表的整理、获取列的基本信息、数据表列的整理、Case When基本语法、Covert Case区别、Exec与Exec()及Exec sp_executesql的使用、SqlServer执行顺序、...

    SQL示例大全.pdf

    EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT; SELECT @max_title; 3.1 执行简单的 SELECT 语句 以下示例将创建并执行一个简单的 SELECT 语句,...

    SQLserver存储过程与触发器.pdf

    执行存储过程可以使用 EXECUTE 语句或 sp_executesql 系统存储过程。执行存储过程需要设置权限,例如设置 PUBLIC 用户有 EXEC 权限。 修改存储过程 修改存储过程可以使用 ALTER PROCEDURE 语句。修改存储过程需要...

    executesql 存储过程

    代码如下:declare @tt varchar(20) set @tt = ‘monisubbouns’ declare @int int declare @sql nvarchar(500) set @sql = ‘select @int=count(*) from ‘ + @tt exec sp_executesql @sql,N’@int int output’,@...

    SQL中存储过程的实例

    exec sp_executesql @getcountsql,N'@count int output',@count=@recordcount output if @recordcount=0 begin set @pagecount = 0 return end declare @lastcount int set @lastcount = @recordcount % @PageSize...

Global site tag (gtag.js) - Google Analytics