單一資料庫~60GB,運作真的很慢,MSSQL2014 64bits 伺服器 64GB記憶體,SQL用了記憶體才~5GB,沒限制MSSQL最大記憶體使用。其他客戶相同系統的資料庫都可用滿。把資料庫搬到一台新VM也一樣。
有解嗎?
同一個系統的資料庫,只是來自不同公司,我是跑系統提供的負載測試,同時只有一個資料庫在線,測試前重開機。沒問題的資料庫一下記憶體就上升,最後是50多,效能很好。有問題的資料庫,記憶體就是要到不了5GB。
因為所有環境都一樣,只有資料庫不同。。。。太神。
在 Microsoft SQL Server 2014 中,記憶體分配主要用於以下用途:
Buffer Pool:
這是 SQL Server 中最常用的記憶體區域,用於存放資料頁面和索引頁面。透過緩衝池,SQL Server 可以減少磁碟 I/O 操作,加速查詢效能。
Execution Contexts:
當 SQL Server 執行查詢時,需要在記憶體中創建執行上下文。執行上下文包含執行查詢所需的所有資訊,例如暫存表、排序和聚合操作等。
Memory-Optimized Tables:
如果使用記憶體優化的表格 (Memory-Optimized Tables),SQL Server 將為這些表格分配記憶體,以提供更快的查詢效能。
Query Plan Cache:
當 SQL Server 執行查詢時,會將查詢計畫存儲在記憶體中,以便稍後再次執行相同的查詢時可以重複使用計畫。因此,查詢計畫緩存也需要記憶體。
Extended Stored Procedures:
擴展存儲過程 (Extended Stored Procedures) 是一些用 C 或 C++ 編寫的 DLL,可以透過 SQL Server 執行。當執行這些程序時,需要在記憶體中分配空間。
這些是 SQL Server 中最常見的記憶體使用方式,但還有其他可能的用途。SQL Server 會自動管理記憶體,以確保最佳的效能和可靠性。
有沒有發現一件事情? SQL 管理記憶體的方式, 跟你的 SQL DB 大小沒有絕對關係, 但卻跟以上四種工作的執行過程或結果, 有很大關係.
從 SQL 2012 以後的版本, 他的記憶體架構與用途如下:
https://learn.microsoft.com/en-us/sql/relational-databases/memory-management-architecture-guide?view=sql-server-ver16
用圖解看裡面各模組的關係:
你可以去調查上面每一個模組的記憶體使用狀況.
或者, 不妨先從 Infra 管理最基本的查起:
先確定以上兩個量測出來的資訊是一致的.
MS-SQL 並不是在啟動的時候就把整個 DB 都載入記憶體內, 而是他需要用到多少, 才即時去拿多少進來. 而會決定他拿多少進來的, 就是上面四種動作. 所以應該是去解析上面的動作, 會用到多少 DB Page 的資料?
如果這些動作用不到那麼多 Page, 他也沒有必要將所有 Page 都載入記憶體內. 例如下圖, 啟動之後就固定容量的只有草綠色和淺藍色模組, 其他都會由 SQL 自動動態調整:
至於 SQL 反應慢, 那是各種綜合因素加乘之後的結果, 並不一定是因為記憶體. 要綜覽所有相關效能因素比對之後, 才能判定是誰? (你還量測過那些效能因素?)
SQL Log 裡面有沒有出現管理性的錯誤旗號? 有的話要先解決那些問題.