• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-167  評論-8  文章-0  trackbacks-0

            Microsoft SQL Server 2005 提供了一些工具來監控數據庫。方法之一是動態管理視圖。動態管理視圖 (DMV) 和動態管理函數 (DMF) 返回的服務器狀態信息可用于監控服務器實例的運行狀況、診斷問題和優化性能。

            常規服務器動態管理對象包括:

            • dm_db_*:數據庫和數據庫對象

            • dm_exec_*:執行用戶代碼和關聯的連接

            • dm_os_*:內存、鎖定和時間安排

            • dm_tran_*:事務和隔離

            • dm_io_*:網絡和磁盤的輸入/輸出

            此部分介紹為監控 SQL Server 運行狀況而針對這些動態管理視圖和函數運行的一些常用查詢。

            示例查詢

            您可以運行以下查詢來獲取所有 DMV 和 DMF 名稱:


            SELECT * FROM sys.system_objects
            WHERE name LIKE 'dm_%'
            ORDER BY name

            監控 CPU 瓶頸

            CPU 瓶頸通常由以下原因引起:查詢計劃并非最優、配置不當、設計因素不良或硬件資源不足。下面的常用查詢可幫助您確定導致 CPU 瓶頸的原因。

            下面的查詢使您能夠深入了解當前緩存的哪些批處理或過程占用了大部分 CPU 資源。

             


            SELECT TOP 50 
                  
            SUM(qs.total_worker_time) AS total_cpu_time, 
                  
            SUM(qs.execution_count) AS total_execution_count,
                  
            COUNT(*AS  number_of_statements, 
                  qs.sql_handle 
            FROM sys.dm_exec_query_stats AS qs
            GROUP BY qs.sql_handle
            ORDER BY SUM(qs.total_worker_time) DESC

            下面的查詢顯示緩存計劃所占用的 CPU 總使用率(帶 SQL 文本)。


            SELECT 
                  total_cpu_time, 
                  total_execution_count,
                  number_of_statements,
                  s2.
            text
                  
            --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text
            FROM 
                  (
            SELECT TOP 50 
                        
            SUM(qs.total_worker_time) AS total_cpu_time, 
                        
            SUM(qs.execution_count) AS total_execution_count,
                        
            COUNT(*AS  number_of_statements, 
                        qs.sql_handle 
            --,
                        --MIN(statement_start_offset) AS statement_start_offset, 
                        --MAX(statement_end_offset) AS statement_end_offset
                  FROM 
                        sys.dm_exec_query_stats 
            AS qs
                  
            GROUP BY qs.sql_handle
                  
            ORDER BY SUM(qs.total_worker_time) DESCAS stats
                  
            CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2
             

            下面的查詢顯示 CPU 平均占用率最高的前 50 個 SQL 語句。

             


            SELECT TOP 50
            total_worker_time
            /execution_count AS [Avg CPU Time],
            (
            SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2FROM sys.dm_exec_sql_text(sql_handle)) AS query_text, *
            FROM sys.dm_exec_query_stats 
            ORDER BY [Avg CPU Time] DESC

             

            下面顯示用于找出過多編譯/重新編譯的 DMV 查詢。


            select * from sys.dm_exec_query_optimizer_info
            where 
                  counter 
            = 'optimizations'
                  
            or counter = 'elapsed time'

            下面的示例查詢顯示已重新編譯的前 25 個存儲過程。plan_generation_num 指示該查詢已重新編譯的次數。

            Code
            效率較低的查詢計劃可能增大 CPU 占用率。

            下面的查詢顯示哪個查詢占用了最多的 CPU 累計使用率。


            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 descas highest_cpu_queries
                
            cross apply sys.dm_exec_sql_text(plan_handle) as q
            order by highest_cpu_queries.total_worker_time desc

            下面的查詢顯示一些可能占用大量 CPU 使用率的運算符(例如 ‘%Hash Match%’、‘%Sort%’)以找出可疑對象。


            select *
            from 
                  sys.dm_exec_cached_plans
                  
            cross apply sys.dm_exec_query_plan(plan_handle)
            where 
                  
            cast(query_plan as nvarchar(max)) like '%Sort%'
                  
            or cast(query_plan as nvarchar(max)) like '%Hash Match%'

            如果已檢測到效率低下并導致 CPU 占用率較高的查詢計劃,請對該查詢中涉及的表運行 UPDATE STATISTICS 以查看該問題是否仍然存在。然后,收集相關數據并將此問題報告給 PerformancePoint Planning 支持人員。

            如果您的系統存在過多的編譯和重新編譯,可能會導致系統出現與 CPU 相關的性能問題。

            您可以運行下面的 DMV 查詢來找出過多的編譯/重新編譯。


            select * from sys.dm_exec_query_optimizer_info
            where 
            counter 
            = 'optimizations'
            or counter = 'elapsed time'

            下面的示例查詢顯示已重新編譯的前 25 個存儲過程。plan_generation_num 指示該查詢已重新編譯的次數。


            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

            如果已檢測到過多的編譯或重新編譯,請盡可能多地收集相關數據并將其報告給Planning 支持人員。

            內存瓶頸

            開始內存壓力檢測和調查之前,請確保已啟用 SQL Server 中的高級選項。請先對 master 數據庫運行以下查詢以啟用此選項。


            sp_configure 'show advanced options'
            go
            sp_configure 
            'show advanced options'1
            go
            reconfigure
            go

            首先運行以下查詢以檢查內存相關配置選項。


            sp_configure 'awe_enabled'
            go
            sp_configure 
            'min server memory'
            go
            sp_configure 
            'max server memory'
            go
            sp_configure 
            'min memory per query'
            go
            sp_configure 
            'query wait'
            go
            運行下面的 DMV 查詢以查看 CPU、計劃程序內存和緩沖池信息。

            select 
            cpu_count,
            hyperthread_ratio,
            scheduler_count,
            physical_memory_in_bytes 
            / 1024 / 1024 as physical_memory_mb,
            virtual_memory_in_bytes 
            / 1024 / 1024 as virtual_memory_mb,
            bpool_committed 
            * 8 / 1024 as bpool_committed_mb,
            bpool_commit_target 
            * 8 / 1024 as bpool_target_mb,
            bpool_visible 
            * 8 / 1024 as bpool_visible_mb
            from sys.dm_os_sys_info
            I/O 瓶頸

            檢查閂鎖等待統計信息以確定 I/O 瓶頸。運行下面的 DMV 查詢以查找 I/O 閂鎖等待統計信息。


            select wait_type, waiting_tasks_count, wait_time_ms, signal_wait_time_ms, wait_time_ms / waiting_tasks_count
            from sys.dm_os_wait_stats  
            where wait_type like 'PAGEIOLATCH%'  and waiting_tasks_count > 0
            order by wait_type

            如果 waiting_task_counts 和 wait_time_ms 與正常情況相比有顯著變化,則可以確定存在 I/O 問題。獲取 SQL Server 平穩運行時性能計數器和主要 DMV 查詢輸出的基線非常重要。

            這些 wait_types 可以指示您的 I/O 子系統是否遇到瓶頸。

            使用以下 DMV 查詢來查找當前掛起的 I/O 請求。請定期執行此查詢以檢查 I/O 子系統的運行狀況,并隔離 I/O 瓶頸中涉及的物理磁盤。


            select 
                database_id, 
                
            file_id
                io_stall,
                io_pending_ms_ticks,
                scheduler_address 
            from  sys.dm_io_virtual_file_stats(NULLNULL)t1,
                    sys.dm_io_pending_io_requests 
            as t2
            where t1.file_handle = t2.io_handle

            在正常情況下,該查詢通常不返回任何內容。如果此查詢返回一些行,則需要進一步調查。

            您還可以執行下面的 DMV 查詢以查找 I/O 相關查詢。


            select top 5 (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_physical_reads,
                       Execution_count, statement_start_offset, p.query_plan, q.
            text
            from sys.dm_exec_query_stats
                  
            cross apply sys.dm_exec_query_plan(plan_handle) p
                  
            cross apply sys.dm_exec_sql_text(plan_handle) as q
            order by (total_logical_reads + total_logical_writes)/execution_count Desc

            下面的 DMV 查詢可用于查找哪些批處理/請求生成的 I/O 最多。如下所示的 DMV 查詢可用于查找可生成最多 I/O 的前五個請求。調整這些查詢將提高系統性能。


            select top 5 
                (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

            阻塞

            運行下面的查詢可確定阻塞的會話。


            select blocking_session_id, wait_duration_ms, session_id from 
            sys.dm_os_waiting_tasks
            where blocking_session_id is not null

            使用此調用可找出 blocking_session_id 所返回的 SQL。例如,如果 blocking_session_id 是 87,則運行此查詢可獲得相應的 SQL。


            dbcc INPUTBUFFER(87)

            下面的查詢顯示 SQL 等待分析和前 10 個等待的資源。


            select top 10 *
            from sys.dm_os_wait_stats
            --where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')
            order by wait_time_ms desc

            若要找出哪個 spid 正在阻塞另一個 spid,可在數據庫中創建以下存儲過程,然后執行該存儲過程。此存儲過程會報告此阻塞情況。鍵入 sp_who 可找出 @spid;@spid 是可選參數。


            create proc dbo.sp_block (@spid bigint=NULL)
            as
            select 
                t1.resource_type,
                
            'database'=db_name(resource_database_id),
                
            'blk object' = t1.resource_associated_entity_id,
                t1.request_mode,
                t1.request_session_id,
                t2.blocking_session_id    
            from 
                sys.dm_tran_locks 
            as t1, 
                sys.dm_os_waiting_tasks 
            as t2
            where 
                t1.lock_owner_address 
            = t2.resource_address and
                t1.request_session_id 
            = isnull(@spid,t1.request_session_id)

            以下是使用此存儲過程的示例。


            exec sp_block
            exec sp_block @spid = 7
            posted on 2009-12-24 10:39 老馬驛站 閱讀(496) 評論(0)  編輯 收藏 引用 所屬分類: DataBase
            91秦先生久久久久久久| 国内精品久久人妻互换| 久久精品成人国产午夜| 日本人妻丰满熟妇久久久久久| 无码任你躁久久久久久老妇| 精品久久久久久无码中文字幕| 久久久久久a亚洲欧洲aⅴ| 国产美女久久久| 久久精品中文字幕久久| 亚洲伊人久久大香线蕉苏妲己| 欧美久久精品一级c片片| 色综合久久综合网观看| 日本福利片国产午夜久久| 国产成人香蕉久久久久| 久久久WWW成人| 久久午夜免费视频| 亚洲精品国产美女久久久| 久久久噜噜噜www成人网| 国产亚洲婷婷香蕉久久精品| 久久久久中文字幕| 久久综合九色欧美综合狠狠| 亚洲一级Av无码毛片久久精品| 久久SE精品一区二区| 久久国产精品99国产精| 91精品国产91热久久久久福利| 国产福利电影一区二区三区久久久久成人精品综合 | 精品久久久久久中文字幕| 国产呻吟久久久久久久92| 亚洲国产精品无码久久九九 | 亚洲AV日韩AV永久无码久久| 97久久超碰国产精品旧版| 精品无码人妻久久久久久| 亚洲欧美久久久久9999| 人妻少妇久久中文字幕| 国内精品久久久久久麻豆 | 精品久久一区二区| 国产一区二区久久久| 77777亚洲午夜久久多喷| 久久精品国产99久久久香蕉| 亚洲av成人无码久久精品| 丁香久久婷婷国产午夜视频|