PR

クラウドで利用できるRDBMSとしてのSQL Azure

2009年9月15日(火)
田中 主夫

SQL AzureのテーブルにはClustered Indexが必須

 ガイドに従った操作では気がつかずに進んでしまいますが、ここで注意しておかなければならないのはClustered Indexです。

 SQL AzureでClustered Indexが必要な理由として「クラスターインデックスによりディスク上のデータの並びが決まるので、クラスターの設定は不可欠であるが、プライマリーキーに以外に設定することも可能である」と説明されています。[※1][※2]

 これについて詳細を確認します。1つのClustered Indexが必須だと、ソート指定する列にもインデックスが必要になるのかと思いましたが、通常のRDBMS同様、インデックスがない列を指定したソートは可能でした。また10,000行の“全件”検索を実行しても、Windows Azure Tableのように1,000件でエラーとなることはありません。

 インデックスの使われ方についてはHoLTestTableにデータが1行しかないとき、Email Addressを指定した“条件”検索ではClustered Indexが使われ、10,000行のデータでは、追加で作成したインデックスが使われる様子などの実行計画をSQL Azureでも確認することができます。[※1]

PHPでSQL Azureを使う

 SQL Azureにテーブルとデータが用意できましたので、このデータにアクセスする簡単なプログラムをPHPで作成してみます。

 同じAzureであっても、Windows Azure StorageとSQL AzureではPHPで接続するために必要なファイルが異なります。Windows AzureではCodeplexのPHPAzureライブラリを利用しましたが、SQL Azureはこれとは異なりSQL Serverと同じものを利用します。

 従って、マイクロソフト社から提供されている資料もWindows Azure関連ではなく、PHP on Windows Training Kit(August 2009)[※3]が参考になります。

 具体的には、今回のドライバ設定はUTF-8に対応したSQL Server Driver for PHP 1.1 CTP[※4]からphp_sqlsrv_52_nts_vc6.dllを取り出し、php.iniのextension_dirに指定したフォルダにコピーし、php.ini にextension=php_sqlsrv_52_nts_vc6.dllを追記しました。

 プログラムファイルa01.phpはUTF-8で保存し、接続時に「”CharcterSet=>”UTF-8”」と指定してあります。

 動作内容は一部のデータを日本語で更新した後、10,000行のデータを全件検索します。

a01.php
---------------------------------------------------
<?php
function Connect()
{
$serverName = "tcp:「サーバー名」.ctp.database.windows.net";
$connectionInfo = array(
"Database"=>"HoLTestDB","UID"=>"HoLTestUser@「サーバー名」", "PWD"=>"Pass@word1","MultipleActiveResultSets"=>"0",
"CharacterSet" => "UTF-8");
$connection = sqlsrv_connect( $serverName, $connectionInfo);
if( $connection === false )
{  print_r(sqlsrv_errors() ) ;
die( sqlsrv_errors());
}
return $connection;
}
$conn = Connect();
$tsql = "update Customer set LastName=(?) where CustomerID=(?)";
$param = array("test2 テストupdate from php",2);
$stmt = sqlsrv_query( $conn, $tsql, $param);
$tsql = "SELECT CustomerID, EmailAddress FROM Customer ";
$stmt = sqlsrv_query( $conn, $tsql );
while( $row = sqlsrv_fetch_array($stmt))
{
echo "CsutomerID:".$row[0]. "EmailAddress:".$row[1]."\r\n";
}
?>
---------------------------------------------------

C:\PHPAzure-0.2.0[1]\library>c:\php_529\php.exe a01.phpを実行した後、SMSSでデータを確認することができます。

【注意】データベースの接続にはPHP5.2.9を使用しましたが、PHPのバージョンが古いと、「Call to undefined function sqlsrv_connect()」、またSQL Server 2008 Native Client が正しくインストールされていない場合に以下のエラーが発生します[※5]。
---------------------------------------------------
「The SQL Server Driver for PHP requires the SQL Server 2008 Native Client ODBC Driver (SP1 or later) to communicate with SQL Server. That ODBC Driver is not currently installed.」
---------------------------------------------------
 また、「”CharcterSet=>”UTF-8”」を指定しなかった場合、日本語の部分はSSMSでは“?”に文字化けします。

■SQL ServerからSQL Azureへのデータ移行

 PHPを用いてSQL Azureへアクセスし、日本語も利用できることが確認できました。この調子であればWordPressなどは既にSQL Azureで動いているのではないかと思い、検索したのですが、稼働報告はまだ発見できませんでした。

 それではと、インストールマニアックス2009においてインストールしたIIS7+PHP+SQL Serverの環境のWordPress[※6]をSQL Azureへ移行に挑戦してみることにしたのですが、作業開始後に判明した問題は「text型がSQL Azureでは利用できない」ということです。

 これはnvarchar(4000)などにして、取りあえずは対応できそうですが、これ以外にもテーブル作成の段階で次々と制限事項が見つかります。次はCreate Tableの際に発生したエラーの一部です。

---------------------------------------------------
Deprecated feature 'Data types: text ntext or image' is not supported in this version of SQL Server.
'Filegroup reference and partitioning scheme' is not supported in this version of SQL Server.
Option 'sort_in_tempdb' is not supported in this version of SQL Server.
'Multi-part names with Server or Database specifier' is not supported in this version of SQL Server.
---------------------------------------------------

 データ移行には、Windows Azure Platform Training Kit - August Updateにある「Hands-On Lab:Migrating Databases to SQL Azure」[※1]が参考になりました。ツールの利用方法が解説されているので、一部抜粋します。
---------------------------------------------------
 SQL Serverの管理ツール(SSMS)を起動して、データベースを選択した状態で右クリックし開いたメニューの中から「スクリプトの生成」を選ぶと「スクリプト作成ウィザード」が起動されます。画面の指示に従い、設定を進めることでテーブル作成およびデータ挿入用のSQL文が作成されます。
---------------------------------------------------

 ポイントは「スクリプトオプションの選択」の画面で[UDDTsを基本データ型に変換: True]、[拡張プロパティのスクリプトを作成: False]、[USE DATABASEのスクリプト作成: False]、[データのスクリプトを作成: True]とすることです(図2参照)。

 「スクリプト作成ウィザード」で作成されたSQLから手動で不要な部分を置換・削除して作業完了です。こうして作成したSQLにより、SQL ServerのWordPress用のデータをSQL Azureへ移行することができました。

【補足】今回のWordPressはテスト環境ですので、4,000バイト以上のテキストデータはありませんでしたが、実際に稼働しているシステムの移行の際にはデータの加工が必要になりますので、移行用のプログラムを作成した方が確実でしょう。

※1 Windows Azure Platform Training Kit - August Update(http://www.microsoft.com/DownLoads/details.aspx?familyid=413E88F8-5966-4A83-B309-53B7B77EDF78&displaylang=en)(アクセス:2009.09)

※2 Guidelines and Limitations(SQL Azure Database)(http://msdn.microsoft.com/en-us/library/ee336245.aspx)(アクセス:2009.09)

※3 PHP on Windows Training Kit(August 2009)(http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=c8498c9b-a85a-4afa-90c0-593d0e4850cb)(アクセス:2009.09)

※4 SQL Server Driver for PHP 1.1 Community Technology Preview - August 2009(http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=ccdf728b-1ea0-48a8-a84a-5052214caad9)(アクセス:2009.09)

※5 Microsoft SQL Server 2008 Native Client
http://www.microsoft.com/downloadS/details.aspx?familyid=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=ja)(アクセス:2009.09)

※6 Wordpress on SQL Server
http://x64.museum-in-cloud.com/index.php/2009/05/wordpress-on-sql-server/)(http://www.forestpointtechnologies.com/blog/wordpress-on-sql-server/)(アクセス:2009.09)

ERPの導入支援に携わりOracle, SQL Server, DB2などのRDBMSを扱う。クラウドの出現により、これで速度劣化のトラブルから開放されるかと思いきや、ストレージ面ではRDBMSの便利さにあらためて感心する面も。インストールマニアックス2008では苦労の甲斐(http://iis.museum-in-cloud.com)あって勝利。褒美のマイクロソフト本社訪問でWindows AzureのSQL機能を知る。

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています