『業務データ多面分析ツール』 強力クエリで業務 …SIerで作ったクエリ、書式 クエリ3 クエリ2 クエリ1 クエリ3 クエリ2 クエリ1 クエリ2
Google App Engine: Datastore のクエリを 理解しよう
-
Upload
mitsuyuki-shiiba -
Category
Technology
-
view
2.197 -
download
9
description
Transcript of Google App Engine: Datastore のクエリを 理解しよう
![Page 1: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/1.jpg)
Google App Engine:Datastore のクエリを理解しよう
@bufferings2010/07/31
appengine ja night #9
![Page 2: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/2.jpg)
appengine ja night #92
自己紹介@bufferings
● #appengine ja night in kansaihttp://www.ustream.tv/channel/ajnk
● Slim3 サイトの日本語化http://sites.google.com/site/slim3documentja/
● Kotori Web JUnit Runner(ktrwjr ことーじゃ )http://code.google.com/p/ktrwjr/
![Page 3: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/3.jpg)
appengine ja night #93
クエリの前に
![Page 4: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/4.jpg)
appengine ja night #94
Datastore
![Page 5: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/5.jpg)
appengine ja night #95
Bigtable
![Page 6: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/6.jpg)
appengine ja night #96
Bigtable
Row name Row dataA distributed, shareded, sorted Array
![Page 7: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/7.jpg)
appengine ja night #97
Entity
![Page 8: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/8.jpg)
appengine ja night #98
Entity
![Page 9: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/9.jpg)
appengine ja night #99
Entities Table
![Page 10: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/10.jpg)
appengine ja night #910
Entities TablePath
![Page 11: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/11.jpg)
appengine ja night #911
Entities Table > 例
※ この図は概念図です。実際の実装を表すものではありません。
![Page 12: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/12.jpg)
#appengine ja night in kansai 2 ( #ajnk2 )12
ソフトスキーマ
![Page 13: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/13.jpg)
#appengine ja night in kansai 2 ( #ajnk2 )13
Null 値と Missing
![Page 14: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/14.jpg)
appengine ja night #914
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
![Page 15: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/15.jpg)
appengine ja night #915
Read
![Page 16: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/16.jpg)
appengine ja night #916
Prefix Scan
![Page 17: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/17.jpg)
appengine ja night #917
Range Scan
![Page 18: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/18.jpg)
appengine ja night #918
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
![Page 19: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/19.jpg)
appengine ja night #919
Get
![Page 20: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/20.jpg)
appengine ja night #920
Get● Key = MyApp/Person(1)/Person(10)
![Page 21: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/21.jpg)
appengine ja night #921
(参考) Batch Get
![Page 22: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/22.jpg)
appengine ja night #922
Query
![Page 23: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/23.jpg)
appengine ja night #923
Query
![Page 24: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/24.jpg)
appengine ja night #924
Query
![Page 25: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/25.jpg)
appengine ja night #925
Index● 使用する全ての Query に対して Index が必要● 問い合わせ時の計算・集約・ Join はできない● プロパティの一部を返すことはできない
( キーだけを返すことは可能 )● Entity を更新したら関係する Index が更新される
![Page 26: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/26.jpg)
appengine ja night #926
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
![Page 27: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/27.jpg)
appengine ja night #927
Query の構成● Kind を指定● 0 個以上のフィルタを指定
=, <=, <, >, >=, !=, IN● 0 個以上のソート順を指定
ASC, DESC
※Kind を指定しない Kindless Query という特別な種類の Query もあります
![Page 28: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/28.jpg)
appengine ja night #928
Query と Kind● Query は単一の Kind の Entity だけを取得
→これが Kind の主な目的
![Page 29: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/29.jpg)
appengine ja night #929
制約● あるプロパティをフィルタまたはソートするには、そ
のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ
ティに限られる● 不等式フィルタで使用されているプロパティは他の
ソート順よりも先にソートする必要がある
![Page 30: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/30.jpg)
appengine ja night #930
制約● あるプロパティをフィルタまたはソートするには、そ
のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ
ティに限られる● 不等式フィルタで使用されているプロパティは他の
ソート順よりも先にソートする必要がある
Query の仕組みを知ることで制約の理由がわかります。
→ 今日の目標
![Page 31: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/31.jpg)
appengine ja night #931
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
![Page 32: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/32.jpg)
appengine ja night #932
Index Tables● 自動で作成される Index
● Kind Index● Single Property Index
● 定義が必要な Index● Custom Index
![Page 33: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/33.jpg)
appengine ja night #933
Kind Index
![Page 34: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/34.jpg)
appengine ja night #934
Kind Index● 特定の Kind の全 Entity を取得
![Page 35: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/35.jpg)
appengine ja night #935
Kind Index● 特定の Kind の全 Entity を取得
● [Kind] Food
![Page 36: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/36.jpg)
appengine ja night #936
Single Property Index● ASC
![Page 37: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/37.jpg)
appengine ja night #937
Single Property Index● DESC
![Page 38: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/38.jpg)
appengine ja night #938
Single Property Index● 1 つのプロパティに対する Filter● 1 つのプロパティに対する Sort● 1 つのプロパティに対する Filter と Sort
![Page 39: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/39.jpg)
appengine ja night #939
Single Property Index● 1 つのプロパティに対する Filter
● [Filter] name = "Suzuki"
![Page 40: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/40.jpg)
appengine ja night #940
Single Property Index● 1 つのプロパティに対する Filter
● [Filter] name > "B" and name < "T"
![Page 41: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/41.jpg)
appengine ja night #941
Single Property Index● 1 つのプロパティに対する Sort
● [Sort] name DESC
![Page 42: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/42.jpg)
appengine ja night #942
Single Property Index● 1 つのプロパティに対する Filter と Sort
● [Filter] name > "B" and name < "T"● [Sort] name ASC
![Page 43: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/43.jpg)
appengine ja night #943
Custom Index
![Page 44: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/44.jpg)
appengine ja night #944
Custom Index● 2 つ以上のプロパティに対する Sort● 2 つ以上のプロパティに対する Filter● Ancestor と Filter または Sort● Key の降順ソート
※ Merge Join (後述)で可能な Query もあります。
![Page 45: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/45.jpg)
appengine ja night #945
Custom Index● Custom Index の定義
![Page 46: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/46.jpg)
appengine ja night #946
Custom Index● 2 つ以上のプロパティに対する Sort● [Sort] height ASC, weight DESC
![Page 47: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/47.jpg)
appengine ja night #947
Custom Index● 2 つ以上のプロパティに対する Filter● [Filter] lastname = "Suzuki" and
firstname = "Jiro"
![Page 48: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/48.jpg)
appengine ja night #948
Custom Index● 2 つ以上のプロパティに対する Filter
● [Filter] lastname = "Suzuki" and firstname >= "B" and firstname < "T"
![Page 49: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/49.jpg)
appengine ja night #949
Custom Index● 2 つ以上のプロパティに対する Filter
● [Filter] height >= 170● [Sort] height ASC, weight DESC
![Page 50: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/50.jpg)
appengine ja night #950
Custom Index● 不等式フィルタ使用時の 3 つのルール● その1
1 つの不等式フィルタと複数の等式フィルタがある場合は、まず等式フィルタのプロパティでソートされ、次に不等式フィルタのプロパティでソートされなければならない
![Page 51: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/51.jpg)
appengine ja night #951
Custom Index● [Filter] height >= 165 and weight = 70● [Sort] height ASC, weight DESC
![Page 52: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/52.jpg)
appengine ja night #952
Custom Index● 不等式フィルタ使用時の 3 つのルール● その 2
1 つの不等式フィルタと複数のソート順がある場合は、まず不等式フィルタのプロパティでソートされ、次にその他のプロパティでソートされなければならない
![Page 53: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/53.jpg)
appengine ja night #953
Custom Index● [Filter] weight > 60● [Sort] height ASC, weight DESC
![Page 54: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/54.jpg)
appengine ja night #954
Custom Index● 不等式フィルタ使用時の 3 つのルール● その 3
不等式フィルタは1つのプロパティにしか適用できない
![Page 55: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/55.jpg)
appengine ja night #955
Custom Index● [Filter] height >= 170 and weight >= 70
![Page 56: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/56.jpg)
appengine ja night #956
Custom Index● [Filter] height >= 170 and weight >= 70
![Page 57: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/57.jpg)
appengine ja night #957
Custom Index● Ancestor と Filter または Sort
● Ancestor Query は今日は説明しません
![Page 58: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/58.jpg)
appengine ja night #958
Custom Index● Key の降順 Sort には Custom Index が必要
![Page 59: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/59.jpg)
appengine ja night #959
ここまでのまとめ● 自動で作成される Index
● Kind Index– 特定の Kind の全 Entity を取得
● Single Property Index– 1 つのプロパティに対する Filter– 1 つのプロパティに対する Sort– 1 つのプロパティに対する Filter と Sort
![Page 60: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/60.jpg)
appengine ja night #960
ここまでのまとめ● 定義が必要な Index
● Custom Index– 2 つ以上のプロパティに対する Sort– 2 つ以上のプロパティに対する Filter– Ancestor と Filter または Sort– キーの降順 Sort
![Page 61: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/61.jpg)
appengine ja night #961
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
![Page 62: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/62.jpg)
appengine ja night #962
Merge Join● 複数のプロパティに対して等式フィルタのみを適用
する場合は、 Custom Index を使用せずに Queryを実行することができる
● 条件● [Filter] 等式フィルタのみ● [Sort] なし
![Page 63: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/63.jpg)
appengine ja night #963
Merge Join● 複数の Single Property Index をマージしながら検
索⇒ "Merge Join"● Key がソートされていることを利用して "zig-zag" ア
ルゴリズムを使用
![Page 64: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/64.jpg)
appengine ja night #964
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 65: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/65.jpg)
appengine ja night #965
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 66: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/66.jpg)
appengine ja night #966
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 67: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/67.jpg)
appengine ja night #967
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 68: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/68.jpg)
appengine ja night #968
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 69: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/69.jpg)
appengine ja night #969
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 70: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/70.jpg)
appengine ja night #970
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 71: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/71.jpg)
appengine ja night #971
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 72: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/72.jpg)
appengine ja night #972
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 73: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/73.jpg)
appengine ja night #973
Merge Join● [Filter] a=1 and b=2 and c=3
![Page 74: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/74.jpg)
appengine ja night #974
Merge Join● データ量が増えてくると Merge Join では処理しき
れなくなる⇒「 Custom Index が必要」というエラーになる
● Custom Index が定義されている場合は Merge Join せずに Custom Index が使用される
![Page 75: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/75.jpg)
appengine ja night #975
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
![Page 76: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/76.jpg)
appengine ja night #976
制約● あるプロパティをフィルタまたはソートするには、そ
のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ
ティに限られる● 不等式フィルタで使用されているプロパティは他の
ソート順よりも先にソートする必要がある
![Page 77: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/77.jpg)
appengine ja night #977
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
![Page 78: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/78.jpg)
appengine ja night #978
MVP と等式フィルタ● Entity1(Key1)
● favorite=["apple", "google"]● Entity2(Key2)
● favorite=["google"]● Entity3(Key3)
● favorite=["orange"]
![Page 79: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/79.jpg)
appengine ja night #979
MVP と等式フィルタ
![Page 80: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/80.jpg)
appengine ja night #980
MVP と等式フィルタ● [Filter] favorite="google"
![Page 81: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/81.jpg)
appengine ja night #981
MVP と等式フィルタ● リスト内のいずれかの値が等式フィルタに一致す
れば取得される
![Page 82: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/82.jpg)
appengine ja night #982
MVP と等式フィルタ● [Filter] favorite="google" and favorite="apple"● Merge Join によって Entity1 が取得される
![Page 83: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/83.jpg)
appengine ja night #983
MVP と不等式フィルタ● Entity1(Key1)
● val=[1, 3, 5]● Entity2(Key2)
● val=[2, 3, 4]
![Page 84: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/84.jpg)
appengine ja night #984
MVP と不等式フィルタ● Entity1(Key1)
● val=[1, 3, 5]● Entity2(Key2)
● val=[2, 3, 4]
![Page 85: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/85.jpg)
appengine ja night #985
MVP と不等式フィルタ● [Filter] val >= 3● 最初にマッチしたものが採用される
![Page 86: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/86.jpg)
appengine ja night #986
MVP とソート順● Entity1(Key1)
● val=[1, 3, 5]● Entity2(Key2)
● val=[2, 3, 4]
![Page 87: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/87.jpg)
appengine ja night #987
MVP とソート順
![Page 88: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/88.jpg)
appengine ja night #988
MVP とソート順● ASC でも DESC でも Entity1,Entity2 の順になる
![Page 89: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/89.jpg)
appengine ja night #989
インデックス爆発● MVP に対するフィルタを複数持つ Custom Index を
作成した場合● Entity1
● val1: 要素数 10● val2: 要素数 10
● Custom Index● [Sort] val1 ASC, val2 ASC⇒Entity1 の Index は 100 行になる
![Page 90: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/90.jpg)
appengine ja night #990
インデックス爆発● 1Entity に対するインデックス数は 5000 まで● Entity2
● val1: 要素数 18● val2: 要素数 18● val3: 要素数 18
● Query● [Filter] val1=x and val2=y and val3=z
⇒ インデックス爆発
![Page 91: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/91.jpg)
appengine ja night #991
インデックス爆発● Ancestor Query の Custom Index
● Ancestor は展開される● 深い EG を形成している場合に MVP との組み合
わせでインデックス爆発になりやすい
![Page 92: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/92.jpg)
appengine ja night #992
Next gen queries● Merge Join と Multi Query(Custom Index を使用す
るもの ) の実装がパワーアップするらしいhttp://code.google.com/events/io/2010/sessions/next-gen-queries-appengine.html
![Page 93: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/93.jpg)
appengine ja night #993
参考● 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/
![Page 94: Google App Engine: Datastore のクエリを 理解しよう](https://reader033.fdocuments.net/reader033/viewer/2022060119/558fc9dc1a28ab6f198b4693/html5/thumbnails/94.jpg)
appengine ja night #994
ありがとうございました