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