SQL Azure故障排除以及查詢優(yōu)化
SQL Azure數(shù)據(jù)庫是微軟提供的基于云技術(shù)的關(guān)系型數(shù)據(jù)庫服務(wù)?;谠萍夹g(shù)的數(shù)據(jù)解決方案可以提供很多好處,包括快速provisioning, 更經(jīng)濟的的可伸縮性,高可用性并且減少了管理開支。本文介紹了SQL Azure中可用的動態(tài)管理視圖以及怎樣講它們用于故障排除。
性能注意事項
SQL Azure使用SQL Server 2008的數(shù)據(jù)引擎作為核心。SQL Server 2005引入的動態(tài)管理視圖(DMVs)已經(jīng)成為了強大的故障排除工具,被用于排除從系統(tǒng)狀態(tài)到死鎖信息等各個層次的性能問題。在最初發(fā)布的SQL Azure中,大部分的DMV是被禁用的,在之后的計劃更新(Service Update)中才被啟用。DMV暴露了實例級別的信息。由于SQL Azure是一個共享架構(gòu)模型,因此需要修改DMV來限制DMV的輸出使其只顯示適當(dāng)?shù)男畔?。下面的DMV已經(jīng)在***階段中被啟用了。
這些DMV在本地部署的SQL Server中需要VIEW SERVER STATE的權(quán)限。在SQL Azure中,查詢這些DMV需要新的名為VIEW DATABASE STATE的權(quán)限。
和事務(wù)有關(guān)的DMV
sys.dm_tran_active_transactions:返回與您的當(dāng)前邏輯數(shù)據(jù)庫的事務(wù)有關(guān)的信息。
sys.dm_tran_database_transactions:返回有關(guān)用戶數(shù)據(jù)庫級事務(wù)的信息。
sys.dm_tran_locks:返回有關(guān)當(dāng)前處于活動狀態(tài)的鎖管理器資源的信息。向鎖管理器發(fā)出的已授予鎖或正等待授予鎖的每個當(dāng)前活動請求分別對應(yīng)一行。結(jié)果集中的列大體分為兩組:資源組和請求組。資源組說明正在進行鎖請求的資源,請求組說明鎖請求。
sys.dm_tran_session_transactions:返回關(guān)聯(lián)事務(wù)和會話的相關(guān)信息。
和執(zhí)行有關(guān)的DMV
sys.dm_exec_connections: 返回有關(guān)與 Microsoft SQL Azure 數(shù)據(jù)庫建立的連接的信息。
sys.dm_exec_query_plan: 以 XML 格式返回計劃句柄指定的批查詢的顯示計劃。計劃句柄指定的計劃可以處于緩存或正在執(zhí)行狀態(tài)。
sys.dm_exec_query_stats: 返回緩存查詢計劃的聚合性能統(tǒng)計信息。緩存計劃中的每個查詢語句在該視圖中對應(yīng)一行,并且行的生存期與計劃本身相關(guān)聯(lián)。在從緩存刪除計劃時,也將從該視圖中刪除對應(yīng)行。
sys.dm_exec_requests: 返回有關(guān)在 Microsoft SQL Azure 服務(wù)器內(nèi)執(zhí)行的每個請求的信息。
sys.dm_exec_sessions: 返回有關(guān)所有活動的用戶連接和內(nèi)部任務(wù)的信息。
sys.dm_exec_sql_text: 返回由指定的 sql_handle 標(biāo)識的 SQL 批處理的文本。該表值函數(shù)將替換系統(tǒng)函數(shù) fn_get_sql。
sys.dm_exec_text_query_plan: 為 Transact-SQL 批查詢或批查詢中的特定語句返回文本格式的顯示計劃。執(zhí)行計劃句柄指定的查詢計劃可處于緩存狀態(tài)或正在執(zhí)行狀態(tài)。此表值函數(shù)與 sys.dm_exec_query_plan 類似,但存在以下差異:
查詢計劃的輸出以文本格式返回。
查詢計劃的輸出無大小限制。
和數(shù)據(jù)庫相關(guān)的DMV
sys.dm_db_partition_stats:為當(dāng)前數(shù)據(jù)庫中每個分區(qū)返回頁和行計數(shù)信息。只有那些與范圍內(nèi)的服務(wù)器直接相關(guān)的信息會被暴露出來。在SQL Azure中,那些在SQL Server會返回實例級服務(wù)器信息的列將會返回空值。因此,如果你有一些用于SQL Server的自定義故障排除查詢,你可以直接在SQL Azure中運行它們而不需要進行修改。
識別性能不佳的查詢語句
SQL Server為所有執(zhí)行的查詢生成一個優(yōu)化過的查詢計劃。這使得SQL Server的優(yōu)化器可以在同樣或者類似的查詢執(zhí)行的時候重用查詢計劃,從而在最短的時間內(nèi)接收數(shù)據(jù)。一旦數(shù)據(jù)發(fā)生變化,數(shù)據(jù)列上的統(tǒng)計信息會使得查詢計劃變得過期和低效。為了獲得應(yīng)用程序的***性能以及一致的用戶體驗,識別并且調(diào)試這些語句非常的重要。之前列出的DMV可以直接幫助識別那些有問題的查詢。
下面的是一些用于標(biāo)識這些有問題的查詢的基本查詢語句:
過多的重新編譯:
- select top 25
- sql_text.text,
- sql_handle,
- plan_generation_num,
- execution_count,
- dbid,
- objectid
- from
- sys.dm_exec_query_stats a
- cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
- where
- plan_generation_num >1
- order by plan_generation_num desc
不夠高效的查詢計劃
- select
- highest_cpu_queries.plan_handle,
- highest_cpu_queries.total_worker_time,
- q.dbid,
- q.objectid,
- q.number,
- q.encrypted,
- q.[text]
- from
- (select top 50
- qs.plan_handle,
- qs.total_worker_time
- from
- sys.dm_exec_query_stats qs
- order by qs.total_worker_time desc) as highest_cpu_queries
- cross apply sys.dm_exec_sql_text(plan_handle) as q
- order by highest_cpu_queries.total_worker_time desc
- I/O瓶頸
- select top 25
- (total_logical_reads/execution_count) as avg_logical_reads,
- (total_logical_writes/execution_count) as avg_logical_writes,
- (total_physical_reads/execution_count) as avg_phys_reads,
- Execution_count,
- statement_start_offset as stmt_start_offset,
- sql_handle,
- plan_handle
- from sys.dm_exec_query_stats
- order by
- (total_logical_reads + total_logical_writes) desc
【編者推薦】
- 思科推新數(shù)據(jù)中心解決方案支持SQL Server
- 數(shù)據(jù)庫日常維護常用的腳本部分收錄
- TechED 2010現(xiàn)場直擊:SQL Azure在中國落地還需時日
- 微軟云數(shù)據(jù)庫SQL Azure初體驗