最近参加したセッションで、SQL Server 2014 は、
- 2014 年の上半期出荷予定です。
- CTP2 で日本語環境のGUIが提供されます。
- 2012 年には、Oralce → SQL Server に 600 以上の企業が乗り換えたようです。
- 2012 年まで、3年連続顧客満足度一位です。
- 5 年連続脆弱性の少ない DBMS です。
機能拡張としては、主に以下の五点です。
- ワークロードまたいだインメモリ
- リソースガバナーの機能拡張
- PowerBI
- ハイブリッドクラウド
- HDInsight
SQL Server 2014 の紹介はここまでにして、Windows Azure を使用し、SQL Server 2014 CTP1 で機能追加された主機能の一つである、インメモリテーブルの検証をやってみます。セッションで聞いただけなので、いまいちピンと来ていません。サンプルデータは、ここにありますので、ダウンロードをしてアタッチしてください。( SQL Server 2012 と記載がありますが、問題なくアタッチできます。)アタッチが成功すると、下記のように『 AdventureWorksDW2012 』が作成されます。
せっかくなので、一番レコード数が多いものにしましょう。テーブルのディスク使用率統計から、dbo.FactProductInventory テーブルが一番レコード件数が多いようです。
下記のスクリプトを実行することで、検証環境を整備することができます。
USE AdventureWorksDW2012 ALTER DATABASE AdventureWorksDW2012 ADD FILEGROUP InMemoryFG CONTAINS MEMORY_OPTIMIZED_DATA ALTER DATABASE AdventureWorksDW2012 ADD FILE ( NAME = InMemoryTest, FILENAME = 'C:\AdventureWorksDW2012\InMemoryTest' ) TO FILEGROUP InMemoryFG 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) ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY) INSERT INTO [dbo].[FactProductInventoryInMemoryTable] SELECT * FROM [dbo].[FactProductInventory]
下記の SQL を実行して検証を行ってみましょう。
①
USE AdventureWorksDW2012 SELECT * FROM FactProductInventory WHERE ProductKey = 606 AND DateKey = 20081231
② USE AdventureWorksDW2012 SELECT * FROM FactProductInventoryInMemoryTable WHERE ProductKey = 606 AND DateKey = 20081231
まず、①から実行してみましょう。
SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. (1 row(s) affected) Table 'FactProductInventory'. Scan count 0, logical reads 3, physical reads 3, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. (1 row(s) affected) SQL Server Execution Times: CPU time = 0 ms, elapsed time = 6 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
次に、②を実行してみましょう。
SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. (1 row(s) affected) (1 row(s) affected) SQL Server Execution Times: CPU time = 0 ms, elapsed time = 2 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
微妙な差ですが、インメモリテーブルのほうが若干高速です。うーん、思った以上の差は出ないですね。まだ、勉強を始めたばかりなので、まだまだ色々なチューニング方法があるのでしょう。CTP2 がリリースされたら、日本語化されるようです。結合を含んだ SQL などで、再度検証してみようかと思います。(この記事では、インメモリテーブルの作り方を勉強したことにしましょう。)
※①の検証で、『logical reads 3, physical reads 3』 となっていますが、一度検索してデータがバッファキャッシュに乗ってしまうと、『logical reads 0, physical reads 0』となり、①および②のパフォーマンスはまったく変わらなくなってしまいますね。(この程度の件数では、差は出ませんね。)