2013-02-08 12 views
11

我目前的項目會不斷向sql server發送查詢,它可能會使用100%的內存或CPU。使用查詢檢測SQL Server利用率

  • 我怎麼能檢查服務器是否已接近充分利用在存儲過程中,這樣我可以決定是否在一個表執行查詢或沒有或保存一些設置,使下面的查詢就可以知道工作量是高和決定要做什麼

  • 如果不是,我怎樣才能防止SQL服務器達到充分利用?

關於案件的更多信息: 現在我知道我們目前的測試服務器每秒可處理40-50查詢(一個具體的存儲過程)。現在我們將決定每秒發送到服務器的查詢數量。如果我們設置的數量比預期的高1,那麼最終查詢將最終填充虛擬內存,客戶端將不得不定期重新啓動它們的sql服務器實例。

預期結果(賞金獵人):

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

任何想法都歡迎。謝謝。

+9

不成熟的優化是萬惡之源。 – Andomar 2013-02-08 15:51:09

+1

根據你的問題,我想我會退後一步,看看另一種方法。 – 2013-02-13 15:48:40

+1

首先,如果您在服務器上使用虛擬內存,請確保您的實例具有最大內存設置。 SQL Server相當擅長管理它的緩存內存,所以除非你正在使用內存,操作系統需要運行,否則你不需要重新啓動實例(對於這個特定的問題)。有很多關於離開操作系統的內存的文章,但您可以從這裏查看BOL開始:http://msdn.microsoft.com/zh-cn/library/ms178067.aspx。這是2012年,但我不確定你使用的是什麼版本。 – 2013-02-13 15:57:13

回答

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是該機的一個好來源物理內存使用情況。它提供有關機器頁面文件使用情況的類似信息。根據我的經驗,它的信息經常變化 - 在一秒之內對它進行多次查詢產生不同的結果。
  • sys.dm_os_ring_buffers是機器CPU使用率的一個很好的來源,但它並不是經常更新 - 每隔一分鐘我就會看到。如果你需要更多的實時信息,也許你可以影響這個。
  • sys.dm_os_ring_buffers中的CPU使用率值是整數,但是我根據您的規格製作了@cpuUsage a float。由於存儲過程使用兩個參數,因此可以重構CPU使用率確定以提供小數部分而不更改其調用者。
+2

cpu使用率不起作用 - sys.dm_os_sys_memory很有用 – 2013-02-18 07:45:01

+0

很高興聽到內存使用檢查可以幫助,@UğurGümüşhan。 CPU使用率檢查以何種方式不起作用?錯誤嗎?可能需要進行簡單的調整才能在您的環境中工作。另外,這讓我想起 - 你使用的是什麼SQL Server和OS版本? (根據'@@ VERSION',我檢查了Microsoft SQL Server 2008 R2(SP1)上的存儲過程 - 10.50.2500.0(Intel X86)2011年6月17日00:57:23 Copyright(c)Microsoft Corporation Express Edition with Advanced Services在Windows NT 6.1 (內部版本7601:Service Pack 1)中。) – J0e3gan 2013-02-18 09:36:58

+2

我們在公司中有sql server 2008r2 .. cpuusage每次返回1次 – 2013-02-18 09:47:23