2009年6月6日土曜日

Google App Engine考察、DataStoreの効率

Google App Engine Blogの記事にDataStoreのキューに関する面白い記述があった。GQL(Google版のSQL)では「IN」とか「!=」を多用するとパフォーマンスが発揮できない、とのこと。

For example, the query "SELECT * FROM People WHERE name IN ('Bob', 'Jane')" gets translated into two queries, equivalent to running "SELECT * FROM People WHERE name = 'Bob'" and "SELECT * FROM People WHERE name = 'Jane'" and merging the results. Combining multiple disjunctions multiplies the number of queries needed, so the query "SELECT * FROM People WHERE name IN ('Bob', 'Jane') AND age != 25" generates a total of four queries, for each of the possible conditions (age less than or greater than 25, and name is 'Bob' or 'Jane'), then merges them together into a single result set.

上にあるように、「名前がBobかJane」かつ「年齢が25でない」という条件でキューを実行すると、内部では「年齢が26歳以上」「年齢が25才未満」「名前がBob」「名前がJane」と4つの処理が行われるため、処理コストが高くつく。結果のレコード数が少ないと予測されるのなら、全部取り出してアプリ側で取捨選択しろ、とGAEの中の人はおっしゃっている。

今までWebアプリのパフォーマンスを上げるなら、データの取捨選択はSQLで完結させろ(※)、と思っていたが、GQLは逆みたい。 ※もちろん、メンテナンス性を考慮したうえで

そこで気になるのは「結果のレコード数が少ないと予測」という点。どのくらいまでが「少ない」と言えるのだろうか?

0 件のコメント:

コメントを投稿