使用查询检测SQL Server利用率

Uğu*_*han 11 sql database sql-server rdbms sql-server-2008

我当前的项目将不断向sql服务器发送查询,它可能使用100%的内存或CPU.

  • 如何检查服务器是否在存储过程中接近完全利用率,以便我可以决定是否执行查询或在表中保存一些设置,以便以下查询可以知道工作负载很高并决定要做什么

  • 如果没有,我如何防止SQL服务器达到完全利用率?

关于案例的更多信息:现在我知道我们当前的测试服务器每秒可以处理40-50个查询(一个特定的存储过程).现在我们将决定每秒向服务器发送多少查询.如果我们将数量设置为比预期的高1,那么从长远来看,查询最终会填满虚拟内存,而客户端必须定期重启其sql server实例.

预期结果(赏金猎人):

@memory_usage float, @cpu_usage float; /* in percentage */
Run Code Online (Sandbox Code Playgroud)

欢迎任何想法.谢谢.

J0e*_*gan 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
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • sys.dm_os_sys_memory是机器物理内存使用的良好来源.它提供有关计算机页面文件使用情况的类似信息.根据我的经验,它的信息经常变化 - 在一秒钟内对它进行多次查询会产生不同的结果.
  • sys.dm_os_ring_buffers是机器的CPU使用率的一个很好的来源,但它没有经常更新 - 每一分钟我所见.如果您需要更多实时信息,也许可以影响这一点.
  • CPU使用率值sys.dm_os_ring_buffers是一个整数,但我根据您的规格制作@cpuUsagefloat.由于存储过程使用两个float参数,因此您可以重构CPU使用率确定以提供小数部分而不更改其调用者.

  • cpu使用不起作用 - sys.dm_os_sys_memory很有用 (2认同)
  • 我们在公司有sql server 2008r2 .. cpuusage每次返回1 (2认同)