2011-11-04 38 views
2

好吧,我正在研究一個ASP MVC Web應用程序,它可以從SQL Server 2008查詢相當大量的數據。應用程序啓動時,用戶會看到一個包含多個字段的搜索掩碼。使用搜索掩碼,用戶可以搜索數據庫中的數據,也可以通過在掩碼中指定參數來過濾搜索。爲了加速搜索,我將數據庫查詢返回的結果集存儲在服務器會話中。在隨後的搜索過程中,我可以搜索會話中的數據,從而避免不必要的訪問數據庫。在ASP MVC應用程序的服務器會話中存儲大量數據的最佳選擇是什麼?

由於數據庫查詢可返回的數據量可能非常大,因此Web應用程序的可伸縮性受到嚴格限制。比方說,如果有100個用戶同時使用該應用程序,那麼服務器會爲每個單獨的用戶在其會話中保留搜索結果。這最終會消耗相當多的記憶。我現在的問題是,在會話中存儲數據的最佳選擇是什麼?數據庫中的查詢可能需要相當長的一段時間,因此目前我希望避免必須在後續搜索中運行查詢,前提是已經檢索到的數據包含正在搜索的數據。我考慮過的選項是在我的搜索查詢中的數據庫中創建一個臨時表,用於存儲檢索到的數據以及可用於後續搜索的數據。問題是,我沒有太多的SQL Server經驗,所以我不知道如果有多個用戶執行搜索,SQL Server是否會爲每個用戶創建臨時表。還有其他的可能嗎?可以使用SQL Server中的臨時表進行工作,還是隻會導致SQL Server上的內存問題?謝謝您的幫助! :)

編輯:非常感謝您的幫助和洞察力的答案,傢伙!但是,我沒有提到一個重要的細節。當我查詢數據庫時,結果集的格式可能因用戶而異。這是因爲用戶可以通過從搜索掩碼中的預定義多選框中選擇列來決定結果表可以具有哪些列。如果用戶A想要在他的結果表中顯示ColA,ColB和ColC,他將從搜索掩碼中的多選框中選擇這些值。然而,用戶B可能僅選擇ColA和ColC。因此,將結果緩存到所有用戶的單個表中可能會有點棘手,因爲對於所有用戶而言,表列不一定是相同的。因此,我在想,我幾乎不得不使用另一種方法來單獨保存每個用戶的緩存表。下面提到的HTML5本地存儲替代選項聽起來很有趣。由於這是一個Intranet應用程序,因此假設(或要求)用戶擁有支持HTML5的最新瀏覽器可能是公平的。你們有什麼感想?再次感謝您的幫助:)

回答

1

如果您想要緩存查詢結果,它們必須以某種形式存在於Web服務器或客戶端上。所有選項都需要內存,並且由於搜索結果是用戶特定的,因此內存使用量將隨着當前用戶數量的線性函數而增加。

我的建議是限制從SQL返回的行數(使用TOP)和/或查看優化SQL端的查詢。如果您的數據庫查詢需要很長時間,那麼很可能會在SQL中進行優化。

0

您可以嘗試打開sql會話狀態。

http://support.microsoft.com/kb/317604

:輕鬆,你會發現,如果這解決內存壓力,並具有可接受的性能(即讀取和寫入緩存的DB)。如果perf是好的,那麼你可能想要實現sql session自己做的事情,因爲有一個... 下側:如果你不來搶從會話中刪除它,它就會被序列化和反序列化對頁面無關每個請求。

1

你是否已經因子評分有關NoSql databases

一個NoSQL數據庫的想法是來存儲讀取或寫入優化,並且與「易查詢」(例如在搜索字詞查找)訪問的信息。他們很容易橫向擴展,並允許你搜索槽一大堆數據的速度非常快(例如想想谷歌的BigData的!)

+0

非常感謝您的提示。但是,我的產品是針對客戶公司的,我無權更改其數據庫。 – cbbcloud

1

如果HTML5是一種可能性,你可以使用本地存儲。

+0

這聽起來很有趣。是否有可能將整個.NET對象序列化爲本地存儲並將其「發送」給客戶端,或者您是否必須在客戶端使用JavaScript來完成它?你碰巧有一些鏈接或教程可以引用我嗎?我還沒有用過HTML5。 – cbbcloud

+0

我剛纔讀[這裏](http://stackoverflow.com/questions/3220660/local-storage-vs-cookies),如果客戶端需要頻繁訪問數據只能用於使用本地存儲。然而,在我的場景中,服務器需要比客戶端更多地使用數據。因此,Cookie可能比本地存儲更適合。 – cbbcloud

+1

使用Cookie時,每個cookie只限制4MB,每個站點限制20個Cookie。你知道你會下拉多少數據嗎?然後,您必須將這些更改保留回數據庫,然後您必須擔心併發性。您可以使用該框架來幫助您完成該任務。看看這個博客。 http://stephenwalther.com/blog/archive/2011/01/12/asp-net-and-html5-local-storage.aspx –

相關問題