ぼちぼち Hekaton を書こうかと思っているのですが、TSQL の拡張も面白そうなので今回は SQL Server 2014 で拡張された TSQL について少し触れてみたいと思います。
BOL では
What’s New (Database Engine)
CREATE TABLE (SQL Server)
に記載されています。
SQL Server 2014 の TSQL の拡張機能として、
Contents
Inline specification of CLUSTERED and NONCLUSTERED
Inline specification of CLUSTERED and NONCLUSTERED indexes is now allowed for disk-based tables. Creating a table with inline indexes is equivalent to issuing a create table followed by corresponding CREATE INDEX statements. Included columns and filter conditions are not supported with inline indexes.
SELECT … INTO
The SELECT … INTO statement is improved and can now operate in parallel. The database compatibility level must be at least 110.
が紹介されていますのでこれら 2 つの拡張を見ていきたいと思います。
■インラインによるインデックスの作成
SQL Server 2014 では CREATE TABLE で以下の設定ができるようになりました。
<column_definition> ::= column_name <data_type> [ FILESTREAM ] [ COLLATE collation_name ] [ SPARSE ] [ NULL | NOT NULL ] [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] | [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ] ] [ ROWGUIDCOL ] [ <column_constraint> [ …n ] ] [ <column_index> ]
<column_index> ::= INDEX index_name [ CLUSTERED | NONCLUSTERED ] [ WITH ( <index_option> [ ,… n ] ) ] [ ON { partition_scheme_name (column_name ) | filegroup_name | default } ] [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
追加された <column_index> の構文を使用すると CREATE TABLE で以下のようにインデックスが設定できるようになります。
CREATE TABLE dbo.Table_3 |
列の属性としてインデックスをかけるようになった感じでしょうか。
■SELECT INTO の並列実行
テーブルのコピーを作成する場合などは、SELECT INTO 句を使用することがありますが、このステートメントで並列化が行われるようになりました。
以下は SQL Server 2012 の実行プランになります。
Table Scan と Table Insert がシリアルで実行されていることが確認できます。
同様のクエリを SQL Server 2014 CTP1 で実行します。
こちらではクエリが並列化されて実行されているのが確認できますね。
OPTION の MAXDOP を使用して並列度の制御をすることが可能です。
並列化することで処理速度にもかなり影響が出てきますのでこのプランが使えるようになったことはうれしいですね。