11

私の現在のプロジェクトは、クエリを常に SQL サーバーに送信し、メモリまたは CPU を 100% 使用する可能性があります。

  • サーバーがストアド プロシージャで完全に使用されているかどうかを確認して、クエリを実行するかどうかを決定するか、テーブルにいくつかの設定を保存して、次のクエリがワークロードが高いことを認識し、何をすべきかを決定できるようにするにはどうすればよいですか?

  • そうでない場合、SQL サーバーが完全に使用されないようにするにはどうすればよいですか?

ケースに関する詳細情報: 現時点で、現在のテスト サーバーが 1 秒あたり 40 ~ 50 クエリを処理できることがわかっています (1 つの特定のストアド プロシージャ)。次に、毎秒サーバーに送信されるクエリの数を決定します。予想よりも 1 高い量を設定すると、長期的には、クエリによって最終的に仮想メモリがいっぱいになり、クライアントは SQL Server インスタンスを定期的に再起動する必要があります。

期待される結果 (賞金稼ぎの場合):

@memory_usage float, @cpu_usage float; /* in percentage */

どんなアイデアでも大歓迎です。ありがとう。

4

3 に答える 3

5

このように SQL Server を集中的に使用し、それを微調整する作業については、(仮想) マシンが SQL Server 専用であると想定しています。

そうは言っても、マシンの現在の CPU とメモリの使用率を取得すると、うまくいくはずです。

CREATE PROCEDURE dbo.p_GetSystemUsage
    @cpuUsage float out,   -- % CPU usage
    @memoryUsage float out -- % memory usage
AS
BEGIN
    SET NOCOUNT ON;

    /*
     * % CPU usage
     */

    SELECT TOP 1
        @cpuUsage = 100 - r.SystemIdle
    FROM (
        SELECT
            rx.record.value('(./Record/@id)[1]', 'int') AS record_id,
            rx.record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle
        FROM (
            SELECT CONVERT(XML, record) AS record
            FROM sys.dm_os_ring_buffers
            WHERE
                ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND
                record LIKE '%<SystemHealth>%') AS rx
        ) AS r
    ORDER BY r.record_id DESC

    /*
     * % memory usage
     */

    SELECT
        @memoryUsage =
            (((m.total_physical_memory_kb - m.available_physical_memory_kb) /
              convert(float, m.total_physical_memory_kb)) *
             100)
    FROM sys.dm_os_sys_memory m
END

いくつかの注意事項:

  • sys.dm_os_sys_memoryマシンの物理メモリ使用量の良い情報源です。マシンのページ ファイルの使用状況に関する同様の情報を提供します。私の経験では、その情報は頻繁に変更されます。1 秒以内に複数のクエリを実行すると、異なる結果が得られます。
  • sys.dm_os_ring_buffersは、マシンの CPU 使用率の良い情報源ですが、私が見たものから毎分更新されるほど頻繁ではありません。より多くのリアルタイム情報が必要な場合は、これに影響を与えることができます。
  • の CPU 使用率の値sys.dm_os_ring_buffersは整数ですが、仕様ごとに作成@cpuUsageしました。floatストアド プロシージャは 2 つのfloatパラメーターを使用するため、CPU 使用率の決定をリファクタリングして、呼び出し元を変更せずに小数部分を提供できます。
于 2013-02-17T22:35:12.413 に答える
1

SQL でこれを行う方法はわかりませんが、いつでも C# で関数を作成し、CRL を使用してストアド プロシージャとして SQL Server で使用できるようにすることができます。

http://msdn.microsoft.com/en-us/library/ms131094.aspx

于 2013-02-17T09:15:52.527 に答える