sql server 2014 自習書シリーズ no.3

341
SQL Server 2014 自習書シリーズ No.3 SQL Server 2005 ユーザーのための SQL Server 2014 Published: 2008 4 30 SQL Server 2014 更新版: 2014 11 30 有限会社エスキューエル・クオリティ

Upload: doanbao

Post on 28-Jan-2017

398 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SQL Server 2014 自習書シリーズ No.3

SQL Server 2014 自習書シリーズ No.3

SQL Server 2005 ユーザーのための SQL Server 2014

Published: 2008 年 4 月 30 日 SQL Server 2014 更新版: 2014 年 11 月 30 日

有限会社エスキューエル・クオリティ

Page 2: SQL Server 2014 自習書シリーズ No.3

この文章に含まれる情報は、公表の日付の時点での Microsoft Corporation の考え方を表しています。市場の変化に応える必要

があるため、Microsoft は記載されている内容を約束しているわけではありません。この文書の内容は印刷後も正しいとは保障で

きません。この文章は情報の提供のみを目的としています。

Microsoft、SQL Server、Visual Studio、Windows、Windows XP、Windows Server、Windows Vista は Microsoft Corporation

の米国およびその他の国における登録商標です。

その他、記載されている会社名および製品名は、各社の商標または登録商標です。

この文章内での引用(図版やロゴ、文章など)は、日本マイクロソフト株式会社からの許諾を受けています。

© Copyright 2014 Microsoft Corporation. All rights reserved.

Page 3: SQL Server 2014 自習書シリーズ No.3

目次

.................................................................... 5 STEP 1. SQL Server 2005 からの 変更点の概要

1.1 SQL Server 2005 からの変更点の概要 ........................................................................ 6 1.2 SQL Server 2008 から提供された主な新機能 ............................................................... 7 1.3 SQL Server 2008 R2 から提供された主な新機能 .......................................................... 14 1.4 SQL Server 2012 から提供された主な新機能 .............................................................. 18 1.5 SQL Server 2014 から提供された主な新機能 .............................................................. 29 1.6 自習書を試す環境について ........................................................................................ 36 1.7 サンプル データベース(AdventureWorks2014)のダウンロード .................................... 37 1.8 サンプル データベース(NorthwindJ)の作成 .............................................................. 41

............................................................. 43 STEP 2. SQL Server 2008 以降の 必ず役立つ新機能

2.1 バックアップ圧縮(Backup Compression) ................................................................ 44 2.2 データ圧縮(Data Compression) ............................................................................ 48 2.3 SQL Server Audit(SQL Server 監査) ..................................................................... 57 2.4 データ コレクションとパフォーマンス データ コレクション ........................................... 68 2.5 ユーザー定義のデータ コレクションによる定期的なデータ収集 ........................................ 85 2.6 リソース ガバナーによるリソース調整 ........................................................................ 89 2.7 Spatial データ型による地図データのサポート ............................................................ 101 2.8 Reporting Services の大幅強化 .............................................................................. 114 2.9 PowerPivot によるインメモリ BI ............................................................................ 119 2.10 AlwaysOn 可用性グループによる可用性の向上/DR の実現 ....................................... 128 2.11 AlwaysOn フェールオーバー クラスター インスタンス(FCI) .................................. 147 2.12 Windows Server Core へのインストールがサポート ................................................ 148 2.13 包含データベース(CDB:Contained Database) ................................................... 150 2.14 列ストア インデックスによる飛躍的な性能向上 ....................................................... 155

.................................................. 160 STEP 3. SQL Server 2008 以降の Transact-SQL の新機能

3.1 Management Studio の新機能 ............................................................................... 161 3.2 SQL Server 2008 からの Transact-SQL の新機能 ..................................................... 165 3.3 日付データ型(datetime、date、time、datetime2 など) .......................................... 168 3.4 MERGE ステートメント(UPSERT) ........................................................................ 171 3.5 GROUPING SETS ................................................................................................. 174 3.6 テーブル値パラメーターとユーザー定義テーブル型 ...................................................... 177 3.7 HierarchyID データ型 ........................................................................................... 180 3.8 SQL Server 2012 からの Transact-SQL の新機能 ..................................................... 183 3.9 Transact-SQL 分析関数のサポート .......................................................................... 190 3.10 FileStream、FileTable データ型........................................................................... 193 3.11 オブジェクトの依存関係の表示 ............................................................................. 199 3.12 SQL Server Data Tools による開発生産性向上 ........................................................ 202 3.13 Microsoft Azure SQL データベース(SQL Azure)への対応 ...................................... 210

.............................................................. 212 STEP 4. SQL Server 2008 以降の その他の新機能

Page 4: SQL Server 2014 自習書シリーズ No.3

4.1 透過的なデータ暗号化(TDE: Transparent Data Encryption) ...................................... 213 4.2 ポリシー ベースの管理(Policy Based Management) ................................................ 220 4.3 変更データ キャプチャ(CDC:Change Data Capture) ............................................. 229 4.4 データ プロファイル タスクによるデータの分布状況の表示 ........................................... 234 4.5 Deprecated Features オブジェクト ........................................................................ 243 4.6 パーティション ウィザード .................................................................................... 245 4.7 マルチ サーバー クエリ ......................................................................................... 251 4.8 その他の SQL Server 2008 からの新機能 ................................................................. 254 4.9 マルチ サーバー管理(SQL Server ユーティリティ) .................................................. 257 4.10 DAC(データ層アプリケーション) ....................................................................... 274 4.11 Distributed Replay 機能による容易なストレス テストの実施 ..................................... 287 4.12 拡張イベント(XEvents)での GUI サポート ......................................................... 292 4.13 データベース リストア(復元)時の UI 向上 .......................................................... 296 4.14 起動オプションを設定するための新しい UI ............................................................. 297 4.15 DQS(Data Quality Services)によるデータ品質の向上 ............................................ 298 4.16 マスター データ サービス(MDS)によるマスター データ管理 ................................... 310

Page 5: SQL Server 2014 自習書シリーズ No.3

STEP 1. SQL Server 2005 からの 変更点の概要

この STEP では、SQL Server 2008 以降(2008/2008 R2/2012/2014)で提供された新機能の概要を説明します。

この STEP では、次のことを学習します。

SQL Server 2005 からの変更点の概要

SQL Server 2008 からの新機能の概要

SQL Server 2008 R2 からの新機能の概要

SQL Server 2012 からの新機能の概要

SQL Server 2014 からの新機能の概要

サンプル データベース(AdventureWorks、NorthwindJ)の作成

Page 6: SQL Server 2014 自習書シリーズ No.3

1.1 SQL Server 2005 からの変更点の概要

2006 年 2 月に発売された SQL Server 2005 が登場してから約9年、その間に SQL Server は 2008、2008 R2、2012、2014 と 4つバージョン アップしました。したがって、SQL Server 2005 から SQL Server 2014 へ移行/アップグレードを行う場合には、SQL Server 2014 から提供された新機能だけでなく、SQL Server 2008 以降で提供された新機能も大きな移行メリットになります。

SQL Server 2008以降で提供された主な新機能をまとめると、次の表のようになります。1つの表に収めるのが大変なぐらい多くの機能が提供されているので、次ページ以降で詳しく説明します。

主な新機能性能向上 可用性/運用管理 BI/DWH その他

SQL Server 2008(2008年 8月発売)

• データ圧縮• バックアップ圧縮• パーティション環境での

パラレル処理• スタージョインの性能向上• データベース ミラーリング

でのログ転送時の圧縮• Lock Escalationオプション• Sparse カラム• Filtered インデックス• 実行プランの固定• FORCESEEK ヒント• フルテキスト検索の統合

• SQL Server Audit による監査(コンプライアンスの実現が可能)

• 透過的なデータ暗号化• パフォーマンス データコレクションによる性能監視

• リソース ガバナーによるリソース調整

• ポリシー ベースの管理• XEvents(拡張イベント)• データベース ミラーリングで

の破損ページの自動修復

• Reporting Services の大幅強化(多彩なグラフ表現、IIS 非依存)

• データ プロファイル タスク• パーティション ウィザード• Integration Services の性能

向上(パイプライン処理、Lookup 性能の向上)、C# でのスクリプティング

• Analysis Services で集計デザイナー、属性リレーションシップ デザイナーの提供

• Spatial データ型対応(地図データの格納)

• FileStream データ型• 新しい日付データ型

(date/time/datetime2/datetimeoffset)

• MERGE ステートメント• Management Studio に

Visual Studio 2008 シェルを採用(インテリセンス、エラー一覧などへ対応)

• オブジェクトの依存関係表示

SQL Server 2008 R2(2010年 5月発売)

• Unicode 圧縮• StreamInsight(インメモ

リのイベント処理機能)• SQL Server ユーティリティ

によるマルチサーバー管理

• PowerPivot(インメモリのBI 機能)

• MDS (マスター データ サービス) でマスター データ管理

• Reporting Services の地図対応(.shp ファイルやBing マップへの対応)

• DAC(データ層アプリケーション)

• Microsoft Azure SQL データベースへの対応

SQL Server 2012(2012年 4月発売)

• メモリ マネージャーの改良(ラージ オブジェクトへの対応)

• 列ストア インデックス(読み取り専用)

• 15,000 パーティションのサポート

• クラスター(WSFC)環境での tempdb のローカルストレージへの配置

• AlwaysOn 可用性グループによる可用性の向上(データベース ミラーリング機能の進化版)

• クラスター(WSFC)でのSMB やマルチ サブネット構成のサポート

• Windows Server Core への対応

• 包含データベース• Distributed Replay(分散再

生)による負荷テストの実施• 拡張イベントの UI 提供• HASHBYTES 関数での暗号化

アルゴリズムの強化• ユーザー定義サーバー ロール

• Analysis Services のインメモリ化(インメモリ BI のサーバー版)

• 分析関数の提供(LEAD、LAG、CUME_DIST、OVER 句の拡張など)

• Power View によるデータ分析レポートの作成

• Reporting Services のデータ警告

• MDS の Excel アドイン• DQS(Data Quality

Services)の提供• Integration Services での

CDC サポート• Apache Hadoop への対応

(Hadoop Connector 提供)• ODBC driver for Linux 提供

• SQL Server Data Tools による開発生産性の向上

• T-SQL の強化(SEQUENCE、EOMONTH、CONCAT、THROW、IIF、FORMAT、OFFSET..FETCH、CHOOSE などのサポート)

• FileTable による Windows ファイルのサポート(FileStream の進化形)

• フルテキスト検索の強化(プロパティ検索への対応など)

• Management Studio にVisual Studio 2010 シェルを採用(コード スニペット、ズーム、マルチ ウィンドウなどへ対応)

SQL Server 2014(2014年 4月発売)

• インメモリ OLTPOLTP 向けのインメモリ エンジン(Hekaton)

• クラスター化列ストアインデックス(CCSI)インメモリの列指向データベースの SQL Server 実装

• SSD バッファ プール拡張• Delayed Durability(遅

延永続化)• SELECT INTO のパラレル

処理• 基数推定の進化• 統計の増分更新

• AlwaysOn 可用性グループで、クォーラム損失時にも読み取り可能セカンダリへのアクセスが可能

• AlwaysOn 可用性グループで、セカンダリを最大 8台まで作成可能(SQL Server 2012 では 4台が上限)

• クラスター(WSFC)でCSV(クラスター共有ボリューム)をサポート

• リソース ガバナーの強化(I/O 制限など)

• パーティション スイッチやインデックス再構築時のロックの優先度変更

• Power View レポートでのAnalysis Services 多次元モデルへの対応

Excel のアドオン• Power Query for Excel• Power Map for Excel

• Microsoft Azure 上へのバックアップとバックアップ ファイルの暗号化

• AlwaysOn 可用性グループのセカンダリを Microsoft Azure 上へ作成することができるウィザードの提供(クラウド DR の実現)

• Microsoft Azure 上の仮想マシン(VM)へのデータベースの複製

• データベース ファイル(.mdf)を Microsoft Azure 上に配置可能

• Microsoft Azure 上へのバックアップを支援するツールの提供

Page 7: SQL Server 2014 自習書シリーズ No.3

1.2 SQL Server 2008 から提供された主な新機能

SQL Server 2008 からは、非常に多くの新機能が提供されていて、主なものを一覧すると、次のようになります(前ページの表から、SQL Server 2008 の部分を抜き出したものです)。

この中でも特に役立つのが「データ圧縮」と「バックアップ圧縮」機能で、どちらも大きな性能向上を実現できる機能です(弊社でも、ほとんどのお客様が利用されています)。

また、コンプライアンス(法令遵守)関連の機能がたくさん提供されたことも大変役立ちます。SQL Server Audit 機能を利用すれば、SQL Server に対するあらゆる操作の監査/ログ記録を行うことができるようになり、透過的なデータ暗号化機能を利用すれば、物理ファイルを暗号化することもできます。

パフォーマンス データ コレクション機能も大変役立つ機能で、これを利用すれば、SQL Server の動作状況を自動監視することができ、監視した結果をもとにグラフィカルなレポートを生成してくれるので、性能監視を非常に簡単に行えるようになります。

その他にも、Reporting Services の大幅強化や、地図データを格納できる Spatial データ型、リソースの調整が行えるリソース ガバナー、新しい日付データ型、MERGE ステートメントなど、実際に役立つ機能が本当にたくさん提供されています。

これらの SQL Server 2008 からの新機能の特徴を簡単にまとめると、次のようになります。

主な新機能

性能向上

• データ圧縮• バックアップ圧縮• パーティション環境でのパラレル処理• スタージョインの性能向上• データベース ミラーリングでのログ転送時の圧縮• Lock Escalationオプション• Sparse カラム• Filtered インデックス• 実行プランの固定• FORCESEEK ヒント• フルテキスト検索の統合

可用性運用管理

• SQL Server Audit による監査(コンプライアンスの実現が可能)• 透過的なデータ暗号化• パフォーマンス データ コレクションによる性能監視• リソース ガバナーによるリソース調整• ポリシー ベースの管理• XEvents(拡張イベント)• データベース ミラーリングでの破損ページの自動修復

BI/DWH

• Reporting Services の大幅強化(多彩なグラフ表現、IIS 非依存)• データ プロファイル タスク• パーティション ウィザード• Integration Services の性能向上(パイプライン処理、Lookup 性能の向上)、C# でのスクリプティング

• Analysis Services で集計デザイナー、属性リレーションシップ デザイナーの提供

その他

• Spatial データ型対応(地図データの格納)• FileStream データ型• 新しい日付データ型 (date/time/datetime2/datetimeoffset)• MERGE ステートメント• Management Studio にVisual Studio 2008 シェルを採用(インテリセンス、エラー一覧などへ対応)

• オブジェクトの依存関係表示

Page 8: SQL Server 2014 自習書シリーズ No.3

性能向上に関する主な新機能

SQL Server 2008 から提供された性能向上に関する主な新機能の概要は、次のとおりです。

データ圧縮による性能向上/ディスク コストの削減

データを圧縮することで、ディスク Write/Read を減らしてスピード UP を実現できる機能。またディスク コストの削減にも役立つ機能。

弊社のお客様データ(40億件のデータベース)では、データ圧縮を利用して、以下のような成果が得られました(詳しくは Step2 で説明)。

バックアップ圧縮による性能向上/ディスク コストの削減

バックアップ データを圧縮することで、バックアップとリストアのスピード UP を実現できる機能。またディスク コストの削減にも役立つ機能。

弊社のお客様データ(250GBのデータベース)では、バックアップ圧縮を利用して、以下のような成果が得られました(通常バックアップでは、205GB のファイル サイズであるところを、バックアップ圧縮では、わずか 55.2GB に圧縮することができ、実行時間も 45% 性能向上。詳しくは Step2 で説明)。

データ パーティション環境でのパラレル処理への対応

スター ジョインの性能向上(DWH 環境で JOIN の性能向上)

5.4倍性能UP

4.6倍性能UP

データ圧縮の効果

* 詳しくは Step 2 で説明

* 詳しくは Step 2 で説明

相対実行時間が45%性能UP

Page 9: SQL Server 2014 自習書シリーズ No.3

データベース ミラーリングでのログ転送時の圧縮

転送するログ情報を圧縮することで、同期/非同期でのログ転送の性能を向上できる機能

Lock Escalation オプション

ALTER TABLE ステートメントを利用して、テーブル単位でロック エスカレーションを禁止することができる機能(SQL Server 2005 以前のバージョンの場合は、トレース フラグで設定が可能)

Sparse カラム(スパース列)

NULL 値の多いデータ列を効率良く格納し、ストレージ サイズを小さくできる機能

Filtered インデックス

テーブル内の一部の行へインデックスを作成できる機能

実行プランの固定

プラン キャッシュをもとに実行プランの固定が可能に。従来のバージョンでは XML 実行プランをもとに固定が可能

FORCESEEK ヒント

Index Seek を強制することができるクエリ ヒント機能

フルテキスト インデックス機能の統合

FullText Search サービスを Database Engine サービスに統合して、性能向上を実現

可用性/運用管理/コンプライアンスに関する主な新機能

SQL Server 2008 から提供された可用性/運用管理/コンプライアンスに関する主な新機能の概要は、次のとおりです。

SQL Server Audit

SQL Server に対するすべての操作履歴を記録可能に。コンプライアンスの実現や J-SOX 法、PCI DSS、内部統制対策として非常に重要となる、SQL Server に対するすべての操作のログを残せる機能。GUI ベースでグラフィカルに設定が可能

監査(Audit)を作成

SQL Server に対するどの操作に対して

ログを記録するかを設定できる

データベース内のどのオブジェクトのどの操作に対して

ログを記録するかを設定できる

Page 10: SQL Server 2014 自習書シリーズ No.3

透過的なデータ暗号化

アプリケーションを修正することなく、データの暗号化を行える機能

パフォーマンス データ コレクションとデータ コレクション

パフォーマンス状況をグラフィカルに監視することができ、パフォーマンス チューニング時に大変役立つ機能

データ コレクションでは、ユーザー定義の任意のパフォーマンス カウンターや SQL、トレース データを定期収集することが可能

リソース ガバナーによるリソース調整

CPU 利用率やメモリ使用量などのリソースを調整できる機能。CPU を占有してしまうアプリケーションの占有率を下げるなどの利用が可能に

ポリシー ベースの管理

Active Directory のグループ ポリシー機能と同じように、管理者が設定したポリシーを強制適用できる機能。セキュリティ設定の強制や、パフォーマンス関連の設定値を確認する際などに役立つ機能

リソース ガバナーでのリソース調整

アプリA はCPU を 95% 利用

アプリB はCPU を 5% しか利用できないように制限

Page 11: SQL Server 2014 自習書シリーズ No.3

データベース ミラーリングでの破損ページの自動修復機能の提供

XEvents(拡張イベント)による監視機能の提供

SQL Server 2012 からは、次のように GUI で設定/監視が可能に

BI/DWH に関する主な新機能

SQL Server 2008 から提供された BI/DWH に関する主な新機能は、次のとおりです。

データ プロファイル タスク

データの分布状況をグラフィカルに表示することができ、インデックス チューニング時やデータ ウェアハウスの構築時などに大変役立つ機能

パーティション ウィザード

データ パーティションの設定をウィザード形式で容易に設定可能に

Integration Services の強化

パイプライン処理、Lookup 性能の向上、C# でのスクリプティング機能の提供

Analysis Services の強化

集計デザイナー、属性リレーションシップ デザイナーの提供

Reporting Services の大幅強化

レポート ビルダーの大幅強化によって多彩なグラフ表現が可能に。また、IIS に依存し

デッドロックの発生を監視

結果をグラフィカルに確認可能

拡張イベント(XEvents)

Page 12: SQL Server 2014 自習書シリーズ No.3

ないレポート サーバー機能を提供

その他の主な新機能

その他の SQL Server 2008 から提供された主な新機能は、次のとおりです。

Spatial データ型

GIS:地理情報システムにおける地図データを格納できるデータ型で、Bing マップと連携することも可能に

レポート ビルダー ツールを利用してレポートを作成しているときの様子

多彩なグラフ

ゲージ

Page 13: SQL Server 2014 自習書シリーズ No.3

FileStream データ型

Word や Excel などの Office ドキュメントや、任意の OS ファイルをデータベース内へ格納することが可能に

Management Studio に Visual Studio 2008 シェルを採用

インテリセンスによる入力補完機能や、エラー一覧ウィンドウへの対応など

新しい日付データ型(date/time/datetime2/datetimeoffset)の提供

MERGE ステートメント

データが既に存在する場合は UPDATE を実行し、存在しない場合は INSERT を実行できる機能

オブジェクトの依存関係を簡単に表示できる機能

ビューやストアド プロシージャのもととなっているテーブル(依存関係のあるテーブル)を一覧表示することが可能に

これらの SQL Server 2008 からの新機能については、Step 2 以降でステップ バイ ステップ形式で試せるように構成しているので、ぜひ試してみてください。

インテリセンス機能が働き、入力候補が一覧される

依存関係をグラフィカルに確認可能

Page 14: SQL Server 2014 自習書シリーズ No.3

1.3 SQL Server 2008 R2 から提供された主な新機能

SQL Server 2008 R2 から提供された主な新機能は、次のとおりです。

SQL Server 2008 R2 は、SQL Server 2008 からのマイナー バージョンアップという位置付けなので、SQL Server 2008 や 2012 と比べると新機能の数は少ないのですが、イチ早くインメモリに対応した PowerPivot や StreamInsight 機能の提供や、Unicode 圧縮、Reporting Services の地図対応(Bing マップへの対応)など、役立つ機能が多く提供されています。

主な新機能の概要

SQL Server 2008 R2 から提供された主な新機能の概要は、次のとおりです。

Unicode 圧縮

Unicode 圧縮機能では、Unicode データ (nchar や nvarchar データ型のデータ) を圧縮することができます。従来は、英数字データ(ABC、0~9)でも 2 バイトを消費していたものを圧縮することで、ディスク Write/Read を減らすことができるので、性能向上を実現することができます。また、ディスク コストの削減にも役立ちます(ただし、圧縮によって、その分 CPU パワーを利用することになるので、それとのトレード オフになります)。

StreamInsight によるストリーム データの処理(CEP:複合イベント処理)

SQL Server 2008 R2 からは、「StreamInsight」機能が提供されて、CEP (Complex Event Processing:複合イベント処理) を実現することができるようになりました。CEP は、各種のセンサー データや株取引情報、Web サーバーのログ(クリック ストリーム)などのように、絶え間なく大量に流れてくるようなストリーム データを処理することができるアプリケーションのことを指します。StreamInsight を利用すれば、こういった大量のデータをすばやく処理することができます。

SQL Server ユーティリティによるマルチ サーバー管理

SQL Server 2008 R2 からは、「SQL Server ユーティリティ」機能が提供されて、複数のサーバーの状態を容易に監視/管理することができるようになりました。

主な新機能

性能向上 • Unicode 圧縮• StreamInsight(インメモリのイベント処理機能)

可用性運用管理 • SQL Server ユーティリティによるマルチサーバー管理

BI/DWH• PowerPivot(インメモリの BI 機能)• MDS (マスター データ サービス) でマスター データ管理• Reporting Services の地図対応(.shp ファイルや Bing マップへの対応)

その他 • DAC(データ層アプリケーション)• Microsoft Azure SQL データベースへの対応

Page 15: SQL Server 2014 自習書シリーズ No.3

PowerPivot によるセルフ サービス データ分析

SQL Server 2008 R2 からは、PowerPivot(パワー ピボット)機能が提供されて、次のような見栄えの良いデータ分析レポートを簡単に作成できるようになりました。

マスター データ サービス(MDS)によるマスター データ管理

SQL Server 2008 R2 からは、「マスター データ サービス」(MDS)機能が提供されて、マスター データ管理(複数システムに散在するマスター データの一元管理や、マスター データの品質管理など)を実現することができるようになりました(以下の画面は、SQL Server 2012 から提供された Excel 用 MDS アドインを利用して、マスター データの

CPU 利用率やディスク使用状況などが健全かどうかを集中管理できる

ユーティリティエクスプローラー

Page 16: SQL Server 2014 自習書シリーズ No.3

管理を行っているときの様子です)。

Reporting Services の進化

SQL Server 2008 R2 からは、Reporting Services(標準搭載されるレポート サーバー機能)が強化されて、次のようなレポートを簡単に作成できるようになりました(データバーやインジケーター、スパークライン、地図、Bing マップ連携機能など)。

データラインとインジケータ、スパークラインを配置したレポート

Page 17: SQL Server 2014 自習書シリーズ No.3

データ層アプリケーション(DAC)によるデータベース構造の複製

SQL Server 2008 R2 からは、「データ層アプリケーション」(DAC)機能が提供されて、メタ データの移動が簡単に行えるようになりました。開発機から本番機へ、あるいはその逆へ同じ構造のデータベースを作成したい場合に便利で、マイクロソフトの提供するクラウド上の RDB サービスである「Microsoft Azure SQL データベース」(旧名:SQL Azure)上に、同じ構造のデータベースを配置する場合にも役立ちます。

Microsoft Azure SQL データベース(クラウド)への対応の強化

SQL Server 2008 R2 からは、「Microsoft Azure SQL データベース」への対応が強化されて、次のように Management Studio から接続することができるようになりました。

これらの SQL Server 2008 R2 からの新機能については、Step 2 以降でステップ バイ ステップ形式で試せるように構成しているので、ぜひ試してみてください。

Page 18: SQL Server 2014 自習書シリーズ No.3

1.4 SQL Server 2012 から提供された主な新機能

SQL Server 2012 は、メジャー バージョンアップなので、非常に多くの新機能が提供されています。その主なものは、次のとおりです。

この中でも特に役立つのが「列ストア インデックス」と「AlwaysOn 可用性グループ」機能です。列ストア インデックスは、大きな性能向上を実現することができ、AlwaysOn 可用性グループは、従来のデータベース ミラーリング機能を進化させたようなものです。

また、Windows Server Core への対応や、包含データベース、Analysis Services のインメモリ対応、Power View による見栄えの良いレポート作成機能など、実際に役立つ機能が本当にたくさん提供されています。

これらの SQL Server 2012 からの新機能の特徴を簡単にまとめると、次のようになります。

性能向上に関する主な新機能

SQL Server 2012 から提供された性能向上に関する主な新機能の概要は、次のとおりです。

メモリ マネージャーの変更

ラージ オブジェクトの処理を効率化、列ストア インデックスへの対応など

主な新機能

性能向上• メモリ マネージャーの改良 (ラージ オブジェクトへの対応)• 列ストア インデックス (読み取り専用)• 15,000 パーティションのサポート• クラスター(WSFC)環境での tempdb のローカル ストレージへの配置

可用性運用管理

• AlwaysOn 可用性グループによる可用性の向上(データベース ミラーリング機能の進化版)

• クラスター(WSFC)での SMB やマルチ サブネット構成のサポート• Windows Server Core への対応• 包含データベース• Distributed Replay(分散再生)による負荷テストの実施• 拡張イベントの UI 提供• HASHBYTES 関数での暗号化アルゴリズムの強化• ユーザー定義サーバー ロール

BI/DWH

• Analysis Services のインメモリ化(インメモリ BI のサーバー版)• 分析関数の提供(LEAD、LAG、CUME_DIST、OVER 句の拡張など)• Power View によるデータ分析レポートの作成• Reporting Services のデータ警告• MDS の Excel アドイン• DQS(Data Quality Services)の提供• Integration Services での CDC サポート• Apache Hadoop への対応(Hadoop Connector 提供)• ODBC driver for Linux 提供

その他

• SQL Server Data Tools による開発生産性の向上• T-SQL の強化(SEQUENCE、EOMONTH、CONCAT、THROW、IIF、FORMAT、OFFSET..FETCH、CHOOSE などのサポート)

• FileTable による Windows ファイルのサポート(FileStream の進化形)• フルテキスト検索の強化(プロパティ検索への対応など)• Management Studio にVisual Studio 2010 シェルを採用(コード スニペット、ズーム、マルチ ウィンドウなどへ対応)

Page 19: SQL Server 2014 自習書シリーズ No.3

列ストア インデックスによる性能向上

列ストア インデックスは、大量のデータに対する集計処理時に大きな性能向上を期待できる機能で、特に、夜間バッチ処理時(夜間バッチでの日次集計や月次集計処理など)や、DWH(データ ウェアハウス)環境での集計処理時に大変役立つ機能です。弊社のお客様データ(1億 2千万件の DWH)を利用して、列ストア インデックスの性能効果を検証したところ、以下のような結果が得られました。

列ストア インデックスを採用することで、25~102 倍もの性能向上を確認することができました(詳しくは Step 2 で説明します)。

15,000 パーティションのサポート。データ パーティション機能で作成できるパーティション数の上限が 15,000 に

クラスター(WSFC)環境での tempdb のローカル ストレージへの配置のサポート

AlwaysOn 可用性グループによる可用性の向上/DR の実現

SQL Server 2012 から提供された新機能のうち、一番の目玉機能/役立つ機能が「AlwaysOn 可用性グループ」です。

AlwaysOn は、「いつでも利用できる」ことを目指したテクノロジーで、いわゆる「高可用性」(High Availability)および「ビジネス継続性」(Business Continuity)を実現するための機能のブランド名です。SQL Server 2012 よりも前のバージョンでは、WSFC(Windows Server フェールオーバー クラスタリング)や DBM(データベース ミラーリング)、ログ配布、レプリケーション機能などが提供されていました。そして、これらのテクノロジーを利用して、稼働率 99.999%(ファイブ ナイン=年間ダウンタイム約 5.3分以内)を達成/実現している企業もすでに存在しています。

弊社のお客様でも、可用性を向上させるために、「WSFCと DBMの組み合わせ」や「WSFCとロ

102倍

59.7倍46.9倍

25倍

テストに利用したハードウェア環境・Xeon 2.66GHz Quad*2(計8コア)・メモリ 32GB・RAID 10 ストレージ(2GB キャッシュ)

Page 20: SQL Server 2014 自習書シリーズ No.3

グ配布の組み合わせ」で年間ダウンタイム 0(1 年間無障害・無停止)を実現しているお客様がいらっしゃいます。また、求める可用性レベルが低くても良いという場合には「WSFC のみ」や「DBM のみ」で運用されているお客様もいらっしゃいます。ここ数年は、万が一の災害に備えるべく、DR(Disaster Recovery:災害復旧)へのニーズも非常に高まっていて、従来のバージョンでは、「DBM 非同期モード」や「ログ配布」機能を利用することで DR を実現していました。

しかし、これらの機能は、すべて別々のテクノロジーとして提供されていたので、組み合わせて利用するためには設定が面倒であったり、組み合わせならではの設定のコツが必要だったりもしました。また、柔軟な設定が行えない部分や、DR 構成時の復旧手順が複雑(これに伴うダウンタイムの増加)などの課題もありました。コスト面でも、WSFC では共有ストレージ(エントリ クラスでも数百万円~)が必須であったこと、DBM での自動フェールオーバー構成時には監視サーバーを別途用意する必要があるなど、余計なコストがかかっていました。そこで、これらの課題を解決するべく登場したのが、SQL Server 2012 から提供された「AlwaysOn 可用性グループ」です。

AlwaysOn 可用性グループ(Availability Group)は、従来の WSFC(Windows Server フェールオーバー クラスタリング)とデータベース ミラーリング機能の良いところどりをしたような機能で、容易な設定で可用性を向上させることができます。以下の画面は、可用性グループの設定ウィザードを利用して、8台のセカンダリ(複製データを保持するサーバー)を設定しているときの様子です。

自動フェールオーバー(自動的に切り替わるサーバー)の指定や、DR(災害復旧)用途の非同期モードの設定などを簡単に行うことができます。

AlwaysOn 可用性グループでは、内部的にデータベース ミラーリングと同じようなテクノロジー

セカンダリへのアクセスを許可する設定

9台のノードで可用性グループを構成

している例(8台のセカンダリ)

非同期モードに設定したセカンダリ

自動フェールオーバーに設定したセカンダリ

同期モードに設定した

セカンダリ

Page 21: SQL Server 2014 自習書シリーズ No.3

を利用して、データベースの複製(レプリカ)を作成しています(最大 8 つの複製=セカンダリを作成することが可能です)。

クライアントからは、リスナーと呼ばれる仮想サーバー名を介してアクセスするので、どのサーバーが処理しているかは意識する必要はありません。フェールオーバー(プライマリとセカンダリの役割変更)があったとしても、クライアントのアプリケーションを修正する必要はなく、同じサーバー名で透過的にアクセスすることが可能です。

フェールオーバーにかかる時間は、わずか 10~20秒程度であり、WSFC の場合の 30秒~数分かかるのに比べて、ダウンタイムを大幅に短縮することもできます。

AlwaysOn 可用性グループには、次のような利点もあります。

ウィザードによる容易な設定およびダッシュボードによる容易な監視が可能

Page 22: SQL Server 2014 自習書シリーズ No.3

セカンダリを遠隔地へ配置した DR(災害復旧)構成が可能。災害からの復旧時にも、アプリケーションを修正することなく同じサーバー名(リスナー)でアクセス可能なため、ダウンタイム(停止時間)を大きく短縮可能

セカンダリに対して読み取りアクセスが可能(レポーティング ツールのような読み取り中心のアプリケーションが、プライマリへ負荷をかけることなく、読み取り操作が可能)

セカンダリからバックアップを取得可能(プライマリへ負荷をかけることなく、バックアップを取得することが可能)

データ転送時の圧縮と暗号化が可能(データベース複製時の転送データは自動圧縮されるためパフォーマンス良く複製することが可能。暗号化によるセキュリティ強化も可能)

自動ページ修復機能(万一プライマリ上のデータベース ページが破損した場合には、セカンダリ上の正常なページを利用して、自動修復が可能)

柔軟なフェールオーバー ポリシー(フェールオーバーを発生させる障害のレベルを 5 段階で調整可能)

共有ストレージが不要な分、コスト削減が可能(可用性グループでは、それぞれのノードがローカル ディスク内にデータベースの複製を保持するため、共有ストレージが不要。通常、WSFC を構成する場合は、エントリー クラスの共有ストレージで数百万円、ミドル クラスだと一千万前後、その分のコスト削減が可能)。また、DBM のように監視サーバーを別途用意する必要がないため、その分のコスト削減も可能

包含データベース(Contained Database)機能により、ログイン アカウントや照合順序に依存しないデータベースが作成可能になり、障害時のダウンタイム(停止時間)を短縮可能(従来のバージョンでは、障害によるフェールオーバー発生後は、ログイン アカウントとデータベース ユーザーとのマッピングの修復が必要)。

このように、AlwaysOn 可用性グループには多くの利点があり、従来のバージョンの DBM(データベース ミラーリング)機能ではサポートされなかった複数セカンダリ(最大 8 台まで構成可能。DBM では 1 台まで)や、セカンダリに対する読み取り操作/バックアップ操作が可能なアクティブ セカンダリが実装されています(DBM の場合はスナップショット作成時点での過去データの読み取りのみがサポートされるのに対して、可用性グループではリアルタイムでの読み取り操作が可能です)。

また、従来のバージョンだと複数のテクノロジーを組み合わせないと実現できなかった構成(ローカル環境での高可用性と、遠隔地サーバーによる DR 構成を実現するには「WSFC と DBM 非同期モード」あるいは「WSFC とログ配布」などの組み合わせが必要だったもの)を、可用性グループではウィザード 1 つで設定可能になりました。障害からの復旧時にも、アプリケーションを修正する必要がないので(同じサーバー名でアクセスできるため)、ダウンタイム(停止時間)を大きく短縮することが可能です。

Page 23: SQL Server 2014 自習書シリーズ No.3

AlwaysOn フェールオーバー クラスター インスタンス(FCI)の新機能

AlwaysOn フェールオーバー クラスター インスタンス(FCI)は、WSFC(Windows Server フェールオーバー クラスタリング)のリソースとしてインストールした SQL Server インスタンス(SQL Server クラスター)のことを指します。SQL Server 2012 からは、従来のバージョンの SQL Server クラスターと比べて、次の新機能が提供されています。

SMB 接続(共有フォルダー)へのデータベース配置が可能

SQL Server 2012 からは、共有ストレージが必須ではなくなり、データベースのインストール先としてネットワーク上の共有フォルダーを選択可能

tempdb データベースをローカル ディスクへ配置可能

ボトルネックになりやすい tempdb データベースをローカル ディスクへ配置できることで、SSD などより高速な内蔵ストレージへ配置して性能向上を実現可能

複数サイト(複数サブネット)フェールオーバー クラスタリングのサポート

従来のバージョンではサブネットをまたがったクラスタリングは構成不可。SQL Server 2012 からはサブネットをまたがった構成が可能に

柔軟なフェールオーバー ポリシー

フェールオーバーを発生させる障害のレベルを 5 段階で調整可能。障害検知をより詳細に行うことが可能

このように SQL Server 2012 からは、SQL Server クラスターが強化されて柔軟な構成をとれるようになりました。これらは、可用性の向上に繋がるだけでなく、性能向上にも役立つものです。

SQL Server 2014 からは、SQL Server クラスターで CSV(クラスター共有ボリューム)がサポートされるなど、さらにパワーアップしています。

共有フォルダーをデータベースのインストール先として指定可能に

tempdb データベースをローカル ディスクへ配置可能に

Page 24: SQL Server 2014 自習書シリーズ No.3

Windows Server Core による計画停止時間の短縮

SQL Server 2012 からは、Windows Server Core へのインストールがサポートされるようになりました。Server Core は、GUI を持たない、コマンドベースでの操作で管理する Windows Server の構成です。以下の画面は、Server Core 上へ SQL Server 2014 をインストールしているときの様子です(コマンドラインから setup.exe を実行しています)。

Server Core では、GUI が不要であるため、必要最小限の機能のみしかインストールされません。これによって、よりセキュアな運用が可能になり、また、修正プログラムの適用回数を大きく削減できるというメリットが得られます。Server Core の場合は、修正プログラムの数を 50~60%程度削減できると言われており、その分 OS を再起動する回数も減らすことができます(計画停止時間を大きく短縮することが可能です)。

以上のように、SQL Server 2012 からは、可用性を高めるための機能強化が数多く行われています。

BI/DWH 関連の新機能

SQL Server 2012 からは、DWH(データ ウェアハウス)関連の機能強化も多く行われています。前述の「列ストア インデックス」は、DWH 環境で最も威力を発揮する機能ですし、そのほかにもデータ品質を向上させることができる「DQS(Data Quality Services)」や、データ分析で役立つ Transact-SQL 関数、Analysis Services のインメモリ対応機能などが提供されています。それぞれの特徴は、次のとおりです。

DWH/BI 系の Transact-SQL 分析関数(Analytic Functions)のサポート

LEAD や LAG、CUME_DIST 関数などのサポートや、ウィンドウ操作が可能な OVER 句がサポートされてデータ分析が容易に。データ分析でよく利用する計算値(累積値や比率、前年同月値、移動累計、移動平均など)を簡単に計算可能に

Page 25: SQL Server 2014 自習書シリーズ No.3

Analysis Services での テーブル モデル(Tabular Model)のサポート

PowerPivot で採用されているインメモリのカラムベース エンジン(xVelocity エンジン)のサーバー サイドでのサポート。ビッグデータへの対応やセキュリティ強化を実現可能に

Power View による、より容易なデータ分析レポートの作成

Reporting Services でデータ警告(Alerting)機能の提供

DQS(Data Quality Services)機能の提供

「データ クレンジング」や「名寄せ」、「シノニムの定義」が可能に。データ ウェアハウスの構築に欠かせないデータ品質の向上が可能

画像を表示可能

推移を確認可能な動的なバブル チャート

グラフが動的に変化。グラフ自身がスライサー(フィルター)となる

Power View で、データ分析レポートを作成しているときの様子

ここで入力した値へ修正するようにする→ 正しい値へ変換

DQS ツールで、データ品質を高めるためのルール作成が可能

間違った値

正しい値

Page 26: SQL Server 2014 自習書シリーズ No.3

MDS(マスター データ サービス)で Excel アドインの提供

Integration Services のユーザー インターフェース変更(操作性の向上)

Integration Services での CDC(変更データ キャプチャ)サポート

Apache Hadoop への対応(Hadoop Connector による連携など)

ODBC driver for Linux の提供

PowerPivot for Excel のバージョン アップ。ダイアグラム ビューや KPI、書式、並べ替え列、ドリルスルー、階層、親子階層、BLOB データのサポート、DAX 関数の強化など、多数の新機能の提供により、さらにパワフルなデータ分析レポートが作成可能に

その他の新機能

その他の SQL Server 2012 で提供された主な新機能の概要は、次のとおりです。

Distributed Replay(分散再生)機能によるストレス テスト(高負荷テスト)の実施が可能に(複数コンピューターからの再生実行により本番環境を想定したテストが可能)

Page 27: SQL Server 2014 自習書シリーズ No.3

拡張イベント(XEvents:Extended Events)の新しいユーザー インターフェース

リソース ガバナーの強化。CPU アフィニティへの対応など、サーバー集約化や、ホスティング環境など、複数インスタンスを同居させる場合の制御が可能に

セキュリティの強化(HASHBYTES 関数での暗号化アルゴリズムの強化、ユーザー定義サーバー ロールなど)

新しいパフォーマンス カウンターや DMO(動的管理オブジェクト)の追加、

SQL Server の起動オプションを設定するための新しいユーザー インターフェース

SQL Server Data Tools(SSDT)による開発生産性の向上

スキーマ比較やリファクタリング、デバッグなどが可能。クラウド上のデータベース「Microsoft Azure SQL データベース」にも対応

Transact-SQL の強化

n 件目~m 件目を容易に取得できるページングや、連番作成が可能な SEQUENCE、TRY .. CATCH での再スロー、EXEC ステートメントでの Result Set のサポートなど

新しい Transact-SQL 関数のサポート

月末を取得することができる EOMONTH や、文字列から日付データを作成することができる DATEFROMPARTS、文字列連結が可能な CONCAT、条件分岐が可能な IIF、CHOOSE 関数、書式変更が可能な FORMAT 関数、例外を発生させない型変換が可能な TRY_CONVERT 関数の提供など

FileTable による Windows ファイルのサポート(FileStream の進化形)

Management Studio の Visual Studio 2010 シェルを採用。「コード スニペット」

異なる部分は赤や黄色、斜線で表示される

SSDT でスキーマ比較をしているときの様子

Page 28: SQL Server 2014 自習書シリーズ No.3

や「ズーム」、「タスク一覧」、「マルチ ウィンドウ」のサポートなど

フルテキスト検索機能の強化(プロパティ検索への対応など)

Spatial データ型の強化(Circular Arc への対応など)

Microsoft Azure SQL データベース対応の強化(DAC v2、SQL Server Data Tools による完全対応、Management Studio の Azure SQL データベース対応強化など)

その他(Remote BLOB、サービス ブローカーの強化、Semantic Search 機能、UTF-16 への対応、Local DB、StreamInsight の HA 対応など)

このように、SQL Server 2012 からも非常に多くの新機能が提供されています。中でも一番の目玉機能/実際に役立つ機能が、「AlwaysOn 可用性グループ」(Availability Group)と「列ストア インデックス」です。

このように、SQL Server 2005 から SQL Server 2014 へ移行/アップグレードを行うユーザーにとっては、SQL Server 2014 から提供された新機能だけでなく、SQL Server 2008 や 2008 R2、2012 から提供された新機能も大きな移行メリットになるので、非常に多くの移行メリットがあります。特に、SQL Server 2008 と SQL Server 2012、SQL Server 2014 はメジャー バージョンアップなので、本当に多くの機能が提供されています。

これらの SQL Server 2008 や 2008 R2、2012 からの新機能については、Step 2 以降でステップ バイ ステップ形式で試せるように構成しているので、ぜひ試してみてください。

Step2 では、たくさんの新機能のうち、皆さんのシステムに必ず役立つと言っても過言ではない、便利な機能を厳選して説明し、Step3 では Transact-SQL 関連の新機能、Step4 ではその他の役立つ機能を説明しています。いずれも新機能を簡単に試せるように説明しているので、ぜひ、皆さんも実際に試してみてください。

Page 29: SQL Server 2014 自習書シリーズ No.3

1.5 SQL Server 2014 から提供された主な新機能

SQL Server の最新バージョンである SQL Server 2014 から提供された主な新機能は、次のとおりです。

この中でも特に役立つのが「インメモリ OLTP」と「クラスター化列ストア インデックス」機能です。どちらも大きな性能向上を実現することができる機能で、大変役立ちます。また、SSD バッファ プール拡張や、Delayed Durability、SELECT INTO のパラレル処理、基数推定の進化など、性能向上に関する新機能が多いのも非常に大きな特徴です(弊社でも、SQL Server 2014 へ変更しただけで、バッチの性能が向上したお客様がいらっしゃったほどです)。それぞれの機能の特徴は、次のとおりです。

性能向上に関する主な新機能

SQL Server 2014 から提供された性能向上に関する主な新機能は、次のとおりです。

インメモリ OLTP(開発コード名:Hekaton)機能による大幅な性能向上

インメモリ OLTP 機能は、OLTP(オンライン トランザクション処理)向けの新しいデータベース エンジンで、インメモリで動作する(メモリにテーブルを載せられる)ことで、大幅な性能向上を実現することができます。

クラスター化列ストア インデックス(CCSI: Clustered Column-store Index)

SQL Server 2012 では、読み取り専用の列ストア インデックス(非クラスター化列ス

主な新機能

性能向上

• インメモリ OLTPOLTP 向けのインメモリ エンジン(Hekaton)

• クラスター化列ストア インデックス(CCSI)インメモリの列指向データベースの SQL Server 実装

• SSD バッファ プール拡張• Delayed Durability(遅延永続化)• SELECT INTO のパラレル処理• 基数推定の進化• 統計の増分更新

可用性運用管理

• AlwaysOn 可用性グループで、クォーラム損失時にも読み取り可能セカンダリへのアクセスが可能

• AlwaysOn 可用性グループで、セカンダリを最大 8台まで作成可能(SQL Server 2012 では 4台が上限)

• クラスター(WSFC)でCSV(クラスター共有ボリューム)をサポート

• リソース ガバナーの強化(I/O 制限など)• パーティション スイッチやインデックス再構築時のロックの優先度変更

BI/DWH• Power View レポートでの Analysis Services 多次元モデルへの対応以下は Excel のアドオンとしての新機能• Power Query for Excel• Power Map for Excel

その他

• Microsoft Azure 上へのバックアップとバックアップ ファイルの暗号化• AlwaysOn 可用性グループのセカンダリを Microsoft Azure 上へ作成することができるウィザードの提供(クラウド DR の実現)

• Microsoft Azure 上の仮想マシン(VM)へのデータベースの複製• データベース ファイル(.mdf)を Microsoft Azure 上に配置可能• Microsoft Azure 上へのバックアップを支援するツールの提供

Page 30: SQL Server 2014 自習書シリーズ No.3

トア インデックス)がサポートされていましたが、SQL Server 2014 からは、更新可能な列ストア インデックスとして「クラスター化列ストア インデックス」(CCSI)がサポートされるようになりました。更新可能な列ストア インデックスを利用すると、次のような性能向上を実現できます。

バッファ プール拡張により、SSD をバッファ プールとして利用可能に

バッファ プール拡張を利用すると、次のような性能向上を実現できます。

Delayed Durability(遅延永続化)により、ログへの非同期書き込みが可能に

トランザクション ログへの遅延書き込みが行える Delayed Durability(遅延永続化)機能が提供されたことによって、ログ書き込みの性能を大幅に向上させることができます(更新系の処理のパフォーマンスを向上させることができます)。

SELECT INTO でのパラレル処理が可能に

以下は、SELECT INTO を実行したときの実行プランです(パラレル Table Insert)。

39.5倍

26.5倍 テストに利用したハードウェア環境・Core i7 3770K 3.5GHz・メモリ 32GB・SSD PLEXTOR M3P 256GB

性能結果は相対値ベンチマーク結果の公開は、使用許諾契約書で禁じられているので、グラフ内の結果は、クラスター化列ストア インデックスの値を100 とした場合の相対値で表しています。

46.7% 向上約2倍の性能向上

テストに利用したハードウェア環境・Core i7 3770K 3.5GHz・メモリ 32GB・HDD:WD30EZRX 3TB・SSD :PLEXTOR M3P 256GB性能結果は相対値ベンチマーク結果の公開は、使用許諾契約書で禁じられているので、グラフ内の結果は、相対値で表しています。

パラレルTable Insert

Page 31: SQL Server 2014 自習書シリーズ No.3

弊社のお客様では、SELECT INTO のパラレル処理によって、次のような性能向上を確認することができました。

クエリ処理エンジンの進化(基数推定の進化や統計の増分更新など)

リソース ガバナーの強化(I/O 数の制限が可能に)

パーティション スイッチやインデックス再構築時のロックの優先度変更

以上のように、SQL Server 2014 には、OLTP 向けのインメモリ機能である「インメモリ OLTP」や、DWH/BI 向けのインメモリ機能である「クラスター化列ストア インデックス」(カラム指向データベースの SQL Server 実装)、SSD をバッファ プールの一部として利用可能な「バッファ プール拡張」、トランザクション ログへの遅延書き込みが行える「Delayed Durability」、「クエリ処理エンジンの進化(新しい基数推定のアルゴリズムや SELECT INTO のパラレル処理、統計の増分更新)など、性能向上を実現できる機能が数多く搭載されています。

詳しくは後述しますが、クラスター化列ストア インデックスの早期導入を行った株式会社 gloops では、約 240倍の性能向上を実現しています。同社は、数多くのソーシャル ゲームを提供していることで有名ですが、人気ゲーム「スカイロック」でのユーザー行動分析用 DWH 作成や、ユーザー ランキングの生成に SQL Server 2014 を採用し、従来 12分かかっていたバッチ処理を、わずか 3 秒に短縮、テーブル容量は 55GB から、わずか 2.8GB へと、1/20 にも圧縮することができています。

また、インメモリ OLTP の早期導入を行った bwin 社では約 16.7倍の性能向上(最新の検証では約 30倍の性能向上)、FX 取引で有名な SBIリクイディティ・マーケット株式会社では約 2.5倍の性能向上(各種のパフォーマンス チューニングによって、元々のシステムと比べると約 30倍の性能向上)、Edgenet 社では約 8~11倍の性能向上を実現しています。

このように、SQL Server 2014 は、大きな性能向上を期待することができます。

最大で 36.6% 向上する処理も有り

平均で18.3% 向上

Page 32: SQL Server 2014 自習書シリーズ No.3

クラウド連携に関する新機能(Microsoft Azure)

SQL Server 2014 は、クラウド連携に関する新機能も充実しています。その主なものは、次のとおりです。

Microsoft Azure 上へのバックアップが可能に(BACKUP TO URL)。 バックアップ ファイルの暗号化も可能

AlwaysOn 可用性グループのセカンダリを Microsoft Azure 上へ作成することができ

るウィザードの提供

Microsoft Azure 上の仮想マシン(VM)へのデータベースの配置(Deploy)

データベース ファイル(.mdf)を Microsoft Azure 上に配置可能に

Microsoft Azure 上へのバックアップを支援するツールの提供

Microsoft Azure 上の BLOB ストレージのコンテナーを指定

して、バックアップが可能バックアップ ファイルの暗号化も可能

Azure VM(仮想マシン)

の設定

AlwaysOn 可用性グループの設定ウィザード

セカンダリ(レプリカ)としてMicrosoft Azure 上の仮想マシンを追加できる=クラウド DR の実現

Page 33: SQL Server 2014 自習書シリーズ No.3

その他の新機能の概要

その他の SQL Server 2014 からの新機能の概要は、次のとおりです。

SQL Server AlwaysOn のパワーアップ

- クォーラム損失時にも読み取り可能セカンダリへのアクセスが可能

- FCI(フェールオーバー クラスター インスタンス)で CSV(クラスター共有 ボリューム)がサポート

- セカンダリを最大 8台まで作成可能に(SQL Server 2012 では 4 台が上限)

最大 8台のセカンダリを作成可能

Page 34: SQL Server 2014 自習書シリーズ No.3

Power View(パワー ビュー)機能の強化

Power View のレポートを Analysis Services の多次元モデル(OLAP キューブ)から作成が可能に(SQL Server 2012 SP1 CU4 から利用可能)

Power Query for Excel によるさまざまなデータソースの検索/抽出/加工が可能に

Analysis Services の多次元モデル(キューブ)

Analysis Services の多次元モデル(キューブ)からPower View のレポートを作成

Page 35: SQL Server 2014 自習書シリーズ No.3

Web ページ内の <Table> タグや、ファイル(Excel や CSV、XML、Text ファイルなど、フォルダー内の複数ファイルをまとめて取り込むことも可能)、SQL Server や Microsoft Azure SQL データベース、Access、Oracle、DB2、MySQL などの各種データベース、Hadoop HDFS や Microsoft Azure HDInsight(Microsoft Azure の Hadoop 実装)、SAP BusinessObjects BI、SharePoint List、Exchange、OData Feed、Facebook などからデータを取得することができます。

Power Map for Excel による地図データの可視化

Power Query for Excel で取得したデータは、次のように Power Map for Excel を利用すれば、地図データを可視化することもできます。

これらの SQL Server 2014 からの新機能については、本自習書シリーズの「SQL Server 2014 からの新機能ダイジェスト」編で、ステップ バイ ステップ形式で画面ショット満載で紹介しているので、こちらもぜひご覧いただければと思います。

Page 36: SQL Server 2014 自習書シリーズ No.3

1.6 自習書を試す環境について

この自習書で実習を行うために必要な環境は、次のとおりです。

OS

Windows Server 2008 SP2 以降 または Windows Server 2008 R2 SP1 以降 または Windows Server 2012 または Windows Server 2012 R2 または Windows 7 SP1 以降 または Windows 8 または Windows 8.1

ソフトウェア

SQL Server 2014

この自習書内でのページやテキストは、OS に Windows Server 2012 R2(x64)、ソフトウェアに SQL Server 2014 Enterprise エディション(x64)を利用して記述しています。

そのほか

この自習書を試すには、サンプル スクリプトをダウンロードして、次のページの事前作業(データベースの作成)を行っておく必要があります。

Page 37: SQL Server 2014 自習書シリーズ No.3

1.7 サンプル データベース(AdventureWorks2014)のダウンロード

この自習書内では、いくつかの機能を試す手順で、CodePlex サイトで提供されている AdventureWorks2014 データベースを利用しているので、以下の URL からダウンロードしておいてください。

CodePlex サイト http://www.codeplex.com/MSFTDBProdSamples

1

Adventure Works 2014 Sample Databases をクリック

2

3

Adventure Works 2014 Full Database Backup.zip をクリック

Page 38: SQL Server 2014 自習書シリーズ No.3

AdventureWorks2014 データベースのリストア

.zip ファイルのダウンロードが完了したら、次に、このデータベースを SQL Server 上へリストアします。リストアする手順は、次のとおりです。

1. まずは、Windows エクスプローラーで、ダウンロードしたファイル(Adventure Works 2014 Full Database Backup.zip)を右クリックして、[すべて展開]をクリックし、ファイルを解凍します。

解凍が完了すると、データベースのバックアップ ファイル(AdventureWorks2014.bak)が作成されます。

2. 次に、バックアップ ファイルをリストアするために、SQL Server 2014 の Management Studio ツールを起動します([スタート]画面の[Microsoft SQL Server 2014]グループから[SQL Server 2014 Management Studio]をクリックします。Windows Server 2008/2008 R2 を利用している場合は、[スタート]メニューから起動します)。

1

2

1

Page 39: SQL Server 2014 自習書シリーズ No.3

3. [サーバーへの接続]ダイアログが表示されたら、[サーバー名]に SQL Server の名前を入力して、[接続]ボタンをクリックします。

4. 接続完了後、次のように Management Studio でツールバーの[ファイルを開く]ボタンをクリックします。

[ファイルを開く]ダイアログが表示されたら、サンプル スクリプトを解凍したフォルダーを展開して、「AW2014Restore.sql」ファイルを選択し、[開く]ボタンをクリックします。

5. 次のようにデータベースを復元するためのスクリプトが表示されるので、ツールバーの[実行]ボタンをクリックして、スクリプトを実行します(FROM DISK= で指定する .bak ファイルへのパスは、手順1 で zip ファイルを解凍したフォルダーを指定するように変更してください。また、MOVE .. TO の TO で指定する .mdf/.ldf ファイルの作成先となるパスは、SampleScript という名前のフォルダーを指定していますが、任意の場所へ変更してください)。

RESTORE DATABASE AdventureWorks2014

FROM DISK = 'C:\Adventure Works 2014 Full Database Backup\AdventureWorks2014.bak'

WITH MOVE 'AdventureWorks2014_data' TO 'C:\SampleScript\AdventureWorks2014.mdf',

MOVE 'AdventureWorks2014_Log' TO 'C:\SampleScript\AdventureWorks2014.ldf'

SQL Server の名前を入力1

2

サンプル スクリプトを解凍した場所を展開して

AW2014Restore.sql を選択

2

3

1

Page 40: SQL Server 2014 自習書シリーズ No.3

6. 実行後、次のように「クエリが正常に実行されました」と表示されれば、データベースのリストアが完了です。

リストアが完了すると、次のように[データベース]フォルダーに AdventureWorks2014 データベースが追加されて、利用できるようになります。

3

手順1 で zipファイルを解凍したフォルダー

を指定する

1

.mdf/.ldf ファイルの作成先は任意の場所へ

変更できます

2

「クエリが正常に実行されました」と表示されることを確認

1

1

AdventureWorks2014データベース内のテーブル

Page 41: SQL Server 2014 自習書シリーズ No.3

1.8 サンプル データベース(NorthwindJ)の作成

この自習書では、サンプル スクリプトに含まれる「NorthwindJ」データベースを利用しているので、STEP2 以降を始める前に、このデータベースを SQL Server 2014 上へ作成しておいてください。作成の手順は、次のとおりです。

1. まずは、次のように Management Studio でツールバーの[ファイルを開く]ボタンをクリックします。

[ファイルを開く]ダイアログが表示されたら、サンプル スクリプトを解凍したフォルダーを展開して、「NorthwindJ.sql」ファイルを選択し、[開く]ボタンをクリックします。

2. 次のようにデータベースを作成するためのスクリプトが表示されるので、ツールバーの[実行]ボタンをクリックして、スクリプトを実行します。

3. 数秒後に実行が完了して、次のように「クエリが正常に実行されました」と表示されることを

サンプル スクリプトを解凍した場所を展開してNorthwindJ.sql を選択

2

3

1

2

データベースを作成するためのスクリプト

が表示される

1

Page 42: SQL Server 2014 自習書シリーズ No.3

確認します。

以上でデータベースの作成が完了です。

なお、この NorthwindJ データベースは、Microsoft Access 2003 に付属のサンプル データベース「Northwind」を SQL Server 上へアップサイズしたものを利用していますが、この自習書の手順を試すために、一部のデータを加工しています。

「クエリが正常に実行されました」と表示されることを確認

1

Page 43: SQL Server 2014 自習書シリーズ No.3

STEP 2. SQL Server 2008 以降の 必ず役立つ新機能

この STEP では、SQL Server 2008 以降で提供された新機能のうち、皆さんのシステムに必ず役立つと言っても過言ではない、便利な機能を厳選して紹介します。どれも、弊社のお客様に好評の機能ばかりなので、ぜひ試してみてください。

バックアップ圧縮

データ圧縮

SQL Server Audit(SQL Server 監査)

データ コレクションとパフォーマンス データ コレクション

リソース ガバナーによるリソースの調整

Spatial データ型

Reporting Services の大幅強化

PowerPivot 機能(PowerPivot for Excel、PowerPivot for SharePoint)

AlwaysOn 可用性グループによる可用性の向上

AlwaysOn フェールオーバー クラスターの新機能

Windows Server Core へのインストール

包含データベース(Contained Database)によるログインや照合順序 に依存しないデータベースの作成

列ストア インデックスによる飛躍的な性能向上

Page 44: SQL Server 2014 自習書シリーズ No.3

2.1 バックアップ圧縮(Backup Compression)

バックアップ圧縮は、その名のとおり、バックアップ データを圧縮できる機能で、SQL Server 2008 から提供されました。バックアップ データを圧縮することによって、バックアップおよびリストア時のデバイス(ハード ディスクやテープ装置などのバックアップ先デバイス)への書き込み/読み取り量(I/O)を減らすことができるので、パフォーマンスを向上させることができます。

バックアップ圧縮は、次のように実行することができます。

BACKUP DATABASE データベース名

TO DISK = 'バックアップ先のパス'

WITH COMPRESSION

通常の BACKUP ステートメントに WITH COMPRESSION を付けるだけで、バックアップ圧縮を行うことができます。

Let's Try

それでは、これを試してみましょう。サンプル データベースの AdventureWorks2014 に対して、次のようにバックアップ圧縮を実行してみましょう(バックアップ先のフォルダーには「C:\test」を指定していますが、任意の場所を指定できます)。

BACKUP DATABASE AdventureWorks2014

TO DISK = 'C:\test\AdventureWorksComp.bak'

WITH COMPRESSION

Note: バックアップ先のフォルダーの NTFS アクセス許可に注意

バックアップ先のフォルダーへは、SQL Server のサービス アカウントに対して NTFS の書き込み権限が必要になります(権限がない場合は、エラーが発生します)。サービス アカウントは、SQL Server のインストール時に設定したアカウントで、SQL Server 構成マネージャー ツールから確認/変更することができます。

このように、通常の BACKUP ステートメントに WITH COMPRESSION を付けるだけで、バックアップ データを圧縮することができます。圧縮後のファイル サイズと、圧縮なしのものを比較すると次のようになります(弊社環境)。

Page 45: SQL Server 2014 自習書シリーズ No.3

ファイル サイズは、4 分の 1 以下になり、実行時間は約 34.6%性能向上することを確認することができました。このように、バックアップ圧縮機能を利用すると、バックアップのパフォーマンスを向上させることができます。

弊社事例

次のグラフは、筆者のお客様のデータ(250GB のデータベース)を通常バックアップした場合と、バックアップ圧縮を利用した場合とで比較したものです。

ファイル サイズは、通常バックアップが 205GB であるところを、バックアップ圧縮によって 50.5 GB へと 4 分の 1 にすることができました(データベース サイズが 250GB であるところを、通常バックアップが 205GB になっているのは、データベース内の使用領域が 205GB であったためです)。また、実行時間は、約 45%性能向上することを確認することができました。

バックアップ中の CPU 利用率は、通常バックアップでは 2~3%ぐらいを推移しているのに対し(CPU への負荷がほとんどない状態)、バックアップ圧縮では、25%前後を推移していることを確認できました。圧縮による CPU のオーバーヘッドはあるものの、それほど大きな負荷にはなっていない(80%以上を越えるような CPU 負荷にはなっていない)ことも確認することができました。

このように、バックアップ圧縮を利用すると、バックアップ時間の短縮ができるだけでなく、ファイル サイズを小さくすることもできるので、大変便利です。弊社のお客様でも、ほとんどのお客様が利用しているほど、大変便利な機能です。バックアップ圧縮は、SQL Server 2008 のときは Enterprise エディションでのみ利用できる機能でしたが、SQL Server 2008 R2 以降では Standard エディションでも利用できるようになっています。

メンテナンス プラン ウィザードを利用する場合

メンテナンス プラン ウィザードを利用してバックアップを行っている場合は、次のように[オプ

ファイル サイズ 実行時間(相対)圧縮なし 190 MB 100圧縮有り 44.5 MB 65.4 圧縮なしの実行時間を 100 とした場合の相対値

相対実行時間が45%性能UP

CPU 利用率圧縮有りは 25% 前後

を推移

圧縮なしは 2~3% 程度

* ベンチマークの結果の公表は、使用許諾契約書で禁止されているので、実行時間は、通常バックアップを 100 とした場合の相対値で表示

Page 46: SQL Server 2014 自習書シリーズ No.3

ション]タブの[バックアップの圧縮の設定]で「バックアップを圧縮する」を選択することで、バックアップ圧縮を利用することができます。

なお、デフォルトは、「既定のサーバー設定を使用する」となっていますが、サーバー設定は、次のように Management Studio でサーバーのプロパティを開いて、[データベースの設定]ページから確認/変更することができます。

「バックアップを圧縮する」をチェックすると、圧縮バックアップを

デフォルトに設定できる

3

「データベースの設定」ページ

2

サーバーを右クリックして「プロパティ」をクリック

1

Page 47: SQL Server 2014 自習書シリーズ No.3

バックアップ圧縮ファイルからのリストア

バックアップ圧縮したファイルからのリストアは、通常のリストアとまったく同じように実行できます。

RESTORE DATABASE AdventureWorks2014

FROM DISK = 'C:\test\AdventureWorksComp.bak'

Note: リストアのパフォーマンスも向上

バックアップ圧縮したファイルからのリストアは、通常のバックアップからリストアするよりもパフォーマンスが向上します(リストア時間を短縮することができます)。これは、デバイスからの読み取り量(Read I/O)が削減されるためです。

Page 48: SQL Server 2014 自習書シリーズ No.3

2.2 データ圧縮(Data Compression)

データ圧縮は、テーブル内のデータそのものを圧縮できる機能で、SQL Server 2008 から提供されました。データを圧縮することによって、ディスクへの書き込み/読み取り量(I/O 数)を減らすことができるので、パフォーマンスの向上と、ディスク コストの削減を実現することができます。弊社でも、実際に多くのお客様が利用していて、データ圧縮による性能向上およびデータベース サイズの大幅縮小を体感しています。

データ圧縮は、特に、ストレージの性能が良くない環境で、テーブル スキャンや範囲スキャンなど、大量のデータをまとめて読み取るような場合に大きな効果を得られます。データ ウェアハウス環境など、データ サイズが巨大になる場合にも、データベース サイズを大幅に小さくすることができるので、大変役立つ機能です。

Let's Try

それでは、これを試してみましょう。

1. まずは、次のように「DataCompTestDB」という名前のデータベースを作成し、このデータベース内へ AdventureWorks2014 サンプル データベースの SalesOrderDetail テーブルを丸ごとコピーした「Sales」テーブルを作成します。

-- データベースの作成

CREATE DATABASE DataCompTestDB

go

-- SalesOrderDetail テーブルをもとに sales テーブルを作成

USE DataCompTestDB

SELECT * INTO sales FROM AdventureWorks2014.Sales.SalesOrderDetail

2. 次に、SET STATISTICS IO コマンドを利用して、データ圧縮を行う前のテーブル スキャ

ン時の読み取り I/O 数(ページ数)を確認します。

-- 圧縮前のテーブルスキャンの I/O 数を取得

SET STATISTICS IO ON

SET STATISTICS TIME ON

SELECT * FROM sales

論理読み取り数が1,497

21

実行時間は、データ量やハードウェア環境、クエリの種類によって大きくことなるので、実際のデータおよび実際のクエリ

でどれだけの効果があるのかを検証することが重要です。

Page 49: SQL Server 2014 自習書シリーズ No.3

行圧縮(Row Compression)

次に、データ圧縮を行ってみましょう。データ圧縮には、行単位での圧縮が行える「行圧縮」(Row Compression)と、ページ単位で圧縮が行える「ページ圧縮」(Page Compression)の 2 種類があります。

まずは、行圧縮を試してみましょう。

1. 行圧縮を行うには、次のように Management Studio で圧縮対象としたいオブジェクトを右クリックして、[ストレージ]の[圧縮の管理]をクリックします。

これにより、「データ圧縮ウィザード」が起動するので、[次へ]ボタンをクリックします。

2. 次の「圧縮の種類の選択」ページでは、[圧縮の種類]で「Row」を選択し、[計算]ボタンをクリックします。

これにより、行圧縮を行った場合の予想される圧縮サイズを確認することができます。確認後、[次へ]ボタンをクリックして、次のページへ進みます。

sales テーブルを右クリック

1

2

3

4

「圧縮の種類」で「Row」を選択

1

「計算」ボタンをクリック

2

計算結果(圧縮後の予想サイズ)が表示される

3

4

Page 50: SQL Server 2014 自習書シリーズ No.3

3. 次の「出力オプションの選択」ページでは、「スクリプトの作成」が選択されていることを確認して、[次へ]ボタンをクリックします。

これにより、行圧縮を行うためのスクリプトを生成することができます。

4. 最後の「データ圧縮ウィザードの概要」ページでは、「完了」ボタンをクリックすると、スクリプトの生成が開始されます。

進行状況ページで、状態が「成功」と表示されれば、スクリプトの生成が完了です。最後に、[閉じる]ボタンをクリックして、ウィザードを終了します。

5. 以上で、行圧縮を行うためのスクリプト(ALTER TABLE .. REBUILD ステートメント)がクエリ エディターへ自動生成されるようになります。

1

2

1

2

Page 51: SQL Server 2014 自習書シリーズ No.3

このステートメントは、データ パーティションを構成している場合は、パーティションごとに圧縮/非圧縮を設定することができるので、「PARTITION=」というキーワードでパーティション番号を指定できるようになっています(ALL の場合は、すべてのパーティションという意味です)。また、WITH 句の「DATA_COMPRESSION=ROW」が行圧縮を指定している部分です。

ステートメントを確認後、ツール バーの「実行」ボタンをクリックして、ステートメントを実行します(実際の行圧縮を実行します)。

6. 行圧縮が完了したら、前の手順で実行したのと同じクエリを実行して、読み取りページ数に注目します。

このように、行圧縮を行うことで、読み取りページ数を減らすことができます。圧縮前との結果を比較すると、次のようになります。

圧縮率は、約 37%(約 2/3 のサイズ)となっていることを確認できます。CPU 時間や実行時間は、今回は対象データ件数が少ないので、参考値として見ておいてください(CPU 時間や実行時間は、データ件数やハードウェア環境、クエリの種類によって、大きく異なるので、実際のデータで、実際のクエリを検証することが重要になります)。

行圧縮を行うためのスクリプトが自動生

成されている

1

「実行」をクリック2

論理読み取り数が942

21

論理読み取り数 圧縮率圧縮なし 1497 ページ(11.7 MB)行圧縮後 942 ページ(7.36 MB) 37.1%

Page 52: SQL Server 2014 自習書シリーズ No.3

行圧縮の内部動作

行圧縮は、SQL Server 2005 の SP2(Service Pack 2)以降で提供された vardecimal データ型と同じような動作(利用していない領域を削る動作)をすることで、圧縮を行っています。具体的には、次のように、固定長データ型の利用していない領域を削る(可変長データ型のように扱う)ことで、サイズを小さくすることができます。

int データ型は、4バイトの固定長データ型ですが、「99」のように 0~255 の間の整数を格納する場合には、1 バイトの使用領域で済むので、残りの 3 バイトを圧縮することができます。また、「8888」のように -32,768~32,767 の間の整数である場合は、2 バイトの使用領域で済むので、残りの 2 バイトを圧縮することができます。

固定長文字列の char/nchar データ型の場合は、末尾の余分な空白を圧縮することができます。

ページ圧縮(Page Compression)

ページ圧縮は、行圧縮よりもさらに圧縮ができる(サイズを小さくすることができる)機能です。ページ圧縮では、行圧縮を行った後に、さらにページ単位での圧縮を行うことで、サイズを小さくすることができます。具体的には、次のようにページ内での重複部分を圧縮(プレフィックスを圧縮)しています。

ただし、ページ圧縮では、より高度な圧縮をかけるので、CPU のオーバーヘッドが行圧縮よりも上がってしまうというデメリットがあります。

int データ型 char(10) データ型

col1

99

88 88

77 77 77

col2

A A A

B B B B

C C C C C C C C

行圧縮で圧縮可能な領域

char 型の場合は、末尾の余分な空白を圧縮可能int 型の場合は、使用していない領域を圧縮可能

99 なら 1バイトしか使用しないので、3バイト分圧縮可能

行圧縮の例

行圧縮は、固定長データ型を可変長のように扱うことで圧縮可能!

8888 なら 2バイトしか使用しないので、2バイト分圧縮可能

末尾の余分な空白を圧縮可能

ページ圧縮の例

ページ圧縮は、ページ内のプレフィックスの重複部分を圧縮!

ページ圧縮では、Prefiix(接頭辞)が同じものは圧縮可能

Page 53: SQL Server 2014 自習書シリーズ No.3

それでは、ページ圧縮を試してみましょう。

1. ま ず は 、 行 圧 縮 の と き の 手 順 5 で 生 成 し た ALTER TABLE ス テ ー ト メ ン ト の DATA_COMP RESSION のところを ROW から PAGE へ変更して、ステートメントを実行します。

USE DataCompTestDB

ALTER TABLE [dbo].[sales] REBUILD PARTITION = ALL

WITH

( DATA_COMPRESSION = PAGE )

2. ページ圧縮が完了したら、前の手順で実行したのと同じクエリを実行して、読み取りページ数に注目します。

圧縮前および行圧縮時との結果を比較すると、次のようになります。

圧縮率は、約 56.2%(半分以下のサイズ)となっていることを確認できます。

このように、ページ圧縮を行うと、行圧縮よりもさらに圧縮サイズを小さくすることができます(読み取り/書き込みページ数を減らすことができます)。ただし、ページ圧縮は、行圧縮よりも CPU のオーバーヘッドが高くなるので、これとのトレードオフになります。

ページ圧縮へ変更するために「PAGE」へ変更

1

「実行」をクリック2

論理読み取り数が656

(圧縮前は 1,495)

2

1

論理読み取り数 圧縮率圧縮なし 1,497 ページ(11.7 MB)行圧縮後 942 ページ(7.36 MB) 37.1%ページ圧縮後 656 ページ(5.13 MB) 56.2%

ROW から PAGE へ変更

Page 54: SQL Server 2014 自習書シリーズ No.3

事例(40億件のデータで半分に圧縮、4倍以上の性能向上)

次のグラフは、筆者のお客様のデータベース(約 40億件のデータ)で、データ圧縮(行圧縮、ページ圧縮)を行った場合の結果です。

通常テーブル(圧縮なし)が 203.5GB であるところを、行圧縮では 170.3GB(約 16.3%)、ページ圧縮では 98.7GB(約 51.5%、半分以下のサイズ)に圧縮することができています。このお客様のデータは、普段から tinyint や snallint などの小さいデータ型を活用されているので、行圧縮ではあまり圧縮ができていませんが、int や bigint などの大きいデータ型を利用している環境では、行圧縮でも 30%ぐらいの圧縮をすることができます。

また、このときのクエリの実行時間(実際にお客様が利用しているクエリ 2 種類の実行時間)は、次のようになりました。

クエリ1 では、行圧縮で 5.4 倍の性能向上、ページ圧縮では 4.6 倍の性能向上を実現することができたものの、クエリ2 では、行圧縮で 13.4%の性能ダウン、ページ圧縮では 32.3%の性能ダウンとなりました(データ圧縮では、速くなるクエリと遅くなるクエリがあるので、実際のクエリで検証を行うことが重要になります)。このお客様では、クエリ1 のほうが重要なクエリ(利用頻度が高いクエリ)で、かつファイル サイズを小さくする必要があったので、ページ圧縮を採用

16.3%圧縮

51.5%圧縮

5.4倍性能UP

4.6倍性能UP

2倍以上のCPUパワーを利用

3倍近いCPUパワーを利用

13.4%遅い

32.3%遅い

70% 余分にCPU を利用

* ベンチマークの結果の公表は、使用許諾契約書で禁止されているので、通常(圧縮なし)を 100 とした場合の相対値で表示しています。

Page 55: SQL Server 2014 自習書シリーズ No.3

しています。このように、使いどころをうまく選択すれば、データ圧縮は大きな効果を得られることができるので、ぜひ活用してみてください。

列ストア インデックスによるデータ圧縮/驚異的な性能向上

SQL Server 2012 からは、列ストア インデックスがサポートされるようになって、行圧縮やページ圧縮よりも、さらにデータ サイズを小さくすることができるようになっています(詳しくは後述します)。このインデックスは、集計のパフォーマンスが優れているので、GROUP BY 演算などを伴う処理で、大きな性能向上を実現することができます。

列ストア インデックスは、SQL Server 2012 では「読み取り専用」でのみの提供でしたが、SQL Server 2014 からは「更新可能な列ストア インデックス」が提供されるようになりました。前者は「非クラスター化列ストア インデックス」、後者は「クラスター化列ストア インデックス」(CCSI:Clustered Column-Store Index)と呼ばれています。

クラスター化列ストア インデックス(CCSI)は、次のように作成することができます。

CREATE CLUSTERED COLUMNSTORE INDEX インデックス名

ON テーブル名

前出の弊社のお客様データ(40 億件)に対して、クラスター化列ストア インデックスを作成すると、次のような効果を得られました。

80.4% 圧縮わずか 1/5 以下に!

129倍の性能向上

21倍の性能向上

Page 56: SQL Server 2014 自習書シリーズ No.3

データ サイズは、わずか 39.9GB(5 分の 1 以下のサイズ)に、クエリ1 は 129倍もの性能向上、クエリ2 でも 21倍の性能向上を実現できています。このように、クラスター化列ストア インデックスは、大きな圧縮効果と性能向上を期待できる機能なので、ぜひ検討してみてください。

Page 57: SQL Server 2014 自習書シリーズ No.3

2.3 SQL Server Audit(SQL Server 監査)

SQL Server Audit(SQL Server 監査)機能は、SQL Server に対して発行されたすべての操作を監査(ログ記録)できる機能で、SQL Server 2008 から提供されました。SQL Server Audit は、J-SOX 法(日本版 SOX 法)や内部統制、PCI DSS(クレジット カード情報のセキュリティ基準)などのコンプライアンス(法令遵守)を実現するために欠かせない機能になります。SQL Server Audit を利用すれば、「いつ」「誰が」「どのデータベースに対して」「どんなステートメント」を実行したのかを記録したり、特権ユーザー(管理権限を持ったログイン アカウント)の不正利用を記録したりできるようになるので、J-SOX 法で求められる財務諸表に対する「監査(Audit)」(ログ記録による虚偽表示対策)の実現や、顧客情報の漏えい対策、内部統制の実現など、昨今求められているセキュリティ要件を実現することができます。

Let's Try

それでは、SQL Server Audit を試してみましょう。

1. まずは、新しく「監査」を作成して、監査ログの記録場所を指定します。監査を作成するには、次のように Management Studio のオブジェクト エクスプローラーで[セキュリティ]フォルダーを展開して、[監査]フォルダーの[新しい監査]をクリックします。

これにより、「監査の作成」ダイアログが表示されるので、[監査名]へ「AuditTest」など任意の名前を入力し、[ファイル パス]へ「C:\AuditLog」など任意のフォルダー名を入力して、ファイルへ監査ログが記録されるようにします(ファイル パスには、SQL Server のサービス アカウントが書き込み可能なフォルダーへのパスを入力するようにしてください)。入

1

2

3

4

Page 58: SQL Server 2014 自習書シリーズ No.3

力後、[OK]ボタンをクリックしてダイアログを閉じます。

Note: ファイル以外の格納先

監査ログは、ファイルのほかに Windows のアプリケーション ログまたはセキュリティ ログへ記録することも可能です。これは、次のように[監査の出力先]から変更できます。

Note: 監査ログのエラー時のシャットダウン

次のように[監査ログの失敗時]で[サーバーのシャットダウン]を選択した場合は、監査ログへの書き込みが失敗したときに、SQL Server をシャットダウンすることができます。これにより、ディスク障害時などで、監査ログが記録できない場合に、SQL Server を停止できるようになります。

2. 続いて、[監査]フォルダーを展開して、作成した監査(AuditTest)を右クリックし、[監査の有効化]をクリックします。

1

2

Page 59: SQL Server 2014 自習書シリーズ No.3

ログイン アカウントの変更履歴の監査

次に、ログイン アカウント(プリンシパル)の作成やパスワード変更など、ログイン アカウントに対する変更操作が行われたことをログへ記録するための監査を作成してみましょう。

1. ログイン アカウントなど、SQL Server 全体に関係するサーバー レベルの監査を作成するには、次のように[セキュリティ]フォルダーの[サーバー監査の仕様]を右クリックして[新しいサーバー監査の仕様]をクリックします。

2. これにより、「サーバー監査の仕様の作成」ダイアログが表示されるので、[名前]で任意の名前を設定して、[監査]で前の手順で作成した「AuditTest」を選択します。

[監査アクションの種類]では「LOGIN_CHANGE_PASSWORD_GROUP」(パスワードの変更)と「SERVER_PRINCIPAL_CHANGE_GROUP」(サーバー プリンシパルの変更)

1

「LOGIN_CHANGE_PASSWORD_GROUP」を選択

3

「SERVER_PRINCIPAL_CHANGE_GROUP」を選択

4

任意の名前を設定

1

2

Page 60: SQL Server 2014 自習書シリーズ No.3

を選択し、[OK]ボタンをクリックします。

3. 次に、作成したサーバー監査の仕様(既定では ServerAuditSpec ~ という名前)を右クリックして[サーバー監査の仕様の有効化]をクリックします。

以上で設定が完了です。これで、ログイン アカウント(プリンシパル)の変更(作成/変更/削除)とパスワードの変更が行われたことをログへ記録できるようになります。

4. 続いて、次のように操作して、任意のログイン アカウントを作成します。

5. 次に、作成したログイン アカウントをダブルクリックしてプロパティを開き、パスワードを適当なものへ変更します。

1

2

1

2

3

Page 61: SQL Server 2014 自習書シリーズ No.3

6. 以上の操作が監査ログへ記録されたことを確認するために、次のように[セキュリティ]フォルダーの[監査]フォルダーにある監査(AuditTest)を右クリックして、[監査ログの表示]をクリックします。

パスワードの変更は、[アクション ID]が[RESET PASSWORD]、ログイン アカウントの作成は、[CREATE]と表示されたログが記録されていることを確認できます。また、ログには、ステートメントが実行された時刻や、実行ユーザー(プリンシパル名)、実際に実行されたステートメントなどが記録されていることも確認できます。

このように、SQL Server Audit 機能を利用すると、ログイン アカウントに対する変更履歴を

1

2

3

1

アクションID が RESETPASSWORD(パスワード変更)

ステートメントを実行したユーザー ID(プリンシパル名)

時刻

実行されたステートメント

Page 62: SQL Server 2014 自習書シリーズ No.3

すべてログへ記録できるようになるので、ログイン アカウントを不正利用(管理者アカウントのパスワードを変更されたり、管理者アカウントが勝手に作られるなど)をログへ記録できるようになります。

コマンドでログの参照: fn_get_audit_file

監査ログは、fn_get_audit_file システム関数を利用すると、コマンドから参照することもできます。これは、次のように利用します。

SELECT statement, action_id, class_type, *

FROM sys.fn_get_audit_file ('C:\AuditLog\AuditTest*', null, null)

この関数は、第1引数へログ ファイルへのパス(* はワイルドカード)を指定して、該当するファイルが複数ある場合には、それらをまとめて読み取ることができます。

このようにステートメントを利用して、ログを参照することもできるので、GROUP BY 演算などと組み合わせて実行すれば、集計レポート(Weekly レポートや Monthly レポートなど)も簡単に作成できるようになります。

具体的なレポートの作成方法については、少し古い資料になりますが、SQL Server 2008 徹底検証シリーズの以下のドキュメントが参考になると思います。

「コンプライアンス実現のためのガイドライン」 http://www.microsoft.com/ja-jp/sqlserver/2008/r2/technology/cqi.aspx

そのほかのサーバー監査の仕様

サーバー監査の仕様には、「FAILED_LOGIN_GROUP」でログインの失敗を記録したり、「SERVER_PERMISSION_CHANGE_GROUP」で SQL Server レベルの権限の変更を記録したり、「AUDIT_CHANGE_GROUP」で監査が変更(作成/変更/削除)されたことを記録できるなど、セキュリティ強化/コンプライアンス実現のための仕様がたくさん用意されています。これらは、オンライン ブックの以下のトピックに記載されているので、ぜひ参考にしてください。

SQL Server 監査のアクション グループとアクション http://msdn.microsoft.com/ja-jp/library/cc280663.aspx

実行されたステートメント

発生時刻アクションID。CR は CREATE、PWR は PASSWORD CHANGE

アクションID の分類SL は SQL LOGIN

Page 63: SQL Server 2014 自習書シリーズ No.3

監査設定のスクリプト化

作成した監査は、次のようにサーバー監査の仕様を右クリックして、[サーバー監査の仕様をスクリプト化]をクリックすれば、スクリプト(CREATE SERVER AUDIT SPECIFICATION ステートメント)を生成することができます。

複数のサーバー監査の仕様を設定する際は、ステートメントを利用したほうが簡単なので、この生

1

Page 64: SQL Server 2014 自習書シリーズ No.3

成したスクリプトを雛形として、別のサーバー監査の仕様を作成すると便利です。

データベースに対する操作履歴の監査

SQL Server Audit では、SQL Server に対するあらゆる操作を監査することができるので、データベースに対する操作(SELECT や INSERT、UPDATE、DELETE など)も、もちろん監査(ログ記録)することができます。

Let's Try

それでは、これも試してみましょう。ここでは、NorthwindJ データベース内の「得意先」テーブルに対して「SELECT」ステートメントが実行されたことをログへ記録する監査(Audit)を作成してみましょう。

1. まずは、[データベース]フォルダーの[NorthwindJ]データベースを展開して、[セキュリティ]フォルダーの[データベース監査の仕様]を右クリックし、[新しいデータベース監査の仕様]をクリックします。

これにより、「データベース監査の仕様の作成」ダイアログが表示されるので、[名前]で任意の名前を設定して、[監査]で前の手順で作成した「AuditTest」を選択し、[監査アクションの種類]で「SELECT」を選択します。

2. 次に、[オブジェクト名]の[...]をクリックして、次のように「オブジェクトの選択」ダイアログで[参照]ボタンをクリックして、「得意先」テーブルを選択します。

1

4

任意の名前を設定

2

3

Page 65: SQL Server 2014 自習書シリーズ No.3

3. 続いて、次のように[プリンシパル名]の[...]をクリックして、「オブジェクトの選択」ダイアログで[参照]ボタンをクリックして、「dbo」データベース ユーザーを選択します。

「...」ボタンをクリック

1

2 「得意先」をチェック3

4

5

「...」ボタンをクリック

1

「dbo」をチェック3

4

5

2

Page 66: SQL Server 2014 自習書シリーズ No.3

このように設定することで、NorthwindJ データベース内の「得意先」テーブルに対して、「dbo」ユーザーから「SELECT」ステートメントが実行された場合に、ログへ記録できるようになります。設定を確認後、[OK]ボタンをクリックして、ダイアログを閉じます。

4. 次に、作成したデータベース監査の仕様(既定では DatabaseAuditSpec ~ という名前)を右クリックして[データベース監査の仕様の有効化]をクリックします。

以上で監査の設定が完了です。

監査ログの記録とログの参照

5. 次に、監査対象の「得意先」テーブルに対して、次のように SELECT ステートメントを実行して、監査ログへ記録されるかどうかを確認します(この手順は、dbo ユーザーにマッピングされている SQL Server の管理者アカウントから実行してください)。

6. 続いて、監査ログを参照します。[セキュリティ]フォルダーの[監査]フォルダーにある監査(AuditTest)を右クリックして、[監査ログの表示]をクリックします。

1 2

「得意先」テーブルを右クリックして「上位 1000行の選択」をクリック

1

得意先テーブルに対するSELECT ステートメント

が自動実行される

Page 67: SQL Server 2014 自習書シリーズ No.3

ログの中で、[アクション ID]へ「SELECT」と表示されているイベントを確認することができます。この中身を参照すると、前の手順で実行した SELECT ステートメントが記録され、そのステートメントを実行したユーザー(ログイン ID)と実行した時刻などを確認することができます。

このように、SQL Server Audit を利用すれば、データベースに対するあらゆる操作を監査(ログ記録)することができるので、「得意先」や「顧客」テーブルなどを監査対象にしておけば、顧客情報(クレジット カードや個人情報など)の漏えいが発生した場合の証跡を残せるようになります。また、特権ユーザー(管理者権限を持ったアカウント)の操作履歴(SQL Server に対する管理操作やデータ操作)をすべて監査しておけば、不正利用(管理者アカウントを悪用したデータの盗難やトロイの木馬の設置など)を監視できるようになります。

以上のように、SQL Server Audit は、J-SOX 法(日本版 SOX 法)や内部統制、PCI DSS(クレジット カード情報のセキュリティ基準)などのコンプライアンス(法令遵守)の実現およびセキュリティの強化には、不可欠な機能になります。SQL Server 2005 以前のバージョンでも利用可能なプロファイラー(SQL Server Profiler)ツールを利用しても、同様に監査ログを記録することができますが、プロファイラーとの違いは、SQL Server Audit のほうが設定が容易で、かつパフォーマンスが良い(監査のオーバーヘッドがプロファイラーよりも小さい)という点です。ぜひ、活用してみてください。

プロファイラーと SQL Server のパフォーマンス比較については、前出の SQL Server 2008 徹底検証シリーズの以下のドキュメントが参考になると思います。

「コンプライアンス実現のためのガイドライン」 http://www.microsoft.com/ja-jp/sqlserver/2008/r2/technology/cqi.aspx

1

アクションIDが SELECT

ログイン ID

時刻

実行された SELECTステートメント

Page 68: SQL Server 2014 自習書シリーズ No.3

2.4 データ コレクションとパフォーマンス データ コレクション

データ コレクション(Data Collection)は、SQL Server 2008 から提供された "定期的なデータ収集" が行える機能で、運用監視やパフォーマンス チューニング時に大変役立つ機能です。データ コレクションを利用すれば、「任意の Transact-SQL ステートメント」や「パフォーマンス カウンター」、「トレース」からデータを収集することができるので、パフォーマンス状況を監視できる動的管理ビュー(DMV:Dynamic Management View)を定期的にクエリしたり、CPU やメモリなどのパフォーマンス カウンターを定期的に取得するといった使い方ができます。

パフォーマンス データ コレクションによるパフォーマンス レポート

データ コレクションでは、「パフォーマンス データ コレクション」(システム データ コレクション)と呼ばれる組み込みのデータ コレクションが用意されていて、主要な動的管理ビューやパフォーマンス カウンターを自動的に取得することができます。また、収集したデータをもとにグラフィカルなレポートを表示する機能も提供されているので、パフォーマンス監視を非常に簡単に行えるようになっています。

パフォーマンス データ コレクションは、SQL Server 2005 SP2(Service Pack 2)のアドインとして提供されていた Performance Dashboard の強化版で、Performance Dashboard が今の状態(リアルタイム)のみしか監視できなかったのに対して、パフォーマンス データ コレクションでは、データ コレクション機能と連動して、過去のデータまでさかのぼって監視することができるのが大きな特徴です。

Let's Try

それでは、パフォーマンス データ コレクションを試してみましょう。

1. データ コレクションは、内部的には SQL Server Agent サービスの機能を利用しているので、まずは、次のように SQL Server Agent サービスを開始しておく必要があります。

Page 69: SQL Server 2014 自習書シリーズ No.3

データ コレクションを常時実行しておくようにするには、SQL Server 構成マネージャーを利用して、SQL Server Agent サービスを自動起動するように変更しておきます

2. データ コレクションでは、収集したデータをデータベースへ格納する前に、一時的にデータを保存する場所として、Windows 上のフォルダーを利用するので、この格納先となるフォルダーを事前に作成しておく必要があります。ここでは、Windows エクスプローラーから、「C:\DataCollectionTemp」という名前でフォルダーを作成しておきます(ドライブ名は使用している環境によって適宜変更してください。フォルダー名は任意の名前を設定できます。また、SQL Server Agent サービスのサービス アカウントに対して、NTFS アクセス許可の書き込み権限を与えておいてください)。

3. 次に、オブジェクト エクスプローラーの[管理]フォルダーを展開し、[データ コレクション]を右クリックして、[タスク]から[管理データ ウェアハウスの構成]をクリックします。

1

2

1

2

Page 70: SQL Server 2014 自習書シリーズ No.3

これにより、[管理データ ウェアハウス構成ウィザード]が起動されるので、[次へ]ボタンをクリックして、次のページへ進みます。

4. 次の[管理データ ウェアハウス ストレージの構成]ページでは、データ コレクション機能によって収集したデータをデータベースへ格納するために、その格納先を選択します。ここでは、次のように[新規作成]ボタンをクリックして、「DataCollectionDWH」という名前のデータベースを新しく作成します(データベース名は、任意の名前を設定できます)。

5. データベースの作成が完了した後、[管理データ ウェアハウス ストレージの構成]ページへ戻ったら、[次へ]ボタンをクリックします。

「DataCollectionDWH」と入力

2

1

3

作成したデータベースが選択されていることを確認

1

2

Page 71: SQL Server 2014 自習書シリーズ No.3

6. 次の[ログインとユーザーのマップ]ページでは、データ コレクションの管理者アカウントとして設定したいログイン アカウントを任意で指定し、[次へ]ボタンをクリックします。

7. 最後の[ウィザードの完了]ページでは、[完了]ボタンをクリックします。

8. これにより、[データ コレクション構成ウィザードの進行状況]ページが表示されるので、構築が完了するのを待ちます(すべての[状態]へ「成功」と表示されれば構築が完了です)。

1

1

1

2

Page 72: SQL Server 2014 自習書シリーズ No.3

構築完了後、[閉じる]ボタンをクリックします。

9. 次に、もう一度、[データ コレクション]を右クリックして、今度は[タスク]から[データ コレクションの構成]をクリックします。

これにより、[データ コレクション構成ウィザード]が起動するので、[次へ]ボタンをクリックして、次のページへ進みます。

10. 次の[データ コレクション セットのセットアップ]ページでは、[データベース名]に前の手順で作成したデータベース(DataCollectionDWH)、[キャッシュ ディレクトリ]に前の手順で作成した Windows フォルダー(C:\DataCollectionTemp)を指定します。

1

2

「...」をクリックしてSQL Server を選択

1

前の手順で作成した「DataCollectionDWH」

データベースを選択

2

前の手順で作成した「C:¥DataCollectionTemp」

フォルダーを指定

3

5

4

Page 73: SQL Server 2014 自習書シリーズ No.3

[有効にするデータ コレクター セットを選択します]では、「システム データ コレクション セット」をチェックして、[次へ]ボタンをクリックします。

なお、「トランザクション パフォーマンス コレクション セット」を選択した場合には、SQL Server 2014 からの新機能である「インメモリ OLTP」機能向けのパフォーマンス監視を行うことができます。

11. 最後の[ウィザードの完了]ページでは、[完了]ボタンをクリックします。

12. これにより、[データ コレクション構成ウィザードの進行状況]ページが表示されるので、構成が完了するのを待ちます(すべての[状態]へ「成功」と表示されれば構成が完了です)。

構成完了後、[閉じる]ボタンをクリックします。

13. 次に、オブジェクト エクスプローラーで、次のように DataCollectionDWH データベース内のテーブルを参照すると、ウィザードによって多くのテーブルが自動作成されていることを確認できます。

1

2

3

Page 74: SQL Server 2014 自習書シリーズ No.3

これらのテーブルは、パフォーマンス データ コレクションによって収集されたデータが格納される場所になります。

パフォーマンス データ コレクションによって自動収集されるデータ

パフォーマンス データ コレクション(システム データ コレクション)には、次のように「ディスク使用量」と「クエリ統計」、「サーバーの利用状況」の 3 種類があります。

それぞれのシステム データ コレクションは、主に次のデータを収集しています。

データベース内にたくさんのテーブルが作成されて

いることを確認

1

3種類のパフォーマンス データ コレクション(システム データ コレクション)

コレクション セット名 主な収集している内容 収集頻度 保持期間

ディスク使用量・database_files・DBCC SQLPERF (LOGSPACE)・partitions、allocation_units

6時間ごと 730日

サーバーの利用状況

・主要なパフォーマンス カウンター・dm_os_wait_stats・dm_os_latch_stats・dm_os_schedulers・dm_os_process_memory・dm_os_memory_nodes / clerks・dm_os_sys_memory / info・dm_io_virtual_file_stats

60秒ごとアップロードは 15分ごと

14日

クエリ統計

・dm_exec_sessions とdm_exec_requests、dm_os_tasksdm_os_waiting_tasks の JOIN

10秒ごとアップロードは 15分ごと 14日

・dm_exec_query_stats・dm_exec_text_query_plan

15分ごと(アップロード時)

Page 75: SQL Server 2014 自習書シリーズ No.3

これらの設定は、それぞれのシステム データ コレクションを右クリックして、「プロパティ」をクリックし、プロパティを参照することで確認できます

また、この収集したデータをもとに、次の 3 つの監視レポートが提供されています。

Let's Try

それでは、これを確認してみましょう。

1. 次のように、オブジェクト エクスプローラーで、[データ コレクション]の[システム データ コレクション セット]を展開して、「ディスク使用量」システム データ コレクションを右クリックして、[プロパティ]をクリックします。

「ディスク使用量」システム データ コレクションは、ディスク使用量という名前のとおり、データ ファイル(.mdf)とログ ファイル(.ldf)の使用量を定期的に収集するように設定されています(デフォルトは 6 時間ごとに収集して、730 日間保持)。

プロパティを確認後、[キャンセル]ボタンをクリックしてダイアログを閉じます。

2. 「ディスク使用量」システム データ コレクションは、プロパティで確認したように 6 時間ごとにデータ収集が行われているので、今すぐデータ収集(とアップロード)を実行した場合には、次のように[今すぐ収集してアップロード]をクリックします。

レポート名 対応するシステム データ コレクション 説明

ディスク使用量の概要 ディスク使用量 データ ファイルとログ ファイルの使用量の推移を表示

クエリ統計の履歴 クエリ統計 クエリの統計情報(CPU 実行時間の多いクエリや、実行時間の長いクエリ)などを表示

サーバーの利用状況の履歴 サーバーの利用状況 メモリや CPU、ディスク、Wait Stats(各種の待ちに関する情報)などの使用状況を表示

実行スケジュールの設定。「キャッシュしない」モードは、

データ収集とアップロードが同じタイミングとなる。

「ディスク使用量」は、6時間ごとに収集とアップロードが行われる

2

収集したデータを保管する日数。「ディスク使用量」は 730日

4

具体的に実行されるSQL ステートメントや

取得するパフォーマンスカウンターなど

3

「ディスク使用量」を右クリックして「プロパティ」をクリック

1

Page 76: SQL Server 2014 自習書シリーズ No.3

これにより、現在のディスク使用量が収集され、DataCollectionDWH データベース(データ コレクション用のデータ ウェアハウス)へアップロード(格納)されます。

3. 次に、アップロードされたデータを確認してみましょう。次のように、データ コレクション用のデータ ウェアハウス内のテーブルの一覧から snapshots スキーマの「disk_usage」テーブルを参照します(このテーブルには、「ディスク使用量」データ コレクションによって収集されたデータベースの使用サイズなどが格納されています)。

データベースごとにデータが格納され、dbsize 列へデータ ファイル(.mdf)、logsize 列へログ ファイル(.ldf)の使用量が収集されています。

また、同じデータベースに対して、2 件ずつの結果が格納されていますが、データ収集のたびにこのデータが増えていきます。1 回目のデータ収集は、ウィザード完了時に実行されていて、

「ディスク使用量」を右クリックして「今すぐ収集してアップ

ロード」をクリック

1

2

「disk_usage」テーブルにはdbsize(データ サイズ)やlogsize(ログ サイズ)など

が格納されている

1

1 回目の収集データ

(時間に注目)

2 回目の収集データ

(時間に注目)

Page 77: SQL Server 2014 自習書シリーズ No.3

2 回目のデータ収集は、前の手順で実行(今すぐ収集してアップロード)したときのものです。3 回目のデータ収集は、6 時間後に実行されます。データが収集された時間は、collection_time 列で確認することができます(時間は、協定世界時で記録されています)。

もし、2 回目のデータ収集の結果が表示されない場合は、1 分程度待ってからもう一度データを参照してみてください。

ディスク使用量の概要レポート

次に、「ディスク使用量」システム データ コレクションと連動したレポート(ディスク使用量の概要レポート)を表示してみましょう。

1. ディスク使用量の概要レポートを表示するには、次のように[データ コレクション]を右クリックして、[レポート]メニューの[管理データ ウェアハウス]から[ディスク使用量の概要]をクリックします。

レポートでは、データベースごとのディスク使用量の推移をグラフィカルに確認することができます。

2. このレポートでは、次のようにグラフをクリックすると、詳細レポートを表示することができます。

「データ コレクション」を右クリックして「レポート」メニューの「管理データ ウェアハウス」から「ディスク使用量の概要」をクリック

1

各データベースのデータ ファイルとログファイルの使用サイズの推移が表示される

2

Page 78: SQL Server 2014 自習書シリーズ No.3

これらのレポートは、「ディスク使用量」システム データ コレクションによって収集されたデータ(データ ファイルやログ ファイルの使用サイズ)をもとに作成されたものです。

「クエリ統計」と「サーバーの利用状況」

次に、「クエリ統計」と「サーバーの利用状況」システム データ コレクションの効果を試してみましょう。

1. まずは、次のように サンプル スクリプト内の「Step2_DataCollection_Query1.sql」と「Step2_DataCollection_Query2.sql」を次のように同時実行(Query1 のほうを少しだけ先に実行)します。

このクエリを実行するには、「AdventureWorks2014」サンプル データベースをセットア

グラフをクリックすると、詳細レポートが表示される

1

Step2_DataCollection_Query1.sql

を少し先に実行

Step2_DataCollection_Query2.sql

を少し遅れて同時実行

Page 79: SQL Server 2014 自習書シリーズ No.3

ップしておく必要があります(セットアップ手順は、Step 1 を参考にしてください)。クエリの実行時間は、環境にもよりますが 10~30 分程度かかるので、その間待っていてください。

2. クエリの実行が完了したら、「クエリ統計」と「サーバーの利用状況」システム データ コレクションに対して、[今すぐ収集してアップロード]をクリックして、データ収集とアップロードを実行します。

前述したように、この 2 つのシステム データ コレクションは、主に次のデータを収集しています。

デフォルトでは、15 分ごとにデータのアップロード(管理データ ウェアハウス内のテーブルへの INSERT)が行われ、データの収集は 60 秒または 10 秒ごとに実行されています(収集されたデータは、キャッシュ フォルダー C:\DataCollectionTemp へ格納されています)。

クエリ統計の履歴レポート

次に、「クエリ統計」システム データ コレクションによって収集されたデータをもとに作成されたレポートを表示してみましょう。

「クエリ統計」を右クリックして「今すぐ収集してアップロード」

をクリック

1 「サーバーの利用状況」を右クリックして「今すぐ収集してアッ

プロード」をクリック

2

コレクション セット名 主な収集している内容 収集頻度 保持期間

サーバーの利用状況

・主要なパフォーマンス カウンター・dm_os_wait_stats・dm_os_latch_stats・dm_os_schedulers・dm_os_process_memory・dm_os_memory_nodes / clerks・dm_os_sys_memory / info・dm_io_virtual_file_stats

60秒ごとアップロードは 15分ごと

14日

クエリ統計

・dm_exec_sessions とdm_exec_requests、dm_os_tasksdm_os_waiting_tasks の JOIN

10秒ごとアップロードは 15分ごと 14日

・dm_exec_query_stats・dm_exec_text_query_plan

15分ごと(アップロード時)

Page 80: SQL Server 2014 自習書シリーズ No.3

3. 次のように[データ コレクション]を右クリックして、[レポート]メニューの[管理データ ウェアハウス]から[クエリ統計の履歴]をクリックし、クエリ統計の履歴レポートを表示します。

このレポートでは、実行時間の長いクエリや、CPU 利用時間の長いクエリの順にクエリを一覧し、そのクエリの詳細を確認できるようになっています。

「データ コレクション」を右クリックして「レポート」メニューの「管理データ ウェアハウ

ス」から「クエリ統計の履歴」をクリック

1

Page 81: SQL Server 2014 自習書シリーズ No.3

前の手順で実行したクエリが上位へリストされることを確認できます(もし、リストされない場合は、前の手順で実行したクエリが、(マシン スペックが良いために)高負荷とは見なされず、収集対象から除外されてしまっています。この場合は、高負荷となるようなクエリを別途実行してみてください)。

リソース待ちに関する詳細

クエリの詳細画面では、次のように「このクエリに関するサンプリングされた待機を表示」ハイパーリンクをクリックすると、リソース待ちに関する詳細を確認することができます。

「実行時間」をクリックすると実行時間の長いクエリの順

に表示してくれる

クエリをクリックすると詳細レポートが表示される

2

時間の選択1

Page 82: SQL Server 2014 自習書シリーズ No.3

サーバーの利用状況の履歴レポート

次に、「サーバーの利用状況」システム データ コレクションによって収集されたデータをもとに作成されたレポートを表示してみましょう。

4. 次のように、[データ コレクション]を右クリックして、[レポート]メニューの[管理データ ウェアハウス]から[サーバーの利用状況の履歴]をクリックし、サーバーの利用状況の履歴レポートを表示します。

このレポートでは、「CPU 利用率」や「メモリ使用量」、「ディスク I/O の使用量」、「SQL Server の動作状況」(Wait Stats や各種パフォーマンス カウンターの状況)などを表示す

「このクエリに関するサンプリングされた待機を表示」をクリックすると、

リソース待ちに関する詳細が表示される

1CPU 待ち

ロック待ち

1

時間の選択1

Page 83: SQL Server 2014 自習書シリーズ No.3

ることができます。

5. また、各グラフをクリックすると、その詳細を表示できるようになっていて、例えば、次のように CPU 利用率のグラフをクリックすると、その詳細(各 CPU コアごとの CPU 利用率など)を確認できるようになります。

SQL Server の動作状況の表示(Wait Stats やロック待ちなど)

サーバーの利用状況の履歴レポートでは、次のように「SQL Server の利用状況」グラフで、「User Connections」や「Batch Requests/sec」、「Logins/sec」、「Compilations/sec」といった、SQL Server 関連の各種パフォーマンス カウンターの状況なども確認することができます。

「CPU 使用率」グラフをクリックすると、各 CPU コアごとの CPU 利用率を参照可能

1

「ディスク I/O の使用量」グラフをクリックすると、各ドライブごとの応答時間や

キュー(ディスク待ち)の長さを参照可能

2

Page 84: SQL Server 2014 自習書シリーズ No.3

このように、パフォーマンス データ コレクション機能を利用すると、リソースの使用状況を過去にさかのぼって参照することができるので、パフォーマンス チューニング時のボトルネックの発見や、トラブル シューティング時のトラブル原因の究明に大変役立ちます。

「SQL Server の利用状況」をクリックすると

詳細レポートを表示

2

「User Connections」や「Batch Requests/sec」、

「Logins/sec」、「Compilations/sec」を確認可

1

Page 85: SQL Server 2014 自習書シリーズ No.3

2.5 ユーザー定義のデータ コレクションによる定期的なデータ収集

前項のパフォーマンス データ コレクション(システム データ コレクション)は、自動でデータ収集を行ってくれる機能ですが、データ コレクション機能では、ユーザー定義の任意のデータを収集することもできます。収集できるのは、任意の Transact-SQL ステートメントやパフォーマンス カウンター、トレースです。パフォーマンス データ コレクションでは自動収集されないデータを収集したい場合や、パフォーマンス データ コレクションに頼らずに、独自のデータ収集を行いたい場合に便利な機能です。

Let's Try

それでは、これを試してみましょう。ここでは、Transact-SQL ステートメント(GETDATE 関数で現在時刻を取得する SELECT ステートメント)を定期的(15 分ごと)に実行し、その結果を収集する手順を説明します。

これを試すには、前項の「パフォーマンス データ コレクション」の手順を実行しておく必要があるので、まだ実行していない場合は実行しておいてください(データ コレクション機能を利用するには、管理データ ウェアハウスを作成しておく必要があります)。

1. データ コレクションを作成するには、「sp_syscollector_create_collection_set」システム ストアド プロシージャを利用して「Collection Set」(コレクション セット)を作成し、その中へ「Collection Item」(コレクション アイテム)を作成します。Collection Item の作成には、「sp_syscollector_create_collection_item」システム ストアド プロシージャを利用します。

これは、次のように記述します(完成版のファイルは、サンプル スクリプト内の「Step2_DataCollection_UserDC.sql」ファイルにあるので、SQL をコピーして貼り付けて、実行します)。

-- Collection Set の作成

USE msdb

DECLARE @collection_set_id int

EXEC dbo.sp_syscollector_create_collection_set

@name = N'DCtest1',

@schedule_name = N'CollectorSchedule_Every_15min', -- 15分ごとに収集する場合

@collection_mode = 1,

@days_until_expiration = 30,

@description = N'テスト',

@collection_set_id = @collection_set_id output

DECLARE @params XML

SELECT @params = CONVERT(XML,

N'<ns:TSQLQueryCollector xmlns:ns="DataCollectorType">

<Query>

<Value>SELECT GETDATE() AS 現在時刻</Value>

<OutputTable>DCtest_GetDate</OutputTable>

</Query>

Collection Set を DCtest1 という名前で作成

定期的に実行したい T-SQL を<Query> 要素の <Value> 要素へ記述

Page 86: SQL Server 2014 自習書シリーズ No.3

</ns:TSQLQueryCollector>')

/*

Collection Item の作成

@collector_type_uid の '302E~' は、T-SQL Query Collector Type で

syscollector_collector_types システム ビューで確認可能

*/

DECLARE @collection_item_id int

EXEC dbo.sp_syscollector_create_collection_item

@collection_set_id = @collection_set_id,

@collector_type_uid = N'302E93D1-3424-4BE7-AA8E-84813ECF2419',

@name = 'DMVtest1',

@frequency = 30,

@parameters = @params,

@collection_item_id = @collection_item_id output;

データの収集間隔を設定するには、sysschedules_localserver_view システム ビューを参照して、スケジュール名(name 列)を確認して、@schedule_name に与えます(15分ごとに収集する場合は、CollectorSchedule_Every_15min を指定します)。

データ収集のための Transact-SQL ステートメントは、XML データ型で定義し、<Value> 要素へクエリを記述、<OutputTable> 要素へクエリ結果を格納するためのテーブル名を記述します。

2. 実行後、オブジェクト エクスプローラーで[データ コレクション]を右クリックして、[最新の情報に更新]をクリックすると、作成されたコレクション セット「DCtest1」が表示されることを確認できます。

3. 次に、作成したデータ コレクション セットを起動するために、次のように「DCtest1」を右クリックして、[データ コレクション セットの開始]をクリックします。

1

2↓

XML 形式で記述した T-SQL クエリ

Page 87: SQL Server 2014 自習書シリーズ No.3

4. 続いて、手動でデータを収集するために、DCtest1 を右クリックして、[今すぐ収集してアップロード]をクリックします。

5. 正常にデータが収集されたかどうかを確認するために、DCtest1 を右クリックして、[ログの表示]をクリックし、ログを参照します。

1

2

1

Page 88: SQL Server 2014 自習書シリーズ No.3

6. 収集されたデータを確認するために、DataCollectionDWH データベース内のテーブルを参照します。

custom_snapshot スキーマの「DCtest_GetDate」テーブルが作成されていることを確認できます。SELECT ステートメントでこのテーブルの中身を参照すると、現在時刻を 2 件以上取得できていることを確認できます。それぞれの時刻は、データ コレクション セットの開始時と手順 4(今すぐ収集してアップロード)を実行したときの時刻です。また、データ コレクション セットを開始してから 15 分以上経過している場合は、そのタイミングでもデータ収集が行われます(SQL Server Agent サービスが起動している場合は、15 分ごとにデータ収集が行われます)。

このように データ コレクション機能を利用すると、任意の Transact-SQL ステートメントを定期的に実行して、データを収集することができるので、パフォーマンス チューニング時に大変役立ちます。また、データ コレクションでは、パフォーマンス カウンターとトレースからもデータを収集することができるので、こちらも便利です。

1

が表示されていれば成功

2

custom_snapshot スキーマの「DCtest_GetDate」テーブル

が作成されていることを確認

1

「DCtest_GetDate」テーブルの中身を参照

2

現在時刻を取得できていることを確認

3

Collection_time(収集時刻)は協定世界時で記録される

Page 89: SQL Server 2014 自習書シリーズ No.3

2.6 リソース ガバナーによるリソース調整

リソース ガバナー(Resource Govenor)は、CPU 利用率やメモリ割り当て量、I/O 数といったリソースの調整(governor)が行える大変便利な機能で、SQL Server 2008 から提供されました。これを利用すれば、CPU を占有する SQL/アプリケーションの CPU 利用率を制限したり、メモリ使用量や I/O 数を制限したりするといったことが可能になります。

リソースガバナーを設定するおおまかな流れは、次のとおりです。

1. リソース プールの作成とリソース ガバナーの有効化 2. ワークロード グループの作成 3. ユーザー定義分類子関数の作成と設定

Let's Try

それでは、リソース ガバナーを試してみましょう。

1. まずは、新しいリソース プールを作成するために、次のようにオブジェクト エクスプローラーの[管理]フォルダーで[リソース ガバナー]を右クリックして、[新しいリソース プール]をクリックします。

2. これにより、次のように[リソース ガバナーのプロパティ]ダイアログが表示されるので、[リソース ガバナーを有効にする]をチェックして、[リソース プール]の[名前]列に「testResourcePool」など、任意の名前を入力します。

「リソース ガバナー」を右クリックして「新しいリソース プール」をクリック

1

Page 90: SQL Server 2014 自習書シリーズ No.3

3. 次に、リソース プール内へワークロード グループを作成するために、引き続き同じダイアログで、作成した「testResourcePool」を選択して、[リソースのワークロード グループ]セクションの[名前]列に「testWorkloadG1」および「testWorkloadG2」と入力し、2つのワークロード グループを作成します。

4. 作成したリソース プールとワークロード グループを確認するために、次のように[リソース ガバナー]フォルダーを展開します。

リソース プール名へ「testResourcePool」と入力

2

internal と default は組み込みのリソースプール。既定では、ユーザー ワークロード

は default プールへ割り当てられる

リソース ガバナーを有効にするためにチェックする

1

作成した「testResourcePool」を選択しておく

1

ワークロード グループ名へ「testWorkloadG1」と

「testWorkloadG2」と入力して 2つのグループを作成

2

3

default リソースプールには、default ワークロード グループ。internalリソースプールには、internal ワークロード グループが存在する

作成したリソース プールとワークロード グループの確認

1

Page 91: SQL Server 2014 自習書シリーズ No.3

5. 次に、ユーザー定義分類子関数(Classification Function)を作成します。この関数は、通常のユーザー定義関数と同様、CREATE FUNCTION ステートメントを利用して次のように作成します(ステートメントは「クエリ エディター」から実行します)。

USE master

go

CREATE FUNCTION [test分類関数]()

RETURNS sysname

WITH SCHEMABINDING

AS

BEGIN

DECLARE @grp_name AS sysname

IF (SUSER_NAME() = 'rUser')

SET @grp_name = 'testWorkloadG1'

RETURN @grp_name

END

Note:ユーザー定義分類子関数は master へ

ユーザー定義分類子関数は、master データベース内へ作成する必要があります。

6. 次に、作成したユーザー定義分類子関数をリソース ガバナーへ設定するために、次のように[リソース ガバナー]を右クリックして、[プロパティ]をクリックします。

[プロパティ]ダイアログが表示されたら、[分類子関数の名前]に、作成した分類子関数(test分類関数)を選択して、[OK]ボタンをクリックします。

以上でリソース ガバナーの設定が完了です。

1

前の手順で作成したユーザー定義分類子関数を選択する

2

3

CREATE FUNCATION ステートメントを利用してユーザー定義関数を作成(関数名は任意)。戻り値は sysname で、WITH SCHEMABINDING を指定する

必ず master データベースへ接続

SUSER_NAME 関数で、ユーザー名を取得。rUser なら、testWorkloadG1 を返すよう

にしている

Page 92: SQL Server 2014 自習書シリーズ No.3

負荷ワークロードの実行と監視

次に、CPU 負荷の高いクエリを実行して、リソース ガバナーの効果を確認してみましょう(この手順を試すには、SQL Server の認証モードが「混合モード」で実行されている必要があります)。

1. まずは、ユーザー定義分類子関数で振り分けている「rUser」ログイン アカウントを次のように作成して、 AdventureWorks2014 のデータベース ユーザーとして設定し、db_owner ロールへ追加しておきます。

USE master

go

-- ログイン アカウントの作成

CREATE LOGIN rUser

WITH PASSWORD = 'P@ssword'

go

-- データベース ユーザーの作成

USE AdventureWorks2014

go

CREATE USER rUser

FOR LOGIN rUser

go

-- db_owner ロールへの追加

EXEC sp_addrolemember 'db_owner', 'rUser'

go

2. 次に、リソース ガバナーの効果を確認しやすくするために、affinity mask を 1 に設定して、CPU コアを 1 つだけ利用するように制限します。

EXEC sp_configure 'show advanced option', 1

RECONFIGURE

EXEC sp_configure 'affinity mask', 1

RECONFIGURE

3. 次に、ワークロード状況を監視するために、[管理ツール]メニューから[パフォーマンス モニター]をクリックして、パフォーマンス モニターを起動します(Windows Server 2012/2012 R2 の場合は、サーバー マネージャーの[ツール]メニューからパフォーマンス モニターを起動することもできます)。

パフォーマンス モニターでは、次のようにツールバーの[+]ボタンをクリックして[カウンターの追加]ダイアログを表示し、[パフォーマンス オブジェクト]で「SQLServer: Resource Pool Stats」を展開、カウンターの一覧から「CPU Usage %」(CPU 利用率)を選択し、インスタンスの一覧から「default」と「testResoucePool」を選択して、[追加]ボタンをクリックします。

Page 93: SQL Server 2014 自習書シリーズ No.3

4. 続いて、CPU 負荷の高いクエリを、(rUser からではなく)sysadmin ロールのメンバーから(管理者アカウントから)実行します。このクエリは、次のように記述またはサンプル スクリプト内の「Step2_ResourceGovernor.sql」ファイルからコピーして貼り付けて、実行します。

USE AdventureWorks2014

go

DECLARE @i int = 1

WHILE @i <= 200000

BEGIN

DECLARE @kekka float

SELECT @kekka = RAND(ProductID) FROM Production.Product ORDER BY NEWID()

SET @i += 1

END

このクエリの実行時間は、環境によって異なりますが、仮想マシン環境の場合は 1 分半ぐらいかかります。クエリの実行が終わる前に、パフォーマンス モニターへ戻り、CPU 利用率の状況を確認します。

「+」をクリック1

12

「追加」をクリック5

SQL Server:Resouce Pool Stats オブジェクト

を展開

2

CPU usage %カウンターを選択

3

インスタンスの一覧からdefault と

testResoucePool を選択

4

6

同じクエリを 200000 回繰り返し実行

Page 94: SQL Server 2014 自習書シリーズ No.3

sysadmin メンバーから実行されたクエリは、default リソース プールとして実行され、CPU 利用率が 100% 近くを推移していることを確認できます(CPU が 4 コアのマシンを利用している場合は、1 コア 25%ずつで表示されるので、画面のように 25%付近を推移している場合は、実質 100% 付近を推移しているのと同じ意味になります。∵Affinity Mask を 1 に設定して、利用する CPU コアを 1 つに制限しているので、25% が実質の 100% 相当になります)。

5. 上記のクエリの実行が完了した後、今度は、rUser ログイン(ユーザー)でクエリ エディターへ接続して、同じクエリ(CPU 負荷の高いクエリ)を実行します。

クエリを実行したら、実行中にパフォーマンス モニターで CPU 利用率の状況を確認します。

sysadmin メンバーから実行されたクエリは、default リソース プールとして実行され、CPU 利用率が 100% 相当近くを推移していることを確認できる(CPU が 4 コアの場合は、1 コア

25% ずつで表示されるため、画面のように 25% 付近を推移している場合は、実質 100% 付近を

推移していることと同じ意味になる)。今回作成した分類子関数では、rUser の場合にのみ testResourcePool リソース プールへ割り当てるようにしているので、それ以外のユーザーから実行されたクエリは、すべて default

リソース プールで実行されます。

1

testResourcePool リソース プールのCPU 利用率は ゼロを推移していることを確認

2

ツールバーの「データベースエンジン クエリ」をクリック

1

「SQL Server 認証」を選択して、

rUser として接続

2

rUser でログイン

3

Page 95: SQL Server 2014 自習書シリーズ No.3

rUser ユーザーから実行されたクエリは、testResourcePool リソース プールとして実行されていることを確認できます。

6. 次に、上記のクエリ(rUser ユーザーが実行したクエリ)の実行中に、sysadmin ロールのメンバーから同じクエリを同時実行し、そのときの状況をパフォーマンス モニターで確認します。

sysadmin のメンバーがクエリを実行すると、testUser が実行しているクエリと半分ずつの CPU 利用率(50% 相当)を推移するようになり、CPU が均等に分配されていることを確認できます。

testResourcePool リソース プールの CPU 利用率が 100% 相当近辺を推移して

いることを確認。default リソース プールはゼロを推移

1

rUser ユーザーのみが実行している間は、testResourcePool リソース プールが 100%相当のCPU を利用し、sysadmin のメンバーがクエリを実行すると、半分ずつの CPU 利用率

(50% 相当)を推移するようになり、均等に CPU が分配されていることを確認できる。

1

Page 96: SQL Server 2014 自習書シリーズ No.3

7. 続いて、クエリの実行中に、リソース プールの調整(CPU 利用率の制限)を行います。sysadmin のメンバーでログインした接続をもう 1 つ作成して、次のように ALTER RESOURCE POOL ステートメントを実行し、testResourcePool の max_cpu_percent(最大 CPU パーセント)を 5 へ変更します。

ALTER RESOURCE POOL testResourcePool

WITH ( max_cpu_percent = 5 )

ALTER RESOURCE GOVERNOR RECONFIGURE

実行後、パフォーマンス モニターで状況を確認します。

default リソース プールは、95% 相当付近を推移するように変わり、testWorkloadG1 リソース プールは 5% 相当付近を推移するように変わることを確認できます(CPU が 4コアの場合は、25% のうちの 95% または 5% になるので、23.75% 付近と 1.25% 付近を推移します)。

8. 続いて、さらにリソース プールの調整(CPU 利用率の制限)を行います。次のように ALTER RESOURCE POOL ステートメントを実行して、testResourcePoolの max_cpu_percentを 30 へ変更します。

ALTER RESOURCE POOL testResourcePool

WITH ( max_cpu_percent = 30 )

ALTER RESOURCE GOVERNOR RECONFIGURE

実行後、パフォーマンス モニターで状況を確認します。

default リソース プールは、95% 相当前後を推移するように変

わり、testResoucePool リソースプールは 5% 相当前後を推移する

ように変わることを確認できる

1

Page 97: SQL Server 2014 自習書シリーズ No.3

default リソース プールは、70% 相当付近を推移するように変わり、testWorkloadG1 リソース プールは 30% 相当付近を推移するように変わることを確認できます(CPU が 4コアの場合は 17.5% と 7.5%付近を推移します)。

Note: リソース ガバナーの注意点

リソース ガバナーは、ユーザーが SQL Server への接続を確立する時(ログイン時)に評価されます。そのため、分類子関数(Classification Function)の作成前に既にログインしているユーザーには有効になりません。また、Execute As ステートメントによるユーザー権限の借用を行っている場合にも、ログインが伴わないため、リソース ガバナーは有効にはなりません。

Affinity Mask を元に戻す

1. リソース ガバナーの効果を確認したら、最後に Affinity Mask を 0(既定値)に戻しておきます。

EXEC sp_configure 'show advanced option', 1

RECONFIGURE

EXEC sp_configure 'affinity mask', 0

RECONFIGURE

Note:複数の CPU コア環境でのリソース ガバナーの動作

手順内では、リソース ガバナーの動作を分かりやすくするために Affinity Mask を 1 に設定して、CPU コアを 1つに制限して試しましたが、複数 CPU コア環境でのリソース ガバナーの動作については、SQLOS チームの次の記事も参照しておくことをお勧めします。 Part 2: Resource Governor CPU Demo on multiple CPUs http://blogs.technet.com/b/sqlos/archive/2008/01/18/part-2-resource-governor-cpu-demo-on-multiple-c

default リソース プールは、70% 相当前後を推移するように変わり、testWorkloadG1 リソース プールは

30% 相当前後を推移するように変わることを確認できる

1

Page 98: SQL Server 2014 自習書シリーズ No.3

pus.aspx

また、次のホワイト ペーパーもお勧めです。

SQL Server 2012 のリソース ガバナー http://msdn.microsoft.com/ja-jp/library/jj573256.aspx

分類子関数内で利用できる関数

分類子関数は、ユーザーが SQL Server へ接続を確立する時(ログイン時)に実行される関数なので、分類子関数内で利用できる関数は、次の種類のみです。

・HOST_NAME() ・APP_NAME() ・SUSER_NAME() ・SUSER_SNAME() ・IS_SRVROLEMEMBER() ・IS_MEMBER()

アプリケーション名(APP_NAME 関数)での振り分け

APP_NAME 関数は、アプリケーション名を取得できる便利な関数なので、この関数を利用すればアプリケーションごとにワークロード グループを振分けられるようになります。アプリケーションを ADO.NET で作成している場合は、次のように接続文字列(Connection String)の「Application Name」でアプリケーション名を指定することができます。

'' ADO.NET での接続文字列の使用例(アプリケーション名を batch と指定)

Using conn As New SqlConnection()

conn.ConnectionString = "Data Source=localhost;" _

& "Initial Catalog=AdventureWorks2014;" _

& "Integrated Security=SSPI;" _

& "Application Name=batch;"

したがって、アプリケーション(接続文字列)から受け取った「Application Name」を利用して、ワークロード グループを振り分けるように、次のように分類子関数を作成することもできます。

-- APP_NAME 関数で振り分けるユーザー定義分類子関数の作成

USE master

go

CREATE FUNCTION dbo.rg_appName()

RETURNS sysname

WITH SCHEMABINDING

AS

BEGIN

DECLARE @grp_name AS sysname

Page 99: SQL Server 2014 自習書シリーズ No.3

IF (APP_NAME() = 'batch')

SET @grp_name = 'testWorkloadG1'

RETURN @grp_name

END

go

スクリプト生成

Management Studio の GUI 操作で作成したリソース プールやワークロード グループは、次のようにスクリプト生成機能を利用して、SQL ステートメントを生成することもできます。

リソース プールに対してスクリプト生成

ワークロード グループに対してスクリプト生成

スクリプト化したいリソース プールを右クリックして、「リソース プールをスクリプト化」をクリック

1

生成されたスクリプト

2

スクリプト化したいワークロード グループを右クリックして、「ワークロード グルー

プをスクリプト化」をクリック

1

生成されたスクリプト

2

Page 100: SQL Server 2014 自習書シリーズ No.3

SQL Server 2012 からのリソース ガバナーの新機能

SQL Server 2012 からは、リソース ガバナーが強化されて、CPU アフィニティへの対応ができるようになりました(リソース プールの作成時に CAP_CPU_PERCENT や AFFINITY SCHEDULER などを指定できるようになりました)。これにより、サーバー集約化や、ホスティング環境など、複数インスタンスを同居させる場合に大変役立ちます。

これについては、次のホワイト ペーパーが参考になると思います。

SQL Server 2012 のリソース ガバナー http://msdn.microsoft.com/ja-jp/library/jj573256.aspx

SQL Server 2014 からのリソース ガバナーの新機能

SQL Server 2014 からは、物理 I/O の制御ができるようになるなど、さらにリソース ガバナーが強化されています。例えば、I/O 数を 1,000 に制限する場合は、次のようにリソース プールを作成することができます。

CREATE RESOURCE POOL testResourcePool1

WITH( MIN_CPU_PERCENT = 0,

MAX_CPU_PERCENT = 100,

MIN_MEMORY_PERCENT = 0,

MAX_MEMORY_PERCENT = 100,

MIN_IOPS_PER_VOLUME = 0,

MAX_IOPS_PER_VOLUME = 1000, -- I/O 数を 1000 に制限

AFFINITY SCHEDULER = AUTO )

MAX_IOPS_PER_VOLUME や MIN_IOPS_PER_VOLUME がサポートされるようになって、I/O 数を制御できるようになりました。

Page 101: SQL Server 2014 自習書シリーズ No.3

2.7 Spatial データ型による地図データのサポート

Spatial データ型(geometry、geography)は、GIS(地理情報システム)における地図データ(緯度と経度)を格納できるデータ型で、Bing マップ(旧名:Virtual Earth)と連携して、次のように地図アプリケーションとして利用することができる機能です(SQL Server 2008 から提供されました)。

Spatial データ型には、geometry データ型と geography データ型の 2 種類があり、次のような違いがあります。

geometry データ型は「平面」(2 次元)として捕え、geography データ型は「球体」として捕えるという違いがあります。

それでは、これらのデータ型を試してみましょう。

geometry データ型

まずは、 geometry データ型を利用して、単純なデータの格納の仕方などを試してみましょう。次のように記述して、データを格納、取得してみます。

-- データベースの作成

CREATE DATABASE GeoTestDB

go

平面モデル(geometry データ型) 測地モデル(geography データ型)

Page 102: SQL Server 2014 自習書シリーズ No.3

-- テーブルの作成。geom 列を geometry データ型へ設定

USE GeoTestDB

CREATE TABLE geomTest

( a int IDENTITY(1,1) PRIMARY KEY

,geom geometry )

-- データの格納は STGeomFromText。POINT と指定することで「点」を追加

INSERT INTO geomTest

VALUES ( geometry::STGeomFromText('POINT(3 4)', 0) )

-- POLYGON と指定することで「多角形」データを追加

INSERT INTO geomTest

VALUES ( geometry::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 0) )

-- データの確認は STAsText

SELECT geom.STAsText(), * FROM geomTest

STDistance(2点間の距離)

次に、STDistance 関数を利用して、2点間(0 0)と(3 4)の距離を取得してみましょう。

DECLARE @g1 geometry;

DECLARE @g2 geometry;

SET @g1 = geometry::STGeomFromText('POINT(0 0)', 0);

SET @g2 = geometry::STGeomFromText('POINT(3 4)', 0);

SELECT @g1.STDistance(@g2);

結果は、5 が返りますが、次のような三角形を思い浮かべると、イメージが沸くのではないでしょうか。

0 1 2 3 4

POLYGON(( 0 0, 0 2, 2 2, 2 0, 0 0))

0 1 2 3 4

POINT( 3 4 )

POINTは点 POLYGONは多角形

Page 103: SQL Server 2014 自習書シリーズ No.3

STArea(多角形の面積)

次に、STArea 関数を利用して、面積を取得してみましょう。

-- STArea(面積)

DECLARE @g geometry;

SET @g = geometry::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 0);

SELECT @g.STArea()

このように Spatial データ型では、多角形などを処理するための特殊な関数が多数用意されています。そのほかの関数については、オンライン ブックの以下のトピックに記載されているので、こちらもぜひ参考にしてみてください。

geometry インスタンスの OGC メソッド http://msdn.microsoft.com/ja-jp/library/bb933960.aspx

0 1 2 3 4

POINT( 0 0 )

POINT( 3 4 )

0 1 2 3

POLYGON(( 0 0, 0 2, 2 2, 2 0, 0 0))

STArea(面積)は 4

Page 104: SQL Server 2014 自習書シリーズ No.3

geography データ型と Bing マップ連携

次に、geography データ型を利用して、Bing マップと連動したアプリケーションを作成してみましょう。具体的には、次のように「つくば市」内の 4 つの郵便局を Bing マップ上へ表示するようなアプリケーションを作成し、郵便局の「経度」と「緯度」を geography データ型の列へ格納し、それを ASP.NET Web フォームから取得するようにします。

まずは、4 つの郵便局のデータと TX(つくばエクスプレス)のつくば駅の経度と緯度を POINT(点)として、次のように「郵便局」テーブルへ格納します(この SQL は、サンプル スクリプト内の「Step2_Spatial.sql」というファイル名で置いてあります)。

USE GeoTestDB

go

CREATE TABLE 郵便局

( id int IDENTITY (1,1) PRIMARY KEY,

郵便局名 varchar(100),

住所 varchar(200),

geog geography )

go

INSERT INTO 郵便局(郵便局名, 住所, geog)

VALUES ('TXつくば駅', '茨城県つくば市吾妻2丁目128',

geography::STGeomFromText('POINT(140.111561 36.082757)', 4612))

INSERT INTO 郵便局(郵便局名, 住所, geog)

VALUES ('筑波学園郵便局', '茨城県つくば市吾妻1丁目13-2',

geography::STGeomFromText('POINT(140.11575 36.082818)', 4612));

INSERT INTO 郵便局(郵便局名, 住所, geog)

VALUES ('葛城郵便局', '茨城県つくば市苅間388',

geography::STGeomFromText('POINT(140.09617 36.077463)', 4612));

Page 105: SQL Server 2014 自習書シリーズ No.3

INSERT INTO 郵便局(郵便局名, 住所, geog)

VALUES ('谷田部松代郵便局', '茨城県つくば市松代4丁目200-1',

geography::STGeomFromText('POINT(140.103989 36.063796)', 4612));

INSERT INTO 郵便局(郵便局名, 住所, geog)

VALUES ('小野川郵便局', '茨城県つくば市館野464',

geography::STGeomFromText('POINT(140.113192 36.043797)', 4612));

SELECT geog.STAsText(), * FROM 郵便局

STDistance でつくば駅からの距離を取得

次に、STDistance 関数を利用して、TX つくば駅から 4 つの郵便局までの距離を取得してみましょう。

DECLARE @g1 geography

SELECT @g1 = geog FROM 郵便局 WHERE id = 1 -- TX つくば駅

SELECT @g1.STDistance(geog), * FROM 郵便局 WHERE id <> 1

筑波学園郵便局は 377 メートル、葛城郵便局は 1.5 km 離れていることを確認できます。

次に、STDistance を WHERE 句で利用して、TX つくば駅から 2km(2,000 メートル)以内の郵便局を検索してみましょう。

-- TX つくば駅から 2km 以内の郵便局

DECLARE @g1 geography

SELECT @g1 = geog FROM 郵便局 WHERE id = 1

SELECT * FROM 郵便局 WHERE @g1.STDistance(geog) < 2000 AND id <> 1

筑波学園郵便局と葛城郵便局のみがヒットしていることを確認できます。

Page 106: SQL Server 2014 自習書シリーズ No.3

Bing マップとの連携(ASP.NET Web アプリケーション)

次に、ASP.NET と ADO.NET(Visual Studio 2013、Visual Basic)を利用して、geography データ型のデータを取得し、それを Bing マップ上へ表示する ASP.NET Web アプリケーションを作成してみましょう。

Bing マップへの表示部分は、「Bing Maps AJAX Cotrol API」(クライアント サイドの JavaScript)を利用します。また、郵便局のアイコンを表示するために、サンプル スクリプト内の「CustomeIcon.png」ファイルを利用するので、プロジェクト内へ追加しておいてください(Visual Studio 2013 の[プロジェクト]メニューの「既存の項目の追加」から、ファイルを追加することができます)。

また、Visual Studio 2013 の[プロジェクト]メニューの「新しい項目の追加」から「Web フォーム」を選択して、新しい Web フォーム(画面では WebForm1.aspx ファイル)を追加しておきます。

Microsoft.SqlServer.Types.dll への参照追加

geography データ型のデータを取得する部分では、ADO.NET を利用しますが、データを操作する部分(経度や緯度の取得など)では、SqlGeography オブジェクトを利用します。SqlGeography オブジェクトを利用するには、「Microsoft.SqlServer.Types.dll」ファイルへの参照を事前に追加しておく必要があります。このファイルは、次のフォルダーへ格納されています。

C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies

参照の追加は、次のように[プロジェクト]メニューの[参照の追加]から行うことができます。

[プロジェクト]メニューの[既存の項目の追加]からサンプル スクリプト内の

CustomIcon.pngファイルを追加

[プロジェクト]メニューの[新しい項目の追加]から「Web フォーム」を追加

「ASP.NET Web アプリケーション」プロジェクト

1

2

3

Page 107: SQL Server 2014 自習書シリーズ No.3

[参照マネージャー]ダイアログが表示されたら、[参照]ボタンをクリックします。[参照するファイルの選択]ダイアログでは、「Microsoft.SqlServer.Types.dll」ファイルを選択して、[追加]ボタンをクリックします。

これにより、[参照マネージャー]に「Microsoft.SqlServer.Types.dll」ファイルが追加されるので、[OK]ボタンをクリックします。

1

2

2

C:¥Program Files (x86)¥Microsoft SQL Server¥120¥SDK¥Assemblies

フォルダーを参照

1

2

3

1

Page 108: SQL Server 2014 自習書シリーズ No.3

続いて、「Bing Maps AJAX Cotrol API」(クライアント サイドの JavaScript)を利用して、次のように単純な地図(TX つくば駅を中心にした地図)を表示するコードを記述します。

コードは、Web フォーム(WebForm1.aspx)のソースを次のように編集します。

<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>Bing Maps 連携テスト</title>

<script type="text/javascript"

src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0&mkt=ja-jp"></script>

<script type="text/javascript">

var map = null;

function GetMap() {

// TX つくば駅. Zoom 12, road map

map = new Microsoft.Maps.Map(document.getElementById("myMap"), {

credentials: "ここに Bing Maps key を記述",

center: new Microsoft.Maps.Location(36.082757, 140.111561),

mapTypeId: Microsoft.Maps.MapTypeId.road,

zoom: 12

});

}

</script>

</head>

<body onload="GetMap();">

<form id="form1" runat="server">

<div>

</div>

</form>

<h1>Bing Maps 連携テスト</h1>

<div id='myMap' style="position:relative; width:640px; height:480px;"></div>

</body>

</html>

TX つくば駅を中心とした地図を表示。

ズーム レベルを 12 へ指定

Page 109: SQL Server 2014 自習書シリーズ No.3

<head> タグ内の「http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx? v=7.0」で、利用する「Bing Maps AJAX Cotrol API」のバージョンを 7.0 へ指定し、「&mkt=ja-jp」で日本語の地図を指定します。また、<Script> タグ内で GetMap という名前の関数を定義し、Map オブジェクトで「myMap」という名前の地図(Bing Map)を作成しています。「Credentials:」には、Bing Maps key を記述しますが、これは、次のサイトから取得することができます。 http://www.bingmapsportal.com/

Location オブジェクトでは、TX つくば駅の緯度と経度(36.082757, 140.111561)を指定する こ と で 、 こ の 場 所 を 中 心 と し た 地 図 を 表 示 で き る よ う に な り ま す 。「 mapTypeId: Microsoft.Maps.MapTypeId.road」は Road(道路)マップを表示するという指定、「zoom: 12」はズーム レベルの指定です。

このように作成した地図(myMap)を、<body> タグ内の <div> タグで、大きさ(width と Height)を指定して、実際に表示を行っています。

こういった Bing Maps のオブジェクトやメソッドの詳細は、「Bing Maps AJAX Cotrol, Version 7.0」のヘルプ(リファレンス)から確認することができます。 http://msdn.microsoft.com/ja-jp/library/gg427611.aspx

body タグにonload="GetMap();" を追加

head タグ内にJavaScript コードを追加

body タグ内にDIV タグを追加して、id='myMap' を指定

Bing Mapskey(http://www.bingmapsportal.com/

から取得できる)を記述

Page 110: SQL Server 2014 自習書シリーズ No.3

SqlGeography で緯度と経度を取得、Pushpin でプッシュ ピンの追加

次に、ADO.NET で geography データ型のデータ(4つの郵便局の緯度と経度の生データ)を取得して、SqlGeography オブジェクトで緯度と経度を取り出す関数を作成します。取り出した緯度と経度には、Bing Maps のプッシュ ピン機能を利用して、郵便局のアイコン(CustomeIcon .png ファイル)を表示するようにします。

ま ず は 、 Web.config フ ァ イ ル を 開 い て <runtime> 要 素 を 次 の よ う に 記 述 し て 、Microsoft.SQLServer.Types.dll の最新バージョン 12.0.0.0 を使用するように記述します。

<runtime>

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

<dependentAssembly>

<assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />

<bindingRedirect oldVersion="10.0.0.0" newVersion="12.0.0.0" />

</dependentAssembly>

</assemblyBinding>

</runtime>

zoom などの指定

表示する地図の種類の指定

緯度と経度の指定

runtime タグ内にMicrosoft.SqlServer.Types.dll の最新バージョン 12.0.0.0 を使用す

るように記述

Page 111: SQL Server 2014 自習書シリーズ No.3

続いて、ADO.NET でコードを次のように記述します(WebForm1.aspx のコード ビハインド ファイル「WebForm1.aspx.vb」へ記述します)。

Imports Microsoft.SqlServer.Types

Imports System.Data.SqlClient

Function pushPinStr() As String

' 郵便局テーブルの SELECT と SQL Server への接続文字列

Dim sqlstr As String = "SELECT geog, 郵便局名, 住所 FROM 郵便局 WHERE id <> 1"

Dim cnstr As String = "Server=localhost;Database=GeoTestDB;Integrated Security=SSPI"

Dim scriptStr As New StringBuilder("")

Dim shapeStr As String = ""

' SQL Server へ接続して、郵便局テーブルを取得(ADO.NET)

Using cn As New SqlConnection(cnstr)

cn.Open()

Using cmd As New SqlCommand(sqlstr, cn)

Using dr As SqlDataReader = cmd.ExecuteReader()

'' 郵便局の数だけ繰り返し処理

While dr.Read

'' geography データ型のデータを SqlGeography オブジェクトへ格納

Dim geog As New SqlGeography()

geog = dr("geog")

Dim lat As String, lon As String

'' 緯度。Latitude

lat = geog.Lat.ToString()

'' 経度。Longitude

lon = geog.Long.ToString()

'' Bing Maps AJAX Cotrol API(JavaScript)を StringBuilder で文字列として組み立て。

'' プッシュ ピンを追加(entities.push メソッドと Pushpin オブジェクトを利用)

scriptStr.Append("map.entities.push(new Microsoft.Maps.Pushpin(" & vbCrLf)

scriptStr.Append(" new Microsoft.Maps.Location(" & lat & ", " & lon & ")" & vbCrLf)

scriptStr.Append(" , { icon: 'CustomeIcon.png', width: 30, height: 60 }));" & vbCrLf) End While

End Using

End Using

End Using

Return scriptStr.ToString()

End Function

関数(Function)を作成

郵便局の緯度と経度をMaps.Location でプッシュ ピンを作成

SqlGeography オブジェクトの「Lat」プロパティで緯度

「Long」プロパティで経度を取得

郵便局のデータを SELECT

ADO.NET の SqlDataReaderで郵便局の数だけループ処理

名前空間のインポート

Page 112: SQL Server 2014 自習書シリーズ No.3

SqlGeography オブジェクトを利用するために「Microsoft.SqlServer.Types」名前空間をインポートして、このオブジェクトでは、「Lat」プロパティで緯度(Latitude)、「Long」プロパティで経度(Longitude)を取得することができます。これを Bing Maps AJAX Cotrol API の「Location」オブジェクトでプッシュ ピンとして貼り付けるようにしています(各郵便局の緯度と経度に customeIcon.png ファイルを表示)。

また、Web フォーム(WebForm1.aspx)側のソースの GetMap メソッドを次のように変更します。

function GetMap() {

map = new VEMap('myMap');

// TX つくば駅. Zoom 12, road map

map = new Microsoft.Maps.Map(document.getElementById("myMap"), {

credentials: "ここに Bing Maps key を記述",

center: new Microsoft.Maps.Location(36.082757, 140.111561),

mapTypeId: Microsoft.Maps.MapTypeId.road,

zoom: 12

});

// レイヤーへカスタム プッシュピンの追加。関数の呼び出し

<%=pushPinStr %>

}

前の手順で作成した pushPinStr 関数を呼び出して、プッシュ ピンを地図へ追加することで、完成です。

デバッグ実行して、結果を確認してみましょう。

pushPinStr 関数の呼び出し

Page 113: SQL Server 2014 自習書シリーズ No.3

このコードは、単純に 4 つの郵便局を表示するだけですが、前述の STDistance 関数などと組み合わせて利用することで、より実践的なアプリケーションを作成できるようになります。

なお、実行時に、「SqlGeography」でのキャスト エラーが発生する場合は、「geog = dr("geog")」の部分を、次のように変更して実行してみてください。

geog = SqlGeography.Deserialize(dr.GetSqlBytes(0))

Note: Reporting Services の Bing Maps 連携機能

SQL Server 2014 の Reporting Services には、Spatial データ型(geography/geometry)のデータをもとに、Bing Maps のレポートを作成する機能があります(SQL Server 2008 R2 から利用できる機能です)。これを利用すれば、プログラム コードを一切記述することなく、次のようなレポートを作成することができます(マップ ウィザード機能によって、GUI 操作のみで作成ができます)。

Reporting Services のレポート作成ツール「レポート ビルダー」の

「マップ ウィザード」機能によって、GUI 操作だけで Bing Map を表示する

レポートを作成可能

Page 114: SQL Server 2014 自習書シリーズ No.3

2.8 Reporting Services の大幅強化

Reporting Services(標準搭載されるレポート サーバー機能)は、SQL Server 2005 のときとは別製品と言っても過言ではないくらい、大きく進化しています。

SQL Server 2008 からの Reporting Services の新機能

SQL Server 2008 からは、Reporting Services が大幅に強化されて、次のような実践的なレポートを簡単に作成できるようになりました。

売上分析レポートや帳票

ゲージで目標達成率、傾向を表示

移動平均線、ボリンジャーバンド 箱ひげ、範囲グラフ

ガント チャート

ドーナッツ グラフ バブル チャート レーダー チャート

積み上げ横棒平滑折れ線 補助円グラフ

漏斗(じょうご)

Page 115: SQL Server 2014 自習書シリーズ No.3

このように SQL Server 2008 からは、見栄えが良く、実践的なグラフを簡単に作成できるようになりました。そのほかの SQL Server 2008 からの Reporting Services の主な新機能は、次のとおりです。

レポート ビルダー ツールによって、レポート作成の操作性が大幅に向上

作成できるグラフの種類の増加

2Y軸グラフのサポート(グラフ分割も可能)

移動平均やボリンジャー バンドなどの計算系列のサポート

グラフ データで突出値があった場合の破線表示(省略表示)のサポート

マトリックス(クロス集計レポート)で柔軟なレイアウトを提供する「Tablix」(テイブリックス)機能の提供

達成率などをグラフィカルに表示できる「ゲージ」機能の提供

画像や組み込みフィールド、パラメーターなどのドラッグ&ドロップでのレポート配置

文字列とデータ フィールドの連結を容易にする「リッチ テキスト ボックス」の提供

Microsoft Office Word へのエクスポート機能

IIS(Internet Information Services)に依存しないレポート サーバー

これらのレポートは、次のように「レポート ビルダー」ツールを利用して、容易に作成することができます。

レポート ビルダー ツールを利用してレポートを作成しているときの様子

多彩なグラフ

ゲージ

Page 116: SQL Server 2014 自習書シリーズ No.3

SQL Server 2008 R2 からの Reporting Services の新機能

Reporting Services は、SQL Server 2008 R2 からもたくさんの機能が追加されています(地図レポートが作成できるようになったなど)。新しく提供された主な機能は、次のとおりです。

マップ(地図)機能の追加。Bing マップとの連携も可能

データバー、インジケーター、スパークライン機能の提供

共有データセットによるデータセットの共有およびキャッシュ機能

共有レポート パーツによるオブジェクトの共有

これらのレポートを作成する手順や、共有データセット/共有レポート パーツを利用する手順については、SQL Server 2012 の自習書シリーズの「Reporting Services によるレポート作成 上・中・下」編で詳しく説明しているので、こちらもぜひご覧いただければと思います。

Page 117: SQL Server 2014 自習書シリーズ No.3

SQL Server 2012 からの Reporting Services の新機能

Reporting Services は、SQL Server 2012 からも新しい機能が提供されています。その主なものは、次のとおりです。

Power View による容易なデータ分析レポートの作成

SQL Server 2012 からは、Power View と呼ばれる、新しいデータ分析/レポーティング ツールが提供されました。Power View を利用すると、容易に見栄えの良いデータ分析レポートを作成することが可能です。

以下の画面は、Power View を利用してデータ分析レポートを作成しているときの様子です。

Power View を利用すると、従来のレポーティング ツールではできなかった、さらに表現力豊かなレポートを、簡単に作成することができます。また、よりエンドユーザーが使いやすいように、直感的な操作ができるようになっています。

Reporting Services での Excel エクスポート時のフォーマットが xlsx 形式へ変更

SQL Server 2008 R2 までは Office 2003 形式の .xls、SQL Server 2012 からは Office 2007 以降の .xlsx 形式に対応するようになりました。

Reporting Services のデータ警告(Alert/通知)機能

SQL Server 2012 からは、Reporting Services の新機能の 1 つとして「データ警告」機能が提供されました。この機能を利用すれば、レポート内のデータを利用して、特定のルールに基づいて、メールを送信するといったことを簡単に行えるようになりました。例えば、「在庫<=発注点」というルールを設定して、在庫が発注点を下回ったら、メールを送信する、という設定の場合は、次のように設定します。

画像を表示可能

推移を確認可能な動的なバブル チャート

グラフが動的に変化。グラフ自身がスライサー(フィルター)となる

Power View で、データ分析レポートを作成しているときの様子

Page 118: SQL Server 2014 自習書シリーズ No.3

SQL Server 2014 からの Reporting Services の新機能

SQL Server 2014 の Reporting Services からは次の機能が追加されています。

Power View レポートの Analysis Services 多次元モデルへの対応

SQL Server 2012 の Power View レポートでは、PowerPivot ファイルまたは Analysis Services のテーブル モード(表形式モード)をデータソースにすることしかできませんでしたが、SQL Server 2014 からは Analysis Services の多次元モデル(従来ながらの OLAP キューブ)をデータソースにすることもできるようになりました。

以上のように、Reporting Services は、本当に大きく進化しています。SQL Server 2005 の Reporting Services とは別製品と言っても過言ではないくらい大きく進化しているので、ぜひ試してみてください。

データ警告の設定

「在庫 <= 発注点」というルールを設定し、在庫が発注点を下回ったらメールを送信するようにデータ警

告を設定

メールの送信先や件名の設定

警告を実行する間隔を設定

在庫 <= 発注点という条件に合致するデータのみが送信

されてきている

データ警告機能によって送信された

メール

Page 119: SQL Server 2014 自習書シリーズ No.3

2.9 PowerPivot によるインメモリ BI

PowerPivot は、SQL Server 2008 R2 から提供されたデータ分析のためのツールで、次の 2種類があります。

PowerPivot for Excel

PowerPivot for SharePoint

PowerPivot for Excel は、Excel 2010/2013 のアドインとして提供されるクライアント側のツール、PowerPivot for SharePoint は、SharePoint Server 2010/2013 と統合されたサーバー側の機能です。

PowerPivot for Excel

PowerPivot for Excel は、PowerPivot(パワー ピボット)という名のとおり、従来の Excel のピボット テーブル機能を大きく進化させたようなツールです。これを利用すると、次のような見栄えの良いデータ分析レポート(ピボット テーブルやグラフ)を簡単に作成することができます。

フィールド(列)一覧

ピボット テーブル

垂直スライサー

水平スライサー

ピボット グラフ

Page 120: SQL Server 2014 自習書シリーズ No.3

PowerPivot for Excel の主な特徴は、次のとおりです。

インメモリ アーキテクチャによる高速なデータ処理

64 ビット(x64)にも対応(32 ビット版と 64 ビット版の提供)

さまざまなデータソースへの対応(SQL Server だけでなく、Excel ファイルや Oracle、DB2、Teradata、Sybase、Infomix、Microsoft Azure SQL データベース、Reporting Services、テキスト ファイル、Web ページ(HTML ファイル)、Analysis Services、Microsoft Access などにも対応)

Excel の上限である 100万件を超えるデータにも対応(Excel で扱えるデータ量の上限の 1,048,576 行以上のデータにも対応。x64 環境でメモリを多く搭載していれば、数億件のデータでも高速なデータ処理が可能)

PowerPivot for Excel の最も大きな特徴は、さまざまなデータソースへ対応している点です。SQL Server だけでなく、普段使い慣れた Excel のワークシートや Reporting Services のレポート、Microsoft Azure SQL データベース、Analysis Services の多次元データベースなどをデータソースにすることができます。いろいろなデータソースのデータを組み合わせてピボット テーブルやピボット グラフが作成できるのが最大の利点です。

なお、PowerPivot for Excel は、SQL Server 2008 R2/2012 のときは、「Microsoft SQL Server PowerPivot」と呼ばれて、Excel 2010 のアドインであるものの SQL Server の機能の一部として扱われていましたが、Excel 2013 以降では、Excel 2013 に標準で搭載されるようになったので、Excel 2013 の機能の一部(アドイン)として扱われるようになりました。

Page 121: SQL Server 2014 自習書シリーズ No.3

PowerPivot for SharePoint

PowerPivot for SharePoint は、SharePoint Server 2010/2013 と統合されたサーバー側の機能で、主な特徴は次のとおりです。

作成した分析レポートの「共有」および「セキュアなデータ格納」

Excel Services と統合した Web ブラウザー ベースの共有

共有のための見栄えの良い Web パーツ(Silverlight ベース)

バックグラウンドでのデータ更新(バッチ実行)

サーバー利用状況を監視するためのダッシュボード(CPU 利用率やメモリ使用量、リクエスト数、利用数の多い上位レポートなどをグラフィカルに表示)

分析レポートの共有

作成した分析レポートの共有(SharePoint Server 2010 の場合)

分析レポートの共有

Excel Services 機能により、Web ブラウザーから

分析レポートを参照可能

Excel Services による Web ブラウザーからの分析レポート参照

Page 122: SQL Server 2014 自習書シリーズ No.3

PowerPivot for SharePoint は、Excel Services と統合されているので、Web ブラウザーを利用して分析レポートを参照することができます(Excel を開くことなく、Web ブラウザー上でスライサーによるフィルター操作やワークシートの移動などが可能です)。

もちろん、次のように Excel 2010/2013 での編集も可能で、かつチェックアウト/チェックイン機能やセキュリティ設定によって、同時更新やアクセス制御を行うこともできます。

また、共有のための見栄えの良い Web パーツ(Silverlight で作成された Web パーツ)として、「PowerPivot ギャラリー」が提供されているので、分析レポートを一覧しやすくなっています。

PowerPivot for SharePoint では、そのほかにも、データ更新をバックグラウンドでバッチ実行す

チェックインやチェックアウトで同時編集を制御

Excel での編集

セキュリティ設定によりアクセス制御が行える

Silverlight ベースのPowerPivot ギャラリー

の Carousel ビュー

Page 123: SQL Server 2014 自習書シリーズ No.3

るための機能(夜間にスケジュールしておくなど)や、サーバー利用状況を監視するための管理ダッシュボード(CPU 利用率やメモリ使用量、リクエスト数、利用数の多い上位レポートなどをグラフィカルに表示)機能なども提供されています。

管理ダッシュボードは、次のように利用することができます。

このように PowerPivot は、PowerPivot for SharePoint と組み合わせることで、データ分析レポートを複数のユーザーでの共有できるようになります。

PowerPivot for Excel の実際の利用方法については、SQL Server 2012 の自習書シリーズの「PowerPivot for Excel によるセルフ サービス分析」、PowerPivot for SharePoint 環境のセットアップ方法については、「Power View&Reporting Services」編で説明しているので、こちらもぜひご覧いただければと思います。

PowerPivot for Excel の SQL Server 2012 からの新機能

PowerPivot for Excel は、SQL Server 2012 でバージョン アップして、多くの新機能が提供されました(PowerPivot 2.0 になりました)。その主なものは、以下のとおりです。

KPI(Key Performance Indicator:重要業績評価指標)への対応

書式(Format)設定の永続化により、書式がピボットテーブルへ反映可能に

並べ替え列のサポートにより、別の列で並べ替えが可能に

ダイアグラム ビューによるグラフィカルなリレーションシップ管理のサポート

階層のサポートにより、階層関係のあるフィールド(例えば、大分類→中分類→小分類→商品のような関係)をワンクリックで配置可能に

フィールド一覧に表示されるフィールドの表示順序の変更が可能に

1

実行時間の長いクエリ数

ユーザー接続数やクエリ数

クエリ数やファイル サイズ

CPU やメモリ使用量

Page 124: SQL Server 2014 自習書シリーズ No.3

パースペクティブのサポートにより、不要な列/メジャーを簡単に非表示に可能

ドリルスルーのサポート

BLOB データ(varbinary(max))のサポート

DAX(Data Analysis Expressions)関数の大幅強化。PATH や PATHITEM 関数によって親子階層への対応も可能

以下の画面は、ダイアグラム ビューでリレーションシップを設定しているときの様子です。

以下の画面は、KPI をグラフィカルに設定しているときの様子です。

このように PowerPivot for Excel は進化し、さらに本格的なデータ分析レポートが簡単に作成で

階層の作成が可能

リレーションシップをグラフィカルに編集可能

KPI や計算メジャー

並べ替え列も設定可能

KPI をグラフィカルに設定

Page 125: SQL Server 2014 自習書シリーズ No.3

きるようになりました。

ビッグデータ対応のインメモリ BI

PowerPivot は、すべてのデータをメモリ内へ配置して動作する「インメモリ BI」機能です。「xVelocity エンジン」と呼ばれるエンジンを採用して、カラムベースでデータを格納し、高度な圧縮技術を利用しています(xVelocity は、SQL Server 2008 R2 のときは VertiPaq と呼ばれていたエンジンで、これを進化させたものです)。

SQL Server 2012 からは、PowerPivot のサーバー版として、Analysis Services の「テーブル モード」(Tabular Mode:表形式モード)が搭載されて、以下の機能も利用できるようになりました。

大量データへの対応(ビッグデータ対応)

パーティショニング

ロールを利用した行レベル セキュリティ

これによって、ビッグデータへの対応や、性能向上(従来ながらの OLAP キューブよりも高速)、セキュリティ強化を実現できるようになりました。

Analysis Services のテーブル モードは、SQL Server 2014 のインストール時に、次のように[Analysis Services の構成]ページで「表形式モード」を選択することで、インストールすることができます。

Analysis Services のテーブル モードの利用方法については、SQL Server 2012 の自習書シリーズの「Analysis Services によるインメモリ BI 入門」編で説明しているので、こちらもぜひご覧いただければと思います。

表形式モード (Tabular Mode)選択するとxVelocity モードの Analysis Services

(インメモリ BI)としてインストール可能。

Page 126: SQL Server 2014 自習書シリーズ No.3

BI システムとしての SQL Server

SQL Server の BI まわりの機能は、バージョンが上がるごとに大きく進化して、”現場で使える" 機能がどんどん増えています。

SQL Server には、次のように「BI」(Business Intelligence:ビジネス インテリジェンス)システムを構築するために必要となる機能がすべて標準で搭載されています。

データの抽出・変換が行える「Integration Services」、データ ウェアハウス(データの格納先)としての「Database Engine」、データ分析のためのサーバー機能を提供する「Analysis Services」、レポート機能を提供する「Reporting Services」など、BI システムを実現するためのすべての機能が SQL Server の標準コンポーネントとして提供されているので、手軽に(それでいて高度な)BI システムを構築することができます。

実際、BI 機能を利用する目的だけで SQL Server を導入する企業もどんどん増えており、弊社のお客様にもたくさんいらっしゃいます。弊社のお客様では、業務システムは Oracle やメインフレーム、そこからデータを抽出してデータ分析レポートを作成する BI/DWH システムには SQL Server を採用している、というケースが多数あります。もちろん、業務システムに SQL Server、BI システムも SQL Server というお客様もいらっしゃいますし、弊社の BI/DWH システム構築サービスへのお問い合わせもここ数年非常に増えています。

特に、Reporting Services は非常に好評で、これを利用すれば Excel と同じようなレポートを作成することができるので、弊社のお客様では、今まで Excel で(人手で)管理していたワークシート(分析レポート)を、Reporting Services に移行することで分析レポートの作成を自動化する、といった使い方をしていたりします。これによって、人手で管理していた運用コストの削減と、人手を介すことによって発生していた人的ミス(計算間違いや操作ミスなど)を回避できるようになりました。

Page 127: SQL Server 2014 自習書シリーズ No.3

マイクロソフトの BI 機能は、Excel のアドオンとしても進化をしています。例えば、Power Map for Excel というアドオンを利用すれば、次のように地図データを可視化することができます。

Power Map for Excel は、SQL Server 上のデータと連動させることができるので、本当に便利です(見栄えの良い地図レポートを簡単に作成することができます)。

*上の画面は、Power BI 作業開始ガイド(https://support.office.com/ja-jp/article/Power-BI---%E4%BD%9C%E6%A5%AD%E3%81%AE%E9%96%8B%E5%A7%8B%E3%82%AC%E3%82%A4%E3%83%89-bd30711a-7ccf-49e8-aafa-2e8f481e675d?ui=ja-JP&rs=ja-JP&ad=JP)より引用

Page 128: SQL Server 2014 自習書シリーズ No.3

2.10 AlwaysOn 可用性グループによる可用性の向上/DR の実現

SQL Server 2012 から提供された新機能のうち、一番の目玉機能/役立つ機能が「AlwaysOn 可用性グループ」(Availability Group)です。AlwaysOn 可用性グループは、DBM(データベース ミラーリング)と WSFC(Windows フェールオーバー クラスタリング)の良いところどりをしたような機能で、DBM の進化版として捕らえると分かりやすい機能です。データベース複製の基本的な仕組みの部分は、DBM と良く似ていて、DBM を利用したことのある方にはお馴染みのキーワードが多く出てきます。

同期モードと非同期モード(データベースの複製モード)

可用性グループでのデータベースの複製は、DBM と同様に、「同期モード」と「非同期モード」のどちらかを選択することができます。同期モードの場合は、次のように動作します。

DBM の場合と同様、可用性グループは、トランザクション ログ(更新履歴)をベースとしたテクノロジーで、プライマリはログの情報を圧縮してセカンダリへ転送し、セカンダリはログを受け取ったことをプライマリへ伝えます。プライマリがこれを受け取って、はじめて処理が完了(トランザクションが完了)になります。このようにセカンダリへのログの転送が完了するのを待っているので(同期をとっているので)、この動作は「同期モード」と呼ばれています。なお、同期モードでは、障害が発生したときにプライマリとセカンダリの役割を自動的に入れ替える「自動フェールオーバー」を設定することも可能です。

これに対して、セカンダリがログを受け取ったことを確認せずに、処理を完了とするのが「非同期モード」(パフォーマンスを重視したモード)です。このモードは、遠隔地へのデータベースの複製時に利用できるので、DR(災害復旧)用途として利用することができます。

AlwaysOn 可用性グループの基本構成

AlwaysOn 可用性グループでは、最大 8 つのセカンダリ(データベースの複製)を作成することができます(SQL Server 2012 のときは最大 4 つまででしたが、SQL Server 2014 から最大 8つまで作成できるようになりました)。クライアントからは、次のように「リスナー」と呼ばれる仮想サーバー名を介してアクセスするので、どのサーバーが処理しているかは意識する必要はありません。

Page 129: SQL Server 2014 自習書シリーズ No.3

フェールオーバー(プライマリとセカンダリの役割変更)があったとしても、クライアントのアプリケーションを修正する必要はなく、同じサーバー名で透過的にアクセスすることが可能です。フェールオーバーにかかる時間は、わずか 10~20秒程度であり、WSFC の場合の 30秒~数分かかるのに比べて、ダウンタイムを大幅に短縮することもできます。

AlwaysOn 可用性グループの利点

AlwaysOn 可用性グループの利点は、次のとおりです。

ウィザードによる容易な設定およびダッシュボードによる容易な監視が可能

セカンダリを遠隔地へ配置した DR(災害復旧)構成が可能。災害からの復旧時にも、

アプリケーションを修正することなく同じサーバー名(リスナー)でアクセス可能なため、ダウンタイム(停止時間)を大きく短縮可能

Page 130: SQL Server 2014 自習書シリーズ No.3

セカンダリに対して読み取りアクセスが可能(レポーティング ツールのような読み取り中心のアプリケーションが、プライマリへ負荷をかけることなく、読み取り操作が可能)

セカンダリからバックアップを取得可能(プライマリへ負荷をかけることなく、バックアップを取得することが可能)

データ転送時の圧縮と暗号化が可能(データベース複製時の転送データは自動圧縮されるためパフォーマンス良く複製することが可能。暗号化によるセキュリティ強化も可能)

自動ページ修復機能(万一プライマリ上のデータベース ページが破損した場合には、セカンダリ上の正常なページを利用して、自動修復が可能)

柔軟なフェールオーバー ポリシー(フェールオーバーを発生させる障害のレベルを 5 段階で調整可能)

共有ストレージが不要な分、コスト削減が可能(可用性グループでは、それぞれのノードがローカル ディスク内にデータベースの複製を保持するため、共有ストレージが不要。通常、WSFC を構成する場合は、エントリー クラスの共有ストレージで数百万円、ミドル クラスだと一千万前後、その分のコスト削減が可能)。また、DBM のように監視サーバーを別途用意する必要がないため、その分のコスト削減も可能

包含データベース(Contained Database)機能により、ログイン アカウントや照合順序に依存しないデータベースが作成可能になり、障害時のダウンタイム(停止時間)を短縮可能(従来のバージョンでは、障害によるフェールオーバー発生後は、ログイン アカウントとデータベース ユーザーとのマッピングの修復が必要)。

このように、AlwaysOn 可用性グループには多くの利点があり、従来のバージョンの DBM(データベース ミラーリング)機能ではサポートされなかった複数セカンダリ(最大 8 台まで構成可能。DBM では 1 台まで)や、セカンダリに対する読み取り操作/バックアップ操作が可能なアクティブ セカンダリが実装されています(DBM の場合はスナップショット作成時点での過去データの読み取りのみがサポートされるのに対して、可用性グループではリアルタイムでの読み取り操作が可能です)。

また、従来のバージョンだと複数のテクノロジーを組み合わせないと実現できなかった構成(ローカル環境での高可用性と、遠隔地サーバーによる DR 構成を実現するには「WSFC と DBM 非同期モード」あるいは「WSFC とログ配布」などの組み合わせが必要だったもの)を、可用性グループではウィザード 1 つで設定可能になりました。障害からの復旧時にも、アプリケーションを修正する必要がないので(同じサーバー名でアクセスできるため)、ダウンタイム(停止時間)を大きく短縮することが可能です。

AlwaysOn 可用性グループを利用するための主な前提条件

AlwaysOn 可用性グループを利用するための主な前提条件は、次のとおりです。

WSFC(Windows Server フェールオーバー クラスター)のノードであること

可用性グループでは、各ノードの障害検知に WSFC のリソース監視機能を利用している

Page 131: SQL Server 2014 自習書シリーズ No.3

ので、可用性グループ を構成するメンバーは、必ず WSFC のノード(WSFC の管理ツールであるフェールオーバー クラスター マネージャー上で「ノード」として認識されているサーバー)である必要があります。

これらのノードに対して、通常の SQL Server のインストールと同様、それぞれのローカル ドライブへインストールした SQL Server のインスタンス、またはフェールオーバー クラスター インスタンス(SQL Server クラスター)としてインストールした SQL Server インスタンスを可用性グループのメンバーにすることができます(どちらの場合も SQL Server 2014 Enterprise エディションが必須)。

可用性グループへ参加させるメンバーは、同じ Active Directory ドメインへ参加していること

可用性グループを構成する各 SQL Server のインスタンスは、サーバー レベルの照合順序を統一しておくこと(同じ照合順序を利用していること)

SQL Server のサービス アカウントをドメイン ユーザーへ設定して、すべてのノードで同じアカウントを利用していること

対象データベースの復旧モデルが「完全」であること

SQL Server 構成マネージャー ツールを利用して、AlwaysOn 可用性グループを有効化しておくこと(後述)

これらの前提条件に関しては、SQL Server 2012 の自習書シリーズの新機能編 No.2「SQL Server AlwaysOn による可用性の向上」で詳しく説明しているので、こちらもぜひご覧いただければと思います。

AlwaysOn 可用性グループの有効化

AlwaysOn 可用性グループを有効化するには、次のように「SQL Server 構成マネージャー」ツールで「SQL Server サービス」のプロパティを開いて、[AlwaysOn 高可用性]タブで「AlwaysOn 可用性グループを有効にする」をチェックします。

2

1 3

4

5

6

Page 132: SQL Server 2014 自習書シリーズ No.3

この設定は、可用性グループを構成する全てのサーバー上で行っておく必要があります。なお、WSFC(Windows Server フェールオーバー クラスター)のノードでない場合には、このオプションはグレーアウトされていて、設定することができません。

AlwaysOn 可用性グループの設定方法

AlwaysOn 可用性グループの設定方法は、次のとおりです。

1. 可用性グループ(Availability Group)を設定するには、次のように Management Studio で[AlwaysOn 高可用性]フォルダーを右クリックして、[新しい可用性グループ ウィザード]をクリックします。

これにより、[新しい可用性グループ]ウィザードが起動するので、[次へ]ボタンをクリックします。

2. 次の[可用性グループ名の指定]ページでは、[可用性グループ名]へ任意の名前を入力(画面は AG1)して、[次へ]ボタンをクリックします。

1

2

Page 133: SQL Server 2014 自習書シリーズ No.3

3. 次の[データベースの選択]ページでは、対象としたいデータベースを選択(画面は AGTestDB)して、[次へ]ボタンをクリックします。

4. 次の[レプリカの指定]ページでは、[レプリカの追加]ボタンをクリックして、追加したいセカンダリへ接続します。

1

2

2

1

Page 134: SQL Server 2014 自習書シリーズ No.3

以下の画面は、2 台のセカンダリを追加したときの様子です(3 台のノードで可用性グループを構成)。

SERVER1 と SERVER2 の[自動フェールオーバー]をチェックすると、[同期コミット]も自動的にチェックされて、SERVER1 と SERVER2 を自動フェールオーバーが可能な同期モードへ設定することができます。SERVER3 は、[同期コミット]のチェックを外しておくことで、非同期モードへ設定することができます。

2

3

1

セカンダリへ設定したいSQL Server の名前を指定

SERVER2 と入力

自動フェールオーバーに設定したレプリカ

セカンダリへのアクセスを許可する設定

非同期モード(高パフォーマンス)に設定したセカンダリ

3 台のノードで可用性グループを構成

Page 135: SQL Server 2014 自習書シリーズ No.3

[読み取り可能なセカンダリ]では、「はい」を選択することで、セカンダリに対しても読み取りアクセスができるようになります。

5. 次に、[リスナー]タブを開きます。このタブでは、リスナーを作成することができます(リスナーは、仮想サーバー名/仮想 IP アドレスになるもので、クライアントからの接続時に利用されるサーバー名(SQL Server の名前)になります)。

次のように[可用性グループ リスナーの作成]を選択して、[リスナーの DNS 名]へ任意の名前(画面は AG1_Listener)、[ポート]へは任意のポート番号(SQL Server の既定のポート番号は 1433)、[ネットワーク モード]で「静的 IP」を選択して、[追加]ボタンをクリックします。

[IP アドレスの追加]ダイアログが表示されたら、任意の静的な IP アドレス(画面は 192.168.1.112)を入力して、[OK]ボタンをクリックします。[レプリカの指定]ページへ戻ったら、[次へ]ボタンをクリックして、次のページへ進みます。

6. 次の[最初のデータ同期を選択]ページでは、「完全」を選択して、[すべてのレプリカからアクセス可能な共有ネットワーク場所を指定]で共有フォルダーへのパス(画面は \\SERVER1\AGtemp)を入力して、[次へ]ボタンをクリックします。

3

2

4

5

1

Page 136: SQL Server 2014 自習書シリーズ No.3

7. 次の[検証]ページでは、可用性グループを構成できるかどうかの検証が行われます。

すべての[結果]が「成功」と表示されていることを確認して、[次へ]ボタンをクリックします。

8. 次の[概要]ページでは、内容を確認して、[完了]ボタンをクリックします。

3

2

1

1

Page 137: SQL Server 2014 自習書シリーズ No.3

これにより、可用性グループの構築が始まります。

9. すべての構築が完了すると、次のように結果が表示されます。

すべての[結果]が「成功」となっている場合は、可用性グループの構築が成功です。

1

1

Page 138: SQL Server 2014 自習書シリーズ No.3

10. 可用性グループの構築が完了したら、[表示]メニューの[オブジェクト エクスプローラーの詳細]をクリックします。これにより、次のようにセカンダリとの接続状態や同期の状態(同期済みかどうかなど)を確認することができます。

リスナー(仮想サーバー名)の確認

次に、ウィザードで作成したリスナーを確認します。

11. 作成されたリスナーを確認するには、次のように[可用性グループ リスナー]フォルダーを展開します。

12. リスナーは、内部的には、WSFC のリソース(ネットワーク名および IP アドレス リソース)として登録されます。これを確認するには、次のように WSFC の管理ツールである「フェールオーバー クラスター マネージャー」を起動して、[役割]を開きます。

セカンダリとの接続状態

セカンダリとの同期の状態非同期モードは ”同期中”

と表示される

作成されたリスナー

リスナーの利用するポート暗号

Page 139: SQL Server 2014 自習書シリーズ No.3

13. 次に、作成したリスナー(AG1_Listener)を利用して、SQL Server への接続を試みてみましょう。オブジェクト エクスプローラーで、次のように[接続]メニューの[データベース エンジン]をクリックして、リスナーの名前を入力し、[接続]ボタンをクリックします。

14. 次に、データベースを展開して、テーブルなどを参照できることを確認しておきましょう。

作成されたリスナー

可用性グループの名前

現在の所有者

作成したリスナーの名前を入力

1

2

3

AGTestDB データベース内の t1 テーブル

Page 140: SQL Server 2014 自習書シリーズ No.3

15. 次に、オブジェクト エクスプローラーでリスナー名を右クリックして、[プロパティ]をクリックし、サーバー プロパティを表示してみます。

[名前]には、実際のプライマリの名前(SERVER1)が表示されていることを確認できます。

ダッシュボードで監視

AlwaysOn 可用性グループは、ダッシュボード機能が提供されているので、現在の状態をグラフィカルに監視することが可能です。ダッシュボードを利用するには、次のように[可用性グループ名](画面は AG1)を右クリックして、[ダッシュボードの表示]をクリックします。

ダッシュボードは、次のように表示されます。

1

2

1

Page 141: SQL Server 2014 自習書シリーズ No.3

セカンダリへの読み取りアクセス

次に、セカンダリへの読み取りアクセスが問題なく行えることを確認してみましょう。セカンダリ(画面は SERVER2)へ接続して、SELECT ステートメントを実行してみましょう。

このように、可用性グループでは、セカンダリに対する読み取りアクセスができる点が大きなメリットです。

ダッシュボードで現在の状態を容易に把握できる

セカンダリへ接続

1データベース内を参照できる

2

Page 142: SQL Server 2014 自習書シリーズ No.3

セカンダリ側でのデータベース バックアップの取得

次に、セカンダリ側でデータベースの完全バックアップを実行してみましょう、これを行うには、セカンダリ ( SERVER2 など) へ接続し て、 次のように BACKUP ステートメ ントで COPY_ONLY オプションを利用します。

BACKUP DATABASE AGTestDB

TO DISk = 'C:\temp\AGTestDB.bak'

WITH COPY_ONLY

このように、可用性グループでは、セカンダリに対してバックアップを実行することができるので、テスト環境などを作成する際に大変便利です(本番環境と同じ環境を作成するのに、本番環境=プライマリ サーバーへの負荷をかけることなく行うことができるようになります)。

手動フェールオーバーで動作確認

次に、手動フェールオーバーを実行して、プライマリとセカンダリの役割を変更してみましょう。

1. 手動フェールオーバーを実行するには、セカンダリ(画面は SERVER2)へ接続して、[可用性グループ]フォルダーの可用性グループ名(AG1)を右クリックして、[フェールオーバー]をクリックします。

2. これにより、[可用性グループのフェールオーバー]ウィザードが起動するので、[次へ]ボタンをクリックします。

SERVER2へ接続

1

可用性グループ名(AG1)を右クリックして[フェールオー

バー]をクリック

2

Page 143: SQL Server 2014 自習書シリーズ No.3

3. 次の[新しい プライマリ レプリカの選択]ページでは、セカンダリ(画面は SERVER2)を選択して、[次へ]ボタンをクリックします。

4. 次の[概要]ページでは、内容を確認して、[完了]ボタンをクリックします。

1

1

Page 144: SQL Server 2014 自習書シリーズ No.3

これでフェールオーバーが開始され、フェールオーバーの実行中は、次のように[進行状況]ページが表示されます。

5. フェールオーバーが完了すると、次のように[結果]ページが表示されます。

1

Page 145: SQL Server 2014 自習書シリーズ No.3

これで手動フェールオーバーが完了です。フェールオーバーにかかる時間は、実行されているトランザクション量にもよりますが、10~20秒程度で完了します。WSFC(Windows Server フェールオーバー クラスター)を利用した SQL Server クラスターでは、30秒~1分程度の時間がフェールオーバーにかかるので、可用性グループのほうがダウンタイム(障害発生時の停止時間)を大幅に短縮することができます(これは、可用性グループの大きなメリットです)。

なお、手動フェールオーバーを SQL ステートメントから実行したい場合には、次のように ALTER AVAILABILITY GROUP ステートメントを実行します。

ALTER AVAILABILITY GROUP [可用性グループ名] FAILOVER

6. フェールオーバーが完了したら、フェールオーバーが成功したことをオブジェクト エクスプローラーから確認しておきましょう。

1

役割が入れ替わっていることを確認

Page 146: SQL Server 2014 自習書シリーズ No.3

7. また、フェールオーバー クラスター マネージャーからもリソースの所有者が新しいプライマリ(画面は SERVER2)へ変更されていることを確認しておきましょう。

8. 次に、オブジェクト エクスプローラーでリスナー名で接続して、サーバーのプロパティを表示します。

[名前]には、新しいプライマリのサーバー名(SERVER2)が表示されていることを確認できます。

以上が 可用性グループの基本的な利用方法になります。非常に簡単にデータベースの複製を作成できることを確認していただけたのではないでしょうか。可用性グループでは、アプリケーションからの接続や、障害発生時の復旧作業も簡単に行うことができます。これらについては、SQL Server 2012 の自習書シリーズの新機能編「No.2 SQL Server AlwaysOn による可用性の向上」で詳しく説明しているので、こちらもぜひご覧いただければと思います。

「所有者ノード」が変更されていることを確認

1

2

Page 147: SQL Server 2014 自習書シリーズ No.3

2.11 AlwaysOn フェールオーバー クラスター インスタンス(FCI)

AlwaysOn フェールオーバー クラスター インスタンス(FCI)は、WSFC(Windows Server フェールオーバー クラスタリング)のリソースとしてインストールした SQL Server インスタンス(SQL Server クラスター)のことを指します。

SQL Server 2012 からは、従来のバージョンの SQL Server クラスターと比べて、次の機能が強化されています。

SMB 接続(共有フォルダー)へのデータベース配置が可能

SQL Server 2012 からは、共有ストレージが必須ではなくなり、データベースのインストール先としてネットワーク上の共有フォルダーを選択可能

tempdb データベースをローカル ディスクへ配置可能

ボトルネックになりやすい tempdb データベースをローカル ディスクへ配置できることで、SSD などより高速な内蔵ストレージへ配置して性能向上を実現可能

複数サイト(複数サブネット)フェールオーバー クラスタリングのサポート

従来のバージョンではサブネットをまたがったクラスタリングは構成不可。SQL Server 2012 からはサブネットをまたがった構成が可能に

柔軟なフェールオーバー ポリシー

フェールオーバーを発生させる障害のレベルを 5 段階で調整可能。障害検知をより詳細に行うことが可能

このように SQL Server 2012 では、SQL Server クラスターが強化されて柔軟な構成をとれるようになりました。これらは、可用性の向上に繋がるだけでなく、性能向上にも役立つものです。

SQL Server 2014 からは、SQL Server クラスターで CSV(クラスター共有ボリューム)がサポートされるなど、さらにパワーアップしています。

共有フォルダーをデータベースのインストール先として指定可能に

tempdb データベースをローカル ディスクへ配置可能に

Page 148: SQL Server 2014 自習書シリーズ No.3

2.12 Windows Server Core へのインストールがサポート

SQL Server 2012 からは、Windows Server Core へのインストールがサポートされるようになりました。Server Core では、必要最小限の機能のみしかインストールされないので、よりセキュアな運用が可能になります。また、修正プログラムの適用回数を削減できる(OS の再起動に伴う計画停止時間を大きく短縮できる)というメリットも得られます。

対応している Server Core は、Windows Server 2012/2012 R2 または Windows Server 2008 R2 に SP1 を適用した Server Core です。

SQL Server 2014 を Server Core へインストールするには、SQL Server 2014 のインストーラー(Setup.exe)をコマンドラインから実行するだけです。例えば、データベース エンジンのみをインストールしたい場合は、次のように Setup.exe を実行するだけで、SQL Server 2014 をインストールすることができます(画面は Windows Server 2012 R2 の Server Core)。

Setup.exe

/qs

/ACTION=Install

/FEATURES=SQLEngine

/INSTANCENAME=MSSQLSERVER

/SQLSVCACCOUNT=".\sqlservice"

/SQLSVCPASSWORD="P@ssword"

/AGTSVCACCOUNT=".\sqlservice"

/AGTSVCPASSWORD="P@ssword"

/SQLSYSADMINACCOUNTS=".\Administrator"

/IACCEPTSQLSERVERLICENSETERMS

/qs は無人インストール オプションとしてお馴染みのオプション、/ACTION=insall でインストール、/FEATURES でインストールしたい機能を指定(SQLEngine の場合はデータベース エンジン)、/INSTANCENAME へ SQL Server のインスタンス名、/SQLSVCACCOUNT へ SQL

SQL Server の管理者アカウントの指定

使用許諾契約書への同意

SQL Server Agent サービスのサービス アカウント名とパスワード

SQL Server サービスのサービス アカウント名とパスワード

SQL Server のインスタンス名

データベース エンジンのインストール

Page 149: SQL Server 2014 自習書シリーズ No.3

Server サービスのサービス アカウント名、/SQLSVCPASSWORD へそのアカウントのパスワード、同様に /AGTSVCACCOUNT と /AGTSVCPASSWORD には SQL Server Agent サービスのサービス アカウント名とパスワード、/SQLSYSADMINACCOUNTS で SQL Server の管理者として設定したいアカウントを指定、/IACCEPTSQLSERVERLICENSETERMS でライセンス条項へ同意したことを意味するオプションになっています。

その他のインストール オプションや、他の機能のインストール方法については、オンライン ブックの以下の場所を参考にしてみてください。

Server Core への SQL Server 2014 のインストール http://msdn.microsoft.com/ja-jp/library/hh231669

また、上記ページにも記載されていますが、Server Core へインストール可能な SQL Server の機能は、次のとおりです。

Server Core では、データベース エンジンやレプリケーション、フルテキスト検索、Integration Services、Analysis Services のインストールがサポートされています。

機能 サポートデータベース エンジン サービス ◯レプリケーション機能 ◯フルテキスト検索 ◯Integration Services サーバー ◯Analysis Services ◯Reporting Services ×Distributed Replay(分散再生)Controller ×Distributed Replay(分散再生)Client ×マスター データ サービス(MDS) ×Data Quality Services(DQS) ×

Page 150: SQL Server 2014 自習書シリーズ No.3

2.13 包含データベース(CDB:Contained Database)

包含データベースは、ログイン アカウントや照合順序に依存しないデータベースを作成できる機能で、SQL Server 2012 から提供されました。

以前のバージョンでのデータベース移行時の問題(不明なデータベース ユーザー)

SQL Server 2012 よりも前のバージョンでは、データベース内に作成したユーザー(データベース ユーザー)は、ログイン アカウントに完全依存しているので、データベースの移行時(バックアップ/リストアやデタッチ/アタッチによるデータベース移動時)には、ログイン アカウントとのマッピングが切れた「不明なデータベース ユーザー」(孤立ユーザー)が発生してしまうという問題がありました。

これに対応するには、移動元と移動先で、同じ SID のログイン アカウントを作成するか、sp_change_users_login を利用してマッピングを修復しなければなりませんでした。これでは、ハードウェア リプレイス時のデータベース移行時や、別のサーバーへデータベースを移動したい場合、開発機から本番機へデータベースを移動したい場合などに不便です。

ログイン アカウントに依存しないデータベース ユーザーの作成が可能に!

上記の問題を解決するために登場したのが包含データベース(Contained Database)です。包含データベースでは、ログイン アカウントに依存しない(マッピングが不要な)データベース ユーザーを作成することができます(独立したデータベース ユーザーをデータベース内に含められることから Contained と名付けられています)。このようにデータベース ユーザーが独立していれば、データベースを別のマシンへ移動したときにも何の問題もなく利用できるようになります。

また、包含データベースでは、tempdb の照合順序にも依存しない一時テーブルの作成が可能です。以前のバージョンでは、一時テーブルの照合順序は tempdb の照合順序を継承していたので、データベースの移行時には照合順序の不一致が問題となる場合がありました。

包含データベースの利用方法

包含データベースを利用するには、まずは sp_configure を利用して、SQL Server の構成オプションで Contained Database Authentication(包含データベース認証)を有効化(1 へ設定)しておく必要があります。これは次のように行います。

EXEC sp_configure 'contained database authentication', 1

RECONFIGURE

オプションの設定後は、CREATE DATABASE ステートメントでのデータベース作成時に、次のように CONTAINMENT=PARTIAL を付ければ、包含データベース対応のデータベースを作成することができます。

Page 151: SQL Server 2014 自習書シリーズ No.3

CREATE DATABASE CDBtest

CONTAINMENT = PARTIAL

go

Management Studio からデータベースを作成する場合には、次のように[新しいデータベース]ダイアログの[オプション]ページで、[コンテインメントの種類]で「部分」を選択することで 包含データベース対応のデータベースを作成することができます。

包含データベース内へデータベース ユーザーの作成

包含データベース対応のデータベース内へデータベース ユーザーを作成するには、次のように CREATE USER ステートメントで WITH PASSWORD を指定します。

USE CDBtest

go

CREATE USER dbUser1

WITH PASSWORD = 'P@ssword'

go

このようにパスワードを指定することで、ログイン アカウントからは独立した(マッピングが不要な)データベース ユーザーを作成することができます。

Management Studio からデータベース ユーザーを作成する場合は、次のように[データベース ユーザー]ダイアログで、[ユーザーの種類]に「パスワードを持つ SQL ユーザー」を選択して、ユーザー名とパスワードを指定することで、包含データベース 内へ独立したデータベース ユ

Page 152: SQL Server 2014 自習書シリーズ No.3

ーザーを作成することができます。

データベース ユーザーの接続

作成したデータベース ユーザーがデータベースへ接続するには、Management Studio の場合は次のように操作します。

ツールバーの[データベース エンジン クエリ]ボタンをクリックして、[データベース エンジンへの接続]ダイアログを表示し、[認証]で「SQL Server 認証」を選択、[ログイン]と[パスワード]に作成したデータベース ユーザーの名前とパスワードを入力して[オプション]ボタンをクリックします。

次のように[接続プロパティ]タブが表示されたら、[データベースへの接続]で接続したいデー

1

3

2

Page 153: SQL Server 2014 自習書シリーズ No.3

タベースの名前を入力して[接続]ボタンをクリックします。

これでデータベースへ接続できるようになります(SQL Server の認証モードが混合モードの場合)。クエリ エディターのステータス バーには、接続しているユーザーの名前と接続しているデータベースの名前が表示されるので、これで正しく接続できたことを確認できます。

このように、包含データベースでは、ログイン アカウントとのマッピングが不要なデータベース ユーザーをデータベース内に作成することができるようになりました。このユーザーは、データベースの移行時(バックアップ/リストアやデタッチ/アタッチによるデータベース移動時)にもそもまま利用できるので、ハードウェア リプレイス時のデータベース移行時や、別のサーバーへデータベースを移動したい場合、開発機から本番機へデータベースを移動したい場合などでも、何の問題もなく利用することができます。

1

2

3

dbUser1 として CDBtest データベースへ接続できたことを確認できる

Page 154: SQL Server 2014 自習書シリーズ No.3

tempdb データベースの照合順序に依存しない一時テーブルの作成

包含データベースでは、tempdb の照合順序に依存しない一時テーブルの作成も可能です。従来のバージョンでは、CREATE TABLE ステートメントを利用して作成した一時テーブルの照合順序は tempdb の照合順序を継承するので、データベースの移行時に、移行元と移行先で tempdb の照合順序が異なる場合に、照合順序の不一致が発生するという問題がありました。この問題は、次のように、包含データベースではない通常のデータベースを作成することで確認できます。

-- 包含データベースではない通常のデータベースを照合順序 Japanese_CS_AS で作成

CREATE DATABASE testDB

COLLATE Japanese_CS_AS

go

USE testDB

CREATE TABLE t1 ( a varchar(100) )

INSERT INTO t1 VALUES('aaa')

SELECT * FROM t1

-- 一時テーブル #t2 の作成

CREATE TABLE #t2 ( a varchar(100) )

INSERT INTO #t2 VALUES('aaa')

SELECT * FROM #t2

このステートメントでは、通常のデータベースを照合順序 Japanese_CS_AS で作成しているので、t1 テーブルの文字列データ型の列は、Japanese_CS_AS として作成されます。一方、tempdb の照合順序は Japanese_CI_AS(既定値)へ設定しているので、一時テーブル #t2 の文字列データ型の列は Japanese_CI_AS として作成されます。このように異なる照合順序の列がある場合に、この列を JOIN キーとして利用すると、次のようにエラーが発生してしまいます。

このように、包含データベースではない通常のデータベースの場合には、移行元と移行先での tempdb の照合順序に注意する必要がありました。これに対して包含データベースでは、tempdb の照合順序に依存しない一時テーブルの作成が可能です。一時テーブルの照合順序は、包含データベースに設定された照合順序を継承するようになっているので、移行元と移行先で tempdb の照合順序が異なっている場合でも、データベースを問題なく動作させることが可能です。このように、SQL Server 2012 からは、包含データベースが提供されたことによって、データベースの移行が非常に簡単に行えるようになりました。

Page 155: SQL Server 2014 自習書シリーズ No.3

2.14 列ストア インデックスによる飛躍的な性能向上

列ストア インデックスは、大量のデータに対する集計処理で大きな性能向上を期待できる機能で、SQL Server 2012 から提供されました。特に、夜間バッチ処理時(夜間バッチでの日次集計や月次集計処理など)や、DWH(データ ウェアハウス)環境での集計処理に大変役立つ機能です。

列ストア インデックスは、SQL Server 2008 R2 の PowerPivot for Excel で実装されたインメモリのカラムベース エンジン(xVelocity エンジン)を RDB へ応用したものです。このエンジンでは、列単位でインデックスを格納し、それらは高度に圧縮されています。

列ストア インデックスの効果(弊社事例:1.2億件で 25~100倍の性能向上)

弊社のお客様データ(1億 2千万件の DWH)を利用して、列ストア インデックスの性能効果を検証したところ、以下のような結果が得られました。

検証で利用したのは売上データが 1 億 2 千万件格納されている「売上」テーブルで、このテーブルには「売上年月」、「売上金額」、「売上数量」列などがあり、以下の SELECT ステートメントを実行したときの結果を比較しました。

-- DISTINCT

SELECT DISTINCT 売上年月 FROM 売上

-- GROUP BY

SELECT 売上年月, SUM(売上金額), SUM(売上数量) FROM 売上 GROUP BY 売上年月

グラフの FullScan は、インデックスが使用されないフル テーブル スキャンが実行されたときの速度、IndexScan は、非クラスター化インデックスを(売上年月, 売上金額, 売上数量)で作成/利用したとき、ColumnStore が列ストア インデックスを作成/利用したときの実行速度で

102倍

59.7倍46.9倍

25倍

テストに利用したハードウェア環境・Xeon 2.66GHz Quad*2(計8コア)・メモリ 32GB・RAID 10 ストレージ(2GB キャッシュ)

Page 156: SQL Server 2014 自習書シリーズ No.3

す。ベンチマーク結果の公開は、使用許諾契約書で禁じられているので、グラフ内の結果は、それぞれ列ストア インデックスでの実行時間を 100 とした場合の相対値で表しています。

列ストア インデックスを利用することで、DISTICT 処理では、フル スキャンに比べて 102倍、インデックス スキャンに比べて 59.7倍の性能向上、GROUP BY 処理では、フル スキャンに比べて 46.9倍、インデックス スキャンに比べて 25倍もの性能向上を確認することができました。なお、各テストで使用したデータは、すべてメモリ上のデータ バッファ キャッシュ内へ格納されている状態でテストしました。したがって、初回アクセス時の(メモリ内にデータが存在しない場合の)ディスクからの読み取りが伴う場合には、さらに性能差が顕著に現れることになります。

今回の結果の 25倍という差は非常に大きいもので、例えば、次のような「売上年月ごとの売上金額を表示するレポート」を思い浮かべてみてください。

このレポートを表示するのに今まで 10 秒かかっていたとします。ここに列ストア インデックスを利用できるとすれば、25倍もの性能向上が得られるので、わずか 0.4秒(10秒の 25分の 1 のスピード)でレポートが表示されるわけです。コンピューターの世界では、3秒以上の待ち時間があったとすると、ユーザーが "遅い" と感じると言われています。しかし、従来のインデックスの作成方法では、データ件数の規模が数億件レベルになる場合には、数秒間もの待ち時間が発生してしまうのです。これを列ストア インデックスに変更することができれば、1 秒以内でのレスポンスを期待できるようになります。

また、列ストア インデックスは、このように GROUP BY 演算などによる集計処理で大きな効果を発揮するので、夜間バッチ処理時(夜間バッチでの日次集計や月次集計処理など)にも大きな性能向上を期待できます。

弊社事例2 ~40億件のデータ~

前述の「データ圧縮」のところで説明したものですが、弊社のお客様データ(40億件)に対して、列ストア インデックスを作成した場合は、次のような効果を得られました。

Page 157: SQL Server 2014 自習書シリーズ No.3

データ サイズは、わずか 39.9GB(5 分の 1 以下のサイズ)に、クエリ1 は 129倍もの性能向上、クエリ2 でも 21倍の性能向上を確認することができました。このように、列ストア インデックスは、大きな性能向上(かつ圧縮効果)を期待できる機能なので、ぜひ試してみてください。

列ストア インデックスの作成方法

列ストア インデックスは、SQL Server 2012 では「読み取り専用」でのみの提供でしたが、SQL Server 2014 からは「更新可能な列ストア インデックス」が提供されるようになりました。前者は「非クラスター化列ストア インデックス」、後者は「クラスター化列ストア インデックス」(CCSI:Clustered Column-Store Index)と呼ばれています。

非クラスター化列ストア インデックスは、次のように作成することができます。

CREATE NONCLUSTERED COLUMNSTORE INDEX インデックス名

ON テーブル名 (列名1, 列名2, 列名3, …)

CREEATE INDEX ステートメントに COLUMNSTORE キーワードを追加するだけで、列ストア インデックスを作成することができます。列名は、従来ながらの非クラスター化インデックスを作成するときと同様、インデックスに含めたい列をカンマ区切りで指定します。

クラスター化列ストア インデックス(CCSI)を作成したい場合には、次のように記述します。

80.4% 圧縮わずか 1/5 以下に!

* CCSI = クラスター化列ストア インデックスCCSI は SQL Server 2014 から提供された更新可能な列ストア インデックス機能

129倍の性能向上

21倍の性能向上

Page 158: SQL Server 2014 自習書シリーズ No.3

CREATE CLUSTERED COLUMNSTORE INDEX インデックス名

ON テーブル名

クラスター化列ストア インデックスの場合は、テーブル名を指定するだけで作成することができます。

GUI 操作で作成したい場合には、次のように[インデックス]フォルダーを右クリックして、[新しいインデックス]メニューから行うことができます。

非クラスター化列ストア インデックスの場合は、次のように[新しいインデックス]ダイアログで、[追加]ボタンをクリックして、対象列を選択することができます。

非クラスター化列ストア インデックスを作成する場合

クラスター化列ストア インデックス(CCSI)を作成する場合

列ストア インデックスに含めたい列を選択

2

1

3

Page 159: SQL Server 2014 自習書シリーズ No.3

以上の操作だけで列ストア インデックスの作成が完了です。列ストア インデックスは、性能を向上させるために大変役立つ機能なので、ぜひ活用してみてください。

また、本自習書シリーズの「SQL Server 2014 からの新機能ダイジェスト」編では、列ストア インデックスの効果を簡単に確認できるようにしたスクリプト(ステップ バイ ステップ形式での検証スクリプト)を紹介しているので、こちらもぜひご覧いただければと思います。

クラスター化列ストア インデックスの早期導入事例

数多くのソーシャルゲームを提供していることで有名な 株式会社 gloops では、SQL Server 2014 のクラスター化列ストア インデックスを早期導入して、従来のシステムよりも約 240倍の性能向上を実現しています。同社の人気ゲーム「スカイロック」でのユーザー行動分析用 DWH 作成や、ユーザー ランキングの生成に SQL Server 2014 を採用し、従来 12分かかっていたバッチ処理を、わずか 3 秒に短縮、テーブル容量は 55GB から、わずか 2.8GB へと、1/20 にも圧縮することができています。これらの詳細は、以下のマイクロソフトの事例ページで確認できるので、こちらもぜひご覧になってみてください。

株式会社 gloops の導入事例 http://www.microsoft.com/ja-jp/casestudies/gloops.aspx

Page 160: SQL Server 2014 自習書シリーズ No.3

STEP 3. SQL Server 2008 以降の Transact-SQL の新機能

この STEP では、SQL Server 2008 以降で提供された Transact-SQL に関連する新機能を説明します。合わせて、Transact-SQL の実行環境である Management Studio の新機能や、SQL Server 2012 から新しく提供された SQL Server Data Tools(SSDT)なども説明します。

Management Studio の新機能(インテリセンスなど)

SQL Server 2008 からの Transact-SQL の新機能

新しい日付データ型

MERGE ステートメント(UPSERT)

GROUPING SETS

テーブル値パラメーター、HierarchyID データ型

SQL Server 2012 からの Transact-SQL の新機能 (ページング、シーケンス、再スロー、新しい関数など)

BI/DWH 系の T-SQL 分析関数(Analytic Functions)

FileStream、FileTable データ型

オブジェクトの依存関係の表示

SQL Server Data Tools(SSDT)による開発生産性の向上

Microsoft Azure SQL データベースへの対応

Page 161: SQL Server 2014 自習書シリーズ No.3

3.1 Management Studio の新機能

SQL Server 2008 からは、Management Studio が Visual Studio のシェルに統合されて、インテリセンスや文法エラー表示機能がサポートされるなど、Management Studio がより使いやすくなりました(SQL Server 2008/2008 R2 は Visual Studio 2008、SQL Server 2012 以降は Visual Studio 2010 シェルに統合されています)。ここでは、Management Studio 関連の新機能を説明します。

インテリセンス(IntelliSense)による入力補完

インテリセンス(IntelliSense)は、Visual Studio でおなじみの入力補完機能です。SQL Server 2008 からは、Management Studio の「クエリ エディター」でインテリセンス機能がサポートされるようになって、SQL ステートメントの入力時に、テーブルの一覧を表示したり、列名の一覧を表示したりできるようになりました。

それでは、これを試してみましょう。

1. まずは、Management Studio を起動して、ツールバーの[新しいクエリ]をクリックし、「クエリ エディター」を開き、次のように入力してみてください。

USE AdventureWorks2014

go

SELECT * FROM Production.

FROM 句でスキーマ名(Production)の後に .(ドット)を入力するとインテリセンス機能 が 働 き 、 入 力 候 補 が 表 示 さ れ る こ と を 確 認 で き ま す ( 上 の 画 面 で は 、AdventureWorks2014 データベース内の Production スキーマが所有するテーブルの一覧が表示されています)。この一覧から任意のテーブル(Product など)を選択して「Tab」キーで確定します。

2. FROM 句でテーブルを指定した後は、次のように選択リストでそのテーブルの列名が入力候補として一覧表示されるようになります。

インテリセンス機能が働き、入力候補が一覧される。確定は、Tab キーを押す

1

「新しいクエリ」をクリックして「クエリ エディター」を開く

1

Page 162: SQL Server 2014 自習書シリーズ No.3

文法エラーの表示機能

この機能も Visual Studio でおなじみの文法チェック機能です。SQL Server 2008 からは、SQL ステートメントの入力持に、即時に文法(構文)をチェックし、文法エラーがある場所は赤い下線で表示してくれるようになりました。また、「エラー一覧」(Error List)ウィンドウもサポートされ、このウィンドウを利用すると、まとめてエラー情報を確認することもできます。従来のバージョンでは、SQL ステートメントを実行しないと文法エラーを確認できなかったところが、この機能のおかげで、SQL ステートメントを実行しなくても文法エラーを確認できるようになったので大変便利です。

それでは、これを試してみましょう。

1. クエリ エディターで、次のように記述してみます。

USE AdventureWorks2014

go

SELECT * FROM ppProduct

AdventureWorks2014 には「ppProduct」というテーブルは存在しないので、赤い下線が表示されて、文法エラーが発生していることを確認できます。

2. また、[表示]メニューから[エラー一覧]をクリックすると、次のように「エラー一覧」ウィンドウを表示することができます。

エラー一覧ウィンドウでは、複数の文法エラーをまとめて確認することができます。

FROM 句でテーブル名を指定した後は、列の一覧も候補に表示されるようになる

1

文法エラーは、赤い下線で表示され、マウスを上へ乗せるとエラーを表示してくれる

1

文法エラーは、「エラー一覧」ウインドウへも表示される。このウィンドウは、「表示」

メニューから開くことができる

1

わざと間違ったテーブル名を入力

Page 163: SQL Server 2014 自習書シリーズ No.3

TOP 1000 クエリ

TOP 1000 クエリは、オブジェクト エクスプローラーで選択したテーブルに対して TOP 1000(最初の 1000 件)を指定した SELECT ステートメントを自動生成して、その結果を取得してくれる機能です。テーブルのデータを確認したい場合にとても便利な機能です。

それでは、これを試してみましょう。

1. オブジェクト エクスプローラーで、データを確認したいテーブルを右クリックして、[上位 1000 行の選択]をクリックします。

このように、結果(データ)を確認できるだけでなく、列名付きの SELECT ステートメントも自動生成されるので、ほかの検索条件を追加したり、特定の列データのみを取得したりする場合にも便利です。

テーブルを右クリックして「上位 1000 行の選択」を

クリック

1

TOP 1000 が記述されたSELECT ステートメント

が自動生成されて結果が表示される

2

Page 164: SQL Server 2014 自習書シリーズ No.3

SQL Server 2012 からの Management Studio の新機能

SQL Server 2012 以降では、Management Studio は Visual Studio 2010 のシェルに統合されています(SQL Server 2008/2008 R2 は Visual Studio 2008 のシェル)。これによって、Visual Studio でお馴染みの「コード スニペット」や「ズーム機能」、「タスク一覧」、「マルチ ウィンドウ」などが Management Studio でも利用できるようになりました。

以下の画面は、コード スニペット機能を利用しているときの様子です。

以下の画面は、マルチ ウィンドウで利用して、複数のクエリを実行しているときの様子です。

このように、SQL Server 2008 以降では、Management Studio がより使いやすくなっています。

コード スニペットがサポートされた

マルチ ウィンドウのサポート

Page 165: SQL Server 2014 自習書シリーズ No.3

3.2 SQL Server 2008 からの Transact-SQL の新機能

SQL Server 2008 からは、Transact-SQL ステートメントに多くの新機能が提供されています。その主なものは、次のとおりです。

変数宣言時の初期値代入

インクリメント/デクリメント演算子(+=、-=)

INSERT ステートメントで複数の値を指定可能

日付データ型の追加(date、time、datetime2、datetimeoffset)

MERGE ステートメント

GROUPING SETS

テーブル値パラメーター、ユーザー定義テーブル型

HierarchyID データ型

FileStream データ型

以降では、これらの利用方法を 1つ1つ説明します。

変数宣言時の初期値代入

SQL Server 2008 からは、DECLARE ステートメントを使用して変数を宣言する際に、初期値を代入できるようになりました。これは、次のように記述します。

DECLARE @変数名 データ型 = 初期値

データ型に続けて「=」を記述することで、変数へ初期値を代入することができます。

これは、次のように試すことができます(変数「@i」へ "888" という初期値を代入)。

DECLARE @i int = 888

SELECT @i

このように SQL Server 2008 からは、変数の宣言時に初期値を代入できるようになったので、大変便利です。

宣言時に初期値を代入

Page 166: SQL Server 2014 自習書シリーズ No.3

インクリメント演算子

SQL Server 2008 からは、「+=」を利用したインクリメント演算子がサポートされました。これは、次のように利用することができます。

DECLARE @i int = 1

WHILE @i <= 5

BEGIN

PRINT @i

SET @i += 1 -- SET @i = @i + 1 と等価

END

この「SET @i += 1」という記述は、「SET @i = @i + 1」と等価です(SET の代わりに SELECT と用いても同等です)。

デクリメント演算子(-=)

SQL Server 2008 からは、デクリメント演算子として、「-=」がサポートされたので、次のように利用することができます。

DECLARE @i int = -1

WHILE @i >= -5

BEGIN

PRINT @i

SET @i -= 1 -- SET @i = @i - 1 と等価

END

Page 167: SQL Server 2014 自習書シリーズ No.3

INSERT ステートメントで複数の値を指定

SQL Server 2008 からは、複数の値(複数の行データ)を 1 つの INSERT ステートメントで記述できるようになりました。これは次のように記述して試すことができます。任意のデータベースを利用して(ここでは、TSQLtestDB データベースを作成して)、次のように t1 テーブルを作成して試してみましょう。

CREATE DATABASE TSQLtestDB

go

USE TSQLtestDB

CREATE TABLE t1 ( a int, b varchar(100) )

INSERT INTO t1

VALUES ( 1, 'AAA' )

,( 2, 'BBB' )

,( 3, 'CCC' )

,( 4, 'DDD' )

SELECT * FROM t1

このように VALUES 句で ,(カンマ)を入れることで、複数の行データを指定できるようになりました。

Page 168: SQL Server 2014 自習書シリーズ No.3

3.3 日付データ型(datetime、date、time、datetime2 など)

SQL Server 2008 からは、日付を格納できるデータ型が、次のように 4 種類追加されました。それぞれのデータ型の違いは、内部的な使用バイト数と格納できるデータの範囲(と時間の単位)です。

各データ型の特徴は、次のとおりです。

datetime データ型は、1/300 秒(0.333 秒)単位の日付と時刻を扱えます。

smalldatetime データ型は、「分」単位でデータを格納できるデータ型で、使用バイト数を 4 バイトに抑えることができます。

date データ型は、「日」単位でデータを格納できるデータ型で、使用バイト数を 3 バイトに抑えることができます。時刻を格納する必要のないデータの場合には、大変便利なデータ型です。

time データ型は、「時刻」のみを格納できるデータ型で、datetime データ型よりも精度が高い時刻(100 ナノ秒=10 のマイナス 7 乗、小数点以下 7 桁)まで格納できるのが特徴です。

datetime2 データ型は、time データ型と同様、時刻を 100 ナノ秒まで格納でき、かつ datetime データ型のように日付も格納できるのが特徴です。

datetimeoffset データ型は、datetime2 データ型の格納範囲に加えて、タイムゾーンのオフセット(協定世界時からの時間差)を格納できるデータ型です。

SQL Server 2005 以前のバージョンまでは、日付データ型は、datetime と smalldatetime の 2種類のみでしたが、SQL Server 2008 からは date と time、datetime2、datetimeoffset の 4種類が追加されました。

Let's Try

それでは、これを試してみましょう。

1. まずは、次のように任意のデータベース内に「dateT」という名前のテーブルを作成して、「a」列のデータ型を datetime、「b」列を smalldatetime、「c」列を date、「d」列を time と指定します。

USE TSQLtestDB

データ型 単位 使用バイト数 範囲

従来からあるデータ型

datetime 0.333 秒 8 バイト 1753-1-1 ~9999-12-31smalldatetime 1分 4 バイト 1900-1-1 ~2079-6-6

2008 から提供されたデータ型

date 日 3 バイト 1-1-1 ~9999-12-31time 100 ナノ秒 time(7) は 5 バイト 00:00:00 ~23:59:59.9999999

datetime2 100 ナノ秒 datetime2(7) は8 バイト 1-1-1 ~9999-12-31

datetimeoffset 100 ナノ秒 datetimeoffset(7) は 10 バイト 1-1-1 ~9999-12-31 +/-14:00

Page 169: SQL Server 2014 自習書シリーズ No.3

CREATE TABLE dateT ( a datetime, b smalldatetime, c date, d time )

2. 続いて、現在時刻を取得できる GETDATE 関数を利用して、各列へデータを INSERT しま

す。

INSERT INTO dateT

VALUES ( GETDATE(), GETDATE(), GETDATE(), GETDATE() )

SELECT * FROM dateT

このように、datetime は 1/300 秒(0.333 秒)単位の日付と時刻を、smalldatetime は分単位、date は日単位、time は時刻のみを格納できることを確認できます。

datetime2、datetimeoffset(SYSDATETIME、SYSDATETIMEOFFSET)

GETDATE 関数の精度は、0.333 秒単位で datetime データ型へ現在時刻を格納するための関数ですが、SQL Server 2008 からの新しいデータ型の time や datetime2、datetimeoffset など、100 ナノ秒(10-7)単位のデータ型へ現在時刻を格納するための関数として SYSDATETIME と SYSDATETIMEOFFSET(両者の違いはタイムゾーン オフセットが含まれるかどうか)があります。

それでは、これを試してみましょう。

1. 次のように、「dateT2」テーブルを作成して、「a」列のデータ型を datetime、「b」列を time、「 c 」 列 を datetime2 、「 d 」 列 を datetimeoffset と 指 定 し 、 SYSDATETIME と SYSDATETIMEOFFSET 関数を利用して現在時刻を INSERT します。

CREATE TABLE dateT2 ( a datetime, b time, c datetime2, d datetimeoffset )

INSERT INTO dateT2

VALUES ( SYSDATETIME(), SYSDATETIME(), SYSDATETIME(), SYSDATETIME() )

INSERT INTO dateT2

VALUES( SYSDATETIMEOFFSET(), SYSDATETIMEOFFSET()

, SYSDATETIMEOFFSET(), SYSDATETIMEOFFSET() )

SELECT * FROM dateT2

datetime は 0.333 秒単位 smalldatetime は 分単位 date は 日単位 time は 時刻のみ。100ナノ秒(10-7、小数点以下 7桁)単位

Page 170: SQL Server 2014 自習書シリーズ No.3

time データ型では、100 ナノ秒(10-7、小数点以下 7 桁)単位でデータが格納されていることを確認できます。また、datetime2 と datetimeoffset データ型についても、100 ナノ秒(10-7)単位でデータを格納できます。

datetime2 と datetimeoffset データ型の違いは、タイムゾーン オフセット(協定世界時からの時間差:東京は +9 時間)を含むかどうかです。SYSDATETIME と SYSDATETIMEOFF SET 関数の違いも同様で、タイムゾーン オフセットを含むかどうかです。

Note: SYSUTCDATETIME で UTC 時刻の取得

SQL Server 2008 以降では、UTC 時刻(協定世界時: Universal Time, Coordinated)を取得できる SYSUTCDATETIME 関数も用意されています。これは、PRINT ステートメントを利用して、次のように確認することができます。

PRINT SYSUTCDATETIME() -- UTC(協定世界時)

PRINT SYSDATETIME() -- タイムゾーンを含まない。datetime2 用

PRINT SYSDATETIMEOFFSET() -- タイムゾーンを含む。 datetimeoffset 用

Note: time、datetime2、datetimeoffset での桁数指定

time と datetime2、datetimeoffset データ型では、time(7) や datetime2(7) のように桁数を指定することもできます。既定値は (7) で、100 ナノ秒(10-7)単位でデータを格納できます。time(6) と指定した場合は、マイクロ秒(10 のマイナス 6 乗、10-6)単位、time(3) と指定した場合は、ミリ秒(10 のマイナス 3 乗、10-3)単位でデータを格納できます。

datetime は 0.333 秒単位 time は 100ナノ秒(10-7)単位

datetime2 は 100ナノ秒単位で格納できる。

datetimeoffset はタイムゾーンオフセットを含み、100ナノ秒単

位で格納できる

Page 171: SQL Server 2014 自習書シリーズ No.3

3.4 MERGE ステートメント(UPSERT)

MERGE ステートメントは、データが存在する場合には UPDATE、存在しない場合には INSERT 処理が行える非常に便利なステートメントで、SQL Server 2008 から提供されました。MERGE ステートメントは、UPDATE と INSERT を組み合わせた造語として「UPSERT」とも呼ばれています。Merge は、「結合する」「吸収する」という意味の英単語です。

MERGE ステートメントの構文は、次のとおりです。

MERGE INTO マージ先のテーブル

USING マージ元のテーブルまたはクエリ

ON マージの条件

WHEN MATCHED THEN

UPDATE SET 更新

WHEN NOT MATCHED THEN

INSERT VALUES ( 追加 );

この構文は、Oracle 9i 以降で搭載されている MERGE ステートメントと同じように利用することができます。

Let's Try

それでは、これを試してみましょう。

1. まずは、次のように mt1 テーブルと mt2 テーブルを作成します。

CREATE TABLE mt1

( a int, b varchar(100) )

INSERT INTO mt1

VALUES ( 1, 'AAA' )

,( 2, 'BBB' )

,( 3, 'CCC' )

,( 4, 'DDD' )

SELECT * FROM mt1

CREATE TABLE mt2

( a int, b varchar(100) )

INSERT INTO mt2

VALUES ( 3, 'XXX' )

,( 5, 'YYY' )

SELECT * FROM mt2

mt1 テーブル mt2 テーブル

Page 172: SQL Server 2014 自習書シリーズ No.3

2. 続いて、mt1 テーブルの「a」列と、mt2 テーブルの「a」列をもとに、次のように MERGE ステートメントを実行してみましょう。

MERGE INTO mt1

USING mt2

ON mt1.a = mt2.a

WHEN MATCHED THEN

UPDATE SET mt1.b = mt2.b

WHEN NOT MATCHED THEN

INSERT VALUES ( mt2.a, mt2.b );

MERGE INTO へマージ(結合)先のテーブルとして「mt1」、USING へマージ対象のテーブルとして「mt2」を指定し、ON へマージの条件(ここでは「a」列が等しいかどうか)を指定しています。WHEN MATCHED(条件がマッチした場合)には、THEN 以下の UPDATE ステートメント(更新処理)が実行され、NOT MATCHED(マッチしなかった場合)には、その下の THEN 以下の INSERT ステートメント(挿入処理)が実行されるようになります。

Note: 文末のセミコロンを忘れずに

MERGE ステートメントでは、ステートメントの末尾に必ず ; (セミコロン)を記述しなければなりません。セミコロンを省略した場合には、エラーになるので注意してください。

変数をもとにした MERGE

MERGE ステートメントの USING には、テーブル名だけでなく、任意のクエリを記述することができます。したがって、複数のテーブル同士の MERGE だけでなく、任意の変数の値をもとにして、MERGE ステートメントを実行することもできます。

1. それでは、これを試してみましょう。次のように変数「@a」と「@b」を宣言して、これを「mt1」テーブルとマージしてみます。

DECLARE @a int = 4

,@b varchar(100) = 'EEE'

mt1 テーブル 変数( @a と @b )

mt1 テーブル mt2 テーブル

MERGE!

UPDATEされたデータ

INSERTされたデータ

Page 173: SQL Server 2014 自習書シリーズ No.3

2. MERGE ステートメントは、次のように記述します。

DECLARE @a int = 4

,@b varchar(100) = 'EEE'

MERGE INTO mt1

USING ( SELECT @a AS a, @b AS b ) var

ON mt1.a = var.a

WHEN MATCHED THEN

UPDATE SET mt1.b = var.b

WHEN NOT MATCHED THEN

INSERT VALUES (var.a, var.b );

このように USING には、任意のクエリを記述できるので、変数やパラメーターなど特定の値をもとに MERGE を実行することができます。

Tips: 一括インポート時に MERGE を利用

MERGE ステートメントでは、OPENROWSET(BULK ...) を指定することもできるので、テキスト ファイルを一括インポートする際に利用することもできます。例えば、テキスト ファイル(C:\bulkTest1.csv)を、フォーマット ファイル(C:\bulkTest1.fmt)を利用して、mt1 テーブルと MERGE する場合は、次のように記述します。

MERGE INTO mt1

USING OPENROWSET( BULK 'C:\bulkTest1.csv'

,FORMATFILE = 'C:\bulkTest1.fmt' ) bulk1

ON mt1.a = bulk1.a

WHEN MATCHED THEN

UPDATE SET mt1.b = bulk1.b

WHEN NOT MATCHED THEN

INSERT VALUES ( bulk1.a, bulk1.b );

C:¥bulkTest1.fmt(フォーマット ファイル)C:¥bulkTest1.csv ファイルmt1 テーブル

MERGE!

UPDATEされたデータ

INSERTされたデータ

mt1 テーブル 変数( @a と @b )

MERGE!

UPDATEされたデータ

Page 174: SQL Server 2014 自習書シリーズ No.3

3.5 GROUPING SETS

GROUPING SETS は、GROUP BY 句とともに利用できる集計関数で、SQL-2003 標準規格で定義されているものです(SQL Server 2008 から提供されました)。また、Oracle 10g で搭載されている GROUPING SETS とも同じように利用することができます。

GROUPING SETS は、複数の集計値を結合(UNION ALL)する場合や、WITH ROLLUP または WITH CUBE を利用して複数項目の集計値を取得する場合の置き換えとして利用することができます。例えば、次のように UNION ALL(A 列でグループ化した集計結果と B 列でグループ化した集計結果を結合したもの)は、GROUPING SETS を利用してシンプルに記述できるようになります。

Let's Try

それでは、これを試してみましょう。

まずは、GROUPING SETS を利用せずに、「NorthwindJ」データベースから、商品区分ごと、および受注年ごとの受注金額の合計を結合(UNION ALL)してみましょう。

USE NorthwindJ

go

SELECT 区分名, NULL AS 年, SUM( od.数量 * od.単価) AS 受注金額

FROM 受注明細 od

INNER JOIN 商品 s ON od.商品コード = s.商品コード

INNER JOIN 商品区分 c ON s.区分コード = c.区分コード

GROUP BY 区分名

UNION ALL

SELECT NULL AS 区分名, YEAR(受注日), SUM( od.数量 * od.単価) AS 受注金額

FROM 受注明細 od

INNER JOIN 受注 o ON o.受注コード = od.受注コード

GROUP BY YEAR(受注日)

SELECT A, NULL AS B, SUM(n) FROM tGROUP BY AUNION ALL

SELECT NULL AS A, B, SUM(n) FROM tGROUP BY B

-- GROUPING SETS の場合SELECT A, B, SUM(n) FROM tGROUP BY GROUPING SETS ( (A), (B) )

商品区分ごとの受注金額の合計

受注年ごとの受注金額の合計

Page 175: SQL Server 2014 自習書シリーズ No.3

次に、GROUPING SETS 関数を利用して、これと同じ結果を取得してみましょう。

SELECT 区分名, YEAR(受注日) AS 年, SUM( od.数量 * od.単価) AS 受注金額

FROM 受注明細 od

INNER JOIN 受注 o ON o.受注コード = od.受注コード

INNER JOIN 商品 s ON od.商品コード = s.商品コード

INNER JOIN 商品区分 c ON s.区分コード = c.区分コード

GROUP BY GROUPING SETS ( (区分名), (YEAR(受注日)) )

このように GROUPING SETS を利用すると、UNION ALL で集計値を結合するクエリをシンプルに記述できるようになります。

全体合計の追加

GROUPING SETS 関数では、次のように () を追加すると、全体合計を結果へ追加できるようになります。

SELECT 区分名, YEAR(受注日) AS 年, SUM( od.数量 * od.単価) AS 受注金額

FROM 受注明細 od ~中略~

GROUP BY GROUPING SETS ( (区分名), (YEAR(受注日)) , () )

WITH CUBE の置き換え

次に、WITH CUBE を置き換えとして利用可能な GROUPING SETS の使用方法をみていきましょう。例えば、次のような WITH CUBE(A と B と C 列の組み合わせた集計結果の取得)は、GROUPING SETS を利用して次のように置き換えることができます。

全体合計はNULL、NULLで表示される

SELECT A, B, C, SUM(n) FROM tGROUP BY A, B, C WITH CUBE

-- GROUPING SETS の場合SELECT A, B, C, SUM(n) FROM tGROUP BY GROUPING SETS

( (A, B, C),(A, B),(A, C),(B, C),(A),(B),(C),() )

Page 176: SQL Server 2014 自習書シリーズ No.3

それでは、これも試してみましょう。まずは、WITH CUBE を次のように実行して、商品区分と受注年の組み合わせ集計を取得します。

SELECT 区分名, YEAR(受注日) AS 年, SUM( od.数量 * od.単価) AS 受注金額

FROM 受注明細 od

INNER JOIN 受注 o ON o.受注コード = od.受注コード

INNER JOIN 商品 s ON od.商品コード = s.商品コード

INNER JOIN 商品区分 c ON s.区分コード = c.区分コード

GROUP BY 区分名, YEAR(受注日)

WITH CUBE

次に、GROUPING SETS 関数を利用して、これと同じ結果を取得してみましょう。

SELECT 区分名, YEAR(受注日) AS 年, SUM( od.数量 * od.単価) AS 受注金額

FROM 受注明細 od

INNER JOIN 受注 o ON o.受注コード = od.受注コード

INNER JOIN 商品 s ON od.商品コード = s.商品コード

INNER JOIN 商品区分 c ON s.区分コード = c.区分コード

GROUP BY GROUPING SETS ( ( 区分名, YEAR(受注日) )

,( 区分名 )

,( YEAR(受注日) )

,() )

このように GROUPING SETS を利用すると、WITH CUBE と同じ結果を取得できるようになります。

商品区分と受注年を組み合わせた受注金額の合計

受注年ごとの受注金額の合計

商品区分ごとの受注金額の合計

全体の合計

・・・

商品区分と受注年を組み合わせた受注金額の合計

全体の合計

Page 177: SQL Server 2014 自習書シリーズ No.3

3.6 テーブル値パラメーターとユーザー定義テーブル型

「テーブル値パラメーター」(Table-Valued Parameters)は、「ユーザー定義テーブル型」をストアド プロシージャの入力パラメーターとして指定できる機能で、SQL Server 2008 から提供されました。これを利用すると、IN 演算子をパラメーター化する場合に非常に便利です。

テーブル値パラメーターは、次のように利用します。

-- テーブル値パラメーター(ユーザー定義テーブル型を入力パラメーターとして利用)

CREATE PROCEDURE ストアド プロシージャ名

@パラメーター名 ユーザー定義テーブル型 READONLY

, …

AS

任意の Transact-SQL ステートメント

パラメーターのデータ型を指定するところへユーザー定義テーブル型を指定し、READONLY(読み取り専用)キーワードを付与して利用します。

ユーザー定義テーブル型は、次のように table データ型のテーブル定義に対して、名前を付けてデータ型(Type)として保存できる機能です。

-- ユーザー定義テーブル型

CREATE TYPE 型名

AS TABLE

( 列名1 データ型

,列名2 データ型

, … )

go

-- ユーザー定義テーブル型の利用

DECLARE @変数名 型名

Let's Try

それでは、テーブル値パラメーターを利用して、IN 演算子をパラメーター化してみましょう。ここでは、「sampleDB」データベースの「emp」テーブルを利用しますが、このテーブルの作成スクリプトは、サンプルスクリプト内の「03_table_parameter.sql」ファイルにあります。

1. まずは、IN 演算子へ与える値を格納するための int データ型の列を持ったユーザー定義テーブル型を「valuelist」という名前で作成します。

USE sampleDB

-- ユーザー定義テーブル型

CREATE TYPE valuelist

AS TABLE ( val int )

go

Page 178: SQL Server 2014 自習書シリーズ No.3

2. 次にテーブル値パラメーターを利用して、ストアド プロシージャを作成します。

-- テーブル値パラメーターを利用するストアド プロシージャ

CREATE PROCEDURE proc3

@v valuelist READONLY

AS

SELECT * FROM emp

WHERE empno IN ( SELECT val FROM @v )

IN 演算子の部分をサブクエリとし、@v(ユーザー定義テーブル型 valuelist を指定したパラメーター)から val 列(int データ型の列)を取得して、それを IN 演算子へ与えています。

3. 次に、ユーザー定義テーブル型の val 列へ「1」と「5」を格納して、この値をストアド プロシージャのパラメーターへ与えてみます。

-- ユーザー定義テーブル型を利用した変数@v の宣言

DECLARE @v AS valuelist

-- 変数 @v へ値の格納(IN 演算子に与える値)

INSERT INTO @v (val)

VALUES ( 1 )

,( 5 )

-- ストアド プロシージャの実行

EXEC proc3 @v

emp テーブルから empno が 1 と 5 の社員を取得できていることを確認できます。

このように、ユーザー定義テーブル型とテーブル値パラメーターを利用すると、IN 演算子のパラメーター化が簡単に行えるようになります。

Tips: ADO.NET からテーブル値パラメーターを利用する場合

VB や C# などのアプリケーションからテーブル値パラメーターへ値を利用する場合は、SqlParameter クラスのデータ型として「Structured」を指定して、DataTable クラスへ値を格納しておくようにします。具体的には次のように利用します(VB の場合)。

Imports System.Data

Page 179: SQL Server 2014 自習書シリーズ No.3

Imports System.Data.SqlClient Imports System.Data.SqlTypes :

' DataTable オブジェクトへ値を格納

Dim dt As New DataTable

Dim row As DataRow

dt.Columns.Add("val", Type.GetType("System.Int32"))

' val 列へ 1 を格納

row = dt.NewRow()

row("val") = 1

dt.Rows.Add(row)

' val 列へ 5 を格納

row = dt.NewRow()

row("val") = 5

dt.Rows.Add(row)

Dim cnstr As String = "Server=localhost;Database=sampleDB;Integrated Security=SSPI"

Using cn As SqlConnection = New SqlConnection(cnstr)

cn.Open()

Using cmd As SqlCommand = New SqlCommand()

cmd.Connection = cn

cmd.CommandType = CommandType.StoredProcedure

cmd.CommandText = "proc3"

' SqlParameter のデータ型へ Structured を指定

Dim p1 As SqlParameter = cmd.Parameters.Add("@v", SqlDbType.Structured)

p1.TypeName = "valuelist"

p1.Value = dt

Using dr As SqlDataReader = cmd.ExecuteReader()

While dr.Read()

Debug.Print(dr("empno") & vbTab & dr("empname"))

End While

End Using

End Using End Using

Page 180: SQL Server 2014 自習書シリーズ No.3

3.7 HierarchyID データ型

HierarchyID は、階層(Hierarchy)のパスを取得/操作が可能なデータ型で、SQL Server 2008 から提供されました。このデータ型には、GetRoot メソッドや、Path プロパティが用意されていて、親子階層のパスが操作できるようになっています。

例えば、次のような親子階層をもった「社員」テーブル(「上司社員番号」列に上司の社員番号が格納されている)があるとします。

CREATE TABLE 社員

( 社員番号 int NOT NULL PRIMARY KEY,

社員名 varchar(40) NULL,

上司社員番号 int NULL,

性別 char(4) NULL )

INSERT INTO 社員 VALUES (1001, '山田 太郎', NULL, '男性')

INSERT INTO 社員 VALUES (1002, '鈴木 一郎', NULL, '男性')

INSERT INTO 社員 VALUES (1003, '伊藤 朋子', 1001, '女性')

INSERT INTO 社員 VALUES (1004, '若旅 素子', 1002, '女性')

INSERT INTO 社員 VALUES (1005, '佐藤 啓太', 1001, '男性')

INSERT INTO 社員 VALUES (1006, '川崎 太郎', 1003, '男性')

この社員データには、次の階層(上司と部下)があります。

SQL Server 2005 までは、このような階層データに対して、次のように CTE(Common Table Expression: 共通テーブル式)を利用して、再帰クエリを実行することで、階層レベルを取得することができました(CTE は、SQL Server 2005 から提供された機能です)。

-- SQL Server 2005 の再帰クエリの場合

WITH cte (社員番号, 社員名, 上司社員番号, 階層)

AS

(

-- 上司

SELECT 社員番号, 社員名, 上司社員番号, 0

FROM 社員

WHERE 社員番号 = 1001

UNION ALL

-- 部下(再帰)

SELECT e.社員番号, e.社員名, e.上司社員番号, M.階層 + 1

FROM 社員 AS e

INNER JOIN cte AS M

ON e.上司社員番号 = M.社員番号

)

SELECT * FROM cte

CTE による再帰クエリで階層のレベルを取得可能

Page 181: SQL Server 2014 自習書シリーズ No.3

SQL Server 2008 からは、このクエリに対して HierarchyID データ型を利用することで、階層のパスを取得できるようになります。

Let's Try

それでは、これを試してみましょう。

1. まずは、サンプル スクリプト内の「04_HierarchyID.sql」ファイルを実行して、「社員」テーブルを作成します。

2. 次に、作成した「社員」テーブルに対して、次のように HierarchyID データ型を利用して、再帰クエリを実行してみましょう。

WITH cte1 (path, 社員番号, 社員名, 上司社員番号, 階層)

AS

(

-- 上司

SELECT HierarchyID::GetRoot() AS root

, 社員番号, 社員名, 上司社員番号, 0

FROM 社員

WHERE 社員番号 = 1001

UNION ALL

-- 部下(再帰)

SELECT CAST( cte1.path.ToString()

+ CAST(e.社員番号 AS varchar(30))

+ '/' AS HierarchyID )

Page 182: SQL Server 2014 自習書シリーズ No.3

,e.社員番号, e.社員名, e.上司社員番号, cte1.階層+ 1

FROM 社員 AS e

INNER JOIN cte1

ON e.上司社員番号 = cte1.社員番号

)

SELECT path.ToString(), * FROM cte1

このように HierarchyID データ型を利用すると、親子階層のパスを簡単に取得できるので便利です。

HierarchyID により階層のパスを取得

Page 183: SQL Server 2014 自習書シリーズ No.3

3.8 SQL Server 2012 からの Transact-SQL の新機能

Transact-SQL は、SQL Server 2008 から多くの新機能が提供されましたが、SQL Server 2012 からもたくさんの新機能が提供されています。その主なものは、次のとおりです。

Transact-SQL の強化

連番作成が可能な SEQUENCE や、n 件目~m 件目を容易に取得できるページング、TRY .. CATCH での再スロー、EXEC ステートメントでの Result Set のサポートなど

新しい Transact-SQL 関数のサポート

月末を取得することができる EOMONTH や、書式変更が可能な FORMAT 関数のサポートなど、主な新しい関数は、次のとおり。

DWH/BI 系の Transact-SQL 分析関数(Analytic Functions)のサポート

LEAD や LAG、CUME_DIST 関数などのサポートや、ウィンドウ操作が可能な OVER 句がサポートされてデータ分析が容易に。データ分析でよく利用する計算値(累積値や比率、前年同月値、移動累計、移動平均など)を簡単に計算可能に

シーケンス(SEQUENCE)による連番生成

SQL Server 2012 からは、他の RDBMS でお馴染みのシーケンス(SEQUENCE)がサポートされて、連番を作成できるようになりました。これは次のように試すことができます。

-- シーケンスの作成。1 から始まり、1 ずつ増える値へ設定

CREATE SEQUENCE seq1

AS int

START WITH 1

INCREMENT BY 1

MAXVALUE 200000

go

-- テーブルの作成

CREATE TABLE nt1 ( a int )

関数 説明EOMONTH 月末の取得CONCAT 文字列連結

DATEFROMPARTS

文字列から日付データ(date 型)を生成。例: DATEFROMPARTS('2011', '11', '11')smalldatetime 型は SMALLDATETIMEFROMPARTSdatetime2 型は DATETIME2FROMPARTSdatetimeoffset 型は DATETIMEOFFSETFROMPARTS

FORMAT 書式変更例: FORMAT(受注日, 'yyyy/MM/dd')

TRY_CONVERTTRY_PARSE

例外を発生させない型変換。変換失敗は NULL を返す例: TRY_CONVERT(datetime, '2011-11-11')

IIF 条件分岐

CHOOSE 引数の中から指定した値を取得例: CHOOSE(2, 'test1','test2','test3') なら test2 を返す

Page 184: SQL Server 2014 自習書シリーズ No.3

-- シーケンスの値を挿入。NEXT VALUE で次の値を取得可能

INSERT INTO nt1 VALUES(NEXT VALUE FOR seq1)

INSERT INTO nt1 VALUES(NEXT VALUE FOR seq1)

INSERT INTO nt1 VALUES(NEXT VALUE FOR seq1)

ページング(n件目~m件目の取得。OFFSET .. FETCH)

SQL Server 2012 からは、ページングがサポートされるようになったので、n件目~m件目のデータを簡単に取得できるようになりました。これは次のように試すことができます。

-- OFFSET .. FETCH で 51件目から 5件取得

SELECT * FROM nt1

ORDER BY a

OFFSET 50 ROWS

FETCH NEXT 5 ROWS ONLY

OFFSET でスキップしたい件数を指定して(画面は 50件)、FETCH NEXT で取得したい件数(画

1

2

3

Page 185: SQL Server 2014 自習書シリーズ No.3

面は 5件)を指定することで、51 件目~55 件目のデータを簡単に取得することができています。

TRY .. CATCH での再スロー(THROW)

SQL Server 2008 R2 以前のバージョンの TRY .. CATCH では、CATCH で捕獲したエラーを再スローすることができなかったので、アプリケーション側でエラーを捕獲するには、RAISERROR ステートメントを利用して再スローを記述する必要がありました。SQL Server 2012 からは、同じエラーを再度発生させる THROW がサポートされるようになったので、簡単に再スローを実現できるようになりました。これは次のように試すことができます。

BEGIN TRY

-- 0 除算エラーを意図的に発生させて CATCH ブロックへ

SELECT 1 / 0

SELECT * FROM t1 -- これは実行されない

END TRY

BEGIN CATCH

THROW -- 再スロー

END CATCH

EXEC ステートメントでの Result Set

SQL Server 2012 からは、EXEC ステートメントでの Result Set(結果セット)がサポートされるようになりました。これは次のように試すことができます。

-- ストアド プロシージャの作成

CREATE PROC proc1

AS

SELECT a FROM t1

go

-- EXEC .. WITH RESULT SETS

EXEC proc1

WITH RESULT SETS

(

( aaa bigint )

)

CATCH ブロックで、同じエラーを再度発生させることができるようになったので、アプリケーションへエラーを通達できるようになりました

Page 186: SQL Server 2014 自習書シリーズ No.3

新しい Transact-SQL 関数のサポート

SQL Server 2012 からは、新しい Transact-SQL 関数として、月末を取得することができる EOMONTH や、文字列から日付データを作成することができる DATEFROMPARTS、文字列連結が可能な CONCAT、条件分岐が可能な IIF や CHOOSE 関数、書式変更が可能な FORMAT 関数、例外を発生させない型変換が可能な TRY_CONVERT 関数の提供など、便利な関数が多数サポートされるようになりました。

これらは、次のように試すことができます。

EOMONTH 関数による月末の取得

EOMONTH 関数を利用すると、月末を簡単に取得することができます。これは次のように試すことができます。

SELECT EOMONTH('2014/10/23')

aaa という名前で取得bigint 型として取得

関数 説明EOMONTH 月末の取得CONCAT 文字列連結

DATEFROMPARTS

文字列から日付データ(date 型)を生成。例: DATEFROMPARTS('2011', '11', '11')smalldatetime 型は SMALLDATETIMEFROMPARTSdatetime2 型は DATETIME2FROMPARTSdatetimeoffset 型は DATETIMEOFFSETFROMPARTS

FORMAT 書式変更例: FORMAT(受注日, 'yyyy/MM/dd')

TRY_CONVERTTRY_PARSE

例外を発生させない型変換。変換失敗は NULL を返す例: TRY_CONVERT(datetime, '2011-11-11')

IIF 条件分岐

CHOOSE 引数の中から指定した値を取得例: CHOOSE(2, 'test1','test2','test3') なら test2 を返す

Page 187: SQL Server 2014 自習書シリーズ No.3

DATEFROMPARTS 関数による文字列から日付データの作成

DATEFROMPARTS 関数を利用すると、文字列データから日付データを作成することができます。これは次のように試すことができます。

SELECT DATEFROMPARTS('2014', '10', '23')

このように DATEFROMPARTS 関数を利用すれば、date 型の日付データを簡単に作成することができます。また、datetime 型の日付データを作成したい場合は DATETIMEFROMPARTS(データ型に FROMPARTS を付けたもの)、smalldatetime 型なら SMALLDATETIMEFROM PARTS、datetime2 型なら DATETIME2FROMPARTS、datetimeoffset 型なら DATE TIMEOFFSETFROMPARTS といった形で、日付データ型ごとに関数が用意されています。

CONCAT 関数による文字列連結

CONCAT は、他の RDBMS でお馴染みの文字列の連結ができる関数です(SQL Server 2008 R2 以前のバージョンでは + 演算子で文字列連結を行っていましたが、その代替として利用することができます)。これは次のように試すことができます。

DECLARE @a varchar(10) = 'SQL Server'

DECLARE @b varchar(10) = '2014'

SELECT CONCAT(@a, ' ', @b)

月末(10/31)を取得

date 型の日付データを作成できる

Page 188: SQL Server 2014 自習書シリーズ No.3

FORMAT 関数による書式設定

SQL Server 2012 からは、書式が設定できる関数として FORMART 関数が提供されました。これは次のように試すことができます。

DECLARE @d datetime = '2014/10/23'

SELECT FORMAT(@d, 'yyyy年MM月dd日')

DECLARE @f float = '0.88123'

SELECT FORMAT(@f, 'p2')

例外を発生させない型変換が可能な TRY_CONVERT 関数

SQL Server 2012 からは、例外を発生させない型変換が可能な関数として TRY_CONVERT が提供されました。これは次のように試すことができます。

SELECT TRY_CONVERT(datetime, '2014-13-23')

SQL Server 2008 R2 以前のバージョンの CONVERT 関数では、型変換が失敗する場合(無効な値の場合)は、例外が発生しますが、TRY_CONVERT 関数では、型変換が失敗する場合には、NULL 値を返すことで、例外を発生させないようにすることができます。

yyyy で 年(4桁)MM で 月(2桁)dd で 日(2桁)を

取得できる

p2 でパーセント表示で、小数点以下 2桁

で表示できる

型変換が無効な場合はNULL が返る

Page 189: SQL Server 2014 自習書シリーズ No.3

条件分岐が可能な IIF 関数

SQL Server 2012 からは、条件分岐ができる関数として IIF 関数が提供されました。これは次のように試すことができます。

DECLARE @a varchar(10) = 'SQL Server'

SELECT IIF(@a = 'SQL Server', '真', '偽')

指定した値を取得できる CHOOSE 関数

SQL Server 2012 からは、引数の中から指定した値を取得することができる CHOOSE 関数が提供されました。これは次のように試すことができます。

SELECT CHOOSE(2, 'test1','test2','test3')

2 を指定しているので2番目の test2 が返る

Page 190: SQL Server 2014 自習書シリーズ No.3

3.9 Transact-SQL 分析関数のサポート

SQL Server 2012 からは、BI(Business Intelligence)および DWH(データ ウェアハウス)環境で役立つ Transact-SQL の分析関数(Analytic Functions)が多数サポートされるようになりました。これらの分析関数では、ウィンドウ操作ができるようになるので、累積値や比率、前年同月値、移動累計、移動平均などといったデータ分析でよく利用する計算値を簡単に導き出せるようになります。これは、次のように試すことができます。

LAG 関数による前年同月値の取得

LAG 関数では、結果セットのうち、指定した行数分前のデータを取得することができます。したがって、これを利用すれば、前年同月の値を取得する、といったことも簡単に行えます。これは次のように試すことができます。

USE NorthwindJ

go

SELECT *, LAG(受注金額, 12) OVER(ORDER BY 年, 月) AS 前年同月

FROM

(

SELECT YEAR(受注日) 年, MONTH(受注日) 月

, SUM( od.数量 * od.単価 ) AS 受注金額

FROM 受注明細 od

INNER JOIN 受注 o ON o.受注コード = od.受注コード

GROUP BY YEAR(受注日), MONTH(受注日)

) t

ORDER BY 年, 月

LAG 関数では ORDER BY 句で「年, 月」で並べ替えて、第 2 引数に「12」を指定しているので、12 ヶ月前(1 年前)の受注金額データ(前年同月値)を取得することができています。

前年同月(2005年 1月)の受注金額

LAG 関数で12行前のデータを取得

年月ごとの受注金額の合計を取得

Page 191: SQL Server 2014 自習書シリーズ No.3

累積金額の取得(OVER .. ROWS ..)

SQL Server 2012 からは、OVER 句が拡張されて、従来から利用できる PARTITION BY(グループ化)と ORDER BY に加えて ROWS や RANGE を指定したウィンドウ操作ができるようになりました。ROWS では、UNBOUNDED PRECEDING を指定することで、そこからウィンドウを開始できるので、次のように SUM 関数を利用すれば、累積値を計算することができます。

SELECT *, SUM(受注金額) OVER(

PARTITION BY 年

ORDER BY 年, 月

ROWS UNBOUNDED PRECEDING ) AS 累積金額

FROM

(

SELECT YEAR(受注日) 年, MONTH(受注日) 月

, SUM( od.数量 * od.単価 ) AS 受注金額

FROM 受注明細 od

INNER JOIN 受注 o ON o.受注コード = od.受注コード

GROUP BY YEAR(受注日), MONTH(受注日)

) t

ORDER BY 年, 月

このように、SQL Server 2012 からは、ウィンドウ操作が可能な分析関数がサポートされるようになったので、BI/データ分析でよく利用する計算値(累積値や比率、前年同月値、移動累計、移動平均など)を簡単に計算できるようになり大変便利になりました。

以上のように、Transact-SQL は、SQL Server 2008 および SQL Server 2012 で非常に多くの機能が提供されて、大きくパワーアップしました。SQL Server 2014 からは、SELECT .. INTO での並列実行が可能になったり、インメモリ OLTP をサポートするなど、さらに強化されています。SQL Server 2014 からの新機能については、本自習書シリーズの「SQL Server 2014 の新機能ダイジェスト」と「SQL Server 2014 のインメモリ OLTP 機能の概要」編で説明しているので、

2005年 1月と 2月を足した金額

2005年 1月~12月までを足した金額

2006年 1月と 2月を足した金額

2005年 1月と 2月、3月 を足した金額

Page 192: SQL Server 2014 自習書シリーズ No.3

こちらもぜひご覧いただければと思います。

Page 193: SQL Server 2014 自習書シリーズ No.3

3.10 FileStream、FileTable データ型

FileStream データ型は、Windows のファイルを直接 SQL Server へ格納できるデータ型で、SQL Server 2008 から提供されました。このデータ型を利用することで、従来の BLOB 型(image データ型や varbinary(max) データ型)へファイル データを格納するよりも、パフォーマンスの良いアプリケーションを作成できるようになります。

Let's Try

それでは、これを試してみましょう。

1. まずは、FileStream の機能を有効化する必要があります。FileStream 機能を有効化するには、スタート画面から[Microsoft SQL Server 2014]グループの「SQL Server 2014 構成マネージャー」をクリックして、SQL Server 構成マネージャーを起動します(Windows Server 2008/2008 R2 の場合は[スタート]メニューから起動します)。

2. 起動後、次のように SQL Server サービスを右クリックして[プロパティ]をクリックし、[SQL Server のプロパティ]ダイアログを開きます。

[FILESTREAM]タブを開いて、[Transact-SQL アクセスに対して FILESTREAM を有効にする]と[ファイル I/O ストリーム アクセスに対して FILESTREAM を有効にする]をチェックして、[OK]ボタンをクリックします。別マシンからアクセスさせたい場合には、[リモート クライアントに FILESTREAM データへのアクセスを許可する]もチェックします。

3. 続いて、次のように sp_configure システム ストアド プロシージャを実行して、FileStream 機能を有効化します(Management Studio のクエリ エディターから実行します)。

EXEC sp_configure 'filestream_access_level', 2

RECONFIGURE

1

2

3

Page 194: SQL Server 2014 自習書シリーズ No.3

4. 次に、FileStream データを格納するためのファイル グループを指定したデータベースを「fsTestDB」という名前で作成します(データベースの作成先のフォルダーは、環境にあわせて適宜変更してください)。

CREATE DATABASE fsTestDB

ON

PRIMARY

( NAME = fsTestDB_mdf

, FILENAME = 'C:\temp\fsTestDB.mdf'),

FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM

( NAME = fsTestDB_fs

, FILENAME = 'C:\temp\fsTestDB_FileSream')

LOG ON

( NAME = fsTestDB_log

, FILENAME = 'C:\temp\fsTestDB_Log.ldf')

go

CONTAINS FILESTREAM を指定することで、そのファイル グループを FileStream データの格納用として利用できるようになります。

5. 次に、FileStream データを格納するためのテーブルを次のように作成します。

USE fsTestDB

CREATE TABLE photo

(

pID uniqueidentifier ROWGUIDCOL PRIMARY KEY,

pName varchar(200),

pData varbinary(MAX) FILESTREAM NULL,

updDate datetime DEFAULT GETDATE()

)

pData 列を varbinary(MAX) FILESTREAM と指定することで、この列へ FileStream データを格納できるようになります。また、FILESTREAM キーワードを指定した場合は、uniqueidentifier データ型で ROWGUIDCOL キーワードを指定した列が必要になるので、ここでは pID 列をそれにしています。そのほかの pName 列は、ファイル名を格納するための列とし、updDate 列は、データ更新日時を格納するための列としています。

OpenSqlFilestream API によるデータ格納

FileStream データ型へデータ(OS ファイル)を格納するには、OpenSqlFilestream API を

Page 195: SQL Server 2014 自習書シリーズ No.3

利用して、アプリケーションを作成する必要があります。この API については、オンライン ブックの以下のトピックに詳細が記載されています。

OpenSqlFilestream による FILESTREAM データへのアクセス http://msdn.microsoft.com/ja-jp/library/bb933972.aspx

FileTable による Windows ファイルのサポート

SQL Server 2012 からは、FileTable 機能がサポートされて、FileStream 機能よりも簡単にWindows 上のファイルを SQL Server 上のデータベース内に格納できるようになりました。FileStream データ型では、Windows ファイルを操作するために OpenSqlFilestream API を利用しなければなりませんでしたが、FileTable 機能では、通常の Windows ファイルを操作するのと同様に Windows エクスプローラーを利用して、データベース内へファイルを格納することができます。

以下の画面は、FileTable に対して Windows エクスプローラーを利用してファイルを操作しているときの様子です。

Page 196: SQL Server 2014 自習書シリーズ No.3

FileTable の中身を次のように SELECT ステートメントで参照すると、実際の Windows ファイルが SQL Server データベース内に格納されていることを確認できます。

FileTable の利用方法

FileTable は、従来の FileStream データ型を応用した機能なので、途中までの手順が FileStream を利用する場合と同じです。

1. まずは、FileStream のときと同様の操作(手順 1~3)を実行して、FileStream 機能を有効化しておきます。

2. 次に、FileTable 機能を利用するために、[データベースのプロパティ]ダイアログを開きます。このダイアログでは、次のように[オプション]ページを開いて、[FileStream ディレクトリ名]へ任意のディレクトリ名(画面は ftest。ここで設定した名前が Windows エクスプローラーから見えるフォルダー名になります)と[FileStream 非トランザクション アクセス]を「Full」へ設定します。

FileTable

¥¥サーバー名¥mssqlserver¥~¥~のように UNC 名を指定して FileTable

へアクセス可能

FileTable 内のファイルをWindows エクスプローラーを利用して、通常のファイル

と同じように操作可能

Windows エクスプローラーで配置したファイルがテーブルへ格納

されていることを確認できる

Page 197: SQL Server 2014 自習書シリーズ No.3

次のように、接続を閉じる必要がある主旨のダイアログが表示されたら、[はい]をクリックします。

3. 次に、CREATE TABLE ステートメントで FileTable を作成します。FileTable を作成するには、次のように AS FILETABLE を指定します。

USE fsTestDB

CREATE TABLE fTable1 AS FILETABLE

WITH

(

FILETABLE_DIRECTORY = 'doctable'

,FILETABLE_COLLATE_FILENAME = database_default

)

FILETABLE_DIRECTORY には、任意のディレクトリ名(上記は doctable)を指定し、ここで設定した名前が Windows エクスプローラーから見えるフォルダー名になります。前述のデータベースのプロパティで設定したディレクトリ名(画面では ftest と設定)が上位フォルダーになり、次のパスで Windows エクスプローラーからアクセスできるようになります。

\\サーバー名\MSSQLSERVER\ftest\doctable

1

2

3

1

Page 198: SQL Server 2014 自習書シリーズ No.3

このように SQL Server 2012 からは、FileTable 機能がサポートされたことで、Windows 上のファイルを SQL Server データベース内に簡単に格納できるようになりました。

¥¥サーバー名¥MSSQLSERVER¥ftest¥doctable

Page 199: SQL Server 2014 自習書シリーズ No.3

3.11 オブジェクトの依存関係の表示

SQL Server 2008 からは、オブジェクト(ビューやストアド プロシージャ、ユーザー定義関数など)の依存関係を表示するための機能として、次の 3 つのビュー(関数)が追加されました。

sql_expression_dependencies dm_sql_referencing_entities dm_sql_referenced_entities

これらのビューにより、ストアド プロシージャが依存しているテーブルや、ユーザー定義関数を利用しているオブジェクトを容易に把握できるようになったので、大変便利です。

Let's Try

それでは、これを試してみましょう。

1. まずは、sampleDB データベースの「emp」テーブルをもとに、ビューやユーザー定義関数、ストアド プロシージャを作成します(emp テーブルは、テーブル値パラメーターで利用したサンプルスクリプト内の「03_table_parameter.sql」ファイルで作成することができます)。

USE sampleDB

go

-- ビュー empView の作成(emp テーブルに依存)

CREATE VIEW dbo.empView

AS

SELECT empno, empname FROM emp

go

-- ユーザー定義関数 empFunc1 の作成

CREATE FUNCTION dbo.empFunc1(@p1 int) RETURNS int

BEGIN

RETURN @p1 * 100

END

go

-- ストアドプロシージャ empProc1 の作成(empFunc1 と emp に依存)

CREATE PROC empProc1

AS

SELECT dbo.empFunc1(empno) FROM emp

go

-- ストアドプロシージャ empProc2 の作成(empProc1 に依存)

CREATE PROC empProc2

AS

EXEC empProc1

go

Page 200: SQL Server 2014 自習書シリーズ No.3

sql_expression_dependencies

1. 次に、sql_expression_dependencies カタログ ビューを利用して、作成したオブジェクトの依存関係を表示してみましょう。

SELECT OBJECT_NAME( referencing_id ), referenced_entity_name AS 依存元, *

FROM sys.sql_expression_dependencies

sql_expression_dependencies ビューでは、referenced_entity_name 列を参照することで依存元となっているオブジェクトを取得することができます。empView が emp テーブルへ依存していること、empProc1 ストアド プロシージャが emp テーブルと empFunc1 ユーザー定義関数に依存していることを確認できると思います。

dm_sql_referenced_entities

dm_sql_referenced_entities 動的管理関数を利用すると、依存元の列名を取得することもできます。これも試してみましょう。

1. 次のように記述して、empView ビューが依存している列名を取得してみます。

SELECT referenced_entity_name AS 依存元, referenced_minor_name AS 依存元の列名,*

FROM sys.dm_sql_referenced_entities ('dbo.empView', 'OBJECT')

dm_sql_referenced_entities 関数では、第 1 引数へ依存関係を調べたいオブジェクト名を指定することで、referenced_minor_name 列で依存元の列名を取得することができます。

Page 201: SQL Server 2014 自習書シリーズ No.3

依存関係を GUI で確認

オブジェクト間の依存関係は、Management Studio を利用して、グラフィカルに確認することもできます。これも試してみましょう。

1. 次のようにストアド プロシージャ「empProc2」を右クリックして、[依存関係の表示]をクリックします。

これにより、[オブジェクトの依存関係]ダイアログが表示されるので、「empProc2 に依存するオブジェクト」をクリックすると、依存関係をグラフィカルに確認することができます。

このように、SQL Server 2008 からは、オブジェクト間の依存関係を簡単に表示できるようになったので、大変便利です。

1

2

依存関係をグラフィカルに確認可能

Page 202: SQL Server 2014 自習書シリーズ No.3

3.12 SQL Server Data Tools による開発生産性向上

SQL Server 2012 からは、SQL Server Data Tools(SSDT)というデータベース開発に役立つ新しいツールが提供されました。

SSDT ツールを利用しているときの様子

SSDT では、データベースのスキーマ比較を行ったり、リファクタリング(オブジェクト名の変更など)、デバッグ実行(ストアド プロシージャのステップ実行)などを行ったりすることができるので、大変便利です。このツールは、クラウド上のデータベース「Microsoft Azure SQL データベース」(旧名:SQL Azure)にも対応しているので、オンプレミス(ローカル環境)のデータベースとクラウド上のデータベースでスキーマ比較をして、定義が異なるオブジェクトがある場合には同じスキーマにする(更新する)、といったことも行うことができます。

SSDT ツールでスキーマ比較をしているときの様子

Azure SQL データベースに対してもグラフィカルな操作で

テーブル作成が可能

GUI 操作によってCREATE TABLE ステートメントが自動生成される

SSDT でAzure SQL データ

ベース内のテーブル一覧を参照

異なる部分は赤や黄色、斜線で表示される

SSDT でスキーマ比較をしているときの様子

Page 203: SQL Server 2014 自習書シリーズ No.3

SSDT(SQL Server Data Tools)のインストール

SQL Server 2014 に対応した SSDT は、次の URL からインストールすることができます。

Microsoft SQL Server Data Tools Download http://msdn.microsoft.com/en-us/data/hh297027

なお、SSDT をインストールするには、Visual Studio が必要になるので、Visual Studio をインストールしていない環境の場合には、後述の Note で紹介している「SSDT-BI」ツールを先にインストールした後に、SSDT をインストールするようにします。

Note: Visual Studio 2012/2013 に付属の SSDT は SQL Server 2012 対応の古いもの

SSDT は、Visual Studio 2012/2013 の Professional エディション以上であれば、次のようにインストール時の[インストールするオプション機能]ページからインストールすることができますが、この SSDT は SQL Server 2012 対応のもので、古いバージョンであることに注意する必要があります(SQL Server 2014 へ対応した最新バージョンは、上記の URL からインストールする必要があります)。

12

Page 204: SQL Server 2014 自習書シリーズ No.3

Note: SSDT-BI(SQL Server Data Tools - Business Intelligence)

SSDT には、BI プロジェクトを作成するための SSDT-BI(SQL Server Data Tools - Business Intelligence)ツールもあります。SSDT-BI は、SQL Server 2008 R2 以前での BIDS (Business Intelligence Development Studio)ツールに相当する機能で、Reporting Services や Analysis Services、Integration Services のプロジェクトを作成することができます。

SSDT-BI は、前出の SSDT の URL と同じページから、次のようにダウンロードおよびインストールすることができます。

SSDT の SQL Server オブジェクト エクスプローラー

SSDT(SQL Server Data Tools)をインストールすると、「SQL Server オブジェクト エクスプローラー」が追加されます。これは、次のように[表示]メニューから[SQL Server オブジェクト エクスプローラー]をクリックすることで、開くことができます。

SQL Server オブジェクト エクスプローラーは、Management Studio のオブジェクト エクスプ

SSDT-BI for Visual Studio 2013 のインストール

Page 205: SQL Server 2014 自習書シリーズ No.3

ローラーと非常によく似ているツールで、各種のオブジェクト作成やスキーマ比較を行ったりすることができます。また、クエリ エディターも付属しているので、次のように任意の SQL ステートメントを実行することもできます(実行プランを確認することもできます)。

SSDT で Microsoft Azure SQL データベース上のオブジェクトも簡単操作

SSDT は、クラウド上のデータベース「Microsoft Azure SQL データベース」(以降、Azure SQL データベースと表記します)にも対応しているので、Azure SQL データベース内のオブジェクトを操作することもできます。

これを行うには、次のように SQL Server オブジェクト エクスプローラーで「SQL Server」アイコンを右クリックして、[SQL Server の追加]をクリックします。

[サーバーへの接続]ダイアログが表示されたら、[サーバー名]に Azure SQL データベースのサーバー名、[ログイン]と[パスワード]に Azure SQL データベース上のログイン名とパスワードを指定します。

これで Azure SQL データベースに接続して、次のようにオブジェクトを操作していくことができます(グラフィカルな操作でテーブルを作成したりできます)。

SQL Server オブジェクトエクスプローラー

クエリ エディターで任意の SQL ステートメントを実行可能

実行プランも表示できる

Microsoft Azure SQL データベースのサーバー名を指定可能

Page 206: SQL Server 2014 自習書シリーズ No.3

SSDT でのスキーマ比較

SSDT には、Visual Studio 2008 以前のバージョンで提供されていたデータベース プロジェクト機能と同様、異なるサーバー間(開発機と本番機など)でのスキーマ比較(テーブルの列名やデータ型、ストアド プロシージャのソースコードなどの比較)を行うことができます。

これを行うには、SQL Server オブジェクト エクスプローラーで、次のように対象データベースを右クリックして、[スキーマ比較]をクリックします。

これによって、次のように[スキーマ比較]エディターが表示されるので、[ターゲットの選択]で比較対象となるサーバー/データベースを選択すれば、スキーマ比較を行うことができます。

Azure SQL データベースに対してもグラフィカルな操作で

テーブル作成が可能

GUI 操作によってCREATE TABLE ステートメントが自動生成される

SQL Server オブジェクト エクスプローラーで Azure SQL データベース内のテーブル

一覧を参照

Page 207: SQL Server 2014 自習書シリーズ No.3

[比較]ボタンをクリックして、スキーマ比較を行った後の様子

スキーマ比較を行うと、異なる部分があった場合には、赤や黄色、斜線で表示してくれます(従来の Visual Studio 2008 でのスキーマ比較よりも見やすくなりました)。また、SSDT のスキーマ比較機能では、従来からの機能と同様、異なる部分をターゲット サーバーへ反映させることも簡単に行うことができます([更新]ボタンをクリックするだけで反映可能です)。したがって、開発機で修正したスキーマ変更を、本番環境へ反映させる、といったことも簡単に行うことができます。

SSDT は、Azure SQL データベースにも対応しているので、オンプレミス(社内)の SQL Server と、クラウド上の Azure SQL データベースとの間でスキーマ比較を行って、異なる部分があればそれを反映させる、といったことも簡単に(ワンクリックで)行うことができます(従来の Visual Studio 2008 のスキーマ比較機能は Azure SQL データベースには対応していません)。

SSDT のリファクタリング機能 ~名前やスキーマ変更が可能に~

SSDT では、リファクタリング機能が強化されて、オブジェクト名やスキーマの変更にも対応できるようになりました。これを利用するには、次のようにデータベースを右クリックして、[新しいプロジェクト]をクリックし、新しいデータベース プロジェクトを作成します。

異なる部分は赤や黄色、斜線で表示される

スキーマ比較をした結果

Page 208: SQL Server 2014 自習書シリーズ No.3

リファクターを行うには、次のようにビューやストアド プロシージャなどのスクリプトを表示して、名前を変更したいオブジェクトを右クリックして、[リファクター]をクリックします。

[リファクター]メニューの[名前の変更]をクリックした場合は、新しい名前(変更したい名前)を入力して[OK]ボタンをクリックすると、次のように[変更のプレビュー]ダイアログが表示されます。

Azure SQL データベース内のオブジェクトをもとにデータベース

プロジェクトを作成可能

Azure SQL データベース内のオブジェクトをインポートして

スクリプトを生成可能

名前を変更したいオブジェクトを右クリック

新しい名前を入力

1

2

3

4

Page 209: SQL Server 2014 自習書シリーズ No.3

このダイアログには、名前を変更したことによって影響のあるオブジェクトが一覧されて、[適用]ボタンをクリックすれば、これらのオブジェクトを一括変更することができます。

このように、SSDT では、リファクタリング機能が強化されているので大変便利です(従来の Visual Studio 2008 のリファクタリング機能では、「ワイルドカードの展開」と「完全修飾名」のみの提供でした)。

名前の変更によって影響のあるオブジェクトが一覧される

同じ名前のテーブルを利用している他のストアド プロシージャも自動変更

もちろんテーブル自身も自動変更される

リファクター機能で名前変更商品から Products へ

Page 210: SQL Server 2014 自習書シリーズ No.3

3.13 Microsoft Azure SQL データベース(SQL Azure)への対応

SQL Server 2008 R2 の Management Studio からは、マイクロソフトの提供するクラウド上の データベース サービス「Azure SQL データベース」(旧名:SQL Azure)に接続することができるようになりました(SQL Server 2008 の場合は、sqlcmd やクエリ エディターからのみ接続が可能で、Management Studio のオブジェクト エクスプローラーからは接続することができませんでした)。

[サーバーへの接続]ダイアログでは、[サーバー名]に Azure SQL データベースのサーバー名や、[ログイン]と[パスワード]に Azure SQL データベース上のログイン名とパスワードを指定することで、Azure SQL データベースへ接続することができます。

接続後は、次のようにオブジェクトを操作することができます

なお、前項で紹介した SSDT(SQL Server Data Tools)ツールを利用しても、Azure SQL データベースへ接続することができるので、どちらを利用しても大丈夫です。

Azure SQL データベースのサーバー名を指定可能

Azure SQL データベースへ接続

Azure SQL データベース内のテーブル一覧を参照できる

Page 211: SQL Server 2014 自習書シリーズ No.3

SQL Server 2014 の Microsoft Azure 対応機能

SQL Server 2014 からは、Microsoft Azure との連携に関する機能がさらに充実しています。これらの概要は、次のとおりです。

Microsoft Azure 上へのバックアップが可能に(BACKUP TO URL)。 バックアップ ファイルの暗号化も可能

AlwaysOn 可用性グループのセカンダリを Microsoft Azure 上へ作成することができ

るウィザードの提供

Microsoft Azure 上の仮想マシン(VM)へのデータベースの配置(Deploy)

データベース ファイル(.mdf)を Microsoft Azure 上に配置可能に

Microsoft Azure 上へのバックアップを支援するツールの提供

このように SQL Server 2014 からは、クラウド対応機能がさらに充実しています。

Microsoft Azure 上の BLOB ストレージのコンテナーを指定

して、バックアップが可能バックアップ ファイルの暗号化も可能

Azure VM(仮想マシン)

の設定

AlwaysOn 可用性グループの設定ウィザード

セカンダリ(レプリカ)としてMicrosoft Azure 上の仮想マシンを追加できる=クラウド DR の実現

Page 212: SQL Server 2014 自習書シリーズ No.3

STEP 4. SQL Server 2008 以降の その他の新機能

この STEP では、SQL Server 2008 以降(2008/2008 R2/2012)で提供された、その他の新機能について説明します。

透過的なデータ暗号化(TDE:Transparent Data Encryption)

ポリシー ベースの管理

変更データ キャプチャ(CDC:Change Data Capture)

データ プロファイル タスクによるデータの分布状況の表示

Deprecated Features オブジェクト

パーティション ウィザード

マルチ サーバー クエリ

マルチサーバー管理(UCP)

DAC(データ層アプリケーション)

Distributed Replay によるストレス テストの実施

拡張イベントでの GUI サポート

UI 向上(DB リストア/起動オプション)

DQS(Data Quality Services)によるデータ クレンジング/名寄せ処理

マスター データ サービス(MDS)によるマスター データ管理

Page 213: SQL Server 2014 自習書シリーズ No.3

4.1 透過的なデータ暗号化(TDE: Transparent Data Encryption)

透過的なデータ暗号化は、データベース内のオブジェクトをすべて暗号化できる機能で、SQL Server 2008 から提供されました。SQL Server 2005 のときには、EncryptByKey と DecryptByKey を利用した暗号化機能が提供されていましたが、この機能を利用するには、アプリケーションを修正する必要がありました。そこで、SQL Server 2008 からは、アプリケーションを修正しなくてもよい(アプリケーションからは透過的に利用できる)暗号化機能として、透過的なデータ暗号化機能が提供されました。

透過的なデータ暗号化では、データベースに対して暗号化を設定するだけで、データベース内のすべてのオブジェクトを暗号化することができます(データ ファイル全体を暗号化することができます)。また、バックアップ ファイルも自動的に暗号化されるようになります。これによって、データ ファイル(.mdf)やハード ディスクが盗難に遭ったり、バックアップ テープが持ち出されてたとしても、(暗号が解読されない限りは)データが読み取られることはありません。

Let's Try

それでは、これを試してみましょう。

1. まずは、「enc」という名前のデータベースを任意の場所(C:\TDE フォルダーなど)へ作成します(CREATE DATABASE が失敗する場合は、「C:\TDE フォルダー」への書き込み権限を与えるか、書き込み権限のあるフォルダーを指定して作成してください)。

USE master

go

CREATE DATABASE enc

ON PRIMARY

( NAME = 'enc',

FILENAME = 'C:\TDE\enc.mdf' )

2. 次に、CREATE MASTER KEY ENCRYPTION ステートメントを利用して、master データベース内にデータベース マスター キーを作成します。

USE master

go

CREATE MASTER KEY ENCRYPTION

BY PASSWORD = '<StrongPassword>'

BY PASSWORD には、任意のパスワードを設定しますが、強固なパスワード(大文字と小

Page 214: SQL Server 2014 自習書シリーズ No.3

文字、@ などの特殊文字を含むなど)を設定するようにします。

3. 次に、CREATE CERTIFICATE ステートメントを利用して、サーバー証明書を作成します。

CREATE CERTIFICATE MyServerCert

WITH SUBJECT = 'My Certificate'

「MyServerCert」は、サーバー証明書の名前なので、任意の名前を設定できます。

4. 続いて、このサーバー証明書を利用して、データベース暗号化キーを作成します。これは、CREATE DATABASE ENCRYPTION KEY ステートメントを利用して、次のように作成することができます。

USE enc

go

CREATE DATABASE ENCRYPTION KEY

WITH ALGORITHM = AES_128

ENCRYPTION BY SERVER CERTIFICATE MyServerCert

WITH ALGORITHM には、暗号化アルゴリズムとして、AES_128、AES_192、AES_256 などを選択できますが、ここでは、AES_128 を指定しています。

このステートメントを実行すると、証明書のバックアップに関する警告が表示されますが、これについては、後述します。

5. 次に、ALTER DATABASE ステートメントを利用して、データベースに対して透過的なデータ暗号化を有効化します。有効化するには、次のように「SET ENCRYPTION ON」を指定します。

ALTER DATABASE enc

SET ENCRYPTION ON

Page 215: SQL Server 2014 自習書シリーズ No.3

以上で設定が完了です。

次に、この「enc」データベース内へテーブルを作成して、データを追加し、バックアップを実行してみましょう。

USE enc

go

-- テーブルの作成

CREATE TABLE t1

( a int , b varchar(100) )

-- データを 3件追加

INSERT INTO t1

VALUES

(1, 'aaaaaaaaaa')

,(2, 'あいうえお')

,(3, '暗号化されている???')

SELECT * FROM t1

-- データベースのバックアップ

BACKUP DATABASE enc

TO DISK = 'C:\enc.bak'

次に、正しく暗号化されたかどうかを確認するために、SQL Server サービスを停止し、停止が完了した後に、「C:\enc.mdf」(データ ファイル)を任意のバイナリ エディター(Stirling など)で開いてみましょう。

Page 216: SQL Server 2014 自習書シリーズ No.3

バイナリ エディターで開いても、どういったデータが格納されているかを読み取ることはできず、きちんと暗号化されていることを確認できます。同じように、バックアップ ファイル「C:\enc.bak」についても暗号化がされていることを確認してみてください。

なお、暗号化されていないデータベースをバイナリ エディターで開いた場合には、次のようにデータを読み取ることが可能です。

GUI での設定方法

手順 4 の「データベース暗号化キーの作成」と手順 5 の「データベース対して暗号化を有効」については、Management Studio から GUI ベースで設定することもできます。これは、次のように対象となるデータベースを右クリックして[タスク]メニューの[データベース暗号化の管理]をクリックして行えます。

暗号化されていることを確認

暗号化を設定していないデータベースの場合は

バイナリ エディターから参照可能

Page 217: SQL Server 2014 自習書シリーズ No.3

別マシンでのリストアはエラー

透過的なデータ暗号化を設定したデータベースのバックアップは、別のマシンでリストアしようとすると、次のようにエラーが発生します。

サーバー証明書が存在しないので、リストアができないという主旨です。透過的なデータ暗号化では、バックアップ ファイルが持ち出されたとしても、簡単にはリストアできないようになっています(かつ中身が暗号化されているので、安全性が高いものとなっています)。

また、データ ファイル(.mdf)を別マシンでアタッチしようとしても、次のように同じエラーが発生します。

このように、データ ファイルについても、簡単にアタッチできないようになっています。

1

2

3

4

5

Page 218: SQL Server 2014 自習書シリーズ No.3

サーバー証明書のバックアップとリストア

開発機から本番機へ、あるいはその逆へなど、別マシンへデータベースを移動させたい場合には、次のように BACKUP CERTIFICATE ステートメントを利用して、サーバー証明書(と秘密キー)のバックアップを実行しておく必要があります。

BACKUP CERTIFICATE MyServerCert

TO FILE = 'C:\TDE\MyServerCert'

WITH PRIVATE KEY

( FILE = 'C:\TDE\MyPrivKey'

, ENCRYPTION BY PASSWORD = 'P@ssword' )

このステートメントでは、サーバー証明書をファイルへバックアップすることができ、WITH PRIVATE KEY オプションを付けることで、秘密キーもバックアップしておくことができます。このときに指定するパスワードは、推測されにくい強固なパスワードにし、そのパスワードが簡単に漏れないように注意しておく必要があります。

次に、バックアップしたファイル(サーバー証明書と秘密キー)を別マシンへ物理的にコピーし、次のように CREATE CERTIFICATE ステートメントを利用して、リストア(インポート)します。

-- データベース マスター キーの作成

USE master

go

CREATE MASTER KEY ENCRYPTION

BY PASSWORD = '<StrongPassword>'

go

-- サーバー証明書のリストア(インポート)

CREATE CERTIFICATE MyServerCert

FROM FILE = 'C:\MyServerCert'

WITH PRIVATE KEY

( FILE = 'C:\MyPrivKey'

, DECRYPTION BY PASSWORD = 'P@ssword' )

Page 219: SQL Server 2014 自習書シリーズ No.3

サーバー証明書のリストア(ファイルからの作成)には、データベース マスター キーを作成しておく必要があるので、まずデータベース マスター キーを作成しています。

サーバー証明書のリストア時(CREATE CERTIFICATE ステートメントの実行時)には、DECRYPTION BY PASSWORD に、複合化のためのパスワードを、バックアップ時に指定したのと同じものを指定します。これで、サーバー証明書のリストアが完了です。

このように同じサーバー証明書がリストアされている環境であれば、透過的なデータ暗号化(TDE)を設定したデータベースをリストアして、データを参照することができるようになります。

その他、TDE の詳細(アーキテクチャなど)については、オンライン ブックの以下のトピックがお勧めです。

透過的なデータ暗号化(TDE) http://msdn.microsoft.com/ja-jp/library/bb934049.aspx

Page 220: SQL Server 2014 自習書シリーズ No.3

4.2 ポリシー ベースの管理(Policy Based Management)

ポリシー ベースの管理は、Windows Server の Active Directory におけるグループ ポリシー機能と同じように、管理者が設定したポリシーを利用して複数の SQL Server を集中管理できる機能です(SQL Server 2008 から提供されました)。ポリシー ベースの管理では、SQL Server 2014 だけでなく、下位バージョンの SQL Server を対象にすることもできるので、企業内の SQL Server を集中管理する目的として利用することもできます。また、ポリシー ベースの管理で作成したポリシーは、そのポリシーを強制(設定値を強制)したり、定期的なチェックを行ってレポートを作成したりすることもできます。

ポリシー ベースの管理の使用例

ポリシー ベースの管理は、次のような目的で利用することができます。

セキュリティ強化の徹底

パフォーマンス関連の環境設定パラメーターを一括設定(sp_configure や データベース オプションの値をリモートから強制変更可能)

オブジェクトの名前付けルールの徹底(プレフィックス/接頭辞の強制:ストアド プロシージャの名前は MyCompany_sp_xxxx とするなど)

イベント ビューアーに対して WMI クエリを実行し、エラーが発生していないかどうかをチェックする

セキュリティ強化としてのポリシーの利用

ポリシー ベースの管理では、前出の SQL Server Audit(監査)が有効になっているかどうかをチェックしたり、xp_cmdshell コマンドや Ad hoc 分散クエリの実行を禁止したりする目的(セキュリティ強化の目的)で利用することができます。

また、SQL Server 2005 のときに提供されていた「セキュリティ構成ツール」(Surface Area Configuration: SAC)で設定していたセキュリティ設定などを、ポリシーとして集中管理できるようになります(SQL Server 2008 以降では、セキュリティ構成ツールが削除されています)。

Page 221: SQL Server 2014 自習書シリーズ No.3

ポリシーの設定手順

それでは、ポリシー ベースの管理を試してみましょう。設定のおおまかな流れは次のとおりです。

1. ファセットをもとに、条件を作成

2. 条件をもとに、ポリシーを作成

このように ポリシー ベースの管理では、最初にファセット(Facet)をもとに条件(Condition)を作成するので、まずはどういったファセットがあるのかを確認しておく必要があります。

ファセットの確認

1. ファセットを確認するには、次のように[管理]フォルダーの[ポリシー管理]から[ファセット]フォルダーを展開して、ファセットの一覧を表示します。

2. 次に、中身を確認したいファセットを右クリックして、[プロパティ]をクリックします。例えば、「サーバー構成」ファセットの中身には、次のように「Max Server Memory」や「Max Degree of Parallelism」、「Max Worker Threads」などがプロパティ一覧に表示されて、SQL Server の環境設定パラメーター(sp_configure で設定できるパラメーター)が一覧されることを確認できます。

1

Page 222: SQL Server 2014 自習書シリーズ No.3

3. 次に、「セキュリティ構成」ファセットの中身を確認してみます。

これは、SQL Server 2005 のときに提供されていたセキュリティ構成ツール(Surface Area Configuration)で設定していたセキュリティ設定に関する項目です。

4. 次に、「データベース オプション」ファセットの中身を確認してみます。

SQL Server の環境設定パラメーター(sp_configure で設定できるパラメーター)が一覧されることを確認。・Fill Factor・Max Server Memory・Min Server Memory・Max Degree of Parallelism・Max Worker Threads など

2

1

3

1

Page 223: SQL Server 2014 自習書シリーズ No.3

このファセットでは、「Auto Shrink」(自動圧縮)や「Auto Create Statistics」(統計の自動作成)といった、データベースの「プロパティ」ダイアログで設定可能なプロパティが一覧されることを確認できます。

データベースの「プロパティ」ダイアログで設定可能なプロパティが一覧されることを確認。・Auto Shrink(自動圧縮)・Auto Create Statistics(統計の自動作成)・Auto Update Statistics(統計の自動更新)・Auto Close(自動終了)・RecoveryModel(復旧モデル)・Page Verify(ページ確認)・Read Only など

1

Page 224: SQL Server 2014 自習書シリーズ No.3

監査が有効かどうかを確認するポリシーの作成

次に、前の Step で作成した監査(Audit)が有効になっているかどうかを確認するポリシーを作成してみましょう。これを行うには、「監査」ファセットを利用します。

1. まずは、「監査」ファセットをもとに「条件」を作成しますが、条件を作成するには、次のように[条件]フォルダーを右クリックして[新しい条件]をクリックします。

[名前]へ任意の名前(AuditCheck など)と入力して、[ファセット]で「監査」ファセットを選択し、[式]の[フィールド]一覧から「@Enabled」を選択し、[値]で「True」を選択し、[OK]をクリックします。これにより、監査が有効(True)になっているかどうかを確認するための条件を作成できます。

2. 次に、作成した条件をもとにポリシーを作成します。ポリシーを作成するには、次のように[ポリシー]フォルダーを右クリックして[新しいポリシー]をクリックします。

任意の条件名を入力2

「OK」をクリック6

1

ファセットの一覧から「監査」 ファセットを

選択

3

プロパティの一覧から@Enable(有効)プロパティを選択

4

値で「True」

を選択

5

任意のポリシー名を入力

2

1

3

4

Page 225: SQL Server 2014 自習書シリーズ No.3

[名前]へ任意の名前(AuditCheckPolicy など)と入力して、[条件の確認]で作成した条件(監査ファセットの下の「AuditCheck」)を選択し、[OK]ボタンをクリックします。

以上でポリシーの作成が完了です。

ポリシーの評価

3. ポリシーの作成が完了したら、次は、ポリシー(AuditCheckPolicy)を右クリックして、[評価]をクリックし、ポリシーを実行してみます。

結果は、緑のチェック マークが付き、前の Step で作成した監査(AuditTest)が有効になっている(ポリシーを満たしている)ことを確認できます。

4. 次に、監査(AuditTest)を無効へ設定してみましょう。これは、[セキュリティ]フォルダーの[監査]から[AuditTest]監査を右クリックして、[監査の無効化]をクリックします。

「AuditTest」監査に が表示されて、ポリシーを満たしている

ことを確認できる

2

作成したポリシー「AuditCheckPolicy」

を右クリックして「評価」をクリック

1

1

2

Page 226: SQL Server 2014 自習書シリーズ No.3

5. 次に、もう一度、[ポリシー]フォルダーのポリシー(AuditCheckPolicy)を右クリックして、[評価]をクリックし、ポリシーを実行してみます。

今度は、赤の X マークが表示されて、ポリシーに違反していることを確認できます。

このようにポリシーを利用すると、監査が有効になっているかどうかをチェックするために利用することができます。せっかく監査を有効にしても、悪意のある管理者によって、監査を無効にされては、その間の監査(ログ記録)ができなくなってしまうので、ポリシーを利用して、監査が有効かどうかを定期的にチェックしておくことが重要です。

また、監査内へ作成している「サーバー監査の仕様」と「データベース監査の仕様」についても、それぞれファセットが用意されているので、これらの @Enabled(有効)プロパティを定期的にチェックしておくことも重要です。

「AuditTest」監査に が表示されて、ポリシーに違反している

ことを確認できる

2

1

Page 227: SQL Server 2014 自習書シリーズ No.3

ポリシーの定期実行

ポリシーは、次のように設定することで、定期的に実行することもできます。

これによって、SQL Server Agent ジョブが自動作成されて、設定したスケジュールでポリシー評価が実行されるようになります。

ポリシーの実行履歴の確認

ポリシーの実行履歴は、次のようにポリシーを右クリックして、[履歴の表示]から確認することができます。

このように、「ポリシー ベースの管理」機能を利用すると、任意のポリシーを定義して、定期的なチェックを行えるようになるので便利です。また、ポリシーは、複数の SQL Server を対象にすることもできるので、企業内の SQL Server を集中管理する目的としても利用することができま

1

2

任意のスケジュール設定が可能

スケジュール実行するには「有効」

をチェック

3

1

Page 228: SQL Server 2014 自習書シリーズ No.3

す。

Page 229: SQL Server 2014 自習書シリーズ No.3

4.3 変更データ キャプチャ(CDC:Change Data Capture)

変更データ キャプチャは、UPDATE や INSERT、DELETE ステートメントによる更新履歴を保管できる(変更データをキャプチャできる)機能で、SQL Server 2008 から提供されました。変更データ キャプチャを利用すれば、Oracle 11g における Total Recall 機能のように、指定した時間の過去のデータを参照したり、オペレーション ミス時のデータ回復などで利用できるようになります。変更データ キャプチャは、悪意のあるユーザーによって、データが改ざんされた場合などに、改ざんされる前のデータを復旧する目的としても利用することができます。

Let's Try

それでは、これを試してみましょう。

1. 変更データ キャプチャは、内部的には SQL Server Agent サービス機能を利用しているので、まずは SQL Server Agent サービスを開始しておく必要があります。

2. 次に、変更データ キャプチャ機能を試すために「CDCtestDB」という名前のデータベースを作成します。

CREATE DATABASE CDCtestDB

3. 次に、このデータベースに対して「sp_cdc_enable_db」ストアド プロシージャを実行して、変更データ キャプチャ(CDC)を有効化します。

USE CDCtestDB

EXEC sys.sp_cdc_enable_db

1

2

Page 230: SQL Server 2014 自習書シリーズ No.3

4. 続いて、NorthwindJ データベースの「商品」テーブルをもとに、CDCtestDB データベース内へ「商品」テーブルを作成します。

USE CDCtestDB

-- 商品テーブルの作成

SELECT * INTO 商品 FROM NorthwindJ..商品

-- データの確認

SELECT * FROM 商品

5. 次に、作成した「商品」テーブルに対して、「sp_cdc_enable_table」ストアド プロシージャを実行して、CDC を有効に設定します。

USE CDCtestDB

go

EXEC sys.sp_cdc_enable_table

@source_schema = N'dbo'

,@source_name = N'商品'

,@role_name = N'cdc_Admin'

以上で、変更データ キャプチャの設定が完了です。

Page 231: SQL Server 2014 自習書シリーズ No.3

Note: SQL Server Agent サービスを開始していない場合のエラー

もし、SQL Server Agent サービスを開始していない場合は、上記のステートメントを実行したときに、次のようにエラーが返されます。

サービスは、事前に開始しておくようにしましょう。 なお、このエラーが出た後に、サービスを開始して、再度 sp_cdc_enable_table を実行した場合には、次のようにエラーが出ることがあります。

この場合は、sp_cdc_disable_table を利用して、いったんテーブルに対する変更データ キャプチャを無効にした後に、再度 sp_cdc_enable_table を実行するようにします。

更新履歴の参照(スキーマ名_テーブル名_CT テーブル)

変更データ キャプチャを有効化すると、「dbo_商品_CT」のように「スキーマ名_テーブル名_CT」という名前のテーブルが自動的に作成されて、このテーブルへ更新履歴が記録されていくようになります。

それでは、これを確認してみましょう。まずは、UPDATE/INSERT/DELETE ステートメント

変更データ キャプチャを設定したことによって作成される内部テーブル。

cdc スキーマ内へ作成される

Page 232: SQL Server 2014 自習書シリーズ No.3

を実行して、商品テーブルのデータを更新します

-- データの変更

UPDATE 商品 SET 商品名 = 'XXX' WHERE 商品コード = 1

-- データの追加

INSERT INTO 商品(商品コード, 商品名, 生産中止) VALUES (199, 'AAAAAA', 1)

-- データの削除

DELETE FROM 商品 WHERE 商品コード = 2

-- データが更新されたことを確認

SELECT * FROM 商品

次に、更新履歴が格納されているテーブル「dbo_商品_CT」(cdc スキーマ)を参照します。

SELECT * FROM cdc.dbo_商品_CT

このように「dbo_商品_CT」テーブルの Operation 列を参照することで、更新前のデータなのか更新後のデータなのか、INSERT/DELETE されたデータなのかを確認することができます。また、変更データ キャプチャは、トランザクション ログへ記録された更新情報をもとにした機能なので、start_lsn と end_lsn など LSN(Log Sequence Number:ログ順序番号)によって、更新時刻(や順序)を管理しています。

追加された商品199

更新された商品果汁100%オレンジ

から XXX へ商品 2 を削除 :

更新履歴が格納されているdbo_商品_CT テーブル

Start_LSN 値(トランザクション ログ内の開始 LSN 番号)

Operation 列で操作の種類を確認可能4 update(変更後データ)3 update(変更前データ)2 insert1 delete

変更前のデータ「果汁100%オレンジ」

変更後のデータ「XXX」

追加されたデータ「199」削除されたデータ「2」

Page 233: SQL Server 2014 自習書シリーズ No.3

時間指定による過去データの参照

変更データ キャプチャでは、特定の時間を指定して、昔のデータの参照することも簡単に行えます。変更データ キャプチャでは、次のように「lsn_time_mapping」という名前のテーブルが自動的に作成されていて、LSN と時刻とのマッピングが管理されているからです。

SELECT * FROM cdc.lsn_time_mapping

このマッピング テーブルは、「fn_cdc_map_time_to_lsn」関数を利用すると、時刻をもとに LSN 番号を取得することができるので、この LSN 番号を「fn_cdc_get_all_changes_テーブル名」関数へ与えるようにすると、特定の時間の範囲を指定して、昔のデータを参照できるようになります。これは次のように利用できます。

-- 2014-10-10 00:15:00 以降から現在までの間に更新されたデータの参照

DECLARE @begin_time datetime = '2014-10-10 00:15:00'

DECLARE @end_time datetime = GETDATE()

DECLARE @from_lsn binary(10), @to_lsn binary(10)

-- fn_cdc_map_time_to_lsn 関数によりLSN(ログ順序番号)の取得

SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time)

SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time)

-- fn_cdc_get_all_changes_dbo_商品関数

SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_商品(@from_lsn, @to_lsn, 'all')

Page 234: SQL Server 2014 自習書シリーズ No.3

4.4 データ プロファイル タスクによるデータの分布状況の表示

データ プロファイル タスクは、データの分布状況や、データの長さの分布状況、NULL 値の割合などを表示できる機能で、SQL Server 2008 から提供されました。データ プロファイル タスクは、DWH(データウェア ハウス)構築時のデータ クレンジング処理時やインデックス チューニング時などにデータの分布状況を確認できるので便利です。

データ プロファイル タスクは、Integration Services(SSIS)のタスクとして実装され、出力結果を「Data Profile Viewer」ツールを利用してグラフィカルに参照することができます。

Lets Try

それでは、これを試してみましょう。データ プロファイル タスクの作成には、SQL Server Data Tools - Business Intelligence(以降、SSDT-BI と表記。SSDT-BI は、以前のバージョンでの Business Intelligence Development Studio に相当するツール)を利用します。

1. SSDT-BI ツールを起動するには、次のようにスタート画面から[Microsoft SQL Server 2014]グループの[SQL Server Data Tools for Visual Studio 2013]をクリックします(Windows Server 2008/2008 R2 の場合は[スタート]メニューから起動します)。

SSDT-BI ツールのダウンロード/インストール方法については、前の Step の SSDT(SQL Server Data Tools)の項の Note を参考にしてください。

Page 235: SQL Server 2014 自習書シリーズ No.3

2. SSDT-BI は、Visual Studio 2013 に統合されたツールなので、SSDT-BI を起動するとVisual Studio 2013 が起動します。Visual Studio 2013 が起動したら、[ファイル]メニューの[新規作成]から[プロジェクト]をクリックして、新しいプロジェクトを作成します。

[新しいプロジェクト]ダイアログが表示されたら、テンプレートの一覧から[ビジネス インテリジェンス]をクリックして、「Integration Services プロジェクト」を選択します。[名前]へ任意のプロジェクト名(画面は Integration Services プロジェクト 1)、[場所]へ任意の保存場所を指定して、[OK]ボタンをクリックします。

3. 次のように、Integration Services プロジェクト(Integration Services プロジェクト 1)が作成されたら、SSIS ツールボックスを表示して、[共通]セクションから[データ プロファイル タスク]を選択し、[制御フロー]ペインへドラッグ&ドロップして配置します。

4. 次に、新しい ADO.NET 接続を作成するために、[接続マネージャー]ペイン内の任意の場所

「Integration Servicesプロジェクト」を選択

3

任意のプロジェクト名を入力4

5

2

1

ドラッグ&ドロップ1

Page 236: SQL Server 2014 自習書シリーズ No.3

で右クリックして、[新しい ADO.NET 接続]をクリックします。

[ADO.NET の接続マネージャーの構成]ダイアログが表示されたら、[新規作成]ボタンをクリックします。

5. 次のように[接続マネージャー]ダイアログが表示されたら、[サーバー名]に SQL Server の名前を入力して、[データベース名の選択または入力]で分析対象にしたいデータベースを選択します(画面は NorthwindJ データベースを選択)。

6. 接続先の設定後、[ADO.NET の接続マネージャーの構成]ダイアログへ戻ったら、[OK]ボタンをクリックします。

7. 次に、データの分布状況を調査するテーブルを指定するために、[制御フロー]内へ配置した[データ プロファイル タスク]を右クリックして、[編集]をクリックします。

「接続マネージャー」ペイン

1

任意の場所を右クリックして「新しい ADO.NET接続」をクリック

2

3

SQL Serverの名前を入力

1

NorthwindJデータベースを選択

2

3

Page 237: SQL Server 2014 自習書シリーズ No.3

[データ プロファイル タスク エディター]ダイアログが表示されたら、[クイック プロファイル]ボタンをクリックします。

8. これにより、[単一テーブル クイック プロファイル フォーム]ダイアログが表示されるので、次のように[ADO.NET 接続]で前の手順で作成した ADO.NET 接続を選択して、[テーブルまたはビュー]で「商品」テーブルを選択し、[OK]ボタンをクリックします。

9. 次のように[データ プロファイル タスク エディター]ダイアログへ戻ったら、[OK]ボタンをクリックします。

「編集」をクリック

1

「クイック プロファイル」をクリック

2

前の手順で作成したADO.NET 接続を選択

1

「商品」テーブルを選択2

どのようにプロファイルを取得するかの設定

3

Page 238: SQL Server 2014 自習書シリーズ No.3

10. 次に、出力結果を書き出すファイルを設定するために、再度[データ プロファイル タスク]を右クリックして、[編集]をクリックし、[データ プロファイル タスク エディター]ダイアログを表示します。

[Destination]で「新しいファイル接続」を選択し、表示された[ファイル接続マネージャー エディター]で、[使用法の種類]で「ファイルの作成」を選択して、[ファイル]に「C:\DPVtest\product.xml」と入力し(フォルダー名は使用している環境に応じて適宜変更してください)、[OK]ボタンをクリックします。

11. 次のように[データ プロファイル タスク エディター]ダイアログへ戻ったら、[OK]ボタンをクリックします。

1

「Destination」で「新しいファイル接続」を選択

2

「ファイルの作成」を選択3

1

「C:¥test¥product.xml」と入力4

5

Page 239: SQL Server 2014 自習書シリーズ No.3

12. 次に、データ プロファイル タスクを実行するために、ツールバーの[開始]ボタン(デバッグ開始)をクリックします。

13. 実行中は、[制御フロー]へ配置した[データ プロファイル タスク]が黄色で表示されて、実行が完了すると緑色に変わります。次のように緑色に変わったら、ツールバーの[デバッグの停止]ボタンをクリックします。

1

1

実行中は黄色で表示され実行が完了すると緑色に変わる

1

2

Page 240: SQL Server 2014 自習書シリーズ No.3

実行が完了すると、前の手順で設定した出力結果ファイル(C:\DPVtest\product.xml)へデータの分布情報が書き込まれています。

Data Profile Viewer で出力結果の参照

1. 次に、出力結果を参照するために、次のようにスタート画面から[Microsoft SQL Server 2014]グループの[SQL Server 2014 Data Profile Viewer]をクリックして、Data Profile Viewer ツールを起動します(Windows Server 2008/2008 R2 の場合は[スタート]メニューから起動します)。

2. Data Profile Viewer が起動したら、ツールバーの[開く]ボタンをクリックして、次のように出力結果ファイル(C:\DPVtest\product.xml)を開きます。

1

「C:¥DPVtest¥product.xml」ファイルを選択

2

1

3

Page 241: SQL Server 2014 自習書シリーズ No.3

3. 次に、NorthwindJ データベースを展開して、次のように[列の値分布プロファイル]をクリックすると、右ペインに、「商品」テーブルの列名(フリガナや区分コード、梱包単位、在庫など)が一覧されることを確認できます。

列名の一覧から、「商品名」列をクリックすると、商品名データが表示されることを確認できます。

4. 次に、右ペインの列の一覧から「区分コード」列をクリックして、区分コードごとのデータの件数を参照します。

5. 続いて、次のように「4」のデータを選択して、[クエリ]ボタンをクリックし、区分コードが「4」のデータを参照します。

「列の値分布プロファイル」をクリック

2

「商品」テーブルを展開

1

商品名が一覧される

4

「商品名」列をクリック

3

「区分コード」列(商品区分)をクリック

1

商品区分 4 番の商品が 14件 あり、それが全体の 11.3821% であることが分かる

2

Page 242: SQL Server 2014 自習書シリーズ No.3

このように、Data Profile Viewer では、実際のデータを参照することもできます。

6. 次に、「商品」テーブルの「列長分布プロファイル」をクリックして、右ペインの列の一覧から「商品名」列をクリックし、商品名データの長さの分布状況を参照します。

このように データ プロファイル タスクおよび Data Profile Viewer を利用すると、データの分布状況を簡単に参照することができるので大変便利です。

商品区分 4番を選択1

ココをクリック2

商品区分 4 番の商品一覧を取得できる

3

「列長分布プロファイル」をクリック

1

「商品名」列をクリック。データの最小の長さが 3文字、

最大の長さが 13文字であると分かる

2

商品名の 長さが 7 文字のデータが 22件ありそれが全体の 17.8862% であることが分かる

3

Page 243: SQL Server 2014 自習書シリーズ No.3

4.5 Deprecated Features オブジェクト

Deprecated Features オブジェクトは、パフォーマンス モニターのパフォーマンス オブジェクトで、SQL Server の将来のバージョン(SQL Server 2014 の次のバージョン)以降でサポートされなくなる予定の機能が利用された回数をカウントしてくれる機能です(このオブジェクトは、SQL Serve 2008 から提供されました)。なお、Deprecate は、「とがめる」や「反対する」という意味です。

Let's Try

それでは、これを試してみましょう。ここでは、将来のバージョンでなくなる予定となっている「DBCC SHOWCONTIG」と「DBCC DBREINDEX」、「DBCC INDEXDEFRAG」コマンドに対して、これらが使用された回数をカウントしてみましょう。

1. まずは、[管理ツール]メニューから[パフォーマンス モニター]をクリックして、パフォーマンス モニターを起動します(Windows Server 2012/2012 R2 の場合は、サーバー マネージャーの[ツール]メニューから起動することもできます)。

2. パフォーマンス モニターが起動したら、次のように「+」ボタンをクリックします。

[カウンターの追加]ダイアログでは、[パフォーマンス オブジェクト]で、「SQL Server:Deprecated Features」を展開します。「Usage」カウンターを選択すると、[一覧からインスタンスを選ぶ]に将来のバージョンでなくなる機能がリストアップされるので、「DBCC SHOWCONIG」と「DBCC DBREINDEX」、「DBCC INDEXDEFRAG」を選択して、[追加]ボタンをクリックします。

「+」をクリック1

「パフォーマンス オブジェクト」で「SQLServer:Deprecated Features」を展開

2

「選択したオブジェクトのインスタンス」から「DBCC DBREINDEX」と

「DBCC INDEXDEFRAG」、「DBCC SHOWCONTIG」を選択

3

4

Page 244: SQL Server 2014 自習書シリーズ No.3

3. 続いて、次のように DBCC コマンドを実行します。

USE AdventureWorks2014

go

DBCC SHOWCONTIG ( 'Production.Product' )

DBCC DBREINDEX ( 'Production.Product' )

DBCC INDEXDEFRAG ( 'AdventureWorks2014', 'Production.Product')

DBCC コマンドを実行後、パフォーマンス モニターを確認すると、それぞれのインスタンスの数値が、上記のクエリを実行した回数分上がっていることを確認できます。

Note:SQL Server Profiler ツールの Deprecation イベント

SQL Server Profiler ツールの Deprecation イベント(SQL Server 2005 から利用できるイベント)は、SQL Server 2014 でも引き続き使用することができます。これを利用すると、プロファイラー上で将来のバージョンでなくなる機能をリストアップすることができます。

実行した回数分、数値が上がっていることを確認

1

Page 245: SQL Server 2014 自習書シリーズ No.3

4.6 パーティション ウィザード

パーティション ウィザードは、データ パーティションの設定をウィザードで簡単に設定できる機能で、SQL Server 2008 から提供されました。

Let's Try

それでは、これを試してみましょう。ここでは、AdventureWorks2014 データベースの「SalesOrderHeader」テーブルをもとに新しいテーブルを作成し、そのテーブルをパーティション化してみます。

1. まずは、次のように「PartitionTestDB」データベースを作成し、AdventureWorks2014 データベースの「SalesOrderHeader」テーブルをもとに「sales」テーブルを作成します。

-- データベースの作成

CREATE DATABASE PartitionTestDB

go

-- SalesOrderHeader テーブルをもとに sales テーブルを作成

USE PartitionTestDB

SELECT * INTO sales FROM AdventureWorks2014.Sales.SalesOrderHeader

2. 次に、作成した「PartitionTestDB」データベースの「sales」テーブルを右クリックして、

[ストレージ]の[パーティションの作成]をクリックします。

「パーティションの作成ウィザード」が起動したら、[次へ]ボタンをクリックします。

3. 次の[パーティション分割列の選択]ページでは、パーティションを区切る基準となる列を選択します。

「sales」テーブルを右クリック

1

2

3

Page 246: SQL Server 2014 自習書シリーズ No.3

ここでは、「OrderDate」(受注日)を選択して、[次へ]ボタンをクリックします。

4. 次の[パーティション関数の選択]ページでは、[新しいパーティション関数]を選択して、任意の名前(pf1 など)を入力し、[次へ]ボタンをクリックします。

5. 次の[パーティション構成の選択]ページでは、[新しいパーティション構成]を選択して、任意の名前(ps1 など)を入力し、[次へ]ボタンをクリックします。

1

2

1

2

Page 247: SQL Server 2014 自習書シリーズ No.3

6. 次の[パーティションのマップ]ページでは、[右側の境界]を選択して、[境界の設定]ボタンをクリックします。

7. [境界値の設定]ダイアログが表示されたら、[開始日]を「2011/01/01」へ、[終了日]を「2015/12/31」へ、[日付範囲]を「毎年」へ変更し、[OK]ボタンをクリックします。

これにより、2011 年から 2015 年までの 1 年ごとのパーティション範囲を作成することができます。

1

2

2

1

1

2

3

4

Page 248: SQL Server 2014 自習書シリーズ No.3

8. 次に、それぞれの境界の[ファイル グループ]で「PRIMARY」を選択します。

9. 続いて、[ストレージの推定]ボタンをクリックして、各パーティションに含まれる行数や領域の見積もりを表示します。

境界(Boundary)が自動設定される

1

境界が設定されていない最後の行も「ファイル グループ」で

「PRIMARY」を選択

1

2

Page 249: SQL Server 2014 自習書シリーズ No.3

確認後、[次へ]ボタンをクリックして、次のページへ進みます。

10. 次の[出力オプションの選択]ページでは、[スクリプトの作成]を選択して、[次へ]ボタンをクリックします。

11. 最後の[概要の確認]ページでは、[完了]ボタンをクリックします。

1

2

1

3

2

Page 250: SQL Server 2014 自習書シリーズ No.3

12. ウィザードが完了すると、パーティションを作成するためのスクリプトがクエリ エディターへ自動生成されるので、ツール バーの[!実行]ボタンをクリックして、ステートメントを実行します。

13. 次に、データがパーティション分割されたことを確認するために、次のように $PARTITION 関数を利用します。

SELECT $PARTITION.pf1(OrderDate), * FROM sales

このようにパーティション ウィザードを利用すると、既存のテーブルを簡単にパーティション分割できるようになります。

1 ウィザードで生成されたパーティションを作成するための

スクリプト

・・・

2011 年 のデータはパーティション番号2 へ格納されている

2013 年のデータはパーティション番号4 へ格納されている

2014 年のデータはパーティション番号5へ格納されている

Page 251: SQL Server 2014 自習書シリーズ No.3

4.7 マルチ サーバー クエリ

マルチ サーバー クエリ(Multi Server Query)は、複数のサーバーに対して同時に同じクエリを実行できる機能で、SQL Server 2008 から提供されました。マルチ サーバー クエリの対象にできるサーバーは、SQL Server 2014 だけでなく、次のように SQL Server 2008 や 2008 R2、2012 なども含めることができるので、企業内の SQL Server をまとめて管理する目的として利用することができます。

Let's Try

それでは、マルチ サーバー クエリを試してみましょう(この手順を試すには、SQL Server のインスタンスが 2 つ以上必要になるのですが、SQL Server 2008 R2 や SQL Server 2012 を対象とすることもできるので、それらを利用して試してみてください)。

1. マルチ サーバー クエリを利用するには、まず[表示]メニューから[登録済みサーバー]をクリックして、[登録済みサーバー]ウィンドウを開きます。

[登録済みサーバー]ウィンドウでは、[中央管理サーバー]フォルダーを右クリックして、[中央管理サーバーの登録]をクリックします。

2. これにより、次のように[新規サーバーの登録]ダイアログが表示されるので、管理サーバーとして設定したい SQL Server の名前を入力して、[保存]ボタンをクリックします。

登録した複数のサーバーに対して同じクエリを同時に実行できる

2企業内の SQL Serverをまとめて登録

1

SQL Server 2008 や 2008 R2、2012 を対象にすることもできる

「表示」メニューから「登録済みサーバー」

をクリック

1

「中央管理サーバー」から「中央管理サーバーの登録」をクリック

2

登録済みサーバー ウィンドウが表示される

Page 252: SQL Server 2014 自習書シリーズ No.3

3. 次に、登録した構成サーバーを右クリックして、[新しいサーバー グループ]をクリックします。

[新しいサーバー グループのプロパティ]ダイアログが表示されたら、[グループ名]に任意のグループ名(testGroup など)を入力して、[OK]ボタンをクリックします。グループは対象となるサーバーをグループ化するために作成するもので、たとえば東京や大阪といった地域の名前を付けたグループを作成して、地域ごとの SQL Server をグループ化するといった使い方ができます。

4. 次に、グループ内へ対象となるサーバーを登録するために、次のようにグループ名を右クリックして、[新規サーバーの登録]をクリックします。

SQL Serverの名前を入力

1

2

1

任意のグループ名を入力2

3

Page 253: SQL Server 2014 自習書シリーズ No.3

[新規サーバーの登録]ダイアログが表示されたら、[サーバー名]へ対象にしたい SQL Server の名前を入力して、[保存]ボタンをクリックします。

5. 次に、グループ名を右クリックして、[新しいクエリ]をクリックします。

新しいクエリ エディターが表示されたら、任意のクエリを入力して実行し、実行結果を確認します。グループへ登録した SQL Server の名前が結果に付加されて、複数のサーバーに対して同じクエリを実行できたことを確認できます。

Note:クエリ オプションで結果の表示方法の変更

マルチ サーバー クエリの結果の表示方法は、クエリ オプションで変更することができます。変更するには、次のようにクエリ エディター内の任意の場所を右クリックして、[クエリ オプション]をクリックします。

1 登録したい SQL Serverの名前を入力

2

グループに登録された SQL Server

が一覧される

4

3

任意のクエリを入力して実行

2

1

1

「結果」の「マルチサーバー」をクリック

2結果にログイン名を含めるかや、SQL Server の名前を含めるか、結果を 1つのマージ(まとめる)

するかなどを設定できる

3

Page 254: SQL Server 2014 自習書シリーズ No.3

4.8 その他の SQL Server 2008 からの新機能

SQL Server 2008 からは、まだまだたくさんの新機能が提供されています。その主なものは次のとおりです。

DWH(データ ウェアハウス)関連のパフォーマンスの向上

スター ジョインのパフォーマンス向上

パーティションのパラレル処理のパフォーマンス向上(1 つのパーティションを複数スレッドが処理可能に)

パーティション単位のロックが可能に

インデックス付きビューがパーティションへ割り当て可能に

周辺テクノロジーのパフォーマンス向上(Integration Services の Data Flow パイプラインのパフォーマンス向上、Lookup パフォーマンスの向上、Analysis Services と Reporting Services のエンジン改良など)

SQL Server 2008 からは、データ ウェアハウス関連のパフォーマンス向上に目覚ましいものがあります。上記の機能だけでなく、この自習書内で紹介した、「データ圧縮」や「バックアップ圧縮」などもデータ ウェアハウス系のシステムで大変役立つ機能です。また、SQL Server 2012 から提供された「列ストア インデックス」もデータ ウェアハウスのパフォーマンスを飛躍的に向上させることができる機能です。

Lock Escalation オプション

ALTER TABLE ステートメントを利用して、テーブル単位でロック エスカレーションの禁止が可能に

実行プランの固定

プラン キャッシュをもとに実行プランの固定が可能に。従来のバージョンでは XML 実行プランをもとに固定が可能

Sparse カラム(スパース列)

NULL 値の多いデータ列を効率良く格納し、ストレージ サイズを小さくできる機能

Filtered インデックス

テーブル内の一部の行へインデックスを作成できる機能

FORCESEEK ヒント

Index Seek を強制することができるクエリ ヒント機能

XEvents(拡張イベント)による監視機能の提供(SQL Server 2012 からは GUI で設定可能)

Hot Add CPU(SQL Server を止めることなく CPU の追加が可能に)

Off-Box キー管理(ハードウェア ベースの鍵管理機構を利用可能に)

フルテキスト インデックス統合(FullText Search サービスが Database Engine サービスに統合された)

Page 255: SQL Server 2014 自習書シリーズ No.3

Peer To Peer トランザクション レプリケーション(トランザクション レプリケーションで双方向更新が可能に。グラフィカルな設定インターフェースも搭載)

データベース ミラーリング機能の強化(ログ圧縮によるパフォーマンス向上と破損ページの自動修復機能の追加など)

SQL Server 2008 からの Analysis Services の新機能

SQL Server 2008 からの Analysis Services(標準搭載される分析サーバー機能)には、属性リレーションシップ デザイナーや集計デザイナーの搭載、パフォーマンスの向上、DMV(動的管理ビュー)による監視機能などが追加されています。

Analysis Services は、"データ分析" のためのサーバー機能で、売上分析や予実管理(予算・実績管理)、ABC 分析(パレート図)、スコアカード、財務諸表分析、商圏分析、経営ダッシュボードといったさまざまなデータ分析や、傾向分析や予測分析といったデータ マイニングを簡単に行うことができます。

Analysis Services を利用すると、次のようなグラフやレポートを簡単に作成することができます。

属性リレーションシップをグラフィカルに設定可能に

属性リレーションシップ デザイナー

集計デザイナー

集計(Aggregation)をグラフィカルに設定可能に

Page 256: SQL Server 2014 自習書シリーズ No.3

SQL Server 2012 からの Analysis Services の新機能

SQL Server 2012 からは、Analysis Services のインメモリ対応機能(インメモリで動作する xVelocity エンジンおよびテーブル モデル:Tabular Model の提供によって、多次元モデルよりも高速な動作が可能な機能)が提供されています。これらの Analysis Services を利用する手順については、SQL Server 2012 の自習書シリーズの「Analysis Services 多次元モデル入門/応用」および「Analysis Services によるインメモリ BI 入門」編で詳しく説明しているので、こちらもぜひご覧いただければと思います。

商品分類ごとの商品売上トップ5

都道府県ごとの商品売上の割合 商品区分ごとの商品売上金額 商品ごとの売上金額(飲料区分)

区分ごとの商品売上の推移(四半期単位)

ABC 分析グラフ(パレート図)クロス集計、ABC 分析レポート

Page 257: SQL Server 2014 自習書シリーズ No.3

4.9 マルチ サーバー管理(SQL Server ユーティリティ)

SQL Server 2008 R2 からは、「SQL Server ユーティリティ」機能が提供されて、マルチ サーバー管理が簡単に行えるようになりました。SQL Server ユーティリティは、複数サーバーを監視/管理できる機能で、次のように管理対象のサーバーの健康状態を容易に監視できる「ユーティリティ エクスプローラー」が提供されています。

これにより、複数のインスタンスの CPU やディスクの利用状況などを容易に監視することができ

CPU 利用率やディスク使用状況などが健全かどうかを集中管理できる

ユーティリティエクスプローラー

データ ファイル(.mdf)は 100% 使用中

ログ ファイル(.ldf)は 95% 使用中

Page 258: SQL Server 2014 自習書シリーズ No.3

ます。

UCP(ユーティリティ コントロール ポイント)の作成

SQL Server ユーティリティ機能では、管理ポイントとなる UCP(Utility Control Point:ユーティリティ コントロール ポイント)を作成して、UCP から他のサーバーを管理/監視します。

したがって、マルチ サーバー管理を行うには、まず管理ポイントとなる UCP を作成します(ユーティリティ エクスプローラーから行います)。

Let's Try

それでは、これを試してみましょう。

1. SQL Server ユーティリティは、内部的には SQL Server Agent サービスを利用しているので、まずは SQL Server Agent サービスをすべてのサーバーで開始しておきます。

2. 次に、Management Studio の[表示]メニューから[ユーティリティ エクスプローラー]をクリックして、ユーティリティ エクスプローラーを表示します。

3. これにより、次のように[作業の開始]タブが表示されるので、「ユーティリティ コントロール ポイント(UCP)を作成します」をクリックします。

Page 259: SQL Server 2014 自習書シリーズ No.3

4. これにより、[ユーティリティ コントロール ポイントの作成]ウィザードが開始されます。

最初の[説明]ページでは、[次へ]ボタンをクリックします。

5. 次の[SQL Server のインスタンスの指定]ページでは、UCP(ユーティリティ コントロール ポイント)として設定したい SQL Server のインスタンスを指定します。

2

1

1

Page 260: SQL Server 2014 自習書シリーズ No.3

[接続]ボタンをクリックすると、[サーバーへの接続]ダイアログが表示されるので、[サーバー名]へ、UCP を作成する SQL Server のインスタンス名を指定して、[接続]ボタンをクリックします。

6. [SQL Server のインスタンスの指定]ページへ戻ったら、[ユーティリティ コントロール ポイントの名前]へ任意の UCP 名を入力(画面はユーティリティ)して、[次へ]ボタンをクリックします。

1

2

3

2

1

Page 261: SQL Server 2014 自習書シリーズ No.3

7. 次の[ユーティリティ コレクション セットのアカウント]ページでは、マルチ サーバー管理に利用するログイン アカウントを指定します。

このログイン アカウントには、Active Directory のドメイン ユーザーを指定する必要があります。また、[SQL Server エージェント サービス アカウントを使用する]を選択した場合は、SQL Server Agent サービスのサービス アカウントを利用することもできますが、この場合も、サービス アカウントがドメイン ユーザーである必要があります。

もし、同一マシン内で複数インスタンスで試している場合には、「マシン名\ユーザー名」形式でローカル ユーザー指定することもできますが、複数サーバーを管理する場合は、ドメイン ユーザーが必須になります。

ログイン アカウントを指定したら、[次へ]ボタンをクリックします。

8. 次の[SQL Server インスタンスの検証]ページでは、指定した SQL Server のインスタンスが UCP として作成する条件を満たしているかどうかがチェックされます。

1

2

Page 262: SQL Server 2014 自習書シリーズ No.3

すべての項目が「成功」になっていることを確認して、[次へ]ボタンをクリックします。なお、SQL Server Agent サービスが開始されていない場合には「エラー」、自動起動に設定されていない場合には「警告」が表示されます(実際の運用で利用する場合には、SQL Server Agent サービスを自動起動するようにしておきます)。

9. 次の[UCP の作成の概要]ページでは、ここまで設定してきた UCP の構成を確認して、[次へ]ボタンをクリックします。

10. 次の[ユーティリティ コントロール ポイントの作成]ページでは、UCP の作成が開始され

1

11

Page 263: SQL Server 2014 自習書シリーズ No.3

ます。

11. すべての項目の[結果]が[成功]と表示されれば、UCP(ユーティリティ コントロール ポイント)の作成が完了です。

最後に[完了]ボタンをクリックして、ウィザードを終了します。

1

Page 264: SQL Server 2014 自習書シリーズ No.3

SQL Server ユーティリティ ダッシュボード

UCP の作成ウィザードが完了すると、ユーティリティ エクスプローラーに次のように「SQL Server ユーティリティ ダッシュボード」(ユーティリティ エクスプローラー コンテンツ ペイン)が表示されるようになります。

ユーティリティ エクスプローラーでは、次のように[マネージ インスタンス]をクリックすると、UCP へ設定したインスタンスが表示されていることを確認できます。

現在は、すべての状態が「灰色」のアイコンで表示されますが、15 分ごとの状態チェックが実行された後は、その状態がアイコン(緑のチェックマークや赤い矢印、緑の矢印など)で表示されるようになります。

SQL Server ユーティリティダッシュボード

サマリを確認できる

Page 265: SQL Server 2014 自習書シリーズ No.3

ユーティリティ エクスプローラーでは、次のように[ユーティリティ管理]をクリックすると、状態をチェックする基準となる「グローバル ポリシー」を設定することができます。既定では、CPU 利用率が 70% を超えた場合には赤い矢印のアイコンで表示するなどの基準値が設定されています。

[データ ウェアハウス]タブでは、状態を保存するためのデータベースの設定が行えます。

Note: UCP(ユーティリティ コントロール ポイント)に自動作成されるもの

UCP(ユーティリティ コントロール ポイント)として設定すると、収集したデータを格納するために、次のように「sysutility_mdw」という名前のデータベースが自動作成されています。

CPU 利用率が 70% 以上なら赤い矢印で表示

収集したデータを格納するデータベースの名前

15分ごとにアップロードする設定

データの保持期間

Page 266: SQL Server 2014 自習書シリーズ No.3

このデータベースには、15 分ごとにデータがアップロードされて、データの保持期間は、既定では 1 年間です(保持期間は、前述の[データ ウェアハウス]タブで変更可能です)。

実際のデータの収集/アップロードは、ジョブおよびシステム データ コレクションが行っています。

データの収集/アップロードを行っているジョブは、「sysutility_mi_collect_and_upload」で、ステップの中では、PowerShell のスクリプトが記述されています。

データ収集、アップロード用のジョブ

データ収集、アップロード用のシステム データ コレ

クション

UCP 用のデータベース(sysutility_mdw)を

管理するためのジョブなど

Page 267: SQL Server 2014 自習書シリーズ No.3

管理対象インスタンスの追加

次に、管理対象のインスタンスを追加してみましょう。

1. 管理対象のインスタンスを追加するには、ユーティリティ エクスプローラーで「マネージ インスタンス」を右クリックして、「インスタンスの登録」をクリックします。

これにより、「インスタンスの登録」ウィザードが開始されます。

2. 最初の「説明」ページでは、[次へ]ボタンをクリックします。

3. 次の[SQL Server のインスタンスの指定]ページでは、管理対象として追加したい SQL Server のインスタンスを指定します。

1

1

Page 268: SQL Server 2014 自習書シリーズ No.3

[接続]ボタンをクリックすると、[サーバーへの接続]ダイアログが表示されるので、[サーバー名]へ、管理対象として追加したい SQL Server のインスタンス名を選択して、[接続]ボタンをクリックします。[SQL Server のインスタンスの指定]ページへ戻ったら、[次へ]ボタンをクリックします。

4. 次の[ユーティリティ コレクション セットのアカウント]ページでは、ログイン アカウントを指定します。

このログイン アカウントには、Active Directory のドメイン ユーザーを指定して、[次へ]

1

2

3

2

1

Page 269: SQL Server 2014 自習書シリーズ No.3

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

5. 次の[SQL Server インスタンスの検証]ページでは、指定した SQL Server のインスタンスが管理対象として作成する条件を満たしているかどうかがチェックされます。

すべての項目が「成功」になっていることを確認して、[次へ]ボタンをクリックします。なお、SQL Server Agent サービスが開始されていない場合には「エラー」、自動起動に設定されていない場合には「警告」が表示されます。

6. 次の[インスタンスの登録の概要]ページでは、[次へ]ボタンをクリックします。

7. 次の[SQL Server インスタンスの登録]ページでは、管理対象のインスタンスのセットア

1

1

Page 270: SQL Server 2014 自習書シリーズ No.3

ップが開始されます。

すべての項目の結果が[成功]になれば、管理対象インスタンスの追加が完了です。

8. ウィザードが完了すると、ユーティリティ エクスプローラーの[マネージ インスタンス]に追加したインスタンスが表示されて、15~30 分後には状態が表示されるようになります(それまでは灰色のアイコンで表示されます)。

1

Page 271: SQL Server 2014 自習書シリーズ No.3

管理対象のインスタンスに負荷がかかっている場合は、次のように状態が表示されます。

アイコンの種類は、次のとおりです(上限/下限の設定方法は、後述します)。

Note: 管理対象インスタンスの削除

ユーティリティ エクスプローラーでは、管理対象のインスタンスを簡単に削除する(管理対象外にする)こともできます。インスタンスを削除するには、次のようにインスタンスを右クリックして、「マネージ インスタンスの削除」をクリックします。

下限値を下回っている場合のアイコン

上限値を上回っている場合のアイコン

正常な場合のアイコン

アイコン 説明

正常な場合(上限~下限の間)

上限を上回っている場合

下限を下回っている場合

Page 272: SQL Server 2014 自習書シリーズ No.3

ユーティリティ エクスプローラーでのデータベースの利用状況の監視

ユーティリティ エクスプローラーでは、次のように UCP 名(既定は ユーティリティ)をクリックすると、「SQL Server ユーティリティ ダッシュボード」が「ユーティリティ エクスプローラー コンテンツ」ペインに表示されてサマリ(全体の概要)を確認することができます。

ユーティリティ エクスプローラーでは、次のように[マネージ インスタンス]の「記憶域使用率」タブをクリックすると、データベースごとの使用状況を確認することができます。

ダッシュボードサマリを確認できる

データ ファイル(.mdf)は 100% 使用中

ログ ファイル(.ldf)は 95% 使用中

Page 273: SQL Server 2014 自習書シリーズ No.3

このタブでは、次のように「ボリューム」を選択すると、ドライブごとに使用状況を確認することもできます。

グローバル ポリシーによる全体設定

ユーティリティ エクスプローラーでは、[ユーティリティ管理]の[ポリシー]タブでグローバル ポリシー(管理対象のインスタンス全体に対する上限/下限の監視設定)を確認/変更することができます。

既定では、CPU 利用率が 70%以上、ドライブやデータ/ログ ファイルの使用量の 70%以上が上限に設定され、これを越えると赤い矢印で表示されるように設定されています。また、[揮発性リソースのポリシー評価]セクションでは、CPU 利用率に関して、どれぐらいの期間で、何回ポリシー違反を発生したのかを定義することができます。

このように、SQL Server ユーティリティを利用すると、複数のサーバーを簡単に監視できるようになります。

C: ドライブは15% 使用中

C: ドライブ内のデータベースごと

の使用率

CPU 利用率が 70% 以上なら赤い矢印で表示

Page 274: SQL Server 2014 自習書シリーズ No.3

4.10 DAC(データ層アプリケーション)

DAC(データ層アプリケーション)は、同じ構成のデータベースを作成する際に便利なオブジェクト定義をエクスポート/配置できる機能で、SQL Server 2008 R2 から提供されました。DAC は、開発環境から本番環境、あるいはその逆へデータベース定義を移動したり、テスト環境を構築したりする場合に役立ちます。

DAC パッケージのエクスポート(.dacpac)

DAC では、オブジェクト定義を「DAC パッケージ」(.dacpac ファイル)としてエクスポートすることができます。それでは、これを試してみましょう。

1. まずは、オブジェクト定義をエクスポートしたいデータベース(画面は NorthwindJ)を右クリックして、[タスク]の「データ層アプリケーションの抽出」をクリックします。

これにより、「データ層アプリケーションの抽出」ウィザードが開始されるので、[次へ]ボタンをクリックして、次のページへ進みます。

2. 次の[プロパティの設定]ページでは、[アプリケーション名]へ任意のアプリケーション名、[DAC パッケージ ファイルに保存]へエクスポート場所となる任意のファイル パスを指定して、[次へ]ボタンをクリックします。

1

2

Page 275: SQL Server 2014 自習書シリーズ No.3

画面は、[アプリケーション名]に NorthwindJ、[DAC パッケージ ファイルに保存]のパスには C:\temp フォルダーの下へ NorthwindJ.dacpac という名前のファイルとして作成するように指定しています(DAC パッケージの拡張子は、.dacpac とするようにします)。

3. 次の[検証と概要]ページでは、内容を確認して、[次へ]ボタンをクリックします。

3

1

2

1

Page 276: SQL Server 2014 自習書シリーズ No.3

4. 次の[パッケージのビルド]ページでは、DAC パッケージの作成状況が表示されて、結果が「成功」と表示されれば、DAC パッケージの作成が完了です。

5. 作成が完了したら、Windows エクスプローラーを起動して、ウィザードで指定したパスにファイル(.dacpac)が作成されていることを確認しておきます。

2

1

DAC パッケージの拡張子は .dacpac

Page 277: SQL Server 2014 自習書シリーズ No.3

DAC パッケージの配置(デプロイ)

次に、作成した DAC パッケージを利用して、別サーバーへ配置(デプロイ)してみましょう。

1. DAC パッケージを配置するには、配置先となる別サーバーで、次のように[データベース]フォルダーを右クリックして、「データ層アプリケーションの配置」をクリックします(画面は、別インスタンス「SQL2」へ配置する場合の例です)。

これにより、[データ層アプリケーションの配置]ウィザードが開始されるので、[次へ]ボタンをクリックして、次のページへ進みます。

2. 次の[パッケージの選択]ページでは、[参照]ボタンをクリックして、配置したい DAC パッケージ(.dacpac)を選択します。

1

2

1

2

3

Page 278: SQL Server 2014 自習書シリーズ No.3

3. 次の[構成の更新]ページでは、配置する際のデータベース名を指定します。

なお、配置先のサーバーで、データベースが作成される場所は、SQL Server をインストールしたパスの「Data」フォルダーになります。

4. 次の[概要]ページでは、内容を確認して、[次へ]ボタンをクリックします。

5. 次の[DAC の配置]ページでは、DAC パッケージの配置状況が表示されて、結果がすべて

データベース名の指定

1

1

Page 279: SQL Server 2014 自習書シリーズ No.3

「成功」と表示されれば、DAC パッケージの配置が完了です。

6. 次に、配置されたデータベースの中身を確認してみましょう。

同じ構成のテーブルが作成されていることを確認できます。このように DAC パッケージを利用すると、簡単に同じ構成のデータベースを作成することができるようになります。

2

1

同じ構成のテーブルが作成されている

データは空。データを移行するには、

後述の bacpac を利用する

Page 280: SQL Server 2014 自習書シリーズ No.3

Note: DAC パッケージの中身を参照

DAC パッケージの実体は、zip ファイルなので、次のようにファイルの拡張子を .zip へ変更すれば中身を参照することもできます。

1 .zip を付ける

2

オブジェクト定義が XML 形式で生

成されている

Page 281: SQL Server 2014 自習書シリーズ No.3

SQL Server 2012 からの新機能(.bacpac によるデータ移行)

SQL Server 2008 R2 から提供された DAC は、「.dacpac」という拡張子で、オブジェクト定義のみの移行でしたが、SQL Server 2012 からは、DAC のバージョンが 2.0 へ上がって、データの移行も行えるようになりました。データの移行を行う場合は、「.bacpac」という拡張子のファイルを作成します。

「.bacpac」を作成するには、次のようにデータベースを右クリックして、[タスク]の[データ層アプリケーションのエクスポート]をクリックします(.dacpac の場合は[データ層アプリケーションの抽出]をクリックしていました)。

これにより、[データ層アプリケーションのエクスポート]ウィザードが開始されるので、次のように[エクスポート設定]ページで、[ローカル ディスクに保存]をクリックすれば、.bacpac を作成することができます。

1

Microsoft Azure(旧名:Windows Azure)

上に保存することも可能

Page 282: SQL Server 2014 自習書シリーズ No.3

なお、.bacpac を作成する場合は、テーブルにクラスター化インデックスが作成されている必要があるので、今回利用している NorthwindJ データベースの場合は、次のように「都道府県」テーブルにクラスター化インデックスがない、という主旨のエラーとなってしまいます。

この場合は、次のようにクラスター化インデックスを作成してから、再度エクスポートを実行する必要があります。

CREATE CLUSTERED INDEX cl_都道府県 ON 都道府県(都道府県)

go

.bacpac の作成に成功すると、次のように表示されます。

Page 283: SQL Server 2014 自習書シリーズ No.3

作成した .bacpac を別のマシンでインポートするには、次のように[データベース]フォルダーを右クリックして、[データ層アプリケーションのインポート]をクリックします(.dacpac の場合は[データ層アプリケーションの配置]をクリックしていました)。

これにより、[データ層アプリケーションのインポート]ウィザードが開始されるので、次のように[ローカル ディスクからインポート]をクリックすれば、.bacpac をインポートして、データを丸ごと移行することができます。

インポートされたデータベースの中身を確認すると、次のようになります。

作成するデータベースの名前や、作成先となるファイル パスなどを指定

Page 284: SQL Server 2014 自習書シリーズ No.3

このように、.bacpac を利用すると、開発環境から本番環境、あるいはその逆へデータベースを丸ごと移動したり、テスト環境を構築する際などに便利です。また、.bacpac はクラウド上の Microsoft Azure SQL データベース(以降、Azure SQL データベースと記述)にも対応しているので、開発環境で作成したデータベースを Azure SQL データベース上へ移行(複製)する場合にも役立ちます(その逆も可能です)。

なお、Azure SQL データベースに対しては、エクスポート/インポートという操作ではなく、次のように[タスク]メニューから[データベースを Windows Azure SQL データベースに配置]をクリックすることで、直接配置(複製を作成)することもできます。

このウィザードでは、次のように[配置の設定]ページで、Azure SQL データベース上のサーバ

.bacpac ではデータも移行できる

Page 285: SQL Server 2014 自習書シリーズ No.3

ー名を指定することで、直接データベースを複製することができます(内部的には .bacpac が作成されて、エクスポートおよびインポートが実行されています)。

このウィザードの注意点としては、Azure SQL データベースのエディションが古いもの(Web か Business)しか選択できない点です。この 2 つのエディションは、2015 年 9 月に提供終了にな

Azure SQL データベースのサーバー名を指定

Azure SQL データベース上に作成するデータベースの

名前を指定

Azure SQL データベースのエディションは、

Web か Bisiness かで選択(2015年 9月で終了)

Page 286: SQL Server 2014 自習書シリーズ No.3

るので、Azure SQL データベース上に配置が完了した後は、エディションを最新のもの(Basic、Standard、Premium のいずれか)へ変更しておく必要があります。エディションの変更は、次のように Azure 管理ポータルから行うことができます。

Azure 管理ポータルで配置したデータベース

をクリック

エディションの変更

Page 287: SQL Server 2014 自習書シリーズ No.3

4.11 Distributed Replay 機能による容易なストレス テストの実施

SQL Server 2012 からは、Distributed Replay(分散再生)機能が提供されて、ストレス テスト(高負荷テスト、ラッシュ テスト)が簡単に実施できるようになりました。この機能では、複数のコンピューターからの再生実行(分散再生)が可能なので、よりリアルに近いテストを実行することができます(実際の本番環境を想定したシミュレーションが行えるので、パフォーマンス チューニング時などに役立ちます)。

SQL Server Profiler トレースの再生機能との比較

SQL Server には、以前のバージョンからプロファイラー(SQL Server Profiler)でトレースしたデータ(SQL)をもとにした再生実行(トレースした SQL の再現実行)機能がありました(以下の画面)。

この機能では、1 行ごとに再生実行が可能なステップ実行機能や、ブレークポイントを設定して、ブレークポイントまで実行するなどの機能があるので、アプリケーションの動作確認時などデバッグ用途として利用すると便利でした。

これに対して、Distributed Replay 機能では、ステップ実行などはできませんが、その代わりに複数のコンピューターからの分散実行がサポートされるので、より本番環境に近い形でのシミュレーションを実施できるようになります。

Distributed Replay による再生実行

Distributed Replay 機能は、下図のように「Distributed Replay Controller」と「Distributed Replay Client」という 2 つの機能が存在します。

Page 288: SQL Server 2014 自習書シリーズ No.3

Distributed Replay Controller(分散再生コントローラー)が Distributed Replay Client(分散再生クライアント)を起動して、複数の Client からの再生実行を実施することができます。再生には、SQL Server Profiler の TSQL_Replay テンプレートで取得したトレース ファイルを使用します。

両者は、SQL Server 2014 インストール時の[機能の選択]画面では、次のように表示されます。

どちらも Windows サービスとしてインストールされて、既定では自動起動に設定されていないので、利用するためには、[管理ツール]メニューの[サービス]ツールから、次のように Distributed Replay Controller と Distributed Replay Client サービスを起動しておく必要があります。

Page 289: SQL Server 2014 自習書シリーズ No.3

また、サービス アカウントは、Active Directory のドメイン アカウントまたは Windows のローカル アカウントへ設定し、Distributed Replay Controller のインストール時に設定した管理者アカウント(以下の画面で設定したアカウント)を指定するようにします(これを行わない場合は、Client が Controller に接続することができないので注意してください)。

また、ここで追加した管理者アカウントを利用して、後述の再生ツール(DReplay.exe)を実行する必要もあります(管理者アカウントのみが再生実行を実施することができます)。

なお、インストール完了後に、サービス アカウントや管理者アカウントを変更したい場合には、以下の手順に従って、dcomcnfg でのアクセス許可設定、および Distributed COM Users グループへのユーザー追加を行って、管理者登録を行う必要があります。 http://msdn.microsoft.com/ja-jp/library/gg471531.aspx

Distributed Replay Controller(分散再生コントローラー)のインストール時に指定する

管理者アカウント

Page 290: SQL Server 2014 自習書シリーズ No.3

DReplay.exe による再生実行(Preprocess、Replay)

サービスを起動した後は、DReplay.exe ツールを利用して、再生実行を行います。このツールは、コマンドライン ツールとして提供されていて、既定では次のパスに格納されています。

C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn

したがって、DReplay.exe ツールを利用するには、コマンドプロンプトを起動して、次のようにcd コマンドでカレント ディレクトリを移動しておく必要があります。

C:

cd \

cd Program Files (x86)\Microsoft SQL Server\120\Tools\Binn

DReplay.exe ツールでは、まず Controller 上で preprocess 処理を行って、再生したいトレース ファイル(.trc)を再生可能な形式へ処理します。これは次のように実行します。

dreplay preprocess -i c:\dr\rep.trc -d c:\temp

-i オプションでトレース ファイル(画面は C:\dr フォルダーに保存した rep.trc ファイル)を指定して、-d オプションで処理したファイルを保存する場所(Controller 上の作業ディレクトリ、画面は C:\ temp フォルダー)を指定します。これで Distributed Replay を実行する準備が完了です。

続いて、Distributed Replay を実行するには、DReplay.exe ツールで replay オプションを指定して、次のように記述します。

dreplay replay -d c:\temp -o -w クライアントマシン名 -s 対象サーバー名

replay オプションでは、-d オプションで Controller 上の作業ディレクトリを指定し(画面は C:\temp)、-o オプションで再生結果をクライアント上に保存、-w オプションでクライアントのマシン名(複数コンピューターからの Distributed Replay の場合は、カンマ区切りで複数指定)、-s オプションで再生実行の対象としたい SQL Server のサーバー名を指定します。

Page 291: SQL Server 2014 自習書シリーズ No.3

-o オプションを指定した場合には、クライアント側の結果ディレクトリに実行結果(再生実行したときに実行された SQL を記録したトレース ファイル)が格納されています。既定では、結果ディレクトリのパスは、以下になります。

C:\Program Files (x86)\Microsoft SQL Server\120\Tools\DReplayClient\ResultDir

このように Distributed Replay 機能を利用すれば、簡単にストレス テスト(高負荷テスト)を実施することができるので、パフォーマンス チューニング時などに役立ちます。

結果ファイル(.trc)

結果ファイル(.trc)をダブルクリックすれば

プロファイラーから結果を確認可能

Page 292: SQL Server 2014 自習書シリーズ No.3

4.12 拡張イベント(XEvents)での GUI サポート

拡張イベント(XEvents:Extended Events)は、サーバーの状態を監視するときに役立つ機能で、SQL Server 2008 から提供されました。しかし、SQL Server 2008 のときは、拡張イベントを利用するには、コマンドベースでの操作が必要であったこと、結果セットが XML 形式であったことから、利用には面倒なところがありました。そこで、SQL Server 2012 からは、拡張イベントを容易に設定できる GUI ツールが提供されるようになりました。また、結果についても、次のようにグラフィカルに確認できるようになりました。

拡張イベントの設定(新規セッション ウィザード)

SQL Server 2012 からは、次のようにウィザード形式で拡張イベントを設定できるようになりました(拡張イベントでの監視単位である "セッション" の作成をウィザードで設定可能)。

デッドロックの発生を監視

結果をグラフィカルに確認可能

Page 293: SQL Server 2014 自習書シリーズ No.3

このウィザードでは、監視したいイベントを次のようにグラフィカルな操作で設定できます。

また、取得したいイベント列についても、次のように簡単に設定できるようになりました。

監視可能なイベントの一覧

監視したいイベントを追加

デッドロックの監視が可能

ログインとログアウトの監視が可能

バッチの完了と開始の監視が可能

取得したいイベント列の選択

Page 294: SQL Server 2014 自習書シリーズ No.3

フィルターについても、ウィザードで設定できるようになりました。

ウィザードの最後では、[スクリプト]ボタンをクリックすれば、拡張イベントを設定のためのスクリプト(CREATE EVENT SESSION ステートメント)を生成することも可能です。

設定後は、[ライブ データの監視]をクリックすると、グラフィカルな監視が可能です。

イベント フィルターも設定可能

ウィザードで生成された設定スクリプト

Page 295: SQL Server 2014 自習書シリーズ No.3

xml_deadlock_report イベントを監視している場合は、次のようにデッドロックの発生をグラフィカルに監視することもできます。

なお、xml_deadlock_report イベントに関しては、次のように既定で作成される「system_ health」セッションを利用しても監視することができます。

デッドロックの発生を監視

デッドロックの原因となっているバッチ

デッドロックの原因となっているバッチ

バッチが実行されたときの周辺情報(イベント列)

原因となったSQL

Page 296: SQL Server 2014 自習書シリーズ No.3

4.13 データベース リストア(復元)時の UI 向上

SQL Server 2012 からは、データベース リストア時のユーザー インターフェースがより使いやすくなりました。これは、次のように試すことができます。

[データベースの復元]ダイアログに[タイムライン]ボタンが追加されて、これをクリックすると[バックアップのタイムライン]ダイアログが表示されるようになり、戻したい時刻(STOPAT オプションで指定する時刻)をグラフィカルな操作で設定できるようになりました。

また、ページ単位でのリストアや、複数ファイルに対応したリストア(複数のバックアップ ファイルをまとめてリストア、かつバックアップ履歴へ対応)するなど、データベースをリストアするときの UI がより使いやすくなりました。

グラフィカルな操作で戻したい時刻を指定可能

Page 297: SQL Server 2014 自習書シリーズ No.3

4.14 起動オプションを設定するための新しい UI

SQL Server 2012 からは、SQL Server の起動オプションを設定するためのユーザー インターフェースが使いやすく変更されました。これは、次のように試すことができます。

SQL Server 構成マネージャー(Configuration Manager)ツールで、SQL Server サービスのプロパティを開くと、[起動時のパラメーター]タブが表示されるようになって、ここから起動オプションを追加できるようになったので、設定しやすくなりました。

1

2

34

Page 298: SQL Server 2014 自習書シリーズ No.3

4.15 DQS(Data Quality Services)によるデータ品質の向上

SQL Server 2012 からは、DQS(Data Quality Services:データ品質サービス)と呼ばれるデータ品質を向上させるためのサービスが提供されました。DQS は、いわゆる「データ クレンジング」(Data Cleansing)や「名寄せ」と呼ばれる処理が可能なサービスで、複数の業務システム(散在したマスター データ)から DWH(データ ウェアハウス)を構築する際に大変役立つ機能です。

普段私たちが利用している業務システムでは、データの入力ミスや、システム上のイレギュラーな処理によるデータの不整合や不一致などが起こり得ます。また、複数の業務システム(マスター データ)が存在する場合には、それぞれのマスター内でデータの格納方法がバラバラである場合があります。例えば、A というシステムでは「XXX株式会社」として登録している取引先が、B というシステムでは「XXX(株)」のように省略系で登録されていたりするケースなどがあります。また、あるシステムでは「第一営業部」として登録されている部署名が、別のシステムでは「第 1営業部」のように漢字の「一」が数字の「1」として登録されてしまっているようなケースもあり得ます。

このようにデータ品質に問題がある場合(同一データが異なる形式で格納されていたり、入力ミスなどで不正なデータが格納されていたりする場合)を解決するための処理が「データ クレンジング」と呼ばれています。クレンジング(Cleansing)は、「洗浄」という意味なので、データ クレンジングは、「データをきれいに洗う」=「データを正しい状態へ整える」という意味で使われています。このようなデータ クレンジングが可能なサービスが DQS(Data Quality Services)です。

その他のデータ

メイン フレーム(汎用機)や UNIX など

SQL Server

DWH(データ ウェアハウス)

さまざまな業務システム

さまざまな業務システムから DWH を構築取引先マスター

XXX株式会社

取引先マスターXXX(株)部署マスター第一営業部

部署マスター第1営業部

システムが違うと同一データが異なる形式で格納されている場合がある

システムが違うと同一データが異なる形式で格納されている場合がある

株が省略されている...

漢字の 一 と数字の 1 の違い

データの品質に問題がある可能性

DQS Client ツールのホーム画面

Page 299: SQL Server 2014 自習書シリーズ No.3

DQS(Data Quality Services)では、次の画面のように、データの修正先を簡単に定義することができるツールが用意されています。

この画面では、間違っているデータ「マイクロソフト日本株式会社」などの場合に、正しいデータ「日本マイクロソフト株式会社」へ修正するようなルールの作成を行っています。

また、このような名前の修正(変換)だけでなく、文字列の長さが正しいかどうかをチェックしたり(例えば、商品コードが 5桁かどうかをチェックしたり)、正規表現を利用したデータのチェックを行ったりすることもできます。

ここで設定した値へ修正するようにする→ 正しい値へ変換

間違った値 正しい値

データ品質を向上させるための

さまざまなチェックが可能

Page 300: SQL Server 2014 自習書シリーズ No.3

このように DQS ツール上で作成したルール/品質チェックは、次のように Integration Services の「DQS クレンジング」タスクを利用することで、実際の処理を実行することができます。

DQS(Data Quality Services)のインストール

DQS(Data Quality Services)を利用するには、SQL Server 2014 のインストール時の[機能の選択]ページで、次のように「Data Quality Services」と「Data Quality Client」、「Integration Services」の 3 つを選択して、インストールしておく必要があります。

DQS クレンジング タスクでナレッジベースのルールに

従ったデータのクレンジングを実行可能

Page 301: SQL Server 2014 自習書シリーズ No.3

「Data Quality Services」はサーバー機能、「Data Quality Client」はルールを設定するための GUI ツール(前述の画面は、この Client ツールです)、「Integration Services」は、前述の「DQS クレンジング」タスクを利用するためにインストールしておく必要があります。

インストールが完了した後は、次のように[スタート]画面から[Microsoft SQL Server 2014]グループの[SQL Server 2014 Data Quality Server Installer]をクリックして、Data Quality Server(サーバー機能)をインストールしておく必要があります(Windows Server 2008/2008 R2 の場合は[スタート]メニューから起動します)。

このインストーラーでは、上記のようにデータベース マスター キーへ設定するパスワードの入力が求められるので、任意のパスワード(8 文字以上の大文字/小文字/数字/特殊文字のうちの 3種類を含んだもの。例えば P@ssword123 など)を指定して、Enter キーを押下します。これ

Page 302: SQL Server 2014 自習書シリーズ No.3

により、パスワードの確認が求められるので、再度同じパスワードを入力すればインストールが始まります。

インストールが完了すると、次のように「DQS インストーラーが正常に終了しました」と表示されます。

DQS(Data Quality Services)によるデータ クレンジング処理

次に、DQS を利用したデータ クレンジングを試してみましょう。

1. まずは、次のようにデータベース(DQStest)とテーブル(取引先マスター)を作成して、クレンジング対象のデータを INSERT しておきます。

CREATE DATABASE DQStest

go

USE DQStest

CREATE TABLE 取引先マスター

( 取引先コード nvarchar(10) PRIMARY KEY

,取引先名 nvarchar(60) )

go

INSERT INTO 取引先マスター VALUES('TR001', '日本マイクロソフト株式会社')

INSERT INTO 取引先マスター VALUES('TR002', 'マイクロソフト日本株式会社')

INSERT INTO 取引先マスター VALUES('TR003', '日本マイクロソフト(株)')

INSERT INTO 取引先マスター VALUES('TR004', 'dummy1')

INSERT INTO 取引先マスター VALUES('TR005', 'dummy2')

INSERT INTO 取引先マスター VALUES('TR006', 'dummy3')

INSERT INTO 取引先マスター VALUES('TR0333', 'dummy4')

INSERT INTO 取引先マスター VALUES('XX011', 'dummy5')

go

SELECT * FROM 取引先マスター

2. 次に、「SQL Server 構成マネージャー」ツールを利用して、[SQL Server ネットワークの

Page 303: SQL Server 2014 自習書シリーズ No.3

構成]の["インスタンス名" のプロトコル](既定のインスタンスの場合は MSSQLSERVER)に表示される「TCP/IP」プロトコルが有効化されていることを確認します(Developer エディションを利用している場合は、既定で無効化されているので、有効化します)。

3. 次に、データ クレンジングのルール作成を行うために、「Data Quality Client」ツールを起動します。このツールは、[スタート]画面から[Microsoft SQL Server 2014]グループの[SQL Server 2014 Data Quality Client]から起動することができます(Windows Server 2008/2008 R2 の場合は[スタート]メニューから起動します)。

4. 「Data Quality Client」ツールが起動したら、次のように[サーバー名]に DQS サーバーの名前(画面は SERVER1)を入力して、[接続]ボタンをクリックします。

5. 次のようにホームページが表示されたら[新しいナレッジベース]をクリックします。

DQS では、ナレッジベースという単位で、クレンジングのための各種ルールを作成します。

6. 次のように[新しいナレッジベース]ページが表示されたら、[名前]へ任意の名前(画面は KB取引先)を入力して、[アクティビティの選択]で「ナレッジ検出」を選択し、[次へ]ボタンをクリックします。

1 2

1

2

1

Page 304: SQL Server 2014 自習書シリーズ No.3

ナレッジ検出を選択することで、既存のデータをもとにクレンジングのためのルールを作成していくことができます。

7. 次の[マップ]ページでは、[データソース]に「SQL Server」、[データベース]と[テーブルまたはビュー]には、先ほど作成したデータベース(DQStest)とテーブル(取引先マスター)を選択します。

なお、データソースには「Excel」を選択することもできるので、Excel シート内のデータをもとにルールを作成していくことも可能です。

8. 次に、[マッピング]セクションで、[基になる列]で「取引先コード」列を選択し、[ドメインの作成]ボタンをクリックします。

1

2

3

1

2

Page 305: SQL Server 2014 自習書シリーズ No.3

DQS では、ドメインという単位でルールを作成します。[ドメインの作成]ダイアログが表示されたら、[ドメイン名]へ任意の名前(列名と同じ名前など)、[データ型]を適宜設定(文字列なら「String」を選択など)、[言語]ではスペル チェックを行いたい言語を選択(日本語は存在しないので、日本語データのみの場合は「その他」を選択)して[OK]ボタンをクリックします。

ドメインの作成が完了したら[次へ]ボタンをクリックして、次のページへ進みます。

Note: スペル チェックに使用する言語

スペル チェックに使用する言語には、日本語を選択することができませんが(日本語のスペルチェックはできません)、次のように[言語]で[英語]を選択して、英語のデータがあった場合には、スペル ミスを検出することができるので、入力ミスやイレギュラーなデータを検出するのに大変役立ちます。

1

2

3

5

4

1

2

スペル ミスがあった場合に赤波線で表示してくれる

3

Page 306: SQL Server 2014 自習書シリーズ No.3

9. 次の[検出]ページでは、[開始]ボタンをクリックします。

これにより、SQL Server 上の取引先テーブルへアクセスして、データを取得し、取得が完了すると、次のように表示されます。

データ件数や一意なデータ件数などが表示されます。確認後、[次へ]ボタンをクリックします。

1

検出された結果

2

1

Page 307: SQL Server 2014 自習書シリーズ No.3

10. 次の[ドメインの値の管理]ページでは、[取引先名]ドメインを選択して、間違っているデータである「マイクロソフト日本株式会社」と「日本マイクロソフト(株)」、正しいデータである「日本マイクロソフト株式会社」の 3 つを Ctrl キーを押しながら選択し、右クリックして、[シノニムとして設定]をクリックします。

これで、選択した 3 つのデータをシノニム(同一データ)として見なすことができるようになります。

また、以下のようにシノニムの先頭データを正しいデータへ設定することで、間違ったデータを正しいデータへ変更できるようになります。

11. 修正ルール(シノニムなど)を設定後、最後に[完了]ボタンをクリックすると、次のように DQS サーバーへパブリッシュするかどうかを尋ねられるので[パブリッシュ]ボタンをクリックします。これでナレッジベースの完成です。

1

2

1

2

↓ 3

一番上に上がる

先頭に指定したものが修正先に変更される

1

Page 308: SQL Server 2014 自習書シリーズ No.3

12. 作成したナレッジ ベースを利用してデータ クレンジング処理を行うには、次のように Integration Services を利用します。

Integration Services のプロジェクト(SSIS パッケージ)では、データ フローの変換コンポーネントとして「DQS クレンジング」タスクが提供されていて、次のようにナレッジベースを指定して、それをもとにデータを出力させることが可能です。

なお、Integration Services を利用しないでナレッジベースの効果を検証したい場合は、次のように Data Quality Client ツールで、[データ品質プロジェクト]を作成することで行うこともできます。

1

DQS クレンジング タスクでナレッジベースのルールに

従ったデータのクレンジングを実行可能

Page 309: SQL Server 2014 自習書シリーズ No.3

ここまで紹介してきたものは、DQS(Data Quality Services)機能のほんの一部です。まだまださまざまなルールを作成したデータのクレンジングが可能で、正規表現によるルール付けや、似たようなレコードを検出するマッチング機能などもあるので、オンライン ブック(SQL Server のヘルプ)などを参考にぜひチャレンジしてみてください。DQS は、データの品質を向上させるために大変役立つ機能です。

また、DQS については、SQL Server 2012 の自習書シリーズの新機能編「No.3 DWH(データ ウェアハウス)関連の新機能」でも詳しく説明しているので、こちらもぜひご覧いただければと思います。

データ品質プロジェクトを作成してナレッジベースのルールに従って

データ クレンジングを実施

Page 310: SQL Server 2014 自習書シリーズ No.3

4.16 マスター データ サービス(MDS)によるマスター データ管理

マスター データ サービス(MDS: Master Data Services)は、SQL Server 2008 R2 から提供されたマスター データ管理(MDM: Master Data Management)を実現することができるサービスです。マスター データとは、「商品マスター」や「社員マスター」、「顧客マスター」、「店舗マスター」などのマスター テーブルのデータを指し、DWH(データ ウェアハウス)環境においてはディメンション テーブルのデータ(分析軸となるデータ)を指します。したがって、MDM(マスター データ管理)が行えるツールは、「ディメンション マネージャー」とも呼ばれています。

MDM(マスター データ管理)は、次の目的で行います。

複数システムに散在するマスター データを統一管理

マスター データの品質管理 データの不整合、不一致を解消(ex. 株式会社 と(株)の違いなどを吸収)

現在、多くの企業では複数のシステムが乱立して、マスター データが散在してしまっています(マスター データは SQL Server だけでなく、メインフレームや Oracle、Excel ファイル、ERP などのいろいろなシステムに散在してしまっています)。こうしたマスター データを統一管理し、データの品質を管理していくことが MDM(マスター データ管理)で求められる機能です。

MDS の主な機能

SQL Server で提供されるマスター データ サービス(MDS)は、MDM(マスター データ管理)を実現するためのサービスで、主に次の機能があります。

マスター データ ハブ 複数のシステムから利用できるマスター データのハブとなるインフラの提供

データ スチュワード ポータル マスター データの総括責任者(データ スチュワード)のためのポータル サイトの提供

マスター データの管理のための Excel アドイン(SQL Server 2012 から提供) エンティティの作成や属性の管理などを Excel 2010/2013 から行えるツール

マスター データの階層管理やバージョン管理機能

トランザクション履歴(データの変更履歴)の記録とロールバック処理への対応

マスター データのセキュリティ保護

マスター データの品質管理のための Transact-SQL 関数の提供 FuzzyLookup(あいまい参照)や Regex(正規表現)、Split など

次の画面は、データ スチュワード ポータル(ポータル サイト)を利用して、マスター データを管理しているときの様子です。

Page 311: SQL Server 2014 自習書シリーズ No.3

次の画面は、Excel アドイン ツールを利用して、マスター データを管理しているときの様子です。

エンティティや属性の管理・作成

Page 312: SQL Server 2014 自習書シリーズ No.3

マスター データ サービスのインストール

マスター データ サービスのインストール手順は、次のとおりです。

1. マスター データ サービスは、SQL Server 2014 のインストール時の[機能の選択]ページで、次のように[マスター データ サービス]を選択することで、インストールすることができます。

マスター データ サービスの構成(MDS Configration Manager)

マスター データ サービスをインストールした後は、マスター データ サービスを構成します(マスター データ サービスが使用するシステム データベースや、ポータル サイトの作成など)。構成には、「Master Data Services Configration Manager」(MDS 構成マネージャー)ツールを利用します。

2. マスター データ サービスのポータル サイトは、ASP.NET を利用しているので、「Master Data Services Configration Manager」ツールを利用する前に、[サーバー マネージャー]ツールを利用して、次のように[役割と機能の追加]から、IIS(Web サーバー)と ASP.NET、Windows 認証などをインストールしておく必要があります。

Page 313: SQL Server 2014 自習書シリーズ No.3

[サーバーの役割の選択]ページでは、[Web サーバー(IIS)]を選択して、追加します。

[機能の選択]ページでは、次のように[ASP.NET 4.5]や[HTTP アクティブ化]機能を

役割と機能の追加ウィザードの起動

1

2

Page 314: SQL Server 2014 自習書シリーズ No.3

選択して、追加します。

[役割サービスの選択]ページ(Web サーバーの役割)では、次のように[Windows 認証]や[.NET 拡張機能]などの役割サービスを選択して、追加します。

・・・

Page 315: SQL Server 2014 自習書シリーズ No.3

3. IIS や ASP.NET などのインストールが完了したら、[スタート]画面から[Microsoft SQL Server 2014]グループの[SQL Server 2014 Master Data Services Configration Manager]をクリックして、Master Data Services Configration Manager(以降、MDS Configration Manager と記述します)ツールを起動します。

4. MDS Configration Manager ツールが起動すると、次のように表示されます。

Page 316: SQL Server 2014 自習書シリーズ No.3

5. このツールでは、次のように[データベース構成]ページを開いて、[データベースの作成]ボタンをクリックし、MDS が利用するシステム データベースを作成します。

[データベースの作成]ウィザードが開始されたら、[次へ]ボタンをクリックします。

もし、ここで .svc ハンドラー マッピングの警告が出る場合には、ASP.NET や HTTP アクティブ化機能などが正しくインストール

されていない場合なので、前の手順を確認してみてください

1 2

3

Page 317: SQL Server 2014 自習書シリーズ No.3

6. 次の[データベース サーバー]ページでは、[SQL Server インスタンス]へデータベースを作成したい SQL Server のインスタンス名を入力、[認証の種類]で任意の認証方法を選択して、[接続テスト]ボタンをクリックします。

接続に成功したら、[次へ]ボタンをクリックします。

7. 次の[データベース]ページでは、[データベース名]へ任意のデータベース名を入力(画面は MDS と入力)して、[次へ]ボタンをクリックします。

8. 次の[管理者アカウント]ページでは、マスター データ サービスの管理者アカウント(画面は MATUMO\Administrator アカウント)を指定して、[次へ]ボタンをクリックします。

3

1

2

2

1

1

1

Page 318: SQL Server 2014 自習書シリーズ No.3

9. 次の[概要]ページでは、ここまでの設定を確認して、[次へ]ボタンをクリックします。

これにより、データベースの作成が始まります(作成には 1~2 分程度かかります)。

10. データベースの作成が完了すると、次のように[タスク]の[状態]が「成功」と表示されます。

[完了]ボタンをクリックして、ウィザードを終了します。

11. MDS Configration Manager の[データベース構成]ページへ戻ったら、作成したデータベース名が表示されて、[システム設定]セクションでマスター データ サービスに関するシステム設定の確認と変更ができることを確認できます。

1

2

1

Page 319: SQL Server 2014 自習書シリーズ No.3

12. 続いて、マスター データ サービスの管理サイト(ASP.NET ベースのポータル サイト)を作成するために、次のように[Web 構成]ページを開きます。

今回は、既定の Web サイト内へ新しいアプリケーション(と仮想ディレクトリ)を作成す

作成したデータベース

システム設定

1 2

3

Page 320: SQL Server 2014 自習書シリーズ No.3

るので、[Web サイト]で「Default Web Site」を選択して、[アプリケーションの作成]ボタンをクリックします。

13. 次のように[Web アプリケーションの作成]ダイアログが表示されたら、[別名]へ任意のエイリアス名(仮想ディレクトリ名。画面は MDS)を入力します。

[ユーザー名]と[パスワード]には、アプリケーション プールの実行ユーザー アカウント名(画面は MATUMO\sqlservice)とパスワードを入力して、[OK]ボタンをクリックします。

14. [Web 構成]ページへ戻ったら、[データベースへのアプリケーションの関連付け]セクションの[選択]ボタンをクリックします。

2

1

3

1

4

2

3

Page 321: SQL Server 2014 自習書シリーズ No.3

[データベースへの接続]ダイアログが表示されたら、[接続]ボタンをクリックして、[マスター データ サービス データベース]で、前の手順で作成したデータベース(画面は MDS)を選択して、[OK]ボタンをクリックします。

15. [Web 構成]ページへ戻ったら、[適用]ボタンをクリックします。

数十秒後に、[構成の完了]ダイアログが表示されて、「Web アプリケーションの設定が正常に適用されました」というメッセージが表示されれば、サイトの作成が完了です。このダイアログでは、「ブラウザーで Web アプリケーションを起動する」がチェックされていることを確認して、[OK]ボタンをクリックします。

16. これにより、次のページが表示されます。

ここでは、[マスター データ マネージャーのホームページを開きます]をクリックします。

17. これにより、「マスター データ マネージャーのホーム ページ」(ポータル サイトのトップページ)が開かれます。

1

SQL Server 2012 から提供された「DQS」(データ品質サービス)との統合機能を利用する場合には[適用]後、これをクリックする

2

1

Page 322: SQL Server 2014 自習書シリーズ No.3

このポータル サイトは、[Web 構成]ページで「Default Web Site」サイトの「MDS」アプリケーションとして作成したので、次の URL からもアクセスすることができます。

http://サーバー名/MDS

Excel 用マスター データ サービス アドインのインストール

次に、「Excel 用マスター データ サービス アドイン」をインストールします(このアドインは、SQL Server 2012 から提供されました)。このツールを利用すれば、エンティティの作成や属性の設定などを Excel 2010/2013 から行えるようになります(SQL Server 2008 R2 のときは、ポータル サイトを利用して、これらの操作を行っていました)。

1. Excel 用マスター データ サービス アドインをインストールするには、ポータル サイトで「Microsoft Excel 用マスター データ サービス アドインをインストールする」をクリックするか、次の URL へアクセスします。

Microsoft Excel 用 Microsoft SQL Server 2014 マスター データ サービス アドイン http://www.microsoft.com/ja-jp/download/details.aspx?id=42298

Page 323: SQL Server 2014 自習書シリーズ No.3

2. ダウンロードが完了したら、「MasterDataServicesExcelAddin.msi」ファイルをダブルクリックして、次のようにインストールを実行します。

なお、このアドインをインストールするには、「Visual Studio 2010 Tools for Office Runtime」が必要になるので、このラインタイムをインストールしていない場合には、次の URL からダウンロードして、インストールしておく必要があります。

Visual Studio 2010 Tools for Office Runtime http://www.microsoft.com/ja-jp/download/details.aspx?id=44074

Page 324: SQL Server 2014 自習書シリーズ No.3

3. インストールが完了したら Excel 2013 を起動します。Excel 2013 を起動すると、次のように[マスター データ]タブが表示されることを確認できます。

これで、「Excel 用マスター データ サービス アドイン」のインストールが完了です。

以上で、MDS(マスター データ サービス)関連のツールのインストールおよび構成が完了です。以降では、MDS 上にモデルやエンティティの作成、属性の設定などを行って、マスター データを管理する方法を説明します。

モデルの作成

マスター データの管理を行うには、まずはモデルを作成します。

1. モデルを作成するには、ポータル サイト(マスター データ マネージャー)のホーム ページを開いて、次のように[システム管理]をクリックします。

1

Page 325: SQL Server 2014 自習書シリーズ No.3

2. 次のように[モデルの追加]ページが表示されたら、[モデル名]へ「商品モデル」など任意のモデル名を入力して、[保存]ボタン(フロッピーの形のアイコン)をクリックします。

3. これにより、[モデルのメンテナンス]ページが表示されて、モデルの一覧へ「商品モデル」が追加されて、モデルが作成されたことを確認できます。

エンティティと属性の作成

モデルの作成後は、エンティティと属性を作成します。エンティティは、リレーショナル データベースにおける「テーブル」、属性は「列」に相当するものです。これらは、「Excel 用マスター データ サービス アドイン」ツール(以降、Excel 用 MDS アドインと記述します)を利用すると、簡単に作成することができます(Excel 用 MDS アドイン ツールは SQL Server 2012 から提供されたツールなので、SQL Server 2008 R2 を利用している場合は、ポータル サイトからエンティティと属性を作成することができます)。

1. エンティティを作成するには、Excel 2013 を起動して、エンティティの元となるデータをシートへインポートしておきます(画面は、NorthwindJ データベースの「商品区分」テーブルを取り込んだ Sheet1 シート)。

1

2

モデルが作成されたことを確認

Page 326: SQL Server 2014 自習書シリーズ No.3

2. 次に、商品区分のデータを全て選択して、[マスター データ]タブから[エンティティの作成]をクリックします。

3. これにより、[接続の管理]ダイアログが表示されるので、[新規作成]ボタンをクリックして、新しい接続を作成します。

[新しい接続の追加]ダイアログでは、[説明]へ任意の接続名(MDS など)、[MDS サーバー アドレス]へポータル サイトへのアドレス(画面は http://matumo/MDS)を入力

NorthwindJ データベースの「商品区分」テーブルを

取り込んだもの

データを全て選択

2

1

1

2

3

4

Page 327: SQL Server 2014 自習書シリーズ No.3

して、[OK]ボタンをクリックします。

4. 次に、[接続]ボタンをクリックして、MDS サーバーへ接続します。

5. [エンティティの作成]ダイアログが表示されたら、[モデル]で「商品モデル」、[バージョン]で「VERSION_1」を選択します。

[新しいエンティティ名]には「商品区分」など任意のエンティティ名を入力して、[コード(一意識別子を含む列)]で「区分コード」、[名前]で「区分名」を選択し、[OK]ボタンをクリックします。

6. これで、エンティティが作成されて、次のように新しいシート(エンティティの名前と同じ名前のシート)が追加されます。

1

1

2

3

Page 328: SQL Server 2014 自習書シリーズ No.3

また、各列は、「属性」として自動作成されています。

7. 次に、NorthwindJ データベースの「商品」テーブルを取り込んだシートから、新しいエンティティを作成します。

商品データを全て選択して、[マスター データ]タブから[エンティティの作成]をクリックします。

8. [エンティティの作成]ダイアログが表示されたら、[モデル]で「商品モデル」、[バージョン]で「VERSION_1」を選択します。

新しいエンティティが作成される

1

データを全て選択

2

1

Page 329: SQL Server 2014 自習書シリーズ No.3

[新しいエンティティ名]には「商品」など任意のエンティティ名を入力して、[コード(一意識別子を含む列)]で「商品コード」、[名前]で「商品名」を選択し、[OK]ボタンをクリックします。

9. これで、「商品」エンティティが作成されて、次のように新しいシートが追加されます。

属性の設定

次に、属性を設定してみましょう。

10. ここでは、「商品」エンティティの「区分コード」属性を選択して、[属性のプロパティ]をクリックします。

1

2

3

新しいエンティティが作成される

1

Page 330: SQL Server 2014 自習書シリーズ No.3

11. これにより、[属性のプロパティ]ページが表示されて、属性の設定を変更できるようになります。

[属性の型]で「制約付き一覧(ドメイン ベース)」、[属性に次の値を設定]で「商品区分」エンティティを選択して、[OK]ボタンをクリックします。

このように設定すると、「区分コード」属性を「商品区分」エンティティに関連付けることができます(リレーションシップを設定できます)。

12. 関連付けを行うと、次のように「区分コード」属性にドロップダウン リストが表示されて、商品区分エンティティの区分名が表示されるようになります。

1

2

1

2

1

Page 331: SQL Server 2014 自習書シリーズ No.3

データの編集とパブリッシュ

次に、データを編集してみましょう。データの編集は、Excel 用 MDS アドインまたはポータル サイトから行うことができます。

1. ここでは、Excel 用 MDS アドインで任意のデータを編集してみましょう(画面は、商品コード 3 の果汁 100% レモンの区分コードを 1:飲料 から 7:加工食品 へ変更)。

データを変更すると、セルがオレンジ色に表示されます。これを MDS サーバーへ反映させるには、[パブリッシュ]ボタンをクリックします。

2. 次のように[パブリッシュと注釈設定]ダイアログが表示されたら、任意の注釈(説明)を記述(画面は 区分変更と記述)して、[パブリッシュ]ボタンをクリックします。

以上でパブリッシュが完了です。完了後、編集したデータは、オレンジ色から通常の色へ変わっていることを確認できます。

1

2

1

2

Page 332: SQL Server 2014 自習書シリーズ No.3

エクスプローラーでのデータの確認

次に、ポータル サイトの「エクスプローラー」機能を利用して、エンティティ内のデータを確認してみましょう。

3. エクスプローラーを利用するには、まずは、画面左上のロゴをクリックして、ホーム ページに戻ります。

ホームページでは、[モデル]で「商品モデル」、[バージョン]で「VERSION_1」を選択して、[エクスプローラー]をクリックします。

4. なお、Silverlight をインストールしていない環境の場合には、次のように Silverlight のインストールが促されるので、Silverlight をインストールしておきます。

1

2

3

Page 333: SQL Server 2014 自習書シリーズ No.3

5. [エクスプローラー]ページのメニューが表示されたら、次のように[エクスプローラー]をクリックします。

6. 続いて、[エンティティ]メニューから[商品区分]エンティティをクリックします。

商品区分エンティティのデータが表示されることを確認できます。ここでは、右ペインを利用して、データを編集することもできます。

7. 次に、[エンティティ]メニューから[商品]エンティティを選択して、商品エンティティのデータを確認します(もし、メニューが表示されない場合は、[エクスプローラー]をクリックしてから、[エンティティ]メニューを開いてみてください)。

1

商品区分エンティティのデータが表示されて

いることを確認

データの編集も可能

1

Page 334: SQL Server 2014 自習書シリーズ No.3

商品エンティティのデータが表示されて、Excel 用 MDS アドインで編集したデータ(商品コード 3 の果汁 100% レモンの区分コードを 1:飲料 から 7:加工食品 へ変更)も確認することができます。

トランザクションの確認と破棄

MDS では、マスター データに対して行われたトランザクション(変更の履歴)を確認することができます。また、そのトランザクションを破棄(ロールバック)することもできます。

1. トランザクションの確認を行うには、ホームページへ戻って、次のように[バージョン管理]をクリックします。

商品エンティティのデータ

1

Page 335: SQL Server 2014 自習書シリーズ No.3

2. 次に、[トランザクション]をクリックすると、トランザクション(変更の履歴)を確認することができます。

[以前の値]列には「1」(飲料区分)、[新しい値]列には「7」(加工食品区分)と表示されるトランザクションがあることを確認できます。

3. 記録されたトランザクションを破棄(ロールバック)するには、次のように破棄したいトランザクションを選択して、[トランザクションを元に戻す]ボタンをクリックします。

これにより、[Web ページからのメッセージ]ダイアログが表示されて、確認を促されるので、[OK]ボタンをクリックします。

4. トランザクションには、次のように、[以前の値]が「7」(加工食品区分)、[新しい値]が「1」(飲料区分)」となったデータが記録されて、元の区分へ戻っていることを確認できます。

1

トランザクションの履歴が表示される

以前の値が 1(飲料区分)で新しい値が 7(加工食品区分)

であることを確認できる

3

2 破棄(ロールバック)したい操作を選択

1

Page 336: SQL Server 2014 自習書シリーズ No.3

5. データが元にもどったことを Excel 用 MDS アドインで確認するには、次のように[更新]ボタンをクリックします。

サブスクリプション ビューの作成

MDS では、マスター データを、別システム(レポート ツールや BI ツールなど)から利用できるようにするための「サブスクリプション ビュー」機能が用意されています。

1. サブスクリプション ビューを作成するには、ホーム ページへ戻って、次のように「統合管理」をクリックします。

以前の値が 7(加工食品区分)で新しい値が 1(飲料区分)となり元にもどっていることを確認できる

1

2

1

Page 337: SQL Server 2014 自習書シリーズ No.3

2. 次に、[ビューの作成]をクリックすると、「サブスクリプション ビュー」ページが表示されます。

このページでは、「+」(サブスクリプション ビューの追加)ボタンをクリックします。

3. [サブスクリプション ビュー定義の作成]ページが表示されたら、[サブスクリプション ビュー名]に任意の名前(画面は TestView1)を入力して、[モデル]で「商品モデル」、[バージョン]で「VERSION_1」、[エンティティ]で「商品」、[形式]で「リーフ メンバー」を選択します。

選択後、上部の[保存]ボタンをクリックすれば、サブスクリプション ビューの作成が完了です。

4. 作成が完了すると、次のように表示されます。

5. 次に、作成したサブスクリプション ビューを Management Studio から確認してみましょう。オブジェクト エクスプローラーで MDS データベースの「ビュー」フォルダーを展開すると、TestView1 が作成されていることを確認できます。

1 「サブスクリプション ビュー」ページが表示される

2

3

2

3 4 5

6

1

作成されたサブスクリプション ビュー

Page 338: SQL Server 2014 自習書シリーズ No.3

また、SELECT ステートメントで TestView1 テーブルの中身(商品エンティティのデータ)を参照できることも確認しておきましょう。

このように、MDS を利用すると、マスター データ管理(MDM: Master Data Management)を実現することができます。SQL Server 2012 からは、データの品質を向上させることができる DQS(データ品質サービス)機能も提供されていて、MDS には、この DQS と連携する機能もあります。

MDS には、まだまだたくさんの機能があるので、オンライン ブックなどを参考に、ぜひ試してみてください。

Page 339: SQL Server 2014 自習書シリーズ No.3

おわりに

最後までこの自習書を試された皆さま、いかがでしたでしょうか? SQL Server 2008~SQL Server 2012 では、多くの新機能が提供されていることを確認していただけたのではないでしょうか。この自習書では、現場で役立つ新機能を厳選して、利用方法をステップ バイ ステップ形式で解説してきましたが、実際の移行方法(SQL Server 2005 からの移行/アップグレード方法)については、SQL Server 2014 実践シリーズで、詳しく解説しているので、こちらもぜひご覧いただければと思います。

SQL Server 2014 実践シリーズ http://www.microsoft.com/ja-jp/sqlserver/2014/technology/self-learning.aspx#practical-contents

また、SQL Server 2014 からの新機能(クラスター化列ストア インデックスやインメモリ OLTP、SSD バッファ プール拡張など)については、本自習書シリーズの「SQL Server 2014 新機能ダイジェスト」および「インメモリ OLTP 機能の概要」編で詳しく解説しているので、こちらもぜひご覧いただければと思います。

SQL Server 2014 自習書シリーズの URL http://www.microsoft.com/ja-jp/sqlserver/2014/technology/self-learning.aspx

Page 340: SQL Server 2014 自習書シリーズ No.3

その他、SQL Server に関する全般的な利用方法については、SQL Server 2012 のときの自習書シリーズになりますが、こちらも詳細手順を記載しているので、こちらもぜひご覧いただければと思います。

SQL Server 2012 自習書シリーズの URL http://www.microsoft.com/ja-jp/sqlserver/2012/technology/self-learning.aspx

Page 341: SQL Server 2014 自習書シリーズ No.3

執筆者プロフィール

有限会社エスキューエル・クオリティ(http://www.sqlquality.com/) SQLQuality(エスキューエル・クオリティ)は、日本で唯一の SQL Server 専門の独立系コンサルティング会社です。過去のバージョンから最新バージョンまでの SQL Server を知りつくし、多数の実績と豊富な経験を持つ、OS や .NET にも詳しい SQL Server の専門家(キャリア 17年以上)がすべての案件に対応します。人気メニューの「パフォーマンス チューニング サービス」は、100%の成果を上げ、過去すべてのお客様環境で驚異的な性能向上を実現。チューニング スキルは世界トップレベルを自負、検索エンジンでは(英語情報を含めて)ヒットしないノウハウを多数保持。ここ数年は BI/DWHシステム構築支援のご依頼が多く、支援だけでなく実際の構築も行う。

主なコンサルティング実績/構築 大手製造業の「CAD 端末の利用状況の見える化」システム構築

Oracle や CSV(Notes)、TSV ファイル、Excel からデータを抽出し、SQL Server 2012 上に DWH を構築 見える化レポートには Reporting Services を利用

大手映像制作会社の BI システム構築(会計/業務システムにおける予実管理/原価管理など) 従来 Excel で管理していたシートを Reporting Services のレポートへ完全移行。 Oracle や勘定奉行からデータを抽出して、SQL Server 上に DWH を構築

大手流通系の DWH/BI システム構築支援(POS データ/在庫データ分析/ABC 分析/ポイントカード分析) 大手アミューズメント企業の BI システム構築支援(人事システムにおける人材パフォーマンス管理)

Reporting Services による勤怠状況の見える化レポートの作成、PostgreSQL/人事システムからのデータ抽出 外資系医療メーカーの BI システム構築支援(Analysis Services と Excel による販売分析システム)

OLAP キューブによる売上および顧客データの多次元分析/自由分析(ユーザーによる自由操作が可能) 大手流通系の DWH システムのパフォーマンス チューニング データ量 100億件の DWH、総ステップ数2万越えのストアド プロシージャのパフォーマンス チューニング

ミッション クリティカルな金融システムでのトラブル シューティング/定期メンテナンス支援 SQL Server の下位バージョンからの移行/アップグレード支援(32 ビットから x64 への対応も含む) 複数台の SQL Server の Hyper-V 仮想環境への移行支援(サーバー統合支援) ハードウェア リプレース時のハードウェア選定(最適なサーバー、ストレージの選定)、高可用性環境の構築 2時間かかっていた日中バッチ実行時間を、わずか 5分へ短縮(95.8% の性能向上) Java 環境(Tomcat、Seasar2、S2Dao)の SQL Server パフォーマンス チューニング etc

コンサルティング時の作業例(パフォーマンス チューニングの場合) アプリケーション コード(VB、C#、Java、ASP、VBScript、VBA)の解析/改修支援 ストアド プロシージャ/ユーザー定義関数/トリガー(Transact-SQL)の解析/改修支援 インデックス チューニング/SQL チューニング/ロック処理の見直し 現状のハードウェアで将来のアクセス増にどこまで耐えられるかを測定する高負荷テストの実施 IIS ログの解析/アプリケーション ログ(log4net/log4j)の解析 ボトルネック ハードウェアの発見/ボトルネック SQL の発見/ボトルネック アプリケーションの発見 SQL Server の構成オプション/データベース設定の分析/使用状況(CPU, メモリ, ディスク, Wait)解析 定期メンテナンス支援(インデックスの再構築/断片化解消のタイミングや断片化の事前防止策など)etc

松本美穂(まつもと・みほ) 有限会社エスキューエル・クオリティ 代表取締役 Microsoft MVP for SQL Server(2004 年 4 月~) 経産省認定データベース スペシャリスト/MCDBA/MCSD for .NET/MCITP Database Administrator SQL Server の日本における最初のバージョンである「SQL Server 4.21a」から SQL Server に携わり、現在、SQL Server を中心とするコンサルティングを行っている。得意分野はパフォーマンス チューニングと Reporting Services。著書の『SQL Server 2000 でいってみよう』と『ASP.NET でいってみよう』(いずれも翔泳社刊)は、トップ セラー(前者は 28,500部、後者は 16,500 部発行)。近刊に『SQL Server 2012 の教科書』(ソシム刊)がある。

松本崇博(まつもと・たかひろ) 有限会社エスキューエル・クオリティ 取締役 Microsoft MVP for SQL Server(2004 年 4 月~) 経産省認定データベース スペシャリスト/MCDBA/MCSD for .NET/MCITP Database Administrator SQL Server の BI システムとパフォーマンス チューニングを得意とするコンサルタント。アプリケーション開発(ASP/ASP.NET、C#、VB 6.0、Java、Access VBA など)やシステム管理者(IT Pro)経験もあり、SQL Server だけでなく、アプリケーションや OS、Web サーバーを絡めた、総合的なコンサルティングが行えるのが強み。Analysis Services とExcel による BI システムも得意とする。マイクロソフト認定トレーナー時代の 1998 年度には、Microsoft CPLS トレーナー アワード(Trainer of the Year)を受賞。