SQL Azureの水平パーティショニングと垂直パーティショニングによるスケールアウトについて、Dinakar Nethiが執筆したホワイトペーパーです。
このホワイトペーパーでは、 スケールアウトの概要と、オンプレミスへのスケールアウトの試みと、SQL Azureでのスケールアウトの利点について学ぶことができます。
SQL Azure と Cosmos DB をメインにWindows Azureの情報を発信
SQL Azureの水平パーティショニングと垂直パーティショニングによるスケールアウトについて、Dinakar Nethiが執筆したホワイトペーパーです。
このホワイトペーパーでは、 スケールアウトの概要と、オンプレミスへのスケールアウトの試みと、SQL Azureでのスケールアウトの利点について学ぶことができます。
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で確認できます。
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」を選択します。
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 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で、接続プロパティウィンドウでセッショントレース識別子を取得することができます。
下のクエリを使用してTransact-SQLでセッショントレースID識別子を取得することができます。
SELECT CONVERT(NVARCHAR(36), CONTEXT_INFO())
または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 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の時間関数は、全て基本的に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データベースから同じ結果を返します。