前回の検証につづいて、インデックスの検証も実施してみました。
前回のテーブルに対して、ProductKey および UnitCost に対してインデックスを作成するようにしています。
CREATE TABLE [dbo].[FactProductInventoryInMemoryTable](
[ProductKey] [int] NOT NULL,
[DateKey] [int] NOT NULL,
[MovementDate] [date] NOT NULL,
[UnitCost] [money] NOT NULL,
[UnitsIn] [int] NOT NULL,
[UnitsOut] [int] NOT NULL,
[UnitsBalance] [int] NOT NULL,
CONSTRAINT FactProductInventoryInMemory PRIMARY KEY NONCLUSTERED HASH([ProductKey],[DateKey])
WITH (BUCKET_COUNT = 10000000),
INDEX IX1_FactProductInventoryInMemory NONCLUSTERED HASH ([ProductKey],[UnitCost]) WITH (BUCKET_COUNT=10000000)
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
上記のスクリプトを実行後に、下記のSQLを実行させます。
①
SELECT * FROM FactProductInventoryInMemoryTable WHERE ProductKey = 606 AND [UnitCost] = 197.23
②
SELECT * FROM FactProductInventoryInMemoryTable WHERE ProductKey = 606 AND [UnitCost] > 150
それぞれの実行プランは下記の通りです。
①の実行プラン
②の実行プラン
実行プランを見ると②の場合はインデックスの効果がないんですよね。下記のクエリのようにインデックスを指定しても同様でした。(なぜか、統計情報がないとのワーニングが発生していました。)
SELECT * FROM FactProductInventoryInMemoryTable With( Index (0)) WHERE ProductKey = 606 AND [UnitCost] > 150
範囲検索に関しては、何かしらの工夫が必要なのでしょうか?調査が足りないのかもしれません。それともまだ Range に関しては対応されていないのでしょうか?うーん、困りました。CTP2 に期待しましょう。