當你建立In-Memory table和index時,你無須考慮non-index key 的欄位,
因為In-Memory世界都是Cover query。
Disk table我們需要搭配TSQL來設計索引,Cover Index是最常見的索引,
大部分會提高TSQL查詢效能,因為該索引是另一個資料子集,
所以整體IO大部分會比原本Disk table來的小,另外如使用企業版且又是大索引的話,
建議搭配索引壓縮,節省disk space、memory..等,下面我簡單示範。
create index IX_ProductID on SalesOrderDetailRico(ProductID)
with(data_compression=page)
select SpecialOfferID,UnitPrice,UnitPriceDiscount
from SalesOrderDetailRico
where ProductID=897 --965
從執行計畫我們可以看到,QO透過lookup operator來幫我們取得其他column資料。
Logical reads 如下
這時我們就會透過Cover Index來改善IO並提高查詢效能,如下圖。
Logical reads從264減少至4。
那在In-Memory 世界呢?我一開始就提到都是Cover Query,再來簡單示範
ALTER TABLE [SalesOrderDetailRico_Mem]
ADD INDEX IX_ProductID NONCLUSTERED (ProductID);
go
select SpecialOfferID,UnitPrice,UnitPriceDiscount
from [SalesOrderDetailRico_Mem]
where ProductID=897 --965
select *
from [SalesOrderDetailRico_Mem]
where ProductID=897 --965
無論我使用 *或其他欄位,該Range Index都能滿足我的查詢,
這也表示我們不可對Range Index使用include,
雖然索引設計上比disk table要來的簡單許多,但也要注意所衍生的問題~GL 。
ALTER TABLE [SalesOrderDetailRico_Mem]
drop INDEX IX_ProductID
參考