通過SQLServer2005的過程緩存監(jiān)測(cè)查詢性能

字號(hào):

在SQL Server 2005,對(duì)存儲(chǔ)過程的重新編譯可以只針對(duì)存儲(chǔ)過程內(nèi)的執(zhí)行語句,也就是說,在 SQL Server 2005中對(duì)數(shù)據(jù)庫引擎進(jìn)行重新編譯,只需重新編譯批處理或存儲(chǔ)過程中的少量語句即可。這明顯不同于SQL Server 2000,后者重新編譯存儲(chǔ)過程時(shí),會(huì)編譯整個(gè)存儲(chǔ)過程或批處理。SQL Server 2005語句級(jí)重新編譯功能使其他語句能夠在不需要的時(shí)候跳過重新編譯進(jìn)程。
    在SQL Server 2005中,在執(zhí)行語句之前,數(shù)據(jù)庫引擎會(huì)編譯執(zhí)行計(jì)劃,以便找出運(yùn)行該語句的途徑。SQL Server 2005會(huì)盡可能的重復(fù)利用已存在的原始計(jì)劃,達(dá)到提高查詢速度和效率的目的,并把該計(jì)劃存儲(chǔ)在過程緩存中。數(shù)據(jù)庫引擎會(huì)持續(xù)維護(hù)這塊緩存,并在有需要的時(shí)候會(huì)對(duì)該計(jì)劃進(jìn)行重新優(yōu)化,如利用、插入或刪除。你可以使用動(dòng)態(tài)管理視圖(DMV)來查詢?cè)搱?zhí)行計(jì)劃緩存,根據(jù)數(shù)據(jù)庫中出現(xiàn)的語句的使用頻率和性能還能收集到大量信息。
    本文簡(jiǎn)單的介紹如何查看檢測(cè)數(shù)據(jù)庫服務(wù)器上執(zhí)行語句用到的執(zhí)行計(jì)劃,并對(duì)已經(jīng)存儲(chǔ)在過程緩存中的語句執(zhí)行計(jì)劃的信息進(jìn)行解析,使我們可以了解最常用的查詢執(zhí)行性能情況,以便如何在必要時(shí)對(duì)其進(jìn)行調(diào)整優(yōu)化。
    我們將使用sys.dm_exec_query_stats動(dòng)態(tài)管理視圖來查看過程緩存的語句執(zhí)行計(jì)劃。它包含了緩存中所有語句的聚集數(shù)據(jù),包括語句執(zhí)行的次數(shù)、語句執(zhí)行耗時(shí)長(zhǎng)短、由語句引起的讀取量等等;同時(shí)還包括針對(duì)正在運(yùn)行的執(zhí)行計(jì)劃和SQL語句等數(shù)據(jù)的散列。通過對(duì)查詢腳本稍做修改,我們甚至還能查到存儲(chǔ)過程的名稱及其所在的數(shù)據(jù)庫。
    運(yùn)行下面的查詢腳本,會(huì)返回指定數(shù)據(jù)庫系統(tǒng)中根據(jù)從過程緩存執(zhí)行指令次數(shù)從多到少排列的前一百位執(zhí)行計(jì)劃,這可以幫助我們了解SQL Server在過程緩存中保留了哪些存儲(chǔ)過程。
    在該查詢中,使用了sys.dm_exec_query_stats動(dòng)態(tài)管理視圖,CROSS APPLY運(yùn)算符,以及sys.dm_exec_sql_text和sys.dm_exec_query_plan兩個(gè)函數(shù)來查找緩存中的指令和正在使用的執(zhí)行計(jì)劃。注意,對(duì)于本例中的查詢必須在運(yùn)行在SQL Server 2005 Service Pack 2上,因?yàn)镺BJECT_NAME函數(shù)功能有可能存在些許的不同。如果運(yùn)行的不是SQL Server 2005 Service Pack 2,去掉OBJECT_NAME函數(shù)的第二個(gè)參數(shù)即可。
    以下是引用片段:
    SELECT 100
     qs.execution_count,
     DatabaseName = DB_NAME(qp.dbid),
     ObjectName = OBJECT_NAME(qp.objectid,qp.dbid),
     StatementDefinition =
     SUBSTRING (
     st.text,
     (
     qs.statement_start_offset / 2
     ) + 1,
     (
     (
     CASE qs.statement_end_offset
     WHEN -1 THEN DATALENGTH(st.text)
     ELSE qs.statement_end_offset
     END - qs.statement_start_offset
     ) / 2
     ) + 1
     ),
     query_plan,
     st.text, total_elapsed_time
     FROM sys.dm_exec_query_stats AS qs
     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
     CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) qp
     WHERE
     st.encrypted = 0
     ORDER BY qs.execution_count DESC
    如果要查找過程緩存中執(zhí)行語句用的XML執(zhí)行計(jì)劃,點(diǎn)擊query_plan欄中的鏈接,就會(huì)創(chuàng)建一個(gè)可供查看的XML文檔。此XML文檔的好處就是可以將其存為.sqlplan文件,然后就可以在SQL Server 2005 Management Studio中打開用來查看圖形執(zhí)行計(jì)劃。
    本文所舉的例子簡(jiǎn)單卻非常好用。任何時(shí)候,都可以使用該查詢來查看數(shù)據(jù)庫緩存可供重復(fù)使用的語句的情況,根據(jù)查詢到的信息制定優(yōu)化決策。