--=======================================================
在SQL SERVER 2014中,最吸引眼球的就是內存表和本地編譯存儲過程,在MS強大的宣傳下,內存表和本地編譯存儲過程似乎成了能搞定一切的救世主,這是真的嗎? 讓我們一步一步來學習探索吧
--=======================================================
創建數據庫
由于內存表數據的存放機制和普通表(基于磁盤的表)完全不同,因此內存表的數據需要一個特別的文件夾(注意不是文件哦)來存放,后續會涉及到數據存放原理,此時先放一放,我們來看下數據庫創建腳本:
USE [master]--創建數據庫CREATE DATABASE [TestDB]ON PRIMARY ( NAME = N'TestDB', FILENAME = N'D:/SQL2104/SQLData/TestDB.mdf' , SIZE = 204800KB , MAXSIZE = UNLIMITED, FILEGROWTH = 204800KB ) LOG ON ( NAME = N'TestDB_log', FILENAME = N'D:/SQL2104/SQLData/TestDB_log.ldf' , SIZE = 204800KB , MAXSIZE = 2048GB , FILEGROWTH = 204800KB )GO--創建內存表使用的文件組ALTER DATABASE [TestDB] ADD FILEGROUP [TestDB_MFG1] CONTAINS MEMORY_OPTIMIZED_DATAGO--創建內存表使用的文件夾ALTER DATABASE [TestDB] ADD FILE ( NAME = N'TestDB_MDir1', FILENAME = N'D:/SQL2104/SQLData/TestDB_MDir1') TO FILEGROUP [TestDB_MFG1]GO
對于每個數據庫,只能創建一個內存優化文件組(Memory-Optimized Filegroup),而對于每個內存優化文件組,可以創建多個關聯的文件夾。
PS:內存優化文件組基與FILESTREAM文件組,但是無需為內存優化文件組來啟用FILESTREAM。
--=======================================================
創建內存表
創建內存表限制比較多:
1. 支持的數據類型:http://msdn.microsoft.com/ZH-CN/library/dn133179(v=sql.120).aspx
2. 內存優化表支持自增,但唯一允許用于 seed 和 increment 的值為 1;(1,1) 是 seed 和 increment 的默認值;
3. 內存優化表不支持CHECK約束,在非hash索引列上也不行;
4. 內存優化表不支持使用的排序規則所具有的代碼頁并非 1252 的數據類型 char(n) 和 varchar(n);
5. 內存優化表不支持nvarchar(max)或varchar(max)
6. 內存優化表索引不支持未使用 *_BIN2 排序規則的字符列上的索引,在非hash索引列上也不行;
7. 內存優化表上的索引不支持索引鍵中有可為 Null 的列,在非hash索引列上也不行;
8. 內存優化表必須有至少一個索引或主鍵
創建內存優化表Demo
CREATE TABLE [dbo].[TB1_IM]( [c1] [int] NOT NULL IDENTITY(1,1) PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), [c2] [nchar](200) COLLATE Chinese_PRC_Stroke_90_BIN2 NOT NULL INDEX ix_c2 NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), [c3] [nvarchar](200) COLLATE Chinese_PRC_Stroke_90_BIN2 NOT NULL, [c4] [nvarchar](200) COLLATE Chinese_PRC_Stroke_90_BIN2 NOT NULL, INDEX ix_c3_c4 NONCLUSTERED HASH(c3,c4) WITH(BUCKET_COUNT=1000000), INDEX ix_c2_c3 NONCLUSTERED (c2,c3))WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )
內存優化表的最大特色就是HASH索引,而HASH索引最大的特色就是點查詢比較快,但是對于范圍查找就蒼白無力啦。
上帝為你打開一扇窗的時候,他肯定順手關掉一扇門。
--===============================================================================
關于BUCKET_COUNT的值的設置
MS有如下建議:
在大多數情況下,Bucket 計數應該介于索引鍵中非重復值數目的 1 到 2 倍之間。 如果索引鍵包含許多重復值,且平均而言對于每個索引鍵值超過 10 行,則改用非聚集索引
您不見得始終都能夠預測到某個特定索引鍵可能具有或將具有多少個值。 如果 BUCKET_COUNT 值處于實際鍵值數目的 5 倍之內,性能就應該是可接受的。
簡單理解就是: 要盡可能保持每個Bucket里存放數據而又不存放過多數據,如果空閑Bucket過多就會造成浪費,如果單個Bucket中存放過多行數據,就會造成性能問題。
--=================================================================================
關于索引維護和表修改
內存索引表不支持ALTER TABLE 和 ALTER INDEX操作,如果需要修改表或者修改索引,那么SORRY,請重新刪除創建!(有沒有瞬間無愛的趕腳!)
--=================================================================================
關于數據持續性
對于內存優化表,有兩種持續性可以選擇:SCHEMA_ONLY(非持久表)和SCHEMA_AND_DATA(持久表),SCHEMA_ONLY 選項會導致數據在實例重啟后丟失;而對于SCHEMA_AND_DATA(持久表),又可以設置完全持久行還是延遲持續性,延遲持續性選項允許在事務提交時可以不立即將日志寫入磁盤,從而提升性能,當然代價就是發生故障時可能丟失數據。
--===============================================================================
未完待續
新聞熱點
疑難解答