Uğu*_*han 7 rdbms sql-server-2008 sql-server
我当前的项目将不断向 sql 服务器发送查询,它可能会使用 100% 的内存或 CPU。
如何在存储过程中检查服务器是否接近充分利用,以便我可以决定是否执行查询或将某些设置保存在表中,以便以下查询可以知道工作负载很高并决定要做什么
如果没有,如何防止 SQL Server 达到充分利用?
有关案例的更多信息:现在我知道我们当前的测试服务器每秒可以处理 40-50 个查询(一个特定的存储过程)。现在我们将决定每秒向服务器发送多少查询。如果我们设置的数量比预期的还要高 1,从长远来看,查询最终会填满虚拟内存,客户端将不得不定期重新启动他们的 sql server 实例。
预期结果(赏金猎人):
@memory_usage float, @cpu_usage float; /* in percentage */
Run Code Online (Sandbox Code Playgroud)
欢迎任何想法。谢谢。
Pau*_*ams 11
如果您真的想限制 SQL Server 内存,请查看最大服务器内存选项。
获取内存使用情况是可能的,但这取决于您真正想要什么。您想将内存使用情况视为“最大服务器内存”选项的百分比吗?如果是这样,请查看sys.dm_os_process_memory:
select convert(float, memory_utilization_percentage) / 100 as memory_usage
from sys.dm_os_process_memory
Run Code Online (Sandbox Code Playgroud)
如果您想要物理内存使用与总系统内存,请查看sys.dm_os_sys_infosys.dm_os_process_memory和sys.dm_os_sys_info:
select * from sys.dm_os_sys_info
declare @physicalMemoryInUseKB bigint
declare @totalSystemMemoryBytes bigint
select @physicalMemoryInUseKB = physical_memory_in_use_kb from sys.dm_os_process_memory
select @totalSystemMemoryBytes = physical_memory_in_bytes from sys.dm_os_sys_info
select convert(float, @physicalMemoryInUseKB) * 1024
/ convert(float, @totalSystemMemoryBytes) as memory_usage
Run Code Online (Sandbox Code Playgroud)
我认为除非您启用了资源调控器,否则您无法获得 CPU 使用率。如果这样做,请查看 sys.dm_os_performance_counters:
select
case CPUUsageBase
when 0 then 0
else convert(float, CPUUsage) / convert(float, CPUUsageBase)
end as 'cpu_usage'
from
(select cntr_value as [CPUUsage]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage%'
and object_name like '%Workload Group Stats%'
and cntr_type = 537003264) Usage
cross join
(select cntr_value as [CPUUsageBase]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage %'
and object_name like '%Workload Group Stats%'
and cntr_type = 1073939712) UsageBase
Run Code Online (Sandbox Code Playgroud)
DMV 提供 CPU 和内存使用信息。这些查询需要 VIEW_SERVER_STATE 权限才能运行。
DECLARE @memory_usage FLOAT
, @cpu_usage FLOAT
SET @memory_usage = ( SELECT 1.0 - ( available_physical_memory_kb / ( total_physical_memory_kb * 1.0 ) ) memory_usage
FROM sys.dm_os_sys_memory
)
SET @cpu_usage = ( SELECT TOP ( 1 )
[CPU] / 100.0 AS [CPU_usage]
FROM ( SELECT record.value('(./Record/@id)[1]', 'int') AS record_id
, record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [CPU]
FROM ( SELECT [timestamp]
, CONVERT(XML, record) AS [record]
FROM sys.dm_os_ring_buffers WITH ( NOLOCK )
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
AND record LIKE N'%<SystemHealth>%'
) AS x
) AS y
ORDER BY record_id DESC
)
SELECT @memory_usage [memory_usage]
, @cpu_usage [cpu_usage]
Run Code Online (Sandbox Code Playgroud)
在存储过程中?一旦导致 CPU 达到 100% 的查询完成,您将无法再监视该指标,而这将由存储过程中的下一个查询来完成。
如果您使用的是 SQL Server 2008 或更高版本(以及企业版),您可以使用资源调控器来确保其他进程有可用的 CPU 能力和内存。