都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

SQL Server 2014 CTP1 インメモリテーブルのインデックスについて

 前回の検証につづいて、インデックスの検証も実施してみました。

前回のテーブルに対して、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

 それぞれの実行プランは下記の通りです。

①の実行プラン

f:id:koogucc11:20130922120141p:plain

②の実行プラン

f:id:koogucc11:20130922120234p:plain

 実行プランを見ると②の場合はインデックスの効果がないんですよね。下記のクエリのようにインデックスを指定しても同様でした。(なぜか、統計情報がないとのワーニングが発生していました。)

SELECT * FROM FactProductInventoryInMemoryTable With( Index (0))  WHERE ProductKey = 606 AND  [UnitCost] > 150

 範囲検索に関しては、何かしらの工夫が必要なのでしょうか?調査が足りないのかもしれません。それともまだ Range に関しては対応されていないのでしょうか?うーん、困りました。CTP2 に期待しましょう。