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...