[SQL Server]No Need Conver Index on In-Memory Table

當你建立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

 

參考

Indexes for Memory-Optimized Tables

Hash Indexes for Memory-Optimized Tables