2015-11-24 59 views
0

我想爲sql server 2008 R2 Express Edition實現一個簡單的內存緩存。SQL Server在內存緩存中

要求:

  1. 緩存必須爲高速緩存與持久表同步的所有用戶
  2. 可見。在這個持久表中可能會出現大量的CRUD操作。

我的解決方案: 創建一個CLR程序桶,它可以代表.NET程序集。這些程序將被命名爲:

  • Add(param1,... paramN);
  • 刪除(param1 ... paramN);
  • GetAll();

其中param1 ... paramN是我特有的持久表數據,我想緩存。

在幕後我會組織內存數據,可能進入O(1)添加/刪除的HashSet。然後,我將爲調用這些方法(添加/刪除)創建一個Insert/Delete操作的觸發器(只能在持久表上進行插入和刪除操作)。最大的問題是交易可以回滾。我如何才能發現具有特定ID的交易被回滾?有一個我可以聽的服務器級事件?

請給我任何你知道的替代品。我知道SQL Server 2014支持內存優化的OLTP表,但是......此功能僅對SQL Server企業版有效:D。

另一種方法是創建具有##(上的所有連接可見)的臨時表BUT:

  1. 該表將被存儲在TEMPDB。如果將tempDB存儲在RAM中,可能會提高性能,但會出現第二個問題:

  2. 在此臨時表中搜索(針對特定項目)將花費我O(Log(N))因爲如果我創建一個索引,幕後會有一個B樹。我的內存替代將確保查找將花費O(1)。

+1

你試圖用這個緩存解決的實際問題是什麼?聽起來很複雜,你能確定它甚至能解決你的問題嗎? –

+0

@JamesZ ideea是我想要執行O(1)查找,但sql服務器只能處理O(日誌N),這對我的系統來說是不可接受的,當我處理大量的記錄時。其次,如果我從內存中獲取數據而不是從磁盤/永久性表中讀取數據,會有巨大的性能優勢。無論如何,我的需求相當複雜,但ideea很簡單:我不會最終調用一個CLR函數來獲取O(1)時間的數據。 –

回答

1

如果你有足夠的內存,你真的沒有從光盤讀取數據,所有你經常訪問的數據都會在內存中。我並不完全瞭解快遞版的限制,因此可能會導致您遇到的問題。我認爲你至少應該考慮升級到標準版本,尤其是如果你有很多的記錄,因爲你很可能會用完空間。

臨時數據庫也不例外,它會在光盤或RAM中,具體取決於您擁有多少內存以及最多訪問哪些內存。只是爲其他表中的數據創建緩存1:1到tempdb沒有用,您只會浪費內存來存儲兩次相同的數據。

SQL Server 2012的內存OLTP根本不會幫你。問題的關鍵不是你有沒有在內存中的數據,而是爲了減少鎖定開銷等。

+0

你想我的觀點:我想查找時間在O(1)時間!!!!。 SQL Server不爲我提供這樣的性能。還是呢? (也許我可以聲明一個索引行爲像一個哈希表,但我沒有看到這個選項存在) –

+1

爲什麼要使用SQL服務器呢?這聽起來像是你偏向於基於內存的技術,那麼爲什麼不讓Gemfire或VoltDB開始,而不是圍繞你將要繞過的技術構建一些東西? –

+0

你的問題並沒有說O(1)是一個需求。如果你真的打算通過CLR運行選擇,我認爲你甚至沒有接近。如果你需要的話,那麼你可能應該開始研究與SQL Server不同的平臺,就像@BradD所說的那樣。 –