對於任何這樣的集約利用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
是該機的一個好來源物理內存使用情況。它提供有關機器頁面文件使用情況的類似信息。根據我的經驗,它的信息經常變化 - 在一秒之內對它進行多次查詢產生不同的結果。
sys.dm_os_ring_buffers
是機器CPU使用率的一個很好的來源,但它並不是經常更新 - 每隔一分鐘我就會看到。如果你需要更多的實時信息,也許你可以影響這個。
sys.dm_os_ring_buffers
中的CPU使用率值是整數,但是我根據您的規格製作了@cpuUsage
a float
。由於存儲過程使用兩個參數,因此可以重構CPU使用率確定以提供小數部分而不更改其調用者。
不成熟的優化是萬惡之源。 – Andomar 2013-02-08 15:51:09
根據你的問題,我想我會退後一步,看看另一種方法。 – 2013-02-13 15:48:40
首先,如果您在服務器上使用虛擬內存,請確保您的實例具有最大內存設置。 SQL Server相當擅長管理它的緩存內存,所以除非你正在使用內存,操作系統需要運行,否則你不需要重新啓動實例(對於這個特定的問題)。有很多關於離開操作系統的內存的文章,但您可以從這裏查看BOL開始:http://msdn.microsoft.com/zh-cn/library/ms178067.aspx。這是2012年,但我不確定你使用的是什麼版本。 – 2013-02-13 15:57:13