Google App Engine:
Datastore のクエリを
理解しよう

@bufferings
2010/07/31

appengine ja night #9
自己紹介
                       @bufferings



●
    #appengine ja night in kansai
    http://www.ustream.tv/channel/ajnk
●
    Slim3 サイトの日本語化
    http://sites.google.com/site/slim3documentja/
●
    Kotori Web JUnit Runner(ktrwjr ことーじゃ )
    http://code.google.com/p/ktrwjr/
2                     appengine ja night #9
クエリの前に




3    appengine ja night #9
Datastore




4   appengine ja night #9
Bigtable




5   appengine ja night #9
Bigtable
    A distributed, shareded, sorted Array
        Row name            Row data




6              appengine ja night #9
Entity




7   appengine ja night #9
Entity




8   appengine ja night #9
Entities Table




9     appengine ja night #9
Entities Table
     Path




10            appengine ja night #9
Entities Table > 例




     ※ この図は概念図です。実際の実装を表すものではありません。


11             appengine ja night #9
ソフトスキーマ




12   #appengine ja night in kansai 2 ( #ajnk2 )
Null 値と Missing




13   #appengine ja night in kansai 2 ( #ajnk2 )
Query & Index Tables
●
     Bigtable からのデータ取得
●
     Datastore からのデータ取得
●
     Query
●
     Query と Index
●
     Merge Join
●
     制約
●
     Query と MVP

14                   appengine ja night #9
Read




15   appengine ja night #9
Prefix Scan




16    appengine ja night #9
Range Scan




17    appengine ja night #9
Query & Index Tables
●
     Bigtable からのデータ取得
●
     Datastore からのデータ取得
●
     Query
●
     Query と Index
●
     Merge Join
●
     制約
●
     Query と MVP

18                   appengine ja night #9
Get




19   appengine ja night #9
Get
●
     Key = MyApp/Person(1)/Person(10)




20                  appengine ja night #9
(参考) Batch Get




21      appengine ja night #9
Query




22   appengine ja night #9
Query




23   appengine ja night #9
Query




24   appengine ja night #9
Index
●
     使用する全ての Query に対して Index が必要
●
     問い合わせ時の計算・集約・ Join はできない
●
     プロパティの一部を返すことはできない
     ( キーだけを返すことは可能 )
●
     Entity を更新したら関係する Index が更新される




25              appengine ja night #9
Query & Index Tables
●
     Bigtable からのデータ取得
●
     Datastore からのデータ取得
●
     Query
●
     Query と Index
●
     Merge Join
●
     制約
●
     Query と MVP

26                   appengine ja night #9
Query の構成
                     ●
                         Kind を指定
                     ●
                         0 個以上のフィルタを指定
                         =, <=, <, >, >=, !=, IN
                     ●
                         0 個以上のソート順を指定
                         ASC, DESC



     ※Kind を指定しない Kindless Query という特別な
     種類の Query もあります
27              appengine ja night #9
Query と Kind
●
     Query は単一の Kind の Entity だけを取得
     →これが Kind の主な目的




28               appengine ja night #9
制約
●
     あるプロパティをフィルタまたはソートするには、そ
     のプロパティが存在する必要がある
●
     不等式フィルタが使用できるのは 1 つのプロパ
     ティに限られる
●
     不等式フィルタで使用されているプロパティは他の
     ソート順よりも先にソートする必要がある




29           appengine ja night #9
制約
●
     あるプロパティをフィルタまたはソートするには、そ
     のプロパティが存在する必要がある
●         Query の仕組みを知ることで
     不等式フィルタが使用できるのは 1 つのプロパ
          制約の理由がわかります。
     ティに限られる
●
             → 今日の目標
     不等式フィルタで使用されているプロパティは他の
     ソート順よりも先にソートする必要がある




30           appengine ja night #9
Query & Index Tables
●
     Bigtable からのデータ取得
●
     Datastore からのデータ取得
●
     Query
●
     Query と Index
●
     Merge Join
●
     制約
●
     Query と MVP

31                   appengine ja night #9
Index Tables
●
     自動で作成される Index
     ●
         Kind Index
     ●
         Single Property Index
●
     定義が必要な Index
     ●
         Custom Index




32                      appengine ja night #9
Kind Index




33   appengine ja night #9
Kind Index

     ●
         特定の Kind の全 Entity を取得




34          appengine ja night #9
Kind Index
 ●
     特定の Kind の全 Entity を取得
     ●
         [Kind] Food




35                     appengine ja night #9
Single Property Index
●
     ASC




36               appengine ja night #9
Single Property Index
●
     DESC




37                appengine ja night #9
Single Property Index

      ●
          1 つのプロパティに対する Filter
      ●
          1 つのプロパティに対する Sort
      ●
          1 つのプロパティに対する Filter と Sort




38            appengine ja night #9
Single Property Index
●
     1 つのプロパティに対する Filter
     ●
         [Filter] name = "Suzuki"




39                      appengine ja night #9
Single Property Index
●
     1 つのプロパティに対する Filter
     ●
         [Filter] name > "B" and name < "T"




40                     appengine ja night #9
Single Property Index
●
     1 つのプロパティに対する Sort
     ●
         [Sort] name DESC




41                    appengine ja night #9
Single Property Index
●
     1 つのプロパティに対する Filter と Sort
     ●
         [Filter] name > "B" and name < "T"
     ●
         [Sort] name ASC




42                     appengine ja night #9
Custom Index




43     appengine ja night #9
Custom Index

         ●
             2 つ以上のプロパティに対する Sort
         ●
             2 つ以上のプロパティに対する Filter
         ●
             Ancestor と Filter または Sort
         ●
             Key の降順ソート



※ Merge Join (後述)で可能な Query もあります。
44                appengine ja night #9
Custom Index
●
     Custom Index の定義




45                appengine ja night #9
Custom Index
●
     2 つ以上のプロパティに対する Sort
●
     [Sort] height ASC, weight DESC




46                   appengine ja night #9
Custom Index
●
     2 つ以上のプロパティに対する Filter
●
     [Filter] lastname = "Suzuki" and
     firstname = "Jiro"




47                    appengine ja night #9
Custom Index
●
     2 つ以上のプロパティに対する Filter
     ●
         [Filter] lastname = "Suzuki" and
         firstname >= "B" and firstname < "T"




48                     appengine ja night #9
Custom Index
●
     2 つ以上のプロパティに対する Filter
     ●
         [Filter] height >= 170
     ●
         [Sort] height ASC, weight DESC




49                       appengine ja night #9
Custom Index
●
     不等式フィルタ使用時の 3 つのルール
●
     その1
      1 つの不等式フィルタと複数の等式フィルタがあ
      る場合は、まず等式フィルタのプロパティでソー
      トされ、次に不等式フィルタのプロパティでソート
      されなければならない




50           appengine ja night #9
Custom Index
●
     [Filter] height >= 165 and weight = 70
●
     [Sort] height ASC, weight DESC




51                     appengine ja night #9
Custom Index
●
     不等式フィルタ使用時の 3 つのルール
●
     その 2
      1 つの不等式フィルタと複数のソート順がある場
      合は、まず不等式フィルタのプロパティでソートさ
      れ、次にその他のプロパティでソートされなけれ
      ばならない




52            appengine ja night #9
Custom Index
●
     [Filter] weight > 60
●
     [Sort] height ASC, weight DESC




53                     appengine ja night #9
Custom Index
●
     不等式フィルタ使用時の 3 つのルール
●
     その 3
      不等式フィルタは1つのプロパティにしか適用で
      きない




54            appengine ja night #9
Custom Index
●
     [Filter] height >= 170 and weight >= 70




55                     appengine ja night #9
Custom Index
●
     [Filter] height >= 170 and weight >= 70




56                     appengine ja night #9
Custom Index
●
     Ancestor と Filter または Sort
     ●
         Ancestor Query は今日は説明しません




57                  appengine ja night #9
Custom Index
●
     Key の降順 Sort には Custom Index が必要




58                appengine ja night #9
ここまでのまとめ
●
     自動で作成される Index
     ●
         Kind Index
         – 特定の Kind の全 Entity を取得
     ●
         Single Property Index
         – 1 つのプロパティに対する Filter
         – 1 つのプロパティに対する Sort
         – 1 つのプロパティに対する Filter と Sort



59                    appengine ja night #9
ここまでのまとめ
●
     定義が必要な Index
     ●
         Custom Index
         – 2 つ以上のプロパティに対する Sort
         – 2 つ以上のプロパティに対する Filter
         – Ancestor と Filter または Sort
         – キーの降順 Sort




60                      appengine ja night #9
Query & Index Tables
●
     Bigtable からのデータ取得
●
     Datastore からのデータ取得
●
     Query
●
     Query と Index
●
     Merge Join
●
     制約
●
     Query と MVP

61                   appengine ja night #9
Merge Join
●
     複数のプロパティに対して等式フィルタのみを適用
     する場合は、 Custom Index を使用せずに Query
     を実行することができる


●
     条件
     ●
         [Filter] 等式フィルタのみ
     ●
         [Sort] なし


62                    appengine ja night #9
Merge Join
●
     複数の Single Property Index をマージしながら検
     索⇒ "Merge Join"
●
     Key がソートされていることを利用して "zig-zag" ア
     ルゴリズムを使用




63               appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




64                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




65                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




66                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




67                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




68                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




69                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




70                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




71                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




72                    appengine ja night #9
Merge Join
●
     [Filter] a=1 and b=2 and c=3




73                    appengine ja night #9
Merge Join
●
     データ量が増えてくると Merge Join では処理しき
     れなくなる
     ⇒「 Custom Index が必要」というエラーになる

●
     Custom Index が定義されている場合は Merge
     Join せずに Custom Index が使用される




74              appengine ja night #9
Query & Index Tables
●
     Bigtable からのデータ取得
●
     Datastore からのデータ取得
●
     Query
●
     Query と Index
●
     Merge Join
●
     制約
●
     Query と MVP

75                   appengine ja night #9
制約
●
     あるプロパティをフィルタまたはソートするには、そ
     のプロパティが存在する必要がある
●
     不等式フィルタが使用できるのは 1 つのプロパ
     ティに限られる
●
     不等式フィルタで使用されているプロパティは他の
     ソート順よりも先にソートする必要がある




76           appengine ja night #9
Query & Index Tables
●
     Bigtable からのデータ取得
●
     Datastore からのデータ取得
●
     Query
●
     Query と Index
●
     Merge Join
●
     制約
●
     Query と MVP

77                   appengine ja night #9
MVP と等式フィルタ
●
     Entity1(Key1)
     ●
         favorite=["apple", "google"]
●
     Entity2(Key2)
     ●
         favorite=["google"]
●
     Entity3(Key3)
     ●
         favorite=["orange"]



78                      appengine ja night #9
MVP と等式フィルタ




79      appengine ja night #9
MVP と等式フィルタ
●
     [Filter] favorite="google"




80                     appengine ja night #9
MVP と等式フィルタ
●
     リスト内のいずれかの値が等式フィルタに一致す
     れば取得される




81           appengine ja night #9
MVP と等式フィルタ
●
     [Filter] favorite="google" and favorite="apple"
●
     Merge Join によって Entity1 が取得される




82                     appengine ja night #9
MVP と不等式フィルタ
●
     Entity1(Key1)
     ●
         val=[1, 3, 5]
●
     Entity2(Key2)
     ●
         val=[2, 3, 4]




83                       appengine ja night #9
MVP と不等式フィルタ
●
     Entity1(Key1)
     ●
         val=[1, 3, 5]
●
     Entity2(Key2)
     ●
         val=[2, 3, 4]




84                       appengine ja night #9
MVP と不等式フィルタ
●
     [Filter] val >= 3
●
     最初にマッチしたものが採用される




85                       appengine ja night #9
MVP とソート順
●
     Entity1(Key1)
     ●
         val=[1, 3, 5]
●
     Entity2(Key2)
     ●
         val=[2, 3, 4]




86                       appengine ja night #9
MVP とソート順




87     appengine ja night #9
MVP とソート順
●
     ASC でも DESC でも Entity1,Entity2 の順になる




88                appengine ja night #9
インデックス爆発
●
     MVP に対するフィルタを複数持つ Custom Index を
     作成した場合
●
     Entity1
     ●
         val1: 要素数 10
     ●
         val2: 要素数 10
●
     Custom Index
     ●
         [Sort] val1 ASC, val2 ASC
     ⇒Entity1 の Index は 100 行になる
89                      appengine ja night #9
インデックス爆発
●
     1Entity に対するインデックス数は 5000 まで
●
     Entity2
     ●
         val1: 要素数 18
     ●
         val2: 要素数 18
     ●
         val3: 要素数 18
●
     Query
     ●
         [Filter] val1=x and val2=y and val3=z
         ⇒ インデックス爆発
90                      appengine ja night #9
インデックス爆発
●
     Ancestor Query の Custom Index
     ●
         Ancestor は展開される
     ●
         深い EG を形成している場合に MVP との組み合
         わせでインデックス爆発になりやすい




91                  appengine ja night #9
Next gen queries
●
     Merge Join と Multi Query(Custom Index を使用す
     るもの ) の実装がパワーアップするらしい
     http://code.google.com/events/io/2010/sessions
     /next-gen-queries-appengine.html




92                   appengine ja night #9
参考
●
     Programming Google App Engine
         http://www.amazon.co.jp/o/ASIN/059652272X
●
     Under the Covers of the Google App Engine Datastore
         http://sites.google.com/site/io/under-the-covers-of-the-google-app-engine-datastore

         スライドは
         http://snarfed.org/space/datastore_talk.html
●
     @kazunori_279 さんの「 GAE/J ってどう使う?」
         http://d.hatena.ne.jp/kazunori_279/20090617/1245224939
●
     @ashigeru さんの「レンジスキャンのアレ」
         http://gist.github.com/294650
●
     Cacoo ( カクー )
         http://cacoo.com/

93                                   appengine ja night #9
ありがとうございました




94     appengine ja night #9

Google App Engine: Datastore のクエリを 理解しよう

  • 1.
    Google App Engine: Datastoreのクエリを 理解しよう @bufferings 2010/07/31 appengine ja night #9
  • 2.
    自己紹介 @bufferings ● #appengine ja night in kansai http://www.ustream.tv/channel/ajnk ● Slim3 サイトの日本語化 http://sites.google.com/site/slim3documentja/ ● Kotori Web JUnit Runner(ktrwjr ことーじゃ ) http://code.google.com/p/ktrwjr/ 2 appengine ja night #9
  • 3.
    クエリの前に 3 appengine ja night #9
  • 4.
    Datastore 4 appengine ja night #9
  • 5.
    Bigtable 5 appengine ja night #9
  • 6.
    Bigtable A distributed, shareded, sorted Array Row name Row data 6 appengine ja night #9
  • 7.
    Entity 7 appengine ja night #9
  • 8.
    Entity 8 appengine ja night #9
  • 9.
    Entities Table 9 appengine ja night #9
  • 10.
    Entities Table Path 10 appengine ja night #9
  • 11.
    Entities Table >例 ※ この図は概念図です。実際の実装を表すものではありません。 11 appengine ja night #9
  • 12.
    ソフトスキーマ 12 #appengine ja night in kansai 2 ( #ajnk2 )
  • 13.
    Null 値と Missing 13 #appengine ja night in kansai 2 ( #ajnk2 )
  • 14.
    Query & IndexTables ● Bigtable からのデータ取得 ● Datastore からのデータ取得 ● Query ● Query と Index ● Merge Join ● 制約 ● Query と MVP 14 appengine ja night #9
  • 15.
    Read 15 appengine ja night #9
  • 16.
    Prefix Scan 16 appengine ja night #9
  • 17.
    Range Scan 17 appengine ja night #9
  • 18.
    Query & IndexTables ● Bigtable からのデータ取得 ● Datastore からのデータ取得 ● Query ● Query と Index ● Merge Join ● 制約 ● Query と MVP 18 appengine ja night #9
  • 19.
    Get 19 appengine ja night #9
  • 20.
    Get ● Key = MyApp/Person(1)/Person(10) 20 appengine ja night #9
  • 21.
    (参考) Batch Get 21 appengine ja night #9
  • 22.
    Query 22 appengine ja night #9
  • 23.
    Query 23 appengine ja night #9
  • 24.
    Query 24 appengine ja night #9
  • 25.
    Index ● 使用する全ての Query に対して Index が必要 ● 問い合わせ時の計算・集約・ Join はできない ● プロパティの一部を返すことはできない ( キーだけを返すことは可能 ) ● Entity を更新したら関係する Index が更新される 25 appengine ja night #9
  • 26.
    Query & IndexTables ● Bigtable からのデータ取得 ● Datastore からのデータ取得 ● Query ● Query と Index ● Merge Join ● 制約 ● Query と MVP 26 appengine ja night #9
  • 27.
    Query の構成 ● Kind を指定 ● 0 個以上のフィルタを指定 =, <=, <, >, >=, !=, IN ● 0 個以上のソート順を指定 ASC, DESC ※Kind を指定しない Kindless Query という特別な 種類の Query もあります 27 appengine ja night #9
  • 28.
    Query と Kind ● Query は単一の Kind の Entity だけを取得 →これが Kind の主な目的 28 appengine ja night #9
  • 29.
    制約 ● あるプロパティをフィルタまたはソートするには、そ のプロパティが存在する必要がある ● 不等式フィルタが使用できるのは 1 つのプロパ ティに限られる ● 不等式フィルタで使用されているプロパティは他の ソート順よりも先にソートする必要がある 29 appengine ja night #9
  • 30.
    制約 ● あるプロパティをフィルタまたはソートするには、そ のプロパティが存在する必要がある ● Query の仕組みを知ることで 不等式フィルタが使用できるのは 1 つのプロパ 制約の理由がわかります。 ティに限られる ● → 今日の目標 不等式フィルタで使用されているプロパティは他の ソート順よりも先にソートする必要がある 30 appengine ja night #9
  • 31.
    Query & IndexTables ● Bigtable からのデータ取得 ● Datastore からのデータ取得 ● Query ● Query と Index ● Merge Join ● 制約 ● Query と MVP 31 appengine ja night #9
  • 32.
    Index Tables ● 自動で作成される Index ● Kind Index ● Single Property Index ● 定義が必要な Index ● Custom Index 32 appengine ja night #9
  • 33.
    Kind Index 33 appengine ja night #9
  • 34.
    Kind Index ● 特定の Kind の全 Entity を取得 34 appengine ja night #9
  • 35.
    Kind Index ● 特定の Kind の全 Entity を取得 ● [Kind] Food 35 appengine ja night #9
  • 36.
    Single Property Index ● ASC 36 appengine ja night #9
  • 37.
    Single Property Index ● DESC 37 appengine ja night #9
  • 38.
    Single Property Index ● 1 つのプロパティに対する Filter ● 1 つのプロパティに対する Sort ● 1 つのプロパティに対する Filter と Sort 38 appengine ja night #9
  • 39.
    Single Property Index ● 1 つのプロパティに対する Filter ● [Filter] name = "Suzuki" 39 appengine ja night #9
  • 40.
    Single Property Index ● 1 つのプロパティに対する Filter ● [Filter] name > "B" and name < "T" 40 appengine ja night #9
  • 41.
    Single Property Index ● 1 つのプロパティに対する Sort ● [Sort] name DESC 41 appengine ja night #9
  • 42.
    Single Property Index ● 1 つのプロパティに対する Filter と Sort ● [Filter] name > "B" and name < "T" ● [Sort] name ASC 42 appengine ja night #9
  • 43.
    Custom Index 43 appengine ja night #9
  • 44.
    Custom Index ● 2 つ以上のプロパティに対する Sort ● 2 つ以上のプロパティに対する Filter ● Ancestor と Filter または Sort ● Key の降順ソート ※ Merge Join (後述)で可能な Query もあります。 44 appengine ja night #9
  • 45.
    Custom Index ● Custom Index の定義 45 appengine ja night #9
  • 46.
    Custom Index ● 2 つ以上のプロパティに対する Sort ● [Sort] height ASC, weight DESC 46 appengine ja night #9
  • 47.
    Custom Index ● 2 つ以上のプロパティに対する Filter ● [Filter] lastname = "Suzuki" and firstname = "Jiro" 47 appengine ja night #9
  • 48.
    Custom Index ● 2 つ以上のプロパティに対する Filter ● [Filter] lastname = "Suzuki" and firstname >= "B" and firstname < "T" 48 appengine ja night #9
  • 49.
    Custom Index ● 2 つ以上のプロパティに対する Filter ● [Filter] height >= 170 ● [Sort] height ASC, weight DESC 49 appengine ja night #9
  • 50.
    Custom Index ● 不等式フィルタ使用時の 3 つのルール ● その1 1 つの不等式フィルタと複数の等式フィルタがあ る場合は、まず等式フィルタのプロパティでソー トされ、次に不等式フィルタのプロパティでソート されなければならない 50 appengine ja night #9
  • 51.
    Custom Index ● [Filter] height >= 165 and weight = 70 ● [Sort] height ASC, weight DESC 51 appengine ja night #9
  • 52.
    Custom Index ● 不等式フィルタ使用時の 3 つのルール ● その 2 1 つの不等式フィルタと複数のソート順がある場 合は、まず不等式フィルタのプロパティでソートさ れ、次にその他のプロパティでソートされなけれ ばならない 52 appengine ja night #9
  • 53.
    Custom Index ● [Filter] weight > 60 ● [Sort] height ASC, weight DESC 53 appengine ja night #9
  • 54.
    Custom Index ● 不等式フィルタ使用時の 3 つのルール ● その 3 不等式フィルタは1つのプロパティにしか適用で きない 54 appengine ja night #9
  • 55.
    Custom Index ● [Filter] height >= 170 and weight >= 70 55 appengine ja night #9
  • 56.
    Custom Index ● [Filter] height >= 170 and weight >= 70 56 appengine ja night #9
  • 57.
    Custom Index ● Ancestor と Filter または Sort ● Ancestor Query は今日は説明しません 57 appengine ja night #9
  • 58.
    Custom Index ● Key の降順 Sort には Custom Index が必要 58 appengine ja night #9
  • 59.
    ここまでのまとめ ● 自動で作成される Index ● Kind Index – 特定の Kind の全 Entity を取得 ● Single Property Index – 1 つのプロパティに対する Filter – 1 つのプロパティに対する Sort – 1 つのプロパティに対する Filter と Sort 59 appengine ja night #9
  • 60.
    ここまでのまとめ ● 定義が必要な Index ● Custom Index – 2 つ以上のプロパティに対する Sort – 2 つ以上のプロパティに対する Filter – Ancestor と Filter または Sort – キーの降順 Sort 60 appengine ja night #9
  • 61.
    Query & IndexTables ● Bigtable からのデータ取得 ● Datastore からのデータ取得 ● Query ● Query と Index ● Merge Join ● 制約 ● Query と MVP 61 appengine ja night #9
  • 62.
    Merge Join ● 複数のプロパティに対して等式フィルタのみを適用 する場合は、 Custom Index を使用せずに Query を実行することができる ● 条件 ● [Filter] 等式フィルタのみ ● [Sort] なし 62 appengine ja night #9
  • 63.
    Merge Join ● 複数の Single Property Index をマージしながら検 索⇒ "Merge Join" ● Key がソートされていることを利用して "zig-zag" ア ルゴリズムを使用 63 appengine ja night #9
  • 64.
    Merge Join ● [Filter] a=1 and b=2 and c=3 64 appengine ja night #9
  • 65.
    Merge Join ● [Filter] a=1 and b=2 and c=3 65 appengine ja night #9
  • 66.
    Merge Join ● [Filter] a=1 and b=2 and c=3 66 appengine ja night #9
  • 67.
    Merge Join ● [Filter] a=1 and b=2 and c=3 67 appengine ja night #9
  • 68.
    Merge Join ● [Filter] a=1 and b=2 and c=3 68 appengine ja night #9
  • 69.
    Merge Join ● [Filter] a=1 and b=2 and c=3 69 appengine ja night #9
  • 70.
    Merge Join ● [Filter] a=1 and b=2 and c=3 70 appengine ja night #9
  • 71.
    Merge Join ● [Filter] a=1 and b=2 and c=3 71 appengine ja night #9
  • 72.
    Merge Join ● [Filter] a=1 and b=2 and c=3 72 appengine ja night #9
  • 73.
    Merge Join ● [Filter] a=1 and b=2 and c=3 73 appengine ja night #9
  • 74.
    Merge Join ● データ量が増えてくると Merge Join では処理しき れなくなる ⇒「 Custom Index が必要」というエラーになる ● Custom Index が定義されている場合は Merge Join せずに Custom Index が使用される 74 appengine ja night #9
  • 75.
    Query & IndexTables ● Bigtable からのデータ取得 ● Datastore からのデータ取得 ● Query ● Query と Index ● Merge Join ● 制約 ● Query と MVP 75 appengine ja night #9
  • 76.
    制約 ● あるプロパティをフィルタまたはソートするには、そ のプロパティが存在する必要がある ● 不等式フィルタが使用できるのは 1 つのプロパ ティに限られる ● 不等式フィルタで使用されているプロパティは他の ソート順よりも先にソートする必要がある 76 appengine ja night #9
  • 77.
    Query & IndexTables ● Bigtable からのデータ取得 ● Datastore からのデータ取得 ● Query ● Query と Index ● Merge Join ● 制約 ● Query と MVP 77 appengine ja night #9
  • 78.
    MVP と等式フィルタ ● Entity1(Key1) ● favorite=["apple", "google"] ● Entity2(Key2) ● favorite=["google"] ● Entity3(Key3) ● favorite=["orange"] 78 appengine ja night #9
  • 79.
    MVP と等式フィルタ 79 appengine ja night #9
  • 80.
    MVP と等式フィルタ ● [Filter] favorite="google" 80 appengine ja night #9
  • 81.
    MVP と等式フィルタ ● リスト内のいずれかの値が等式フィルタに一致す れば取得される 81 appengine ja night #9
  • 82.
    MVP と等式フィルタ ● [Filter] favorite="google" and favorite="apple" ● Merge Join によって Entity1 が取得される 82 appengine ja night #9
  • 83.
    MVP と不等式フィルタ ● Entity1(Key1) ● val=[1, 3, 5] ● Entity2(Key2) ● val=[2, 3, 4] 83 appengine ja night #9
  • 84.
    MVP と不等式フィルタ ● Entity1(Key1) ● val=[1, 3, 5] ● Entity2(Key2) ● val=[2, 3, 4] 84 appengine ja night #9
  • 85.
    MVP と不等式フィルタ ● [Filter] val >= 3 ● 最初にマッチしたものが採用される 85 appengine ja night #9
  • 86.
    MVP とソート順 ● Entity1(Key1) ● val=[1, 3, 5] ● Entity2(Key2) ● val=[2, 3, 4] 86 appengine ja night #9
  • 87.
    MVP とソート順 87 appengine ja night #9
  • 88.
    MVP とソート順 ● ASC でも DESC でも Entity1,Entity2 の順になる 88 appengine ja night #9
  • 89.
    インデックス爆発 ● MVP に対するフィルタを複数持つ Custom Index を 作成した場合 ● Entity1 ● val1: 要素数 10 ● val2: 要素数 10 ● Custom Index ● [Sort] val1 ASC, val2 ASC ⇒Entity1 の Index は 100 行になる 89 appengine ja night #9
  • 90.
    インデックス爆発 ● 1Entity に対するインデックス数は 5000 まで ● Entity2 ● val1: 要素数 18 ● val2: 要素数 18 ● val3: 要素数 18 ● Query ● [Filter] val1=x and val2=y and val3=z ⇒ インデックス爆発 90 appengine ja night #9
  • 91.
    インデックス爆発 ● Ancestor Query の Custom Index ● Ancestor は展開される ● 深い EG を形成している場合に MVP との組み合 わせでインデックス爆発になりやすい 91 appengine ja night #9
  • 92.
    Next gen queries ● Merge Join と Multi Query(Custom Index を使用す るもの ) の実装がパワーアップするらしい http://code.google.com/events/io/2010/sessions /next-gen-queries-appengine.html 92 appengine ja night #9
  • 93.
    参考 ● Programming Google App Engine http://www.amazon.co.jp/o/ASIN/059652272X ● Under the Covers of the Google App Engine Datastore http://sites.google.com/site/io/under-the-covers-of-the-google-app-engine-datastore スライドは http://snarfed.org/space/datastore_talk.html ● @kazunori_279 さんの「 GAE/J ってどう使う?」 http://d.hatena.ne.jp/kazunori_279/20090617/1245224939 ● @ashigeru さんの「レンジスキャンのアレ」 http://gist.github.com/294650 ● Cacoo ( カクー ) http://cacoo.com/ 93 appengine ja night #9
  • 94.