2014-05-14 37 views
3

我已閱讀了相當數量的這一點。但找不到可行的解決方案。我有一個有大量RAM和10GB數據庫的服務器。我想將整個數據庫(包括索引)加載到RAM /緩存中。熱身數據庫(把整個數據庫放入緩存)

該解決方案似乎不工作:http://sqlsmurf.wordpress.com/2011/05/23/sql-warm-up-script/

有沒有加載到一切RAM存儲的方式?我可以做SELECT * FROM blah,但是(我相信)不會工作,因爲它不會正確加載索引,它也會有點慢。

+0

你可以在所有的表上運行'UPDATE STATISTICS table WITH FULLSCAN'嗎? – Turophile

+0

在你的域邏輯層中定義一個CACHE怎麼樣? –

+0

@MihaiBejenariu該應用程序是一個寧靜的.NET應用程序,我不想開始處理在該層的本地化緩存,除非收益會很大。 – Faraday

回答

2

當我需要帶的東西到緩存(也有使用情況爲,例如縮短離線索引構建所需的時間),我用的是這樣的:

SELECT COUNT_BIG(*) 
FROM T WITH (NOLOCK, INDEX(IndexNameHere)) 
OPTION (MAXDOP 1) 

併爲每個索引運行它。它並沒有比這更有效率。 NOLOCK用於獲取IAM掃描而不是b-tree-order掃描。

不過,我想知道爲什麼要這樣。數據庫在使用時會逐漸進入緩存。基本上首先訪問頁面緩存的頁面。這還不夠嗎?

+0

問題是,在進入緩存之前,一些查詢需要大約3/4秒,而在緩存中需要1/2秒。由於我有足夠的可用RAM空間,所以我想將它們放入緩存中,這樣第一批查詢數據的人的體驗就不會比最佳緩慢。有問題的查詢是我想要將東西加載到緩存中的原因在此處詳述:http://stackoverflow.com/questions/23649767/optimizing-a-sql-query-which-is-already-doing-an -index-seek?noredirect = 1#comment36322795_23649767 – Faraday

+1

這是一個有效的用例,我會說。 – usr