漫游测试之性能测试(5.4-执行计划)
12. 執(zhí)行計(jì)劃
SQL Server動(dòng)態(tài)控制過程緩沖中執(zhí)行計(jì)劃的存儲(chǔ),保留最常用的執(zhí)行計(jì)劃并放棄在一段時(shí)間中不使用的計(jì)劃,當(dāng)SQL Server在內(nèi)存壓力增加到?jīng)]有足夠的空閑內(nèi)存以服務(wù)新的請(qǐng)求時(shí),從過程緩沖刪除所有壽命字段為0的計(jì)劃,如果內(nèi)存足夠并且有空閑的內(nèi)存頁以服務(wù)新的請(qǐng)求,壽命字段為0的執(zhí)行計(jì)劃可以長期保留在過程緩沖中,這樣他們就可以被重用。
/*
即席查詢生成過的計(jì)劃和過程緩沖,可以用來查看執(zhí)行計(jì)劃是否被緩沖
*/
select?c.usecounts?as?'該對(duì)象添加到緩沖中并被使用的次數(shù)'?,c.cacheobjtype?as?'緩沖對(duì)象類型'?,c.objtype??as?'對(duì)象類型'
from?sys.dm_exec_cached_plans?c?CROSS?APPLY?sys.dm_exec_sql_text?(c.plan_handle?)?t
where?t.text?='SQL語句'
?
12.1. 解決執(zhí)行計(jì)劃老化的方法
1.明確地參數(shù)化查詢的可變部分。
2.使用存儲(chǔ)過程實(shí)現(xiàn)業(yè)務(wù)功能。
3.使用sp_executeSql避免存儲(chǔ)過程維護(hù)。
?
使用sp_executeSql明確地參數(shù)化查詢,使其執(zhí)行計(jì)劃在查詢以可變部分的不同值重新提交時(shí)可重用。
由ODBC和OLEDB通過SQLExecDirect和IcommandWithParameters發(fā)布。.NET開發(fā)人員可以使用ADO和Command命令和Parameters參數(shù)提交相關(guān)的Select語句,如果將ADO的Command Prepared屬性設(shè)置為False并使用ADO Command(sql語句)和ADO Parameters,ADO.NET將使用sp_executeSql發(fā)送Select語句。sp_executeSQL在查詢每次重新執(zhí)行時(shí)通過網(wǎng)絡(luò)發(fā)送整個(gè)查詢串,可以使用ODBC和OLEDB或OLEDB.NET的準(zhǔn)備/執(zhí)行模式來解決每次都通過網(wǎng)絡(luò)發(fā)送整個(gè)查詢串的問題。
?
4.使用準(zhǔn)備/執(zhí)行模式避免重新發(fā)送查詢字符串。
5.避免即席查詢。
6.對(duì)動(dòng)態(tài)查詢使用sp_executeSQL代替Execute。
?
Execute命令不允許查詢的可變部分明確地參數(shù)化,從而降低了計(jì)劃緩沖的可重用性。
?
7.小心地參數(shù)化查詢的可變部分,即參數(shù)嗅探的情況。
8.避免修改連接之間的環(huán)境設(shè)置。
9.避免查詢中對(duì)象的隱含解析。
12.2. 重編譯的原因
1.存儲(chǔ)過程語句中引用的常規(guī)表、臨時(shí)表或視圖的架構(gòu)變化,架構(gòu)變化包括表的元數(shù)據(jù)或表上索引的變化。
2.常規(guī)或臨時(shí)表的列上綁定(如默認(rèn)/規(guī)則)變化。
3.表索引或列上的統(tǒng)計(jì)的變化超過一定的閾值。
4.存儲(chǔ)過程編譯時(shí)一個(gè)對(duì)象不存在,但是在執(zhí)行期間創(chuàng)建,這被稱為延遲對(duì)象解析。
5.Set選項(xiàng)變化。
6.執(zhí)行計(jì)劃老化并被釋放。
7.對(duì)sp_recompile系統(tǒng)存儲(chǔ)過程的顯示調(diào)用。
8.顯示使用Recompile子句。
可以通過Profiler監(jiān)控中的EventSubClass的詳細(xì)內(nèi)容進(jìn)行查看確定。
?
注意:重編譯不一定是問題,只有當(dāng)排除其它性能問題原因,并且確定是重編譯導(dǎo)致問題的時(shí)候,該問題才是問題。
總結(jié)
以上是生活随笔為你收集整理的漫游测试之性能测试(5.4-执行计划)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Beyond Compare4
- 下一篇: idea 手动导入 jar 包