こんにちは、
この記事シリーズでは、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)
- sys.dm_tran_active_transactions(DMV)
- sys.dm_tran_session_transactions(DMV)
- sys.dm_tran_database_transactions(DMV)
- sys.dm_tran_current_transaction(DMV)
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プロファイラーの使用