マスタ参照
参照では、ローカルのCloud SQLインスタンス以外、Cloud SQLおよびBigtableの両方で初回の時間遅延が顕著でした。
Cloud SQL
public String revltemInfo(String item_no){
// Start Timer
long start = System.currentTimeMillis();
// Start Timer
try{
String sql = "select * from item_info where item_no = ?"; //(1)
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, item_no);
ResultSet rs = ps.executeQuery(); //(2)
if(rs.next()) {
String item_name = rs.getString("item_name");
String final_flag = rs.getString("final_flag");
String vendor_no = rs.getString("vendor_no");
String vendor_name = rs.getString("vendor_name"); //(3)
// End Timer
long stop = System.currentTimeMillis();
// End Timer
long time = stop - start;
rv = "{\"status\": \"" + "参照成功: " + time + " ms" + "\",\"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
} else {
rv = "{\"status\": \"参照不成功\"}";
}
}catch(SQLException e){
rv = "{\"status\": \"接続不成功\"}";
}catch(Exception e){
e.printStackTrace();
rv = "参照失敗\n理由:" + e.toString();
}finally{
try{
con.close();
}catch(Exception e){}
}
return rv;
}
参照処理では(1)のSQL文指定から、(2)のクエリー実行を経て(3)での検索データの取得終了までで測定を行っています。キー検索での参照データはJSONフォーマットでWebクライアントに送信していますが、参照処理自体は通常のJavaからのMySQLアクセスなので問題ないでしょう。
Bigtable
public String revltemInfo_kv(String item_no){
// Start Timer
long start = System.currentTimeMillis();
// Start Timer
try{
Entity itemf = ds.get(KeyFactory.createKey("item_info", item_no)); //(1)
String item_name = itemf.getProperty("item_name").toString(); //(2)
String final_flag = itemf.getProperty("final_flag").toString();
String vendor_no = itemf.getProperty("vendor_no").toString();
String vendor_name = itemf.getProperty("vendor_name").toString(); //(3)
// End Timer
long stop = System.currentTimeMillis();
// End Timer
long time = stop - start;
rv = "{\"status\": \"" + "参照成功: " + time + " ms" + "\", \"item_name\": \"" + item_name + "\", \"final_flag\": \"" + final_flag + "\", \"vendor_no\": \"" + vendor_no + "\", \"vendor_name\": \"" + vendor_name + "\"}";
}catch(EntityNotFoundException e){
rv = "Error = " + e;
}catch(Exception e){
rv = "Error = " + e;
}
return rv;
}
Bigtableでは(1)のキー検索で対象となるエンティティを取得し、後は(2)以下のgetPropertyによってプロパティ値を取得します。Bigtableの検索ではSQLによる検索のように取得するプロパティ(フィールド)項目を指定することはなく、SQLで「*」を指定した場合のように必ずすべてのプロパティ項目が取得され、その中から必要な項目だけをgetPropertyで変数にセットする形式になります。
Low-Level APIを使用した場合は(3)でプロパティ値の取得が完了するまでが参照処理で、リスト7でのSQLではこれと対応する形で時間測定を行っています。
参照処理時間の測定結果
| 1 | 2 | 3 | 4 | 5 | |
| Cloud SQL 参照(クラウド) | 890 | 57 | 56 | 57 | 57 |
| Cloud SQL 参照(ローカルCI) | 280 | 275 | 282 | 275 | 273 |
| Cloud SQL 参照(ローカルMI) | 181 | 19 | 23 | 22 | 23 |
| Bigtable1 参照(クラウド) | 725 | 6 | 6 | 9 | 6 |
| 全平均 | 1-4平均 | |
| Cloud SQL 参照(クラウド) | 223.40 | 56.75 |
| Cloud SQL 参照(ローカルCI) | 277.00 | 275.75 |
| Cloud SQL 参照(ローカルMI) | 53.60 | 21.75 |
| Bigtable1 参照(クラウド) | 150.40 | 6.75 |
参照処理では、Cloud SQLおよびBigtableの両方で、初回検索の検索遅延が大きくなっています。これはかなり時間を置いて検索を行った場合で、例えば実際の業務アプリなどである程度頻繁に使用する場合はあまり問題はないかもしれません。Bigtableでは2回目以降はすべて10ミリ秒以内で検索が終了していますが、これは初回検索で同じkindに属するエンティティがメモリ上にキャッシュされ、2回目以降はキャッシュデータからの読み取りになっていると推測されます。
グラフ表示にすると、初回検索の突出した所要時間がよりクリアに見て取れます。参照の場合もアクセスパフォーマンスの順番は同じで、最も高速なのがクラウド上のBigtableで、次にローカルMySQLインスタンスのCloud SQL、クラウド上のCloud SQLと続いています。ローカルでのCloud SQLインスタンスを使用した場合はネットワークレイテンシもあり遅くなっています。

