SQL Azure Team Blog

Generating Scripts for SQL Azure – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

SQL ServerからSQL Azureへ移行する時、最初のステップは、SQL ServerのスキーマからSQL Azureへ移行するためのスクリプトを生成することです。SQL Server Management Studio 2008 R2に、新たに追加されたSQL Azureをターゲットに設定する拡張設定を使用することで、簡単に生成できます。
ステップバイステップで設定方法を説明します。

1) SQL Server Management Studio 2008 R2を開きます。

2) 転送したいデータベースを含むSQL Serverに接続します。

3) データベース上で右クリックし、[タスク]→[スクリプトの生成]を選択します。

1

 

4) スクリプトの生成とパブリッシュ ダイアログを開きます。 次へボタンをクリックし、説明ウィザードを飛ばします。

5) オブジェクトの選択ページが開きます。

 

2

 

6) データベース全体とすべてのデータベースオブジェクトのスクリプトを作成を選択し、「次へ」ボタンを選択します。

7) スクリプト作成オプションの設定ウィザードページが開きます。

 

3

8) 新しいクエリウィンドウに保存を選択し、詳細設定ボタンをクリックします。スクリプト作成の詳細オプションダイアログが開きます。

 

4

 

9) データベースエンジンの種類に対応したスクリプトオプションが表示されるまでスクロールを下げます。そのオプションのドロップダウンリストからSQL Azure データベースを選択します。「OK」ボタンを押します。

10) 次へボタンをクリックします。

11) 次へボタンをクリックし、概要ページを飛ばします。

12) スクリプトの保存またはパブリッシュダイアログで、データベースがクエリ化され、完了をクリックできるようになり、クリックするとクエリウィンドウにSQL Azureで使用できるクエリが表示されます。

13) This new query window in SQL Server Management Studio will automatically be connected the source SQL Server.

14) クエリウィンドウで右クリックし、メニューから[接続]→[接続の変更]を選択します。

 

5

15) 接続するSQL Azure サーバを設定します。オプションボタンを使用して、データベースを選択することができます。

 

6

 

16) SQL Server Management Studio で生成したスクリプトを実行し、SQL Azureにスキーマを作成します。

In order to use SSIS or BCP to transfer your SQL Server data to SQL Azure you need to have the schema is place on SQL Azure including your clustered indexes. クラスターインデックスを含んだSQL Azure上のスキーマに、SQL ServerからSQL Azureにデータを転送するのに、SSISまたはBCPを使用します。他のデータのアップロードを行うオプションとしては、スクリプトの保存またはパブリッシュダイアログで設定を変更しデータの生成を行う方法もあります。INSERT文が、スクリプトに追加されます。スクリプトのサイズが膨大になりますので、小さなデータベース限定の方法となりますが。

SQL Azure Team Blog

SQL Azureのテーブルにデータを追加するには、クラスター化インデックスが必要です。クラスター化インデックスが無いテーブルにデータを追加しようとすると、エラーが発生しデータを追加することができません。SQL Serverには、そのような制限はありません。

なぜ、SQL Azureには、そのような制限があるのでしょうか。

SQL Azure Team Blog

SELECT * AND SQL Azure – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

全ての良いDBAと開発者は、特別必要が無ければ全てのレスを返すクエリを発行すべきで無いことを知っています。

SELECT * FROM [Table]

SELECT文では、必要な列のみを返すようにします。SELECT *を使用すると余計なページングの原因となります。RFIDルックアップ、不必要なテーブルロック、カバードインデックスの作成意図の無効化等が発生します。結果としてパフォーマンスに悪影響が出ます。

さらに、SQL Azureには SELECT *を使用すべきでない理由があります。データ転送料に応じた課金を行うからです。もし、(Windows Azureアプリケーションではない)データセンターの外から使用する場合、クエリによって発生するデータ転送量に応じて料金を支払います。もし使用しない列も要求すると、使用していないデータの転送量にまで支払うことになります。

SELECT *クエリを削除することをあなたのTO-DOリストにあるのなら、SQL Azureですばらしい体験ができるでしょう。

 

(コメント欄より抜粋)

Entity FrameworkのようなORMでも、SELECT *は生成させるべきで無い。しかし、「Oraders.Where」や「.OrderBy」などを使用しても、特別にSELECT句「.select」を指定しない場合、SELECT *が生成されてしまいます。

SQL Azure Team Blog

この投稿は、SELECT INTO With SQL Azureを意訳したものです。随時、意味がとりやすいよう手を加えていますので、オリジナルと文意が変わっている箇所があるかもしれません。

SQL Azureでは、(データを入れる際に)すべてのテーブルにクラスター化インデックスが必要なので、SELECT INTO文でのテーブル作成、クラスター化インデックスの作成をサポートしていません。
SQL Azureへの移行を計画する場合、SELECT INTO文の代わりにテーブルを作成するコードを準備する必要があります。クラスター化インデックスが必要の無い一時テーブルを使用するか、通常のテーブルを使用するかで対応します。

実験するために、簡単に移行元のサンプルデータを用意します。

CREATE TABLE Source (Id int NOT NULL IDENTITY, [Name] nvarchar(max), [Color] nvarchar(10),  
CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED 
(
      [Id] ASC
))
      
INSERT INTO Source([Name], [Color]) VALUES ('Shirt','Red')
INSERT INTO Source([Name], [Color]) VALUES ('Pants','Red')
INSERT INTO Source([Name], [Color]) VALUES ('Tie','Pink')

試しにSELECT INTOを使用してみます。

クラスター化インデックスを必要としない一時テーブルにSELECT INTOを使用します。

SELECT *
INTO #Destination
FROM Source
WHERE [Color] LIKE 'Red'
-- Do Something

--DROP TABLE #Destination

このSQLをSQL Azureに使用すると、クラスター化インデックスを必要としない一時テーブルでも失敗し、エラーが表示されます。

メッセージ 40510, レベル 15, 状態 2, 行 1

Statement ‘SELECT INTO’ is not supported in this version of SQL Server.

次に、あらかじめクラスター化インデックスが無い一時テーブルを作成した状態で、SELECT INTO文を使用してみます。

CREATE TABLE #Destination (Id int NOT NULL, [Name] nvarchar(max), [Color] nvarchar(10))

INSERT INTO #Destination(Id, [Name], [Color])
SELECT Id, [Name], [Color]
FROM Source
WHERE [Color] LIKE 'Red';

-- Do Something

DROP TABLE #Destination

結果は、2行正しく処理されます。

まとめ

SELECT INTO文を使用する場合は、下のどちらかを選択しなければなりません。

  • 予め移行先のテーブルを準備し、クラスター化インデックスを作成しておく
  • 予め移行先のテーブルとして、(クラスター化インデックスが必要のない)一時テーブルを作成しておく

SQL Azure Team Blog

情報源:Clustered Indexes and SQL Azure – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。

SQL Azureの基本に集中した新しいシリーズ連載を始め、SQL Azureを使用したアプリケーションを開発したり、マイグレーションする為の詳細な情報を提供します。

SQL Serverとは違って、SQL Azureは全てのテーブルにクラスターインデックスが必要です。クラスターインデックスは通常、プライマリキーに指定した列に作成されます。クラスタインデックスは、キーの値に応じて行を並べ替え格納します。一つの条件に従って行を並べ替えなければならないので、クラスターインデックスは、一つのテーブルに一つしか作成できません。

クラスターインデックスを持つシンプルなテーブルの例

CREATE TABLE Source (Id int NOT NULL IDENTITY, [Name] nvarchar(max), 
CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED 
(
      [Id] ASC
))

SQL Azureに、クラスターインデックスの無いテーブルを作成することができますが、そのテーブルにデータを追加しようとすると次のエラーが発生します。

Msg 40054, Level 16, State 1, Line 2

Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.

SQL Azureはヒープテーブルを許可していません。ヒープテーブルの定義は、クラスタインデックスの無いテーブルのことです。SQL Serverのインデックスに関する追加情報は、MSDN上のドキュメントを確認してください。

 

一時テーブル

 

データベース上の全ての通常のテーブルは、このルールに従いますが、一時テーブルの場合はルールに当てはまりません。SQL Serverで一時テーブルを作成したのと同様に、SQL Azureにも一時テーブルを作成できます。

CREATE TABLE #Destination (Id int NOT NULL, [Name] nvarchar(max))
-- Do Something
DROP TABLE #Destination