sql >> データベース >  >> RDS >> Sqlserver

DMV(動的管理ビュー)とDMF(動的管理機能)の使用| SQLServerのパフォーマンスのトラブルシューティング-4

    こんにちは、

    この記事シリーズでは、SQLServerのパフォーマンスの問題をトラブルシューティングする方法について引き続き説明します。

    SQLServerパフォーマンスのトラブルシューティング

    この前に前の記事を読んでください。

    PERFMONを介したパフォーマンスカウンターの監視| SQLServerパフォーマンスのトラブルシューティング-3

    DMV(動的管理ビュー)

    SQL Server 2005で導入されたDMV(動的管理ビュー)およびDMF(動的管理機能)を使用すると、データベースで発生したすべてのアクティビティ、パフォーマンスステータスを監視し、データベースを管理および監視するためのシステム情報を表示できます。

    すべてのデータベース(Oracle、SQL Server、MySQL、Sybase、PostreSQL、DB2など)は、システムに関する内部情報(Session、Processなどのアクティビティとその統計)を収集し、これらのデータをシステムテーブルとビューとして提供します。

    >

    OSとデータベースに関する情報を取得するために、SQLServerによって定期的に更新されるシステムテーブルで一般的に次の情報を利用できます。

    • データベースおよびデータベースサーバーに関する一般情報(名前、エディション、バージョン、文字セットなど)
    • アクティブなクエリ
    • アクティブクエリのCPU、I / O、およびメモリ使用量
    • 実行計画
    • 実行中のクエリで使用されるインデックス
    • メモリ、ディスク、ネットワークでのI/O待機
    • データベースのパフォーマンスに悪影響を与えるインデックスの欠落
    • インデックスの使用率(スキャン、シーク値)
    • ディスクの応答時間

    DMF(動的管理機能)

    DMVとDMFはSQLServerでは同じように見えますが、DMVの名前として直接照会できますが、DMFはパラメーターを受け取り、それに応じてテーブルを返す関数です。

    DMVとDMFのおかげで、本番環境として実行されている重要なデータベースを監視し、問題を即座に特定して、それに応じてアクションを実行できます。これらのクエリを使用すると、データベースで実行中のアクティブなクエリからほとんどのCPU、I / O、およびメモリ消費ステートメントをクエリし、不足しているインデックステーブルを見つけ、実行速度の遅いクエリを見つけることができます。

    SQL Serverで使用可能なすべてのDMVおよびDMFは、次のクエリでクエリできます。

     select name、type_desc from sys.system_objects where name like'dm%' order by name; 

    SQL Serverで使用されるこれらのDMVおよびDMFは、セッション、データベース、OS(オペレーティングシステム)、トランザクションなどのカテゴリに従ってユーザーに情報を提供します。たとえば、データベースカテゴリのDMVとDMFは、 sys.dm_dbで始まります。 または、トランザクションに関連するDMVおよびDMFは sys.dm_tranで始まります 。

    カテゴリ別のDMVとDMFのリストは次のとおりです。

    最も一般的に使用されるDMVとDMFは次のようなものです。

    実行(SQL、クエリ、プロセスなど): アクティブに実行されているクエリのDMVおよびDMFは、どのユーザーがどのマシンから呼び出されたか、プロセス、推定終了時間、クエリ統計などの情報を提供します。

    最も重要なものは次のとおりです。

    • sys.dm_exec_query_stats(DMV)
    • sys.dm_exec_requests(DMV)
    • sys.dm_exec_sessions(DMV)
    • sys.dm_exec_connections(DMV)
    • sys.dm_exec_query_plan(DMF)
    • sys.dm_exec_sql_text(DMF)
    • sys.dm_exec_cached_plans(DMV)
    • sys.dm_exec_cursors(DMF)

    データベース: データベースレベルでのインデックス、ミラーリング、およびパーティショニングに関する必要な情報を提供するのはDMVとDMFです。最も重要なものは次のとおりです。

    • sys.dm_db_missing_index_details(DMV)
    • sys.dm_db_missing_index_columns(DMF)
    • sys.dm_db_missing_index_groups(DMV)
    • sys.dm_db_missing_index_group_stats(DMV)
    • sys.dm_db_index_usage_stats(DMV)
    • sys.dm_db_index_physical_stats(DMF)
    • sys.dm_db_index_operational_stats(DMF)
    • dm_db_partition_stats(DMV)
    • sys.dm_db_mirroring_connections(DMV)

    オペレーティングシステム: オペレーティングシステムに関する必要な情報を提供するのはDMVとDMFです。最も重要なものは次のとおりです。
    • sys.dm_os_sys_info(DMV)
    • sys.dm_os_sys_memory(DMV)
    • sys.dm_os_waiting_tasks(DMV)
    • sys.dm_os_wait_stats(DMV)
    • sys.dm_os_waiting_tasks(DMV)
    • sys.dm_os_performance_counters(DMV)
    • sys.dm_os_cluster_nodes(DMF)
    トランザクション: トランザクションに関する必要な情報を提供するのはDMVとDMFです。最も重要なものは次のとおりです。
    • sys.dm_tran_active_transactions(DMV)
    • sys.dm_tran_session_transactions(DMV)
    • sys.dm_tran_database_transactions(DMV)
    • sys.dm_tran_current_transaction(DMV)
    トップ10のCPUステートメントを照会するためにDMVとDMFを使用してみましょう。次のように、DMVとDMFを使用して、データベース内の上位10個のCPUステートメントを照会できます。

    sql_handleがNULLの場合の上位10のケースを選択します。 、st.text))* 2 else qs.statement_end_offset end --qs.statement_start_offset)/ 2))end as query_text、qp.query_plan、(total_worker_time + 0.0)/ 1000 as total_worker_time、(total_worker_time + 0.0)/(execution_count * 1000 )as [AvgCPUTime]、total_logical_reads as [LogicalReads]、total_logical_writes as [logicalWrites]、execution_count、creation_time、last_execution_time、total_logical_reads + total_logical_writes as [AggIO]、(total_logical_reads + total_logical_writes)/(execution_count + 0.0)as [ st.dbid)as database_name、st.objectid as object_idfrom  sys.dm_exec_query_stats qs  クロスアプライsys.dm_exec_sql_text(sql_handle)st  CROSS APPLY  sys.dm_exec_query_plan(qs.plan_handle)AS qp  ここで、total_worker_time> 0 order by total_worker_time desc; 

    テストに使用したAdventureWorksテストデータベースで上記のクエリを実行すると、出力は次のようになります。

    合計CPU、メモリ、合計ディスクサイズ、データベースサイズ、トランザクションログサイズなど、SQL Serverデータベースインスタンスが実行されているOSに関する一般的な情報を提供するスクリプト(OSとデータベースDMVおよびDMFを含む)を共有します。

    >

    このスクリプトは、データベースインベントリを準備するときに特に必要です。

     sp_configure'詳細オプションを表示'、1; GORECONFIGURE; GOsp_configure'Ole Automation Procedures'、1; GORECONFIGURE; GO / *********************** ******************************** / SET NOCOUNT ONDECLARE @hr intDECLARE @fso intDECLARE @drive char(1)DECLARE @ odrive intDECLARE @TotalSize varchar(20)DECLARE @MB Numeric; SET @MB =1048576CREATE TABLE #drives(drive char(1)PRIMARY KEY、FreeSpace int NULL、TotalSize int NULL)INSERT #drives(drive、FreeSpace)EXECmaster.dbo.xp_fixeddrives EXEC @ hr =sp_OACreate'Scripting.FileSystemObject'、@ fso OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo @ fsoDECLARE dcur CURSOR LOCAL FAST_FORWARDFOR SELECT drive from #drives ORDER by driveOPEN dcur FETCH NEXT FROM dcur INTO @driveWHILE @@ FETCH_STATUS =0BEGINEXEC @hr =sp_OAMethod @fso、'GetDrive'、@odrive OUT、@ driveIF @hr <> 0 EXEC sp_OAGetErrorInfo @fso EXEC @hr =sp_OAGetProperty @ odrive、'TotalSize'、@ TotalSize OUT IF @hr <> 0 EXEC sp_OAGetErrorInfo @ odrive UPDATE #drives SET [email protected]/@MB [email protected] FETCH NEXT FROM dcur INTO @driveEndClose dcurDEALLOCATE dcurEXEC @ hr =sp_OADestroy @fso IF @hr <> 0 EXEC sp_OAGetErrorInfo @ fso--SELECT @@ Servername--SELECT--drive、TotalSize as'Total(MB) '、FreeSpace as' Free(MB)'FROM#drives--ORDER BY drive 
     CREATE TABLE #CPUInfo(Logical_CPU_Count bigint、Hyperthread_Ratio bigint、Physical_CPU_Count bigint、Physical_Memory_MB bigint)
     INSERT INTO #CPUInfo(Logical_CPU_Count、Hyperthread_Ratio、Physical_CPU_Count、Physical_Memory_MB)SELECT cpu_count AS [Logical_CPU_Count]、hyperthread_ratio AS [Hyperthread_Ratio]、cpu_count / hyperthread_ratio AS [Physical_CPU_Count]、physical_memory_kb / 1024 pre> 
     CREATE TABLE #DatabaseInfo(Machine_Name varchar(50)、Instance_Name varchar(50)、Sql_Server_Name varchar(50)、Total_Database_log_size_MB bigint、Total_Database_log_used_MB bigint、Total_Database_Data_File_Size_MB bigint)INSERT INTO #DatabaseInfo(Machine_Name、Instance_Name、Sql_ Total_Database_Data_File_Size_MB)select convert(varchar(50)、serverproperty('MachineName'))'Machine_Name'、convert(varchar(50)、isnull(serverproperty('InstanceName')、'mssqlserver'))'Instance_Name'、convert(varchar( 50)、@@ SERVERNAME)'Sql_Server_Name'、sum(ls.cntr_value / 1024)as [Total_Database_log_size_MB]、sum(lu.cntr_value / 1024)as [Total_Database_log_used_MB]、sum(ds.cntr_value / 1024)as [Total_Database_Data_File_Size_MB] from sys.databasesd左外部結合sys.dm_os_performance_countersaslu on lu.instance_name=d.nameおよびlu.counter_namelikeN'Log File(s)Used Size(KB)%' left external join sys.dm_os_performance_counters as lsonls。インスタnce_name=d.nameおよびls.counter_namelikeN'Log File(s)Size(KB)%' and ls.cntr_value> 0 left external join sys.dm_os_performance_counters as lp on lp.instance_name =d.name and lp.counter_name like N'Percent Log Used%' left external join sys.dm_os_performance_counters as ds on ds.instance_name =d.name and ds.counter_name like N'Data File(s)Size(KB)%' where d.database_id> 4; --sistem database ler haricWITH SizeDisc AS(--sunucuüzerindekitümdrivesize ve free size bilgisiSELECT SUM(TotalSize)as'Total_Disc_Sizeon_Server_MB'、SUM(FreeSpace)as'Total_Free_Disc_SizeOn_Server_MB' FROM #drives)SELECT * FROM #DatabaseInfo、#CPU SizeDiscDROP TABLE #Drives DROP TABLE #DatabaseInfoDROP TABLE #CPUInfo GO / ************************************* ****************** // * OleAutomationProceduresの無効化*/sp_configure'詳細オプションを表示'、1; GORECONFIGURE; GOsp_configure'Ole Automation Procedures'、0; GORECONFIGURE; / ************************************************** ***** / GO 

    スクリプトの出力は次のとおりです。

    次の記事では、SQLServerのパフォーマンスのトラブルシューティングについて引き続き説明します。

    SQLServerパフォーマンスのトラブルシューティング-5SQLServerプロファイラーの使用


    1. SQL:カンマ区切りの文字列を解析し、結合として使用します

    2. SQLiteで外部キー違反を見つける

    3. C#コードからMSSQL ServerへのSQLインジェクションを回避するアルゴリズム?

    4. 動的SQLの結果を変数に割り当てます