SQL Azure數據庫是微軟提供的基於雲技術的關系型數據庫服務。基於雲技術的數據解決方案可以提供很多好處,包括快速provisioning, 更經濟的的可伸縮性,高可用性並且減少了管理開支。本文介紹了SQL Azure中可用的動態管理視圖以及怎樣講它們用於故障排除。
性能注意事項
SQL Azure使用SQL Server 2008的數據引擎作為核心。SQL Server 2005引入的動態管理視圖(DMVs)已經成為了強大的故障排除工具,被用於排除從系統狀態到死鎖信息等各個層次的性能問題。在最初發布的SQL Azure中,大部分的DMV是被禁用的,在之後的計劃更新(Service Update)中才被啟用。DMV暴露了實例級別的信息。由於SQL Azure是一個共享架構模型,因此需要修改DMV來限制DMV的輸出使其只顯示適當的信息。下面的DMV已經在第一階段中被啟用了。
這些DMV在本地部署的SQL Server中需要VIEW SERVER STATE的權限。在SQL Azure中,查詢這些DMV需要新的名為VIEW DATABASE STATE的權限。
和事務有關的DMV
sys.dm_tran_active_transactions:返回與您的當前邏輯數據庫的事務有關的信息。
sys.dm_tran_database_transactions:返回有關用戶數據庫級事務的信息。
sys.dm_tran_locks:返回有關當前處於活動狀態的鎖管理器資源的信息。向鎖管理器發出的已授予鎖或正等待授予鎖的每個當前活動請求分別對應一行。結果集中的列大體分為兩組:資源組和請求組。資源組說明正在進行鎖請求的資源,請求組說明鎖請求。
sys.dm_tran_session_transactions:返回關聯事務和會話的相關信息。
和執行有關的DMV
sys.dm_exec_connections: 返回有關與 Microsoft SQL Azure 數據庫建立的連接的信息。
sys.dm_exec_query_plan: 以 XML 格式返回計劃句柄指定的批查詢的顯示計劃。計劃句柄指定的計劃可以處於緩存或正在執行狀態。
sys.dm_exec_query_stats: 返回緩存查詢計劃的聚合性能統計信息。緩存計劃中的每個查詢語句在該視圖中對應一行,並且行的生存期與計劃本身相關聯。在從緩存刪除計劃時,也將從該視圖中刪除對應行。
sys.dm_exec_requests: 返回有關在 Microsoft SQL Azure 服務器內執行的每個請求的信息。
sys.dm_exec_sessions: 返回有關所有活動的用戶連接和內部任務的信息。
sys.dm_exec_sql_text: 返回由指定的 sql_handle 標識的 SQL 批處理的文本。該表值函數將替換系統函數 fn_get_sql。
sys.dm_exec_text_query_plan: 為 Transact-SQL 批查詢或批查詢中的特定語句返回文本格式的顯示計劃。執行計劃句柄指定的查詢計劃可處於緩存狀態或正在執行狀態。此表值函數與 sys.dm_exec_query_plan 類似,但存在以下差異:
查詢計劃的輸出以文本格式返回。
查詢計劃的輸出無大小限制。
和數據庫相關的DMV
sys.dm_db_partition_stats:為當前數據庫中每個分區返回頁和行計數信息。只有那些與范圍內的服務器直接相關的信息會被暴露出來。在SQL Azure中,那些在SQL Server會返回實例級服務器信息的列將會返回空值。因此,如果你有一些用於SQL Server的自定義故障排除查詢,你可以直接在SQL Azure中運行它們而不需要進行修改。
識別性能不佳的查詢語句
SQL Server為所有執行的查詢生成一個優化過的查詢計劃。這使得SQL Server的優化器可以在同樣或者類似的查詢執行的時候重用查詢計劃,從而在最短的時間內接收數據。一旦數據發生變化,數據列上的統計信息會使得查詢計劃變得過期和低效。為了獲得應用程序的最佳性能以及一致的用戶體驗,識別並且調試這些語句非常的重要。之前列出的DMV可以直接幫助識別那些有問題的查詢。
下面的是一些用於標識這些有問題的查詢的基本查詢語句:
過多的重新編譯:
- 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