Windows Azure TableをRDBMSと比較する

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

Windows Azure Table ストレージにデータを作成する

 Windows Azure Blobストレージと同じように、PHPライブラリ[※1]により Windows Azure Tableを扱うことができます。PHPでプログラムを作成することでEntitiesの定義とデータ登録を行うことができますので、簡単なサンプルを使い説明を進めることにします。

 t01.phpは、Windows Azure Tableにテーブル‘testtbl’を作成しています。テーブル作成時に指定するのはテーブル名だけです。なお、接続に必要な設定内容がconfig.phpとなります。

t01.php(Windowsのコマンドラインから実行することでTableストレージに‘testtbl’を作成)
--------------------------------------------------
require_once 'Microsoft/Azure/Storage/Table.php';
require_once 'config.php';
$storageClient = new Microsoft_Azure_Storage_Table($URL_DEV_TABLE,$DEVSTORE_ACCOUNT,$DEVSTORE_KEY );
$containers = $storageClient->createTable(‘testtbl’);
?>
---------------------------------------------------

config.php
---------------------------------------------------
$URL_DEV_BLOB = 'blob.core.windows.net' ;
$URL_DEV_TABLE = 'table.core.windows.net';
$DEVSTORE_ACCOUNT = 'アカウント名' ;
$DEVSTORE_KEY = 'アクセス キー';
?>
---------------------------------------------------

 次に、t02.phpで作成したTableにEntitiesを定義しデータを登録します。「class SampleEntitiy」により項目名とそのプロパティを定義しています。中段のコメント文のように見える部分が実際の定義部分です。項目はName(String)、Age(Int)、 Visible(Boolean)の3つを設定してあります。

t02.php
---------------------------------------------------
require_once 'Microsoft/Azure/Storage/Table.php';
require_once 'config.php';
$storageClient = new Microsoft_Azure_Storage_Table($URL_DEV_TABLE,$DEVSTORE_ACCOUNT,$DEVSTORE_KEY );
class SampleEntity extends Microsoft_Azure_Storage_TableEntity
{
/** * @azure Name */
public $Name;
/** * @azure Age Edm.Int64 */
public $Age;
/** * @azure Visible Edm.Boolean */
public $Visible = false;
}
$entity = new SampleEntity('partition1', 'row1');
$entity->Name = 'testName';
$entity->Age = 30;
$entity->Visible = true;
$tableName = 'testtbl' ;
//try {$storageClient->insertEntity($tableName, $entity);} catch (Exception $e) { }
$storageClient->insertEntity($tableName, $entity);
?>
---------------------------------------------------
「$entity->xxx =‘xxx’」の部分が実際のデータの値を指定している部分です。

 このプログラムの実行により、testtblテーブルのEntitiesに値が設定されたデータが1行挿入されます(図2-2参照)。なお、このブログラムはPartition KeyとRow Keyを'partition1', 'row1'と固定値にしてありますので、複数回実行すると一意制約違反のためエラーとなります。

※1「PHP SDK for Windows Azure」(http://phpazure.codeplex.com/)(http://phpazure.codeplex.com/Wiki/View.aspx?title=Table%20storage&referringTitle=Home)(アクセス:2009/09)

Windows Azure Tableストレージのデータを参照する

 図2-2は、t02.phpを実行した結果をAzure Storage Explorerで確認したものです(Azure Storage ExplorerでEntitiesの値を設定することはできませんが、参照は可能です)。

 Windows Azure Tableに作成した「テーブル名の一覧」や「テーブルに格納した数百行程度のデータ」を参照することはAzure Storage Explorerで可能です。またPHPライブラリでも簡単に行うことができます。しかし、検索結果が1,000行以上になるような場合、単純な対応ができなくなります。ここからはデータの作成と同様に、PHPのプログラムを動かしながら説明を進めていくことにします。

 t03.php テーブル名一覧とテーブルのデータの全件検索、条件検索を行うプログラムです。
---------------------------------------------------
require_once 'Microsoft/Azure/Storage/Table.php';
require_once 'config.php';
$storageClient = new Microsoft_Azure_Storage_Table($URL_DEV_TABLE,$DEVSTORE_ACCOUNT,$DEVSTORE_KEY );
$result = $storageClient->listTables();
foreach($result as $table)
{
echo 'Table name is: ' . $table->Name . "\r\n";
}
---------------------------------------------------

listTables()によりWindows Azure Tableに作成されたテーブル名の一覧を取得しています。
---------------------------------------------------
class SampleEntity extends Microsoft_Azure_Storage_TableEntity
{
/** * @azure Name */
public $Name;
/** * @azure Age Edm.Int64 */
public $Age;
/** * @azure Visible Edm.Boolean */
public $Visible = false;
/** * @azure RowKey Edm.RowKey */
public $RowKey;
/** * @azure PartitionKey Edm.PartitionKey */
public $PartitionKey;
}
---------------------------------------------------

 Windows Azure Tableストレージのプロパティ型は図2-1をご参照ください。キー項目となるPartitionKey、RowKeyの値を表示するために、SampleEntity内にこれらのキー項目の定義も記述します。
---------------------------------------------------
$tableName = 'testtbl' ;
echo "query1 \r\n";
$result = $storageClient->retrieveEntities($tableName, 'SampleEntity');
foreach($result as $row)
{
echo 'row is: '. $row->PartitionKey .'/'. $row->RowKey .' '
. $row->Name . ' '. $row->Age . ' '. $row->Visible ."\r\n";
}
---------------------------------------------------

 testtblテーブルのデータを全件取得し、PartitionKeyとRowKeyの値も表示します。このキー項目が判明していれば、これを指定した検索が可能となります。
(例)$result= $storageClient->retrieveEntityById($tableName, 'partition1', 'row1', 'SampleEntity');

 次は条件検索ですが、別のテーブル(IISLog2)を対象としています。
---------------------------------------------------
$tableName = 'IISLog2' ; // IISLog2のEntitiesの定義は config.php に記述
echo "query2 \r\n";
$result = $storageClient->retrieveEntities(
// $tableName,
$tableName,'s_sitename eq \'W3SVC12\' and cs_uri_stem eq \'/az2.php\'' ,
'IISLog_TestEntity2'
);
foreach($result as $row)
{
echo 'row is: '. $row->s_sitename .' '. $row->cs_uri_stem.' '."\r\n";
}
?>
---------------------------------------------------
検索条件としてEntitiesのcs_url_siteとcs_uri_stemの値を指定した検索を実行しています。

 これまで説明してきたt03.phpの実行結果は以下のようになります。
---------------------------------------------------
C:\PHPAzure-0.2.0[1]\library>c:\php\php.exe t03.php
Table name is: AzureMonitor
Table name is: IISLog2
Table name is: testtbl
query1
row is: partition1/row1 testName 30 true
query2
row is: W3SVC12 /az2.php 090727000622/_az2_php
---------------------------------------------------
テーブル名が3行に続き、testtblテーブルの全件検索結果、IISLog2テーブルの条件検索結果となります。

 最後のIISLog2テーブルからの検索(retrieveEntities)でフィルター条件に設定したcs_url_siteやcs_uri_stemには、インデックスが作成されているわけではありませんので、データ量の増加により検索に時間がかかるようになります。タイムアウトによる検索エラーの可能性もあるため注意が必要です。

 msdnの技術資料Windows Azure Storage Services/Using Table Service API[※2]に現在の仕様が説明されていますが、これによると2009年7月17日バージョンのもののタイムアウトは30秒となっています。図2-2および図2-3をご参照ください。

 この30秒のタイムアウトより先に対応が必要となるのが、次に説明する1,000行以上の検索結果の対応です。

※2「Query Timeout and Pagination」(http://msdn.microsoft.com/en-us/library/dd135718.aspx)(アクセス: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 Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

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