sp_executesql擴充套件儲存過程與t-sql的execute功能相似,但有一點不同,通過sp_executesql執行的執行計畫會被快取起來,可重複使用。
測試:nz.perfectaction [email protected] 下面
測試sp_executesql和exec的效能差別 create
database t_db go
uset_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'
)
andsql 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'
)
andsql 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...