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

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

Microsoft SQL Server 2014 Community Technology Preview 2 の検証をしてみた

 10月18日にリリースされた、Windows 8.1 と Windows 8.1 で機能アップされた SkyDrive で遊びすぎて、SQL Server 2014 CTP2 の検証をすることができませんでした。 

f:id:koogucc11:20131017012917j:plain

  それでは、SQL Server 2014 のインデックスに関する簡単な検証をしてみましょう。まず、データベースの元ネタを用意します。『 SQL Server 2014 CTP1 インメモリテーブルの検証をやってみた 』を参照してください。AdventureWorks データベースの展開から、In-Memory テーブルの作成方法を説明しています。

 今回の検証は、ここを参考にしました。Memory Optimized Table について記載されています。その中に、Walkthrough Using the Memory-Optimization Advisor という気になるキーワードがありました。Disk Based なテーブルを Memory Optimized なテーブルに移行する機能のようです。SQL Server Management Studio から実行することができます。

Walkthrough Using the Memory-Optimization Advisor

In Object Explorer, right click the table you want to convert, and select Memory-Optimization Advisor. This will display the welcome page for the Table Memory Optimization Advisor.

 DDL 文を書こうかと思っていましたが、ウィザードのほうが楽ですよね。Memory-Optimization Advisor でやってみましょう。オブジェクトエクスプローラーで、移行したいテーブルで右クリックし、『 Memory Opmization Advisor 』をクリックします。

f:id:koogucc11:20131019151833p:plain

 Next をクリックします。

f:id:koogucc11:20131019152051p:plain

 ワーニングが出てますね。外部キーに関するエラーです。今回の検証では、便宜上外部キーを削除します。

f:id:koogucc11:20131019152458p:plain

  ワーニングが消えました。Next をクリックします。

f:id:koogucc11:20131019153153p:plain

  その他の注意事項が表示されます。Next をクリックします。

f:id:koogucc11:20131019153356p:plain

  下図のように設定し、Next をクリックします。

f:id:koogucc11:20131019153526p:plain

  プライマリーキーを移行します。NONCLUSTERED Hash index を選択し、Next をクリックします。

f:id:koogucc11:20131019153929p:plain

  インデックスを移行します。範囲検索に用いるため、NONCLUSTERED Index を選択し、Next をクリックします。

f:id:koogucc11:20131019153959p:plain

  Migrate ボタンをクリックします。

f:id:koogucc11:20131019154325p:plain

  移行が完了しました。OK ボタンをクリックし、移行処理を終了します。

f:id:koogucc11:20131019160242p:plain

  今回ウィザード移行したテーブルの DDL 文は下記の通りです。太字部分の定義が、RANGE 系のインデックス定義です。

CREATE TABLE [dbo].[FactProductInventory]
(
	[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 [FactProductInventory_primaryKey] PRIMARY KEY NONCLUSTERED HASH 
(
	[ProductKey],
	[DateKey]
)WITH ( BUCKET_COUNT = 1048576),
INDEX [FactProductInventory_Index] NONCLUSTERED 
(
	[ProductKey] ASC,
	[DateKey] ASC
)
)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_ONLY )

 インデックスが正しく使用されるか、下記の SQL を実行してみましょう。

SELECT * FROM  [dbo].[FactProductInventory] WHERE ProductKey = 606 AND  [UnitCost] > 150

 実行プランを見てみると、nonclustered index scan になっています。期待していた通りの動作となっています。CTP2 で予定通り対応されましたね。

f:id:koogucc11:20131019165945p:plain

f:id:koogucc11:20131019170802p:plain

 上記以外にも SQL Server 2014 CTP2 には検証したい機能が盛りだくさんです。しかし、検証する時間が足りません......