Sql Server 執行計畫

2022-02-05 05:26:53 字數 2595 閱讀 7174

1.每次執行sql語句都會生成執行計畫並快取起來,因為生成執行計畫也需要時間開銷,因此重用執行計畫將能提高效能,並節省緩衝區空間。我們可以使用sys.dm_exec_cached_plans、sys.dm_exec_sql_text、sys.dm_exec_query_plan來查詢快取的執行計畫。

以下實驗語句每次執行前需要執行dbcc freeproccache來清空計畫快取

2.查詢執行計畫語句

selectb.[

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

結果如下,看第2、3條,adhoc和prepared分別被執行3次和1次,說明執行計畫被重用了。

3.2 執行下面3個語句

select

*from person.address where addressid =1go

select

*from person.address where addressid =2go

select

*from person.address where addressid =

3go

結果如下,分別為每個adhoc查詢生成了乙個計畫快取

3.3 執行下面引數話查詢2次

exec sp_executesql n'

select * from person.address where addressid = @addressid

',n'

@addressid int

',@addressid

=1

結果日下,計畫快取被使用了2次

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

*from person.address where city =

'san francisco'go

select

*from person.address where city =

'dallas

'go

結果如下,adhoc計畫重新生成了。所以在後台**裡寫sql語句的時,如果是拼接語句的時候,如果是字串,且長度不一致時,則不會重用執行計畫,原因是對sql語句進行hash計算,根據計算結果去找是否存在執行計畫,所以乙個字元差別就會導致計畫不能重用。

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