測試sp executesql和exec的效能差別

2021-04-19 22:07:49 字數 2528 閱讀 3933

sp_executesql擴充套件儲存過程與t-sql的execute功能相似,但有一點不同,通過sp_executesql執行的執行計畫會被快取起來,可重複使用。

測試:nz.perfectaction [email protected]

下面測試sp_executesql和exec的效能差別

create database t_db

gouse t_db

gocreate table tb

(id int identity(1,1) primary key,name varchar(20))

goinsert 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

godrop table tb

go總結,sp_executesql執行計畫會被快取,而execute不可以,如果大量重複查詢,sp_executesql比execute更能提高資料庫效能。

測試sp executesql和exec的效能差別

sp executesql擴充套件儲存過程與t sql的execute功能相似,但有一點不同,通過sp executesql執行的執行計畫會被快取起來,可重複使用。測試 nz.perfectaction nzperfect gmail.com 下面 測試sp executesql和exec的效能差別...

sp executesql介紹和使用

sp executesql介紹和使用 execute相信大家都用的用熟了,簡寫為exec,除了用來執行儲存過程,一般都用來執行動態sql sp executesql,sql2005中引入的新的系統儲存過程,也是用來處理動態sql的,如 exec sp executesql sql,n count i...

sp executesql介紹和使用

execute相信大家都用的用熟了,簡寫為exec,除了用來執行儲存過程,一般都用來執行動態sql sp executesql,sql2005中引入的新的系統儲存過程,也是用來處理動態sql的,如 exec sp executesql sql,n count int out,id varchar 2...