iT邦幫忙

0

特定資料SQL用了記憶體太少

  • 分享至 

  • xImage

單一資料庫~60GB,運作真的很慢,MSSQL2014 64bits 伺服器 64GB記憶體,SQL用了記憶體才~5GB,沒限制MSSQL最大記憶體使用。其他客戶相同系統的資料庫都可用滿。把資料庫搬到一台新VM也一樣。
有解嗎?


同一個系統的資料庫,只是來自不同公司,我是跑系統提供的負載測試,同時只有一個資料庫在線,測試前重開機。沒問題的資料庫一下記憶體就上升,最後是50多,效能很好。有問題的資料庫,記憶體就是要到不了5GB。

因為所有環境都一樣,只有資料庫不同。。。。太神。

看更多先前的討論...收起先前的討論...
mathewkl iT邦高手 1 級 ‧ 2023-03-03 11:14:03 檢舉
CPU使用率? RAM是取資料快取的暫存
alien663 iT邦研究生 5 級 ‧ 2023-03-03 11:35:32 檢舉
你先想辦法確定是記憶體問題導致速度慢吧。
資料庫查詢速度慢可能性有很多,SQL Query沒寫好、機器的CPU或是硬碟等硬體設備拖垮效能等等。就以你目前的描述來看,基本上跟記憶體沒啥關係,建議可以架設一個測試環境,蒐集log去找出真正的問題點。
player iT邦大師 1 級 ‧ 2023-03-03 12:54:56 檢舉
你要把SQL Server的伺服器屬性
貼出來啊
一般,記憶體,CPU這三項
別人才能幫你看有沒有問題

還有VM的記憶體設定
也貼出來
不然是要觀落陰用猜的?
marius iT邦新手 2 級 ‧ 2023-03-03 13:11:03 檢舉
同一系統,把別家的資料庫(較大)搬到這SQL,記憶體可用滿,效能也可。就是這資料庫不吃記憶體。。。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

6
Ray
iT邦大神 1 級 ‧ 2023-03-03 14:58:04

在 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 管理最基本的查起:

  1. 你在 OS 層級看到, 記憶體剩下多少?
  2. 你用甚麼指令去查 MS-SQL 引擎用掉的記憶體?

先確定以上兩個量測出來的資訊是一致的.

MS-SQL 並不是在啟動的時候就把整個 DB 都載入記憶體內, 而是他需要用到多少, 才即時去拿多少進來. 而會決定他拿多少進來的, 就是上面四種動作. 所以應該是去解析上面的動作, 會用到多少 DB Page 的資料?

如果這些動作用不到那麼多 Page, 他也沒有必要將所有 Page 都載入記憶體內. 例如下圖, 啟動之後就固定容量的只有草綠色淺藍色模組, 其他都會由 SQL 自動動態調整:

至於 SQL 反應慢, 那是各種綜合因素加乘之後的結果, 並不一定是因為記憶體. 要綜覽所有相關效能因素比對之後, 才能判定是誰? (你還量測過那些效能因素?)

SQL Log 裡面有沒有出現管理性的錯誤旗號? 有的話要先解決那些問題.

marius iT邦新手 2 級 ‧ 2023-03-03 15:45:25 檢舉

謝謝你的回覆,同一個系統的資料庫,只是來自不同公司,我是跑系統提供的負載測試,同時只有一個資料庫在線,測試前重開機。沒問題的資料庫一下記憶體就上升,最後是50多,效能很好。有問題的資料庫,記憶體就是要到不了5GB。

因為所有環境都一樣,只有資料庫不同,所以其他的就不覺得有問題。

我要發表回答

立即登入回答