スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

インデックステーブルについてMLで聞いてみた

App Engineのインデックステーブルについて、いまいち理解できてない部分や細かな疑問がいくつかあったのでMLで聞いてみました

インデックステーブルの各行はどう構成されてる?

  • How Entities and Indexes are Storedで説明されているEntitiesByProperty ASC/DESCテーブルは、実際には
    • キー:"アプリID/カインド名/プロパティ名/プロパティ値"
    • 値:エンティティのキー
  • という構成か?それとも、
    • キー:"アプリID/カインド名/プロパティ名/プロパティ値/エンティティキー"
  • という構成で、値はとくに無いのか?

という質問に対し、Nickさんは

    • 「後者で正しい」(インデックス行のキーにエンティティキーが含まれる構成)

と返答してくれました。

また、インデックスについて詳しくはGoogle I/O 2008のUnder the Covers of the Google App Engine Datastoreを見てほしいとのアドバイスがありました。このビデオはApp Engine開発者のバイブルで私も勉強し始めの頃に見てメモを取っていたのですが、今回改めて通して見直してみました。おそらく前回見たときに聞き逃した/理解できなかった点がいくつかありました:

0:15 specific each row of indexes has index data which is one or more properties, kinds and maybe the ancestors. And it also includes the entity keys which are entity row names

0:17 scan, go fetch each of the keys, go fetch each of entities index rows points to, and give you the results back.

0:22 I'm omitting key from the end of the index rows, but just remember that there's a key here, so every time we scan we gotta go fetch entities.

0:23 Sometimes there would be multiple rows with name John. In that case we have multiple index rows with the same index data. They would be differenciated by key. So this is one reason we need the key in the row name, because we want each of rows be in there but they can't have same row name.

0:29 (Composite index) We don't include index names. You gave us the definition so we know which properties and where. For to save space we don't include the values.
  • (シングルプロパティインデックスについて)インデックスの各行は1つ以上のプロパティと、カインド名、そして(必要に応じて)Ancestorが含まれる。さらに、インデックスが指すエンティティのキーが含まれる。
  • (インデックス参照時には)Bigtableをスキャンし、個々のインデックス行が参照するエンティティーキーが指すエンティティを取得し、結果を返す。
  • (スライドでは)インデックスの各行のエンティティキーは省略しているが、本来はキーが含まれており、スキャン時にはそこからエンティティを取得している
  • (複数のエンティティの)プロパティ値がいずれもJohnとなる時もある。その場合、内容がまったく同じ複数のインデックス行が作成されることになる。そこで、個々のインデックス行を識別するため、インデックスのキーにはエンティティキーが含まれている
  • (シングルプロパティインデックスとは異なりコンポジットインデックスには)インデックス名(プロパティ名?)が含まれていない。開発者が作成したインデックス定義があるから、インデックス行にはそれらを含めず、スペースを節約している。

Bigtableでは数値はどうソートされる?

あと2つの質問はこれです:

  • 数値のプロパティ値は「000123」のようにゼロ埋めされて、文字列の辞書順で検索されているのか? もしくはバイナリ形式の場合は、どのようなフォーマット(IEEE 754等)か?
    • Nickさんの答えは、「数値は文字列に変換されず、バイナリ形式で保存されその順番でソートされる。フォーマットはまああまり重要じゃないよ:)」

内緒ってことですねw

  • How Entities...ではDatastoreが利用するBigtableの数は6とあるが、本文中では7つのテーブルが紹介されている。どちらが正しいか?
    • Nickさん「ID sequenceテーブルはカウントに入ってなかったね」

という感じ。重箱の隅な質問に丁寧に答えていただいたNickさんに感謝です!

1/28追記

najeiraさんから以下の情報をいただきました。thxです!

数値のソートについては、ドキュメントに以下のようにありました。

「データストアで別の型として認識される整数値と浮動小数点値の場合には特に注意が必要です。すべての整数値は浮動小数点値より前に並べられるため、整数値 38 を持つプロパティは、浮動小数点値 37.5 のプロパティよりも前の順序となります」