Sql-Server

如何將整個數據庫載入到記憶體中?

  • October 18, 2018

我想將整個數據庫載入到記憶體中,但我該怎麼做呢?我有大約 256 GB 的記憶體,我的數據庫大約是 200 GB,所以我可以輕鬆地在記憶體中處理。

當我執行select count(*) from table1sqlserver 自動將表載入到記憶體中時,我可以非常快速地使用表,但我想知道如何將整個數據庫載入到記憶體中?

如果我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 倍,但唯一的問題是,如果發生任何斷電,您將失去數據。因此,如果您要在其上儲存任何重要數據,請始終使用備份。祝你好運

引用自:https://dba.stackexchange.com/questions/141406