
答案1
這裡遺漏了一個重要的細節:任務管理器顯示 SQL Server 僅使用 344.5 MB RAM,但它實際上保留了更多(幾乎全部)供自己使用。任務管理器不會顯示此內容。任務管理器中的數字實際上並沒有達到系統記憶體的 97%,因為那裡沒有顯示保留記憶體。
您假設幾乎所有記憶體都被其他東西用完了,因此 SQL Server 無法使用超過 344.5 MB 的內存,這是完全錯誤的。它不是這樣工作的。任務管理器可能會產生很大的誤導,請查看實際的效能計數器。
更新以嘗試更好地解釋它。
SQL伺服器按設計將資料緩存在記憶體中,隨著時間的推移,它會耗盡系統中幾乎所有的可用記憶體;但是這個內存並沒有顯示在任務管理器中(或至少不是全部),因為SQL Server 試圖表現得很好並告訴操作系統“我想要這麼多內存,但它只是用於緩存,沒有它我也能生存,因此,如果需要,請隨時回收它」。這意味著任務管理器顯示 SQL Server 使用的記憶體比實際保留的記憶體少得多。
這是絕不是一個問題;這是有意而為之的。您看到的「問題」並不存在,只是您在任務管理器中看到的內容具有誤導性。
如果您停止 SQL Server,它當然會釋放所有已分配的內存,包括任務管理器中顯示的內存和未顯示的內存(更多)。當您再次啟動它時,它將使用很少的記憶體:隨著 SQL Server 將資料載入到記憶體中並對其進行緩存,使用量將隨著時間的推移再次增長。但大部分記憶將再次不是顯示在任務管理器中,因為該特定工具無法看到它。
我還要補充一點,如果 SQL Server 實際上需要內存,它會以不同的方式分配它並且然後工作管理員會顯示它;如果 SQL Server 實際上使用了 60 GB 內存,您會看到必需的那麼多內存,而不是僅僅將其用於緩存。
答案2
你在這台機器上運行 SQL Server,所以它正在做 SQL Server 所做的事情 - 它保留作業系統上(幾乎)所有可用的內存,這樣當它進行大查詢或其他操作時,它就不必分配 RAM ,它已經有了。
你有幾個選擇。
- 接受。如果您僅在此電腦上執行 SQL Server,那麼它會如預期運作。不要管它。
- 蓋上蓋子。如果您需要在此伺服器上執行其他工作負載,則可以限制 SQL 將保留的 RAM 量。
我絕對不會選擇選項 2,除非 SQL 永遠不會使用它所佔用的 RAM。只有在測量作業系統層級 SQL 效能計數器和 SQL 層級動態管理檢視時您才會知道這一點。
從大局來看,您實際上想解決什麼問題?在這種情況下,「釋放記憶體」是一項毫無意義的任務,除非您知道您正在將其釋放以供其他用途使用。您是否遇到 SQL 效能問題?
我要帶你去的是使用適當的監控來診斷效能問題。為此,您需要了解大量有關 SQL 的知識和相當多的有關 Windows 的知識。如果您不是 DBA,請僱用 DBA 或簽訂合同,或與您的軟體供應商合作(如果這是針對已購買產品的 SQL)。如果這是你的公司在沒有 DBA 的情況下自己寫的東西,那就去找一個吧。
預設情況下,隨著時間的推移,SQL Server 執行個體可能會消耗伺服器中大部分可用的 Windows 作業系統記憶體。一旦獲取內存,除非檢測到內存壓力,否則不會釋放。這是設計使然,並不表示 SQL Server 進程中存在記憶體洩漏。
/根據您的編輯進行編輯:
雖然我不是系統管理員,但在我看來,sql server 佔用的記憶體很少,因為其他所有內容都被 Windows 消耗了。
你在這裡幾乎肯定是錯的。正如我上面提到的,隨著時間的推移,SQL Server 將分配幾乎所有的系統 RAM。 sqlserver.exe 進程使用的 RAM 量並不能告訴您 SQL 實際上分配了多少 RAM。 DMV 和效能計數器會告訴您這一點。
我使用 SSMS 來處理資料庫,我直接注意到一切都很慢。即使是簡單的事情,例如打開表格窗格來查看我的所有表格,也需要一段時間,有時甚至會超時。
不要在 SQL 伺服器上運行它,而是從您的工作站運行它。