1.每次執行sql語句都會生成執行計畫並快取起來,因為生成執行計畫也需要時間開銷,因此重用執行計畫將能提高效能,並節省緩衝區空間。我們可以使用sys.dm_exec_cached_plans、sys.dm_exec_sql_text、sys.dm_exec_query_plan來查詢快取的執行計畫。
以下實驗語句每次執行前需要執行dbcc freeproccache來清空計畫快取
2.查詢執行計畫語句
selectb.[結果如下,看第2、3條,adhoc和prepared分別被執行3次和1次,說明執行計畫被重用了。text],
a.usecounts,
a.cacheobjtype,
a.objtype,
c.query_plan,
a.size_in_bytes
from
sys.dm_exec_cached_plans a
cross
說明:text:**sql語句
usecounts:快取使用次數
objtype:
prepared 預定義語句,使用引數化查詢的sql語句
adhoc 即席查詢,沒有引數話的查詢
3.測試
3.1 執行3次下面語句
select
*from person.address where addressid =
1
3.2 執行下面3個語句
select結果如下,分別為每個adhoc查詢生成了乙個計畫快取*from person.address where addressid =1go
select
*from person.address where addressid =2go
select
*from person.address where addressid =
3go
3.3 執行下面引數話查詢2次
exec sp_executesql n'結果日下,計畫快取被使用了2次select * from person.address where addressid = @addressid
',n'
@addressid int
',@addressid
=1
3.4 執行下面語句
exec sp_executesql n'結果如下,當查詢引數值不同時,計畫也被重用了select * from person.address where addressid = @addressid
',n'
@addressid int
',@addressid=1
goexec sp_executesql n'
select * from person.address where addressid = @addressid
',n'
@addressid int
',@addressid=2
go
3.5 執行下面語句
select結果如下,adhoc計畫重新生成了。所以在後台**裡寫sql語句的時,如果是拼接語句的時候,如果是字串,且長度不一致時,則不會重用執行計畫,原因是對sql語句進行hash計算,根據計算結果去找是否存在執行計畫,所以乙個字元差別就會導致計畫不能重用。*from person.address where city =
'san francisco'go
select
*from person.address where city =
'dallas
'go
3.6 執行下面語句
exec sp_executesql n'結果如下,當使用引數話查詢的時候,計畫被重用了。select * from person.address where city = @city
',n'
@city nvarchar(100)
',@city='
san francisco'go
exec sp_executesql n'
select * from person.address where city = @city
',n'
@city nvarchar(100)
',@city='
dallas
'go
SQL Server 執行計畫
預讀 邏輯讀 物理讀的解釋 預讀 sql server查詢的時候會在記憶體中生成查詢計畫,但在同時會去硬碟上取估計的資料放入快取 邏輯讀 從快取中讀取資料 物理讀 當快取中也沒有的時候,就回去硬碟讀 檢視語句執 況 set statistics profile on set statistics i...
SQL Server 執行計畫
預讀 邏輯讀 物理讀的解釋 預讀 sql server查詢的時候會在記憶體中生成查詢計畫,但在同時會去硬碟上取估計的資料放入快取 邏輯讀 從快取中讀取資料 物理讀 當快取中也沒有的時候,就回去硬碟讀 檢視語句執 況 set statistics profile on set statistics i...
sqlserver 執行計畫
執行計畫查詢語句 set statistics profile on sql statement setstatistics profile off 示例 set statistics profile on select from t e base elec where collecttime 20...