如何將整個數據庫載入到記憶體中?
我想將整個數據庫載入到記憶體中,但我該怎麼做呢?我有大約 256 GB 的記憶體,我的數據庫大約是 200 GB,所以我可以輕鬆地在記憶體中處理。
當我執行
select count(*) from table1
sqlserver 自動將表載入到記憶體中時,我可以非常快速地使用表,但我想知道如何將整個數據庫載入到記憶體中?如果我
select count(*) from
在每個表上都這樣做,我可以更快地工作,但是還有其他方法可以將整個數據庫載入到記憶體中嗎?我想通過一個命令載入整個數據庫,而不是一個select count(*) from
表一個表。
我想將整個數據庫載入到記憶體中,但我該怎麼做呢?
在弄清楚“如何”做某事之前,通常最好先弄清楚應該做某事的“原因”。那麼,為什麼要將整個數據庫載入到記憶體中呢?記憶體是一種有限資源,因此需要有效/明智地使用它。
我有大約 256 GB 的記憶體,我的數據庫大約是 200 GB,所以我可以輕鬆地在記憶體中處理
好的,所以您似乎有 56 GB 的 RAM 超出了數據庫的大小。但以下是數據本身之外沒有考慮的內容:
除非您的公司倒閉,否則數據庫會增長,即使您歸檔舊數據也是如此。56 GB 很快就不夠了,對吧?
作業系統需要記憶體(Windows 加上計劃任務等相關服務)
3rd 方軟體需要記憶體(可能是監控、防病毒等)
執行數據庫引擎程序(MSSQLSERVER 或 InstanceName NT 服務)需要記憶體
執行 SQL Server 代理程序需要記憶體
每個連接/會話都需要一些記憶體
查詢需要記憶體(查看查詢計劃的“記憶體授予”):
- 聚合操作
- 計算
- 排序
- 等等
當對象呼叫其他對象時,SQL Server 維護每個父上下文的呼叫堆棧,以便在目前上下文完成時控制可以恢復到該父上下文。此呼叫堆棧在記憶體中進行管理。
查詢計劃記憶體
DMV統計/資訊
結果集(或至少指向每個程序目前所在的每個結果集中的位置的指針)
等等
等等
現在,關於這 200 GB 的數據,您應該考慮這一點:您是否使用了所有200 GB 的數據?我對此表示高度懷疑。將數據頁載入到記憶體中而不引用它們是低效且浪費的。按需載入頁面要好得多,因為用於獲取它們的磁碟 I/O 和它們佔用的記憶體將值得這兩種資源,因為你不會將它們浪費在沒人想要的頁面上。
我想通過單個命令而不是
SELECT *
逐表載入整個數據庫。不,沒有單一的命令可以做到這一點。
此外,該
SELECT COUNT(*)
方法甚至無法實現這一目標。它所做的只是通過掃描載入它可以找到的最小對象,這可能是非聚集索引,也可能實際上是基表本身。但它不載入:
- 記憶體中的任何索引(如果掃描表)或表本身到記憶體中(如果掃描索引),也不是任何未掃描
COUNT(*)
操作的對象。因此,如果將非聚集索引用於操作,您仍然需要找到一種方法來強制對所有非聚集索引和/或表/聚集索引掃描進行索引掃描COUNT(*)
。但這會更加浪費,因為它們不僅不總是被使用,而且每次載入它們都會影響您使用索引 DMV 來確定哪些索引實際上沒有被使用的能力!- 任何行外 LOB 數據頁(可能不是溢出頁)。您需要單獨選擇任何 LOB 列,以及任何具有溢出數據的可變長度列。
只需使用 3rd 方軟體,您就可以將您的 RAM 轉換為“Ram Drive”。我用作測試目的的那個叫做“RamDisk”,你可以在Google上搜尋。是的,您的讀寫速度將提高近 5/10 倍,但唯一的問題是,如果發生任何斷電,您將失去數據。因此,如果您要在其上儲存任何重要數據,請始終使用備份。祝你好運