SQL Azure Team Blog

SQL Azureの水平パーティショニングと垂直パーティショニングによるスケールアウトについて、Dinakar Nethiが執筆したホワイトペーパーです。
このホワイトペーパーでは、 スケールアウトの概要と、オンプレミスへのスケールアウトの試みと、SQL Azureでのスケールアウトの利点について学ぶことができます。

 

Download details: Scaling out with SQL Azure

SQL Azure Team Blog

Creating a SQL Azure Database with SQLCMD – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

一度、SQL Azure Portalでサーバを配置すれば、sqlcmd.exeを使用してデスクトップのコマンドラインからデータベースを作成したり、削除することができます。スクラッチでデータベースを作成し、スキーマをアップロードし、きれいな環境でテストしたり、それらを繰り返しテストするときに便利です。

注意すべき事は、データベースを作成したり削除したりするときはマスターデータベースに接続する必要があることです。また、 -Nパラメータを使用して接続を暗号かあすることも重要です。暗号化に関する詳細情報は、こちらを参照してください。

 

データベースの作成

 

最初に、データベースを作成するためのTransact-SQLコマンドを含む.sqlファイルを作成します。例えば、次のようなクエリになります。

CREATE DATABASE Test

これは、デフォルトサイズの1ギアバイトのデータベースが作成されます。コマンドをCreateDatabase.sqlというファイル名に保存したとします。コマンドラインからコマンド(ファイル)を実行するコマンドは次の用になります。

sqlcmd -SyourSeverdatabase.windows.net -UyouLogin@yourServer -PyourPassword -dmaster -i –N CreateDatabase.sql

ユーザ名は、「ログイン@サーバ名」の形式にする必要があります。ログインは、SQL Azureサーバ上の管理者ログインを使用し、マスターデータベースに対して発行します。

 

データベースを削除する

 

データベースの削除も同様の方法で行います。スクリプトは次の用になります。

DROP DATABASE Test

コマンドをDropDatabase.sqlというファイル名に保存したとします。コマンドラインからコマンド(ファイル)を実行するコマンドは次の用になります。

sqlcmd -SyourSeverdatabase.windows.net -UyouLogin@yourServer -PyourPassword -dmaster -i –N DropDatabase.sql

 

検証

 

SQL Azureの最小課金単位は、一日です。1ギガバイトのデータベースで一ヶ月に$9.99(日本の場合は、979円ぐらい。詳細は、ここで。) 一日あたり33セント(日本の場合は、33円ぐらい)です。データベースを作成し、すぐに削除すれば33セントかかります。詳細は、Windows Azure Pricing | Windows Azure Services | Windows Azure Platformで確認できます。

SQL Azure Team Blog

Finding Your Clustered Indexes – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

SQL Server から SQL Azureにマイグレーションする前に全てのテーブルにクラスターインデックスを作成する必要があります。その理由については、このエントリーを参照してください。このエントリーでは、クラスターインデックスが無いテーブルを見つける方法を紹介します。

SQL Serverデータベースから更新しマイグレーションするテクニックの一つは、スクリプ生成ウィザードを使用して、SQL Azureに同じスキーマを転送することです。それに関しては、このエントリーで書きました。このテクニックを使用する場合は、SQL Serverで次のスクリプトを実行して、クラスターインデックスのないテーブルを探します。

SELECT DISTINCT [TABLE] = OBJECT_NAME(OBJECT_ID)
FROM SYS.INDEXES
WHERE INDEX_ID = 0 AND OBJECTPROPERTY(OBJECT_ID,'IsUserTable') = 1
ORDER BY [TABLE]

クラスターインデックスの無いテーブルリストを取得できます。クラスターインデックスを簡単に作成する方法は、非クラスタインデックスをクラスタインデックスに変更することです。SQL Server Management Studioで実行することができます。

1.オブジェクトエクスプローラーで、テーブルのツリーを開き、テーブルのインデックスを拡げます。

2. クラスターインデックスに変更したい、非クラスタインデックスを選択します。

3. 右クリックをし、「インデックスをスクリプト化」の「Drop toおよびCreate To」を選択します。

vs07

4. SQL Serverはインデックスを削除し、再作成するTransact-SQLを生成します。

5. CREATE INDEX文からNONCLUSTEREDを探し、CLUSTERDに変更します。

6. スクリプトを実行します。

 

次のクエリは、SQL Server Management Studioによって生成されたスクリプト例です。

/****** Object:  Index [PK_GroupFeature]  
  Script Date: 06/01/2010 17:00:47 ******/
IF  EXISTS (SELECT * FROM sys.indexes 
    WHERE object_id = OBJECT_ID(N'[dbo].[GroupFeature]') 
    AND name = N'PK_GroupFeature')
ALTER TABLE [dbo].[GroupFeature]
 DROP CONSTRAINT [PK_GroupFeature]
GO

USE [Kulshan]
GO

/****** Object:  Index [PK_GroupFeature] 
   Script Date: 06/01/2010 17:00:48 ******/
ALTER TABLE [dbo].[GroupFeature] ADD
  CONSTRAINT [PK_GroupFeature] 
  PRIMARY KEY CLUSTERED 
(
    [GroupFeature_Id] ASC
)WITH (PAD_INDEX  = OFF, 
    STATISTICS_NORECOMPUTE  = OFF,
    SORT_IN_TEMPDB = OFF,
    IGNORE_DUP_KEY = OFF, ONLINE = OFF, 
    ALLOW_ROW_LOCKS  = ON,
    ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

SQL Server から SQL Azureにマイグレーションしたいテーブル全てにクラスタインデックスを作成してしまえば、SQL Azureでの開発に一歩近づきます。

SQL Azure Team Blog

SQL Azure and Session Tracing ID – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

もし注意を払っていたら、SQL Azureに接続しているとSQL Server Management Studio 2008 R2に新しいプロパティ(セッショントレースID)が追加されていることに気がついたかもしれません。

セッショントレース識別子は、全てのSQL Azureの接続時に生成されるユニークなGUIDです。サーバサイド上で、SQL Azureチームは、セッショントレースIDによって全ての接続の記録と追跡をしています。つまり、もしセッション識別子とエラーが起こったことがわかれば、Azure Developerサポートは、エラーを探し、エラーの原因を追及することができます。

 

SQL Server Management Studio

 

SQL Server Management Studioで、接続プロパティウィンドウでセッショントレース識別子を取得することができます。

vs03

 

Transact-SQL

 

下のクエリを使用してTransact-SQLでセッショントレースID識別子を取得することができます。

SELECT CONVERT(NVARCHAR(36), CONTEXT_INFO())

 

C#

 

またはC#でも取得することができます。

using (SqlConnection conn = new SqlConnection(…))
{
    // Grab sessionId from new connection
    using (SqlCommand cmd = conn.CreateCommand())
    {
        conn.Open();
         cmd.CommandText = "SELECT CONVERT(NVARCHAR(36), CONTEXT_INFO())";
        sessionId = new Guid(cmd.ExecuteScalar().ToString());
    }
}

重要なことは、セッショントレースIDは、クライアントサイド上のADO.NETコネクションプールとサーバへの接続ごとに発行されます。コネクションプールがリサイクルされ、接続し直すまで、SqlConnectionのインスタンスは同じセッショントレースIDになります。

 

まとめ

 

もし、セッショントレースIDとサーバネーム、おおよその時間を用意し、Azure Developer サポートに電話すると、デバッグプロセスを早めることができ、貴重な時間を守ることができます。

SQL Azure Team Blog

SQL Azure Date and Time Functions – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

Transact-SQLには、SQL Serverのインスタンスが動作するコンピューターのOSに依存する値を返す多数の日付、時刻関数があります。MCS UK Solution Development Teamブログに、SQL Azureでそれらの使用方法が説明されています。
その記事は、「ここ」から読めます。

======

SQL AzureとOSに依存する時間関数

SQL Azure Date and Time Functions derived from the Operating System – MCS UK Solution Development Team – Site Home – MSDN Blogsを翻訳しています。

SQL Azureの時間関数は、全て基本的にUTCで動作し、サーバがホストデータセンターに関係無く同じ結果を返します。以下のクエリを、2010年5月19日12:06:06(UTC)、北ヨーロッパに干すとされているSQL Azureのインスタンスに対して実行したところ、以下のテーブルのような結果になりました。

クエリ

SELECT
SYSDATETIME() as SYSDATETIME,
SYSDATETIMEOFFSET() as SYSDATETIMEOFFSET,
SYSUTCDATETIME() as SYSUTCDATETIME,
CURRENT_TIMESTAMP as currenttimestamp,
GETDATE() as getdate,
GETUTCDATE() as getUTCdate;

 

実行結果

SYSDATETIME()

2010-05-19 12:06:04.2422123

SYSDATETIMEOFFSET()

2010-05-19 12:06:04.2422123 +00:00

SYSUTCDATETIME()

2010-05-19 12:06:04.2422123

CURRENT_TIMESTAMP

2010-05-19 12:06:04.250

GETDATE()

2010-05-19 12:06:04.250

GETUTCDATE()

2010-05-19 12:06:04.240

米国中北部、米国中西部、東南アジアにホストされているSQL Azureデータベースから同じ結果を返します。