我想爲sql server 2008 R2 Express Edition實現一個簡單的內存緩存。SQL Server在內存緩存中
要求:
- 緩存必須爲高速緩存與持久表同步的所有用戶
- 可見。在這個持久表中可能會出現大量的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:
該表將被存儲在TEMPDB。如果將tempDB存儲在RAM中,可能會提高性能,但會出現第二個問題:
在此臨時表中搜索(針對特定項目)將花費我O(Log(N))因爲如果我創建一個索引,幕後會有一個B樹。我的內存替代將確保查找將花費O(1)。
你試圖用這個緩存解決的實際問題是什麼?聽起來很複雜,你能確定它甚至能解決你的問題嗎? –
@JamesZ ideea是我想要執行O(1)查找,但sql服務器只能處理O(日誌N),這對我的系統來說是不可接受的,當我處理大量的記錄時。其次,如果我從內存中獲取數據而不是從磁盤/永久性表中讀取數據,會有巨大的性能優勢。無論如何,我的需求相當複雜,但ideea很簡單:我不會最終調用一個CLR函數來獲取O(1)時間的數據。 –