微軟在SQL 2014 推出了In-Memory的功能,在金融/電信/電商/遊戲…等產業有了不錯的迴響,但可惜有二個主要因素限制了它的發展,包含市場接受度不夠、產品限制(256 GB/不支援 table間的 join/不支援 sub query/某些資料型態、Index、Alter語法…等不支援),經過二年跟時間賽跑,市場的接受度慢慢在打開,產品team終於在新的SQL2016把主要的功能都補齊了。
本篇將透過範例來協助各位了解 SQL2016在In-Memory 要如何設定與使用管理介面?
1. 建立In-Memory資料庫,以下我將透過T-SQL建立1個DB [InMemoryDB] 與3個用來比較的Table 外加1個Stored Procedure [usp_InsertData]
建立資料庫搭配專門存放 InMemory 的 File/Delta File 的 Folder [InMemoryDB_dir]
DiskbasedTable 是一個非 In-memory table
InMemTable 是一個 In-memory table
usp_InsertData 是一個 Native compile的 Stored Procedure先針對 DiskBasedTable 跑一個迴圈insert 300萬筆資料,耗時53秒
再針對 InMemTable 也一樣跑一個迴圈insert 300萬筆資料,進步到只需31秒
最後再執行 Native compile 的 usp_InsertData,它會向 InMemTable2 insert 300萬筆資料,結果只需要18秒
In-memory是個好東西,尤其是在記憶體便宜的時代,但是在管理面上,仍然要注意…
我們再新建一個 ResourceTestDB來模擬搶資源的狀況
開始做100萬筆的寫入,然後把記憶體用盡
我算的好準,大約到寫入94%時,把記憶體用盡了。系統提供了ResourceGovernor與DMV來觀察,前者是企業版功能,待會會示範;DMV與DMF則是SQL2005用來取代SQL2000 system table的管理工具
在範示ResourceGovernor之前,要先建立資源集區 Resource Pool然後再使用系統函數 sp_xtp_bind_db_resource_pool,將資料庫與資源集區繫結(強聯結),然後再離線/上線,以確保有成功設定
再寫入100萬筆,但錯誤訊息不一樣,是說因為資源集區中的資源不足檢視一下目前的資源使用
後續要思考,若交易沒有做完,是不是應該rollback?或是要加大資源集區?
若實務中需要,刪除的指令如下
接下來,若是要記憶體還給系統(挪作他用),要 detach db
ResourceTestDB已經由記憶體移至硬碟,將來若要Attach,只要記憶體夠隨時可以回來
接下來我會再寫一篇較進階的 In-Memory資料庫討論,包含短/長期使用、備份/還原、In-Memory報表/精靈的探討,並介紹全新的Log、索引…等In-Memory資料庫的設計規劃概念來駕馭它
李秉錡 Christian Lee
Once worked at Microsoft Taiwan