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

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

SQL Server 2014 CTP1 インメモリテーブルの検証をやってみた

 最近参加したセッションで、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 』が作成されます。

f:id:koogucc11:20130908204358p:plain

  せっかくなので、一番レコード数が多いものにしましょう。テーブルのディスク使用率統計から、dbo.FactProductInventory テーブルが一番レコード件数が多いようです。

f:id:koogucc11:20130908204634j:plain

  下記のスクリプトを実行することで、検証環境を整備することができます。

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』となり、①および②のパフォーマンスはまったく変わらなくなってしまいますね。(この程度の件数では、差は出ませんね。)