SQL Azure Team Blog

Loading Data to SQL Azure the Fast Way – SQL Azure Team Blogを簡単に翻訳したエントリーです。

Lubor KollarとGeorge VargheseはSQL Azureへデータを転送する時に、いくつかのツールを使用したときのパフォーマンス情報を公開している。
Loading data to SQL Azure the fast way – SQLCAT Blogsを読んでみると良い。

=====

以下、ブログの一部分を抜粋して紹介する。詳細を知りたい場合は、元記事を参照してほしい。

データを転送するツールとして、SQL Server BCP Utility, SQL Server Integration Services (SSIS), Import and Export DataSQL Server Management Studio (SSMS)が提供されている。この投稿では、どのツールを使用すると速いのかを調べた結果を紹介する。

下のグラフは、一つのクラスター化インデックスを持つSQL Azureテーブルに1GBのデータを転送したときにかかった時間を表している。

使用したツールと転送データのある場所でグルーピングしている。それぞれのグラフは、シングルストリームとマルチストリームを比較している。

この結果から、Windows AzureからSQL Azureへデータを転送したときが最も速いことがわかった。multiple streamを使用したとき明らかにどのツールでもパフォーマンスが改善することが分かった。multiple streamは、Windows Azure内外関係なく効果がある。

BCPはバッチサイズ(1トランザクションでコミットする行数)とパケットサイズ(インターネット越しに1パケット辺りで送信するバイト数)を設定することができる。データの特徴とネットワークの状況に応じたパラメータ設定が必要で、パフォーマンスはパラメータ設定に大きく影響を受ける。

MSコーポレートFirewall配下のNWでは・・・・

Tool

Observation

BCP

ベストパフォーマンス;5ストリーム、バッチサイズ10,000、パケットサイズ4K、

SSIS

ベストパフォーマンス;7ストリームUse bulk upload when possible チェックボックスを選択し、ADO .NET destination SQL Azure componentをし余殃する。

 

まとめ

 

SQL Azureにデータを転送するとき、複数ストリームを使用して並列転送を行うのが良い。

BCPは、それぞれの環境に合わせて適切なパラメータ設定をする。

SQL Azureにデータ転送をした後、非クラスター化インデックスを追加する。

データ転送前にインデックスを追加すると最終的なデータベースサイズが50%増加し、同じデータを転送するのにかかる時間が170%増加した。

もし大きなインデックスを作成するとき、エラーメッセージが発生したら、オンラインオプションを使用して再度実行してください。

SQL Azure Team Blog

Consuming SQL Azure Data with the OData SDK for PHP – SQL Azure Team Blogを簡単に翻訳したエントリーです。

Brain SwanはOData SDK for PHPを使用してSQL Azure OData ServiceからSQL Azureのデータを取得する方法についてブログに投稿している。
Consuming SQL Azure Data with the OData SDK for PHPを読んでみると良い。

========

以下、そのブログを抜粋して簡単に翻訳しています。
元記事では、SQL Azureサーバーの準備と、ローカルのNorth WindowデータベースをSQL Azure Migration Wizardを使用してSQL Azureにデータベースを移行する手順が説明されています。以下の抜粋は、SQL Azure上にデータベースの用意をしたところからの説明になります。

SQL Azure OData Serviceを作成する

 

  1. Welcome to SQL Azure Labsにアクセスし、SQL Azure ODataServiceを選択する。
  2. サーバー名、ユーザー名、パスワードを入力し、Connectボタンをクリックする。
  3. 接続後、ドロップダウンリストからOdata Serviceに使用したいデータベースを選択します。Enable ODataチェックボックスにチェックを入れます。
  4. Anonymous Access Userドロップダウンリストからdboを選択することで、匿名アクセスが可能になります。

OData Serviceのエンドポイントを用意できました。URLをブラウザーにコピー&ペーストすることで、いじることができます。

 

PHPでOData Serviceにアクセスする

 

OData Serviceのセットアップが完了したら、Retrieving Data with the OData SDK for PHP – Brian Swanの投稿で説明した方法でPHPからOData Serviceにアクセスできる。

Windows Azure

Now Available: Azure Security Notes PDF – J.D. Meier’s Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

Azure Security Notes (PDF)は、クラウドセキュリティやAzure セキュリティから学び、メモしたコレクションです。これはガイドではなく、またMicrosoftのパタン&プラクティスでもありません。patterns & practices Windows Azure Security Guidance projectの調査段階で学んだことを共有するためにまとめたものです。

 

ダウンロード

Download Azure Security Notes (PDF)

 

目次

  • Ch 1 – クラウドセキュリティへのアプローチ
  • Ch 2 – クラウドセキュリティの脅威と対策
  • Ch 3 – クラウドセキュリティを改善するためのガイドラインのデザイン
  • Ch 4 – Webアプリケーソンセキュリティ アーキテクチャの選択
  • Ch 5 – Webアプリケーションセキュリティ シナリオ
  • Ch 6 – Webサービスセキュリティのアーキテクチャを選択する
  • Ch 7 – Webサービスセキュリティ シナリオ
  • Ch 8 – データセキュリティアーキテクチャの選択
  • Ch 9 – データセキュリティ シナリオ

参考

  • クラウドアプリケーション用のセキュリティチェックリスト
  • WEBアプリケーションの驚異
  • Webサービスの驚異
  • カンペ – Webアプリケーションのセキュリティ驚異と対策
  • カンペ – Web サービス (SOAP) セキュリティ驚異と対策
  • カンペ – Web サービス (REST) セキュリティ驚異と対策
  • カンペ – データセキュリティと対策
  • ハウツー – Azureテーブルストレージでのフォーム認証の使用
  • ハウツー – SQL Azureでのフォーム認証の使用
  • ハウツー – Windows Azure上のシングルサインオン認証をSSLで有効にする

SQL Azure Team Blog

I Miss You SQL Server Agent: Part 2 – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

今のところ、SQL AzureはSQL Server Agentの概念を持っていません。このシリーズでは、Windows Azureワーカーロールを使用して、簡単に代用できるものを作成したいと思います。このシリーズの最初の投稿で、Visual Studioとコードで、Windows AzureワーカーロールでSQL Server Agentと同等のものを作成する方法を紹介しました。
このエントリーでは、一日に一回ジョブを実行するメカニズムを作成します。

 

データベースの作成

Windows Azureは、ワーカーロールは、そのうちデータセンターで異なるサーバに移動する可能性のあるステートレスなプラットフォームです。このため、ジョブが完了するまでジョブの状態を記録し続ける必要があります。その為に迷うことなくSQL Azureを選択します。SQL Azureサーバ下に、SQLServerAgentと呼ばれるデータベースを作成します(データベース名msdbは予め予約されています)。このデータベースに、オンプレミスのSQL Server Agentテーブルsysjobactivityの簡単バージョンであるjobactivityと呼ばれるテーブルを作成します。
私が使用したスクリプトは以下のものです。

CREATE TABLE [dbo].[jobactivity](
    [job_id] uniqueidentifier NOT NULL PRIMARY KEY,
    [job_name] nvarchar(100) NOT NULL,
    [start_execution_date] datetime NOT NULL,
    [stop_execution_date] datetime NULL,
) 

job_idはオブジェクトの日次インスタンスを表し、job_nameはジョブ実行の為の任意のキーです。異なる名前を使用することで多くのジョブを走らせる為に、このテーブルを使用します。

 

ジョブの開始と停止の追跡

 

ジョブ開始時にテーブルにデータを追加する為のストアドプロシージャと、ジョブ停止時に実行ストップを更新する為のストアドプロシージャの2つが必要です。Startjobストアドプロシージャは、ワーカーロールがジョブを開始する為のシグナルを行に登録する前に、ジョブが始まらないことを保証します。

CREATE PROCEDURE StartJob (
    @job_name varchar(100),
    @job_id uniqueidentifier OUTPUT)
AS

BEGIN TRANSACTION

SELECT    @job_id
FROM    [jobactivity]
WHERE    DATEDIFF(d, [start_execution_date], GetDate()) = 0 
    AND [job_name] = @job_name

IF (@@ROWCOUNT=0)
BEGIN
    -- Has Not Been Started
    SET @job_id = NewId()
    INSERT INTO [jobactivity] 
        ([job_id],[job_name],[start_execution_date])
        VALUES (@job_id, @job_name, GetDate())
END
ELSE
BEGIN 
    SET @job_id = NULL
END

COMMIT TRAN

もう一つのストアドプロシージャStopJobは、次のようになります。

CREATE PROCEDURE [dbo].[StopJob](
    @job_id uniqueidentifier)
    
AS

UPDATE [jobactivity]
SET [stop_execution_date] = GetDate()
WHERE job_id = @job_id

ストアドプロシージャを呼び出すワーカーロールを書きます。

protected Guid? StartJob(String jobName)
{
    using (SqlConnection sqlConnection = new SqlConnection(
        ConfigurationManager.ConnectionStrings["SQLServerAgent"].
            ConnectionString))
    {
        try
        {
            // Open the connection
            sqlConnection.Open();

            SqlCommand sqlCommand = new SqlCommand(
                "StartJob", sqlConnection);

            sqlCommand.CommandType =
                System.Data.CommandType.StoredProcedure;

            sqlCommand.Parameters.AddWithValue("@job_name", jobName);

            // WWB: Sql Job Id Output Parameter
            SqlParameter jobIdSqlParameter = new 
                SqlParameter("@job_id", SqlDbType.UniqueIdentifier);
            jobIdSqlParameter.Direction = ParameterDirection.Output;
            sqlCommand.Parameters.Add(jobIdSqlParameter);

            sqlCommand.ExecuteNonQuery();

            if (jobIdSqlParameter.Value == DBNull.Value)
                return (null);
            else
                return ((Guid)jobIdSqlParameter.Value);
        }
        catch (SqlException)
        {
            // WWB: SQL Exceptions Means It Is Not Started
            return (null);
        }
    }
}

protected void StopJob(Guid jobId)
{
    using (SqlConnection sqlConnection = new SqlConnection(
        ConfigurationManager.ConnectionStrings["SQLServerAgent"].
            ConnectionString))
    {
        // Open the connection
        sqlConnection.Open();

        SqlCommand sqlCommand = new SqlCommand(
            "StopJob", sqlConnection);

        sqlCommand.CommandType =
            System.Data.CommandType.StoredProcedure;

        sqlCommand.Parameters.AddWithValue("@job_id", jobId);

        sqlCommand.ExecuteNonQuery();
    }
}

1日1回、午後1時にspTestJobストアドプロシージャを実行するために、ワーカーロールのRunメソッドを実行します。

public override void Run()
{
    Trace.WriteLine("WorkerRole1 entry point called", "Information");

    while (true)
    {
        DateTime nextExecutionTime = new DateTime(
            DateTime. UtcNow.Year, 
            DateTime. UtcNow.Month, DateTime. UtcNow.Day,
            13, 0, 0);
        if (DateTime. UtcNow > nextExecutionTime)
        {
            // WWB: After 1:00 pm, Try to Get a Job Id.
            Guid? jobId = StartJob("TestJob");
            if (jobId.HasValue)
            {
                Trace.WriteLine("Working", "Information");

                // WWB: This Method Has the Code That Execute
                // A Stored Procedure, The Actual Job
                ExecuteTestJob();

                StopJob(jobId.Value);
            }

            // WWB: Sleep For An Hour
            // This Reduces The Calls To StartJob
            Thread.Sleep(3600000);
        }
        else
        {
            // WWB: Check Every Minute
            Thread.Sleep(60000);
        }
    }
}

上のコードにエラーハンドリングのコードがないことに気づいたでしょうか。エラーが発生したらどうなるでしょうか。SQL Azureがエラーを返したらどうなるでしょうか。データセンターで異なるサーバでワーカーロールがリサイクルしたらどうなるでしょうか。それらの問題への対処については、このシリーズの3回目でコードを追加して対処したいと思います。

SQL Azure Team Blog

I Miss You SQL Server Agent: Part 1 – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

今のところ、SQL Azureはクラウド上でのSQL Server Agentの動作をサポートしていません。SQL Azureで、SQL Server Agentの機能が必要な場合は、Windows Azureワーカーロールとカスタムコードで代用できます。このシリーズで、代用する方法を紹介します。

 

SQL Server Agent

SQL Server Agentは、ジョブと呼ばれる管理タスクをスケジュール実行するためのMicrosoft Windows サービスです。SQL Server Agentは、SQL Serverに格納されたジョブ情報を使用します。ジョブは、一つ以上のジョブステップを含んでいます。各ステップは、データベースバックアップのようにSQL Server自信のタスクも含んでいます。SQL Server Agentは、ジョブをスケジュール実行、特定のイベント結果を受けての実行、呼び出されての実行に対応しています。例えば、平日業務後、全ての会社のサーバをバックアップしたい場合、SQL Server Agentを使用すれば自動実行させることができます。月曜から金曜までの22時以降起動するバックアップをスケジュールします。もしバックアップ実行に問題が発生した場合、SQL Server Agentはイベントを記録し、あなたに通知します。SQL Server AgentはオンプレミスのEnterprise、Datacenter、StandardエディションのSQL Serverにインストールされますが、ExpressとCompactエディションには提供されていません。

 

ワーカーロール

ワーカーロールはクラウド上の基本的なWindowsサービスです。ワーカーロールを開始させたとき、エンドレスループをするようにデザインされています。

  • シングルプロセスイベントを確認する
  • 動作を実行する
  • 次に確認する必要ができるまでスリープする様々な目的で使用できるように、ワーカーロールは意図的に抽象的になっています。

注意事項:ワーカーロールは意図的に抽象化されており、SQL Server Agentは開発されており、一年程度で製品提供されると思うので、ワーカーロールで完璧にSQL Server Agentの機能を複製するつもりはありません。代わりに、Windows AzureワーカーロールからSQL Server Agentが行うような多くのタスクを実現できるように、いくつかのアイディアとシンプルなコードを提供しようと思っています。

 

初めに

初めに、Visual Studioでワーカーロールを含むクラウドプロジェクトを作成します。これに関して、基本的な事を知りたい場合は、ここを参照してください。

vs01

WorkerRole.vbと呼ばれるファイルにいくつかのサンプルコードが生成されます。

public override Sub Run()
    ' これは WorkerRole1 の実装例です。実際のロジックに置き換えてください。
    Trace.WriteLine("WorkerRole1 entry point called", "Information");

    While (True)
        Thread.Sleep(10000);
        Trace.WriteLine("Working", "Information");
    End While
End Sub

最初にすることは、SQL Azureデータベース上でストアドプロシージャを実行させるコードを書くことです。これは、SQL Server Agentジョブ内のステップでTransact-SQLを実行させるのと同等です。

vs02

次のようなコードになります。

    Protected Sub ExecuteTestJob()

        Using sqlConnection As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("AdventureWorksLTAZ2008R2").ConnectionString)

            Try

                '接続を開く

                sqlConnection.Open()



                Dim sqlCommand As SqlCommand = New SqlCommand("spTest", sqlConnection)

                sqlCommand.CommandType = System.Data.CommandType.StoredProcedure



                sqlCommand.ExecuteNonQuery()



            Catch ex As SqlException

                Trace.WriteLine("SqlException", "Error")

                Throw

            End Try

        End Using

    End Sub

基本的にはSQL Azure上で、SqlCommand.ExecuteNonQuery()メソッドを使用して、データを返さないストアドプロシージャを実行します。SQL Server Agentのように何も結果を返しません。

 

例外のハンドリング

 

上の例では、Windows AzureワーカーロールでSQL Server Agent版を作成するための最初のステップなので、例外のハンドリングがとても貧相になっています。

SQL Server Agentのロジックから、成功したら次のステップへ進み、失敗したらジョブを終了し、失敗を報告するものを使用する場合、ワーカーロールでtry/catchを使用してSQL Server Agentの動作をシミュレーションします。このシリーズの3回目でエラーハンドリングの問題について取り組みます。

 

まとめ


このシリーズの2回目では、一日の間で、特定の時間にストアドプロシージャを実行させる方法について紹介します。