SQL Server のことなら SQL Quality SQL Server パフォーマンス チューニング、コンサルティング、アドバイス、相談、定期診断、トレーニング

ホーム > 技術情報 > SQL Server 2014 自習書 No.5 Microsoft Azure SQL Database 入門

SQL Server 2014 自習書シリーズ (HTML 版)
「No.5 Microsoft Azure SQL Database 入門」

松本美穂と松本崇博が執筆した SQL Server 2014 自習書シリーズの「No.5 Microsoft Azure SQL Database 入門」の HTML 版です。 日本マイクロソフトさんの Web サイトで Word または PDF 形式でダウンロードできますが、今回、HTML 版として公開する許可をいただきましたので、ここに掲載いたします。[2015年12月29日]

目次へ | 前のページへ | 次のページへ

5.2 Elastic Scale Client Library の利用

(2015年1月時点での情報)

ここでは、NuGet で提供されている「Elastic Scale Client Library」を利用して、どのように Azure SQL Database のシャーディング(データベース分割)を実装するのかを説明します。このライブラリを利用すれば、シャーディングに対して、次のようにデータを INSERT することができます(C# の場合の例)。

    string cnstr = "Server=SQLサーバー名.database.windows.net;"
             + "Database=データベース名;"
             + "User ID=管理者アカウント名;Password=パスワード;Encrypt=true;";
    ShardMapManager smm = ShardMapManagerFactory.GetSqlShardMapManager(
                                cnstr,
                                ShardMapManagerLoadPolicy.Lazy);
    RangeShardMap<long> sm = smm.GetRangeShardMap<long>(mapName);
    int data_colA = 133;         // colA 格納するデータ
    string data_colB = "AAAA";   // colB 格納するデータ
    // SqlConnection  OpenConnectionForKey 作成
    string cred = "User ID=管理者アカウント名;Password=パスワード;Encrypt=true;";
    using (SqlConnection conn = sm.OpenConnectionForKey(
                                     data_colA,
                                     cred, ConnectionOptions.Validate))
    {
        // SqlCommand  INSERT 実行 
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = @"INSERT INTO t1 VALUES(@a@b)";
        SqlParameter p1 = cmd.Parameters.Add("@a", SqlDbType.Int);
        SqlParameter p2 = cmd.Parameters.Add("@b", SqlDbType.VarChar, 100);
        p1.Value = data_colA;
        p2.Value = data_colB;
        cmd.ExecuteNonQuery();
    }

ADO.NET でのプログラミングと同じように、SqlConnection SqlCommand オブジェクトを利用して、データを INSERT することができます。通常との違いは、SqlConnection オブジェクトを作成するときに、RangeShardMap オブジェクトの OpenConnectionForKey メソッドを利用しているところです。これは、次の図のような構成になります。

00409

この例では、OpenConnectionForKey メソッドの第1引数に data_colA(colA 列に格納するデータ 133 を保持している変数)を与えていますが、この値(Key 値)によって、どのシャードに格納すべきかを認識できるようになっている、というライブラリになっています。

SqlCommand オブジェクトの利用方法は、通常の ADO.NET と同じです。このように、Elastic Scale Client Library を利用すれば、アプリケーションからは、どのデータベース(シャード)を利用しているかは意識する必要がなくなります。

◆ Let's Try

それでは、Elastic Scale Client Library を試してみましょう。ここでは、次のような C# の Windows フォーム アプリケーションを作成する場合を例に説明します。

00410

Button1 をクリックすることでシャーディングを構成して、Button2 でデータの追加(INSERT)、Button3 でデータの参照(SELECT)を行うようにします。

シャーディングは、次の図のように構成します。

00411

データベースを 3つ作成して、シャードの管理情報を格納するための「estest」、1~100 のデータを格納するためのシャード「estest_1」、101~200 のデータを格納するためのシャード「estest_2」を作成します。テーブル名は「t1」として、「colA」と「colB」の 2つの列で構成するようにします。

1.まずは、Azure SQL Database の SQL サーバーに接続して、データベースを 3つ作成します(master データベースに接続して、CREATE DATABASE ステートメントを実行します)。

CREATE DATABASE estest COLLATE Japanese_CI_AS
EDITION 'BASIC' )
CREATE DATABASE estest_COLLATE Japanese_CI_AS
EDITION 'BASIC' )
CREATE DATABASE estest_COLLATE Japanese_CI_AS
EDITION 'BASIC' )

00412

このように作成したデータベースは、課金対象になるので、テストが完了したら、削除し忘れないように注意してください。

2.次に、2つのシャード(estest_1 estest_2 データベース)の中に、まったく同じ構成の「t1」テーブルを次のように作成します。

CREATE TABLE t1
colA int NOT NULL PRIMARY KEY
  colB varchar(100NULL )

00413

テーブル名は「t1」として、「colA」と「colB」の 2つの列で構成するようにします。colA intcolB varchar(100) データ型で定義して、colA に格納される値に応じて、シャードが分かれるという形にしていきます。

◆ シャーディングの構成 ~Button1~

次に、Button1 をクリックしたときに、シャーディングを構成するように Elastic Scale Client Library を利用して、コードを記述します。シャーディングの構成では、シャードをいくつ作成するのか、各シャードが保持する値の範囲などを設定します。これには、ShardMapManager RangeShardMapRangeMappingShard オブジェクトなどを利用しますが、おおまかな関係は、次のとおりです。

00414

CreateSqlShardMapManage メソッドで、シャーディングを管理するための ShardMap Manager オブジェクトを作成して、CreateRangeShardMap メソッドで RangeShardMap オブジェクトを作成します。これは値の範囲(1~100 や 101~200 のような範囲)でシャード マップを作成するためのオブジェクトで、特定の値(1 や 2、3 などの値)に応じてシャードを分割することもでき、この場合は ListShardMap オブジェクトを利用します。

RangeShardMap オブジェクトでは、CreateRangeMapping メソッドで RangeMapping オブジェクトを作成して、値の範囲を定義し、CreateShard メソッドで Shard オブジェクト(シャード)を作成して、どの範囲のどのデータベースを割り当てるのかに利用します。

それでは、具体的なコードを記述してみましょう。

1.まずは、Visual Studio 2013 を起動して、新しいプロジェクトを作成します。

00415

テンプレート]で[Visual C#]の[Windows フォーム アプリケーション]を選択して、新しいプロジェクトを作成します。

2.次に、Windows フォーム上に[Button]を 3つ配置します。

00416

3.次に、NuGet から Elastic Scale Client Library を取得するために、[ツール]メニューの[Nuget パッケージ マネージャー]の[ソリューションの NuGet パッケージの管理]をクリックします。

00417

NuGet パッケージの管理]ダイアログでは、[オンライン]を選択して、[検索]ボックスに「Elastic Scale」と入力して、Enter キーを押下します。これにより、検索結果に「Azure SQL Database Elastic Scale Client Library」が表示されるので、[インストール]ボタンをクリックして、インストールします。

4.インストールが完了したら、Button1 をダブルクリックして、Click イベント ハンドラーを作成し、ここにコードを記述していきます。まずは、ShardMapManager オブジェクトなどを操作するために、次のように using を利用して Elastic Scale Client ライブラリの名前空間を宣言します。

using Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement;

00418

5.次に、Azure SQL Database 上のデータベース「estest」に接続するための接続文字列private 変数として定義します。また、これから作成するシャードマップの名前も「maptest1」という値で変数として定義しておきます。

private string cnstr = "Server=SQLサーバー名.database.windows.net;"
             + "Database=estest;"
             + "User ID=管理者アカウント名;Password=パスワード;Encrypt=true;";
private string mapName = "maptest1";

00419

接続文字列の記述方法は、通常の ADO.NET と同様です。

6.次に、Button1 Click イベント ハンドラーの中に、ShardMapManager オブジェクトを作成するためのコードを、次のように記述します。

  // 既存 ShardMapManager 存在チェックTryGetSqlShardMapManager
  ShardMapManager smm;
  bool shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager(
                            cnstr,
                            ShardMapManagerLoadPolicy.Lazy,
                            out smm);
    if (shardMapManagerExists)
    {
        // ShardMapManager 存在している場合
        Console.WriteLine("Shard Map Manager already exists");
    }
    else
    {
        // ShardMapManager 作成CreateSqlShardMapManager
        ShardMapManagerFactory.CreateSqlShardMapManager(cnstr);
        Console.WriteLine("Created SqlShardMapManager");
        smm = ShardMapManagerFactory.GetSqlShardMapManager(
            cnstr,
            ShardMapManagerLoadPolicy.Lazy);
    }

ShardMapManagerFactory クラスの TryGetSqlShardMapManager メソッドで、cnstr(接続文字列)を与えて、データベース内に ShardMapManager が存在しているかどうかをチェックして、存在していない場合は、 CreateSqlShardMapManage メソッドで、ShardMapManager を作成するようにしています。作成した ShardMapManager は、GetSqlShardMapManage メソッドを利用して、smm というオブジェクト変数に格納しています。

7.次に、値の範囲でシャードマップを作成するために、続けて、次のようにコードを記述します。

    // RangeShardMap範囲タイプシャードマップ
    RangeShardMap<long> sm = null;
    if (!smm.TryGetRangeShardMap(mapName, out sm))
    {
        // シャードマップ作成CreateRangeShardMap
        sm = smm.CreateRangeShardMap<long>(mapName);
    }
    // シャード作成CreateShardSQL サーバー名データベース名指定する
    string srvName = "SQLサーバー名.database.windows.net";
    Shard shard1 nullshard2 null;
    if (!sm.TryGetShard(new ShardLocation(srvName, "estest_1"), out shard1))
    {
        shard1 = sm.CreateShard(new ShardLocation(srvName, "estest_1"));
    }
    if (!sm.TryGetShard(new ShardLocation(srvName, "estest_2"), out shard2))
    {
        shard2 = sm.CreateShard(new ShardLocation(srvName, "estest_2"));
    }
    // 範囲マッピング作成CreateRangeMapping範囲設定1100  101200
    RangeMapping<long> rmap = null;
    // shard1  1100 範囲
    if (!sm.TryGetMappingForKey(1, out rmap))
    {
        sm.CreateRangeMapping(new RangeMappingCreationInfo<long>
            (new Range<long>(1100), shard1, MappingStatus.Online));
    }
    // shard2  101200 範囲    
    if (!sm.TryGetMappingForKey(101, out rmap))
    {
        sm.CreateRangeMapping(new RangeMappingCreationInfo<long>
            (new Range<long>(101200), shard2, MappingStatus.Online));
    }

00420

CreateRangeShardMap メソッドで RangeShardMap オブジェクトを作成します。これは値の範囲(1~100 や 101~200 のような範囲)でシャード マップを作成するためのオブジェクトで、特定の値(1 や 2、3 などの値)に応じてシャードを分割することもでき、この場合は ListShardMap オブジェクトを利用します。

RangeShardMap オブジェクトでは、CreateRangeMapping メソッドで RangeMapping オブジェクトを作成して、値の範囲を定義し、CreateShard メソッドで Shard オブジェクト(シャード)を作成して、どの範囲のどのデータベースを割り当てるのかに利用します。このコードでは、shard1 estest_1 データベースを割り当てて、1~100 の範囲マッピング、shard2 estest_2 データベースを割り当てて、101~200 の範囲マッピングを設定しています。

8.コードの記述が完了したら、ツールバーの[開始]ボタンをクリックしてデバッグを開始し、[Button1]をクリックします。

00421

Button1 をクリックしてから 1分ぐらい経過すると、実行が完了するので、完了後、[閉じる]ボタンをクリックして、Windows フォームを終了し、デバッグ実行を終了します。

9.実行が完了した後に、Azure SQL Database 上のデータベース(estest estest_1 など)を参照すると、次のように ShardMapManager が自動作成されていることを確認できます。

00422

◆ データの INSERT ~Button2~

次に、Button2 がクリックされたときに、t1 テーブルにデータを追加INSERT)するようにコードを記述していきましょう。

1.データの追加には、ADO.NET の SqlConnection SqlCommand オブジェクトを利用するので、まずは、次のように System.Data.SqlClient 名前空間を宣言しておきます。

using System.Data.SqlClient;

次に、Windows フォーム上の Button2 をダブルクリックして、Click イベント ハンドラーを作成し、次のようにコードを記述します。

    ShardMapManager smm = ShardMapManagerFactory.GetSqlShardMapManager(
                                cnstr,
                                ShardMapManagerLoadPolicy.Lazy);
    RangeShardMap<long> sm = smm.GetRangeShardMap<long>(mapName);
    // 追加するデータ
    int data_colA 133;
    string data_colB = "AAAA";
    // SqlConnection  OpenConnectionForKey 作成
    string cred = "User ID=管理者アカウント名;Password=パスワード;Encrypt=true;";
    using (SqlConnection conn = sm.OpenConnectionForKey(
                                     data_colA,
                                     cred, ConnectionOptions.Validate))
    {
        // SqlCommand  INSERT 実行 
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = @"INSERT INTO t1 VALUES(@a@b)";
        SqlParameter p1 = cmd.Parameters.Add("@a", SqlDbType.Int);
        SqlParameter p2 = cmd.Parameters.Add("@b", SqlDbType.VarChar, 100);
        p1.Value = data_colA;
        p2.Value = data_colB;
        cmd.ExecuteNonQuery();
    }

00423

データの追加は、ADO.NET でのプログラミングと同じように、SqlConnection SqlCommand オブジェクトを利用します。SqlConnection オブジェクトを作成するときに、RangeShardMap(シャードマップ)の OpenConnectionForKey メソッドを利用して、colA に格納するデータ(data_colA133)を与えるようにします。これは、次の図のような構成になります(前出の図の再掲)。

00424

OpenConnectionForKey メソッドで data_colA133)を与えることで、この値をどのシャードに格納すべきかを、ライブラリが認識できるようになっています(ShardMapManager がシャードを管理しています)。

SqlCommand オブジェクトの利用方法は、通常の ADO.NET と同じです。

2.コードの記述が完了したら、ツールバーの[開始]ボタンをクリックしてデバッグを開始し、[Button2]をクリックします。

00425

実行が完了したら、[閉じる]ボタンをクリックして、Windows フォームを終了し、デバッグ実行を終了します。

3.次に、追加されたデータを確認するために、Azure SQL Database 上のデータベース(estest_1 estest_2)に接続して、「t1」テーブルを参照します。

SELECT FROM t1

00426

シャード2(estest_2 データベース)の t1 テーブルにだけデータ(133)が追加されていることを確認できます。

4.次に、コード内の data_colA 変数に与える値を 133 から 77 に変更して、デバッグを開始し、[Button2]をクリックします。

int data_colA = 77;

00427

5.実行後、追加されたデータを確認するために、「t1」テーブルを参照します。

SELECT FROM t1

00428

今度は、シャード1(estest_1 データベース)の t1 テーブルにだけデータ(77)が追加されていることを確認できます。

このように、Elastic Scale Client ライブラリを利用すれば、データベースの分割(複数のデータベースを1つのデータベースのように見せかけること)ができるようになります。

◆ データの SELECT ~Button3~

次に、「t1」テーブルのデータを参照(SELECT)するコードを記述してみましょう。

1.データの参照では、複数のシャードからデータを取得するために、MultiShardConnectionMultiShardCommandMultiShardDataReader というオブジェクトを利用しますが、基本的な利用方法は、ADO.NET の SqlConnection、SqlCommand、SqlDataReader と同じです。まずは、MultiShard~ を利用するために、次のように名前空間を宣言します。

using Microsoft.Azure.SqlDatabase.ElasticScale.Query;

2.次に、Windows フォーム上の Button3 をダブルクリックして、Click イベント ハンドラーを作成し、次のようにコードを記述します。

   // ShardMapManager 取得
   ShardMapManager smm = ShardMapManagerFactory.GetSqlShardMapManager(
                                cnstr,
                                ShardMapManagerLoadPolicy.Lazy);
   // RangeShardMap 取得
    RangeShardMap<long> sm = smm.GetRangeShardMap<long>(mapName);
    // MultiShardConnection 利用GetShards シャード一覧取得
    string cred = "User ID=管理者アカウント名;Password=パスワード;Encrypt=true;";
    using (MultiShardConnection conn = new MultiShardConnection(
                                            sm.GetShards(),
                                            cred))
    {
       // MultiShardCommand  SELECT 実行
       using (MultiShardCommand cmd = conn.CreateCommand())
        {
        cmd.CommandText = "SELECT FROM t1";
        cmd.CommandType = CommandType.Text;
        cmd.ExecutionOptions = MultiShardExecutionOptions.IncludeShardNameColumn;
        cmd.ExecutionPolicy = MultiShardExecutionPolicy.PartialResults;
            // MultiShardDataReader 結果 Read する
            using (MultiShardDataReader sdr = cmd.ExecuteReader())
            {
                while (sdr.Read())
                {
                    var data_colA = sdr.GetFieldValueint>(0);
                    var data_colB = sdr.GetString(1);
                    Console.WriteLine(data_colA);
                    Console.WriteLine(data_colB);
                }
            }
        }
    }

MultiShardConnection では、GetShards メソッドを利用することで、シャードの一覧を取得することができます。MultiShardCommand で実行したい SELECT ステートメントを定義して、MultiShardDataReader で実行結果を Read するという形になります。

3.コードの記述が完了したら、ツールバーの[開始]ボタンをクリックしてデバッグを開始し、[Button3]をクリックします。

00429

実行が完了すると、次のように[出力]ウィンドウに t1 テーブルのデータが表示されているこを確認できます。

00430

◆ データベースの削除(Elastic Scale の削除)

確認が完了したら、最後にデータベースを削除しておきます(データベースが残っていると課金対象になるので、削除しておくようにしてください)。データベースを削除すれば、Elastic Scale の設定(ShardManager の情報など)も完全に削除されることになります。

1.データベースの削除は、Azure SQL Database の master データベースに接続して、DROP DATABASE ステートメントを実行します。

DROP DATABASE estest
DROP DATABASE estest_1
DROP DATABASE estest_2

00431

以上のように、Elastic Scale Client ライブラリを利用すれば、複数のデータベースを1つのデータベースのように見せかけることができるようになります。データベースのシャーディングを実現できます。

Elastic Scale では、Split(シャードの分割)や Merge(2つのシャードの統合)などもあるので、冒頭のドキュメント マップを参考に、ぜひ試してみてください。

目次へ | 前のページへ | 次のページへ

事例1

SQLQualityは執筆とセミナーを通じて技術の啓蒙やエンジニアの育成支援も行っています
最新刊
SQL Server 2016 の教科書
SQL Server 2016 の教科書(ソシム)

弊社オリジナル制作の
SQL Server 2016 自習書も
マイクロソフトのサイトで公開中!
ダウンロードはこちら
セミナー風景
セミナー風景

ロングセラー
ASP.NET でいってみよう  SQL Server 2000 でいってみよう
ASP.NET でいってみよう
第7刷 16,500 部発行
SQL Server 2000 でいってみよう
第12刷 28,500 部発行
SQL Server 2014 CTP2 インメモリ OLTP 機能の概要
SQL Server 2014 CTP2 インメモリ OLTP 機能の概要(Amazon Kindle 書籍)

弊社執筆の
SQL Server 2014 自習書
マイクロソフトのサイトで公開中
目次はこちら

弊社執筆の
SQL Server 2012 自習書
マイクロソフトのサイトで公開中
ダウンロードはこちら
松本美穂のコラム
(公開活動などのお知らせ)

第60回:SQL Server 2017 自習書 No.3「SQL Server 2017 Machine Learning Services」のご案内
第59回:SQL Server 2017 自習書 No.2「SQL Server 2017 on Linux」のご案内
第58回:SQL Server 2017 自習書 No.1「SQL Server 2017 新機能の概要」のご案内
第57回:SQL Server 2017 RC 版とこれまでのドキュメントのまとめ
第56回:「SQL Server 2016 への移行とアップグレードの実践」完成&公開!
第55回:書籍「SQL Server 2016の教科書 開発編」(ソシム)が発刊されました
第54回:「SQL Server 2016 プレビュー版 Reporting Services の新機能」自習書のお知らせ
第 53 回:SQL Server 2016 Reporting Services の新しくなったレポート マネージャーとモバイル レポート機能
第 52 回:SQL Server 2016 の自習書を作成しました!
第 51 回:PASS Summit と MVP Summit で進化を確信!
第 50 回:新しくなった Power BI(2.0)の自習書を作成しました!
第49 回:Excel 2016 の Power Query を使う
第 48 回:新しくなった Microsoft Power BI ! 無料版がある!!
第 47 回:「Microsoft Azure SQL Database 入門」 完成&公開!
第 46 回:Microsoft Power BI for Windows app からの Power BI サイト アクセス
第 45 回:Power Query で取得したデータを PowerPivot へ読み込む方法と PowerPivot for Excel 自習書のご紹介
第44回:「SQL Server 2014 への移行とアップグレードの実践」ドキュメントを作成しました
第43回:SQL Server 2014 インメモリ OLTP 機能の上級者向けドキュメントを作成しました
第42回:Power Query プレビュー版 と Power BI for Office 365 へのクエリ保存(共有クエリ)
第41回:「SQL Server 2014 CTP2 インメモリ OLTP 機能の概要」自習書のお知らせです
第40回: SQL Server 2012 自習書(HTML版)を掲載しました
第39回: Power BI for Office 365 プレビュー版は試されましたか?
第38回: SQL Server 2014 CTP2 の公開
第37回: SQL Server 2014 CTP1 の自習書をご覧ください
第36回: SQL Server 2014 CTP1 のクラスター化列ストア インデックスを試す
第35回: SQL Server 2014 CTP1 のインメモリ OLTP の基本操作を試す
第34回: GeoFlow for Excel 2013 のプレビュー版を試す
第33回: iPad と iPhone からの SQL Server 2012 Reporting Servicesのレポート閲覧
第32回: PASS Summit 2012 参加レポート
第31回: SQL Server 2012 Reporting Services 自習書のお知らせ
第30回: SQL Server 2012(RTM 版)の新機能 自習書をご覧ください
第29回: 書籍「SQL Server 2012の教科書 開発編」のお知らせ
第26回: SQL Server 2012 の Power View 機能のご紹介
第25回: SQL Server 2012 の Data Quality Services
第24回: SQL Server 2012 自習書のご案内と初セミナー報告
第23回: Denali CTP1 が公開されました
第22回 チューニングに王道あらず
第21回 Microsoft TechEd 2010 終了しました
第20回 Microsoft TechEd Japan 2010 今年も登壇します
第19回 SQL Server 2008 R2 RTM の 日本語版が公開されました
第18回 「SQL Azure 入門」自習書のご案内
第17回 SQL Server 2008 自習書の追加ドキュメントのお知らせ
第16回 SQL Server 2008 R2 自習書とプレビュー セミナーのお知らせ
第15回 SQL Server 2008 R2 Reporting Services と新刊のお知らせ
第14回 TechEd 2009 のご報告と SQL Server 2008 R2 について
第13回 SQL Server 2008 R2 の CTP 版が公開されました
第12回 MVP Summit 2009 in Seattle へ参加

技術コミュニティでも活動中