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

システム統計関数を使用してSQLServer統計情報を取得する方法

    多くの場合、SQL Serverインスタンスの実行に関するシステム統計を収集する必要があります。たとえば、SQL Serverインスタンスの起動以降に試行された接続の総数や、SQLServerがアクティブな操作に費やした時間などです。Microsoftは別のセットを提供しました。システム関連の統計を取得するためのシステム関数。今日は、そのようなシステム統計関数をユースケースとともに説明します。

    SQLのシステム統計関数

    システム統計関数は、出力に単一の値を返すスカラー関数の一種です。これは、システムに関する統計情報を提供します。重要な注意点は、このカテゴリに分類されるすべての関数は、実行時に同じ出力を返すわけではないということです。実行するたびに、異なる結果が得られます。そのため、システムの統計関数は非決定的です。

    SQL Serverには、システム関連の統計を返すいくつかの組み込みのシステム統計関数があります。以下はリストです:

    • @@ CONNECTIONS
    • @@ PACK_RECEIVED
    • @@ CPU_BUSY
    • @@ PACK_SENT
    • @@ TIMETICKS
    • @@ IDLE
    • @@ TOTAL_ERRORS
    • @@ IO_BUSY
    • @@ TOTAL_READ
    • fn_virtualfilestats
    • @@ PACKET_ERRORS
    • @@ TOTAL_WRITE

    それでは、それらをさらに詳しく調べてみましょう。

    @@CPU_BUSYおよび@@TIMETICKSシステム機能について

    @@ CPU_BUSY CPUがSQLServerの操作に費やした時間をミリ秒単位で理解する必要がある場合は非常に重要です。この関数の結果は、SQLServerを最後に再起動してから実行するたびに増分されます。これは、実行ごとに出力に増分値が含まれることを意味します。例を参照してください:

    --Execute below T-SQL to get how busy your CPU is
    SELECT @@CPU_BUSY
    

    出力:

    単一の数値を返します。これは、CPUが最後のSQLServerサービスの再起動以降にSQLServerトランザクションの実行に641ミリ秒を費やしたことを意味します。

    それでは、簡単なSELECTステートメントを実行してみましょう。上記のT-SQLステートメントを再度実行して、出力が増分であるかどうかを確認します。

    --Fetch top 1000 rows for a table
    SELECT TOP (1000) [BusinessEntityID]
          ,[PersonType]
          ,[NameStyle]
          ,[Title]
          ,[FirstName]
          ,[MiddleName]
          ,[LastName]
          ,[Suffix]
          ,[EmailPromotion]
          ,[AdditionalContactInfo]
          ,[Demographics]
          ,[rowguid]
          ,[ModifiedDate]
      FROM [AdventureWorks2019].[Person].[Person]
    

    出力:

    SELECT @@ CPU_BUSYを実行してみましょう もう一度出力を確認します:

    ここでは、最初のスクリーンショットで返された641ミリ秒の値と比較して、653ミリ秒の増分値を確認できます。したがって、これらのシステム関数が単一の増分値を返すことを検証しました。

    それでは、さらに深く掘り下げましょう。 @@ CPU_BUSYの使用方法を確認します 要件のさまざまなシナリオで。

    上記のように、 @@ CPU_BUSY システム関数はミリ秒で出力を返します 。 マイクロ秒で出力を取得したい場合 、 @@ TIMETICKSを使用する必要があります @@ CPU_BUSY T-SQLステートメントの実行中に機能します(以下のコマンドを参照してください)。

    @@ TIMETICKS ダニあたりのマイクロ秒数を返します

    Tickは、スケジューラーを実行させる一種のスケジューリングイベントです。ティックあたりの時間は、以下のT-SQLステートメントを実行することで取得できるコンピューター依存の値です。

    --Get @@TIMETICKS output
    SELECT @@TIMETICKS
    

    その出力は次のとおりです。

    両方の関数を一緒に使用して、マイクロ秒と秒で出力を取得します。

    --Get @@CPU_BUSY output in Microseconds & seconds
    SELECT @@CPU_BUSY*@@TIMETICKS As [CPU Busy Microseconds]
    Go
    SELECT @@CPU_BUSY*@@TIMETICKS/1000000 As [CPU Busy Seconds]
    Go 
    

    両方のT-SQLステートメントを実行すると、次の出力が表示されます。

    注:@CPU_BUSY出力をfloatデータ型で取得する必要がある場合 、以下の一連のステートメントを実行して実行することもできます。

    --Get @@CPU_BUSY output in Microseconds & seconds with float data type
    SELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) As [CPU Busy Microseconds], 
    @@CPU_BUSY*CAST (@@TIMETICKS As float)/1000000 As [CPU Busy Seconds]
    Go
    

    出力:

    先に進み、ビジネスニーズに応じて@@ CPU_BUSY&@@TIMETICKシステム機能を使用してください。

    @@IO_BUSYシステム機能を理解する

    その名前が示すように、このシステム関数は、SQL Serverが最後に再起動してからIO操作(入力/出力操作)の実行に費やした合計時間をミリ秒単位で返します。このシステム関数の出力も、実行するたびに増分されます。

    次のT-SQLステートメントを実行します。

    --Get total time SQL Server has taken in IO operations since its last restart
    SELECT @@IO_BUSY
    

    下の画像の出力は194ミリ秒です。

    @@ TIMETICKSシステム関数を使用して、マイクロ秒単位の値を取得することもできます。

    --Get total time SQL Server has taken in IO operations since its last restart
    SELECT @@IO_BUSY*@@TIMETICKS AS [IO Microseconds]
    GO
    SELECT @@IO_BUSY*@@TIMETICKS/1000000 AS [IO Seconds]
    

    上記のT-SQLステートメントの出力は次のとおりです。

    @@ TIMETICKSシステム関数を使用して値をマイクロ秒に変換する際の算術オーバーフローを回避する場合は、以下のコマンドを実行して、前の@@CPU_BUSY関数で行ったようにfloatデータ型で出力を取得します。

    --Get total time SQL Server has taken in IO operations since its last restart
    SELECT @@IO_BUSY*CAST (@@TIMETICKS As float) AS [IO Microseconds]
    GO
    SELECT @@IO_BUSY*CAST (@@TIMETICKS As float)/1000000 AS [IO Seconds]
    Go
    
    >

    @@IDLEシステム機能を理解する

    このシステム関数は、最後に再起動してからのSQLServerアイドル状態の時間をミリ秒単位で返します。次のコマンドを実行します:

    --Get total time SQL Server was idle
    SELECT @@IDLE
    

    出力は次のとおりです:

    GETDATE()関数を上記のすべてのシステム関数と一緒に使用して、現在の時刻とSQLServerが再起動した時刻の間の値を取得することもできます。この値をマイクロ秒単位で取得する場合は、@@CPU_BUSY関数と@@IO_BUSY関数に示されているように@@TIMETICKS関数を使用します。

    以下のT-SQLステートメントは、前の例と非常によく似ています。 floatデータ型の秒数とマイクロ秒数を返します。

    --Get total time SQL Server was idle
    SELECT @@IDLE* CAST(@@TIMETICKS AS Float) As [IO Microseconds]
    GO
    SELECT @@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Seconds]
    Go
    

    出力:

    @@ PACK_SENT、@@ PACK_RECEIVED、および@@PACKET_ERRORSについて

    これらのシステム統計関数は、ネットワークパケットに関連しています。これらは、ネットワークパケットに関する情報を分析するのに非常に役立ちます。

    • @@ PACK_SENT –最後の再起動以降にSQLServerによってネットワークに書き込まれた出力パケットの数を返します。
    • @@ PACK_RECEIVED –最後の再起動以降にSQLServerによってネットワークから読み取られた入力パケットの数を表示します。
    • @@ PACKET_ERRORS –最後の再起動以降にSQLServer接続で発生したネットワークパケットエラーの数を表示します。

    以下のT-SQLステートメントを使用して、SQLServerによって読み取りまたは書き込みされる入力パケットと出力パケットの数を取得できます。

    --Get the number of packets received or sent
    SELECT @@PACK_SENT AS [Packets Sent]
    GO
    SELECT @@PACK_RECEIVED AS [Packets RECIEVED]
    GO
    

    これらのパケットの詳細は出力にあります:

    @@ PACKET_ERRORSを実行することもできます 同様に、パケットエラーの総数を取得するには:

    --Get number of packets Errors
    SELECT @@PACKET_ERRORS
    

    @@ TOTAL_READ、@@ TOTAL_WRITE、@@TOTAL_ERRORSについて

    ディスク関連のシステム統計関数は、SQL Serverが実行したディスク読み取り、ディスク書き込み、およびディスク書き込みエラーの数を取得します。

    • @@ TOTAL_READ – 最後の再起動以降のSQLServerによるディスク読み取りの数を表示します。
    • @@ TOTAL_WRITE – 最後の再起動以降のSQLServerによるディスク書き込みの数を表示します。
    • @@ TOTAL_ERRORS – 最後の再起動以降のSQLServerによるディスク書き込みエラーの数を表示します。致命的ではない書き込みエラーはこの関数ではキャプチャされないことを忘れないでください。システム自体によって処理されます。

    3つのシステム関数すべてを1つのT-SQLステートメントにまとめて、それらすべての出力を1つのショットで表示しました。

    --Get Disk related statistics
    SELECT @@TOTAL_READ AS [Reads], 
    @@TOTAL_WRITE AS [Writes], 
    @@TOTAL_ERRORS As [Disk Errors]
    

    以下に、ディスクの読み取り、書き込み、および書き込みエラーの数を示します。

    @@CONNECTIONSシステム機能を理解する

    このシステム関数は、SQL Serverの最後の再起動以降の成功に関係なく、SQLServerへの接続の合計試行回数を表示します。次のT-SQLステートメントを実行します。

    --Get the number of attempted connections
    SELECT @@CONNECTIONS AS [Total Connections]
    

    以下の出力は、このSQLServerインスタンスで試行された接続の総数が3130であることを示しています。 3130回の試行がすべて成功したという意味ではありません。

    1つのT-SQLステートメント内のすべてのシステム統計関数

    これらすべてのシステム関数を1つのT-SQLステートメントに組み合わせて、システム統計値ごとに1つの出力を取得することもできます。作業のニーズや要件に非常に役立つ可能性があるため、各システム機能について個別に説明しました。

    以下のT-SQLスクリプトを実行して、説明されているすべてのシステム統計の出力を一度に取得します。

    --Get system statistics
    SELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) As [CPU Busy Microseconds],
    @@CPU_BUSY*CAST (@@TIMETICKS As float)/1000000 As [CPU Busy Seconds],
    @@IO_BUSY*CAST (@@TIMETICKS As float) AS [IO Microseconds],
    @@IO_BUSY*CAST (@@TIMETICKS As float)/1000000 AS [IO Seconds],
    @@IDLE* CAST(@@TIMETICKS AS Float) As [IO Microseconds],
    @@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Seconds],
    @@PACK_SENT AS [Packets Sent],
    @@PACK_RECEIVED AS [Packets RECIEVED],
    @@TOTAL_READ AS [Reads], 
    @@TOTAL_WRITE AS [Writes], 
    @@TOTAL_ERRORS As [Disk Errors],
    @@CONNECTIONS AS [Total Connections]
    

    上記のスクリプトの出力は次のとおりです。1つの出力にすべての統計関連情報が表示されます。

    SQLServer統計を取得するためのストアドプロシージャの使用

    システム統計の同様のビューを表示できる専用のMicrosoftシステムストアドプロシージャもあります。 。このストアドプロシージャの名前はsp_monitor 。同じストアドプロシージャによって最後に実行されてからの各SQLServer統計タイプの使用状況と値を追跡するのに最適です

    注:このストアドプロシージャを実行するには、sysadminロールが必要です。

    sp_monitorを実行しました ストアドプロシージャ– value(value)-value%のような特定の形式で出力が表示されていることを確認します またはvalue(value)。 cpu_busyが表示されます 20(19)-0%として表示される出力。ここで、この出力をどのように読み取ることができるかについて考えるかもしれません。以下の表を読んで理解してください–両方の出力タイプの説明を示しています:

    システムパラメータ 出力 解釈
    CPU_busy 20(19)-0% SQLServerが最後に起動されてから20秒でCPUがビジーでした\restartedCPUが最後に実行されてから19秒でビジー状態でしたsp_monitorが最後に実行されてからの合計時間の0%。
    Packets_received 1467(1428) SQLServerは最後に起動されてから1467パケットを受信しました\restartedSQLServerはsp_monitorが最後に実行されてから1428パケットを受信しました。

    結論

    これで、SQLServerインスタンスのシステム関連の統計を取得する方法を確認できます。システム機能とストアドプロシージャsp_monitor 非常に効率的で便利になります。これらのT-SQLコードを開発作業やシステム分析活動に使用してください。

    この記事をお気に入りのソーシャルネットワークで共有してください。また、この情報について話し合い、意見やヒントを共有したい場合は、コメントセクションにようこそ。


    1. MSSQLServerのセキュリティとアクセス制御に関する未回答の質問

    2. postgres:ユーザーをスーパーユーザーにアップグレードしますか?

    3. SQLバディ–WebベースのMySQL管理ツール

    4. OracleストアドプロシージャのASとISの違いは何ですか?