SQL Server 2014 CTP1 自習書の補足1(CTP2 からの変更点)

弊社の執筆した「SQL Server 2014 CTP1 自習書」ですが、
http://www.microsoft.com/ja-jp/sqlserver/2014/technology/self-learning.aspx

この自習書は「CTP1」の内容となっており、2013/10/16 からは「CTP2
http://technet.microsoft.com/ja-jp/evalcenter/dn205290.aspx

が提供開始されたので、その変更点を補足します。


■ インメモリ OLTP (Hekaton) 機能の変更点
インメモリ OLTP (Hekaton) は、CTP2 で以下の点が変更されています。

  • メモリ最適化非クラスター化インデックス(bw-tree インデックス)のサポート。CTP1 では HASH インデックスのみがサポート
  • メモリ最適化テーブルの PRIMARY KEY は、HASH インデックスまたはメモリ最適化非クラスター化インデックスが必須となる(CTP1 では HASH インデックスが必須)
  • 統計が自動作成される(CTP1 では統計は自動作成されない)
  • ネイティブ コンパイル ストアド プロシージャでの関数制限の緩和(日付関数のサポートが多数追加されているなど)
  • メモリ最適化アドバイザー機能の追加
  • ネイティブ コンパイル アドバイザー機能の追加

CTP2 からは、通常の非クラスター化インデックス(b-tree インデックス)と似ている形式(bw-tree インデックス)の「メモリ最適化非クラスター化インデックス」がサポートされるようになったので、PRIMARY KEY(主キー制約)に HASH インデックスが必須ではなくなりました。
これによって、次のようにメモリ最適化テーブルを作成することができます。

CREATE TABLE t1_InMem_NI
(  col1 int NOT NULL PRIMARY KEY NONCLUSTERED
  ,col2 nvarchar(100) )
 WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)

このように PRIMARY KEY を作成すると、メモリ最適化非クラスター化インデックス(bw-tree インデックス)が作成されて、Range Scan(範囲スキャン)に強いインデックスを作成することができます。
例えば、次のような検索(Range Scan)があったとします。

SELECT * FROM t1_InMem_NI WHERE col1 BETWEEN 10 AND 20

このような検索は、HASH インデックスでは、Table Scan になってしまいますが(下図)、メモリ最適化非クラスター化インデックスであれば、Index Seek で結果を取得することができます。

ただし、メモリ最適化非クラスター化インデックスでは、更新処理が HASH インデックスよりも遅くなってしまう点に注意する必要もあります。自習書で紹介している 100万件のデータ挿入のスクリプトを、上記のテーブル(t1_InMem_NI)に対して実行した場合には、次のグラフのように、大きな性能劣化が起きてしまいます。

したがって、Range Scan を強くしたいのか、更新系を強くしたいのかのトレード オフで、メモリ最適化非クラスター化インデックスを採用するかどうかを見極める必要があります。


■ 関数制限の緩和(日付関数のサポートが多数追加)
CTP1 では、ネイティブ コンパイル ストアド プロシージャ内で利用できる関数が非常に少なく、大きな制限を受けていたのですが、CTP2 からはこの制限が緩和されました。
次の表のように、日付関数系(DATEADD や DATEDIFF など)のサポートが多数追加されました。


また、この表にない関数でも、RTM(製品版)では、追加でサポートされる可能性があります。
ネイティブ コンパイル ストアド プロシージャでの制限事項については、オンライン ブックの以下の場所が参考になります。
サポートされていない Transact-SQL の構造
http://msdn.microsoft.com/ja-jp/library/dn246937(v=sql.120).aspx
ネイティブでコンパイルされたストアド プロシージャのサポートされている構造
http://msdn.microsoft.com/ja-jp/library/dn452279(v=sql.120).aspx

メモリ最適化テーブルの制限事項については、以下の場所が参考になります。
http://msdn.microsoft.com/ja-jp/library/dn246937(v=sql.120).aspx


■ メモリ最適化アドバイザー、ネイティブ コンパイル アドバイザー
CTP2 からの新機能でうれしいのが、メモリ最適化アドバイザーとネイティブ コンパイル アドバイザーです。
メモリ最適化アドバイザーは、既存のテーブルがメモリ最適化テーブルに変換できるかどうかをチェックしてくれて、変換できる場合は実際の変換を行うこともできます。



ネイティブ コンパイル アドバイザーは、既存のストアド プロシージャがネイティブ コンパイル ストアド プロシージャに変換できるかどうかをチェックしてくれる、とっても便利なツールです。ネイティブ コンパイル アドバイザーは、次のように利用できます。


上の画面のように、既存のストアド プロシージャ内で、サポートされていない Transact-SQL を使っている場合をチェックしてくれるので、本当に便利です。


■ AlwaysOn 可用性グループでメモリ最適化テーブルのサポート
CTP2 からは、AlwaysOn 可用性グループでメモリ最適化テーブルがサポートされるようになりました。SCHEMA_ONLY の場合はスキーマのみ、SCHEMA_AND_DATA であればスキーマとデータをセカンダリへ複製することができます。
なお、CTP2 では、読み取り可能セカンダリ側で、メモリ最適化テーブルのデータを参照するには、トレースフラグ 9989 をセットしておく必要があります。
AlwaysOn 関連は、以下の SQL Server Blog も参考になると思います。
http://blogs.technet.com/b/dataplatforminsider/archive/2013/11/05/in-memory-oltp-high-availability-for-databases-with-memory-optimized-tables.aspx


続きは、補足2 へ
http://d.hatena.ne.jp/matu_tak/20131127/1385544999