Upload
mitsuyuki-shiiba
View
2.192
Download
9
Embed Size (px)
DESCRIPTION
2010-07-31に開催された appengine ja night 9で 発表した資料です。 GAEのDatastoreのクエリについて。
Citation preview
Google App Engine:Datastore のクエリを理解しよう
@bufferings2010/07/31
appengine ja night #9
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/
appengine ja night #93
クエリの前に
appengine ja night #94
Datastore
appengine ja night #95
Bigtable
appengine ja night #96
Bigtable
Row name Row dataA distributed, shareded, sorted Array
appengine ja night #97
Entity
appengine ja night #98
Entity
appengine ja night #99
Entities Table
appengine ja night #910
Entities TablePath
appengine ja night #911
Entities Table > 例
※ この図は概念図です。実際の実装を表すものではありません。
#appengine ja night in kansai 2 ( #ajnk2 )12
ソフトスキーマ
#appengine ja night in kansai 2 ( #ajnk2 )13
Null 値と Missing
appengine ja night #914
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
appengine ja night #915
Read
appengine ja night #916
Prefix Scan
appengine ja night #917
Range Scan
appengine ja night #918
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
appengine ja night #919
Get
appengine ja night #920
Get● Key = MyApp/Person(1)/Person(10)
appengine ja night #921
(参考) Batch Get
appengine ja night #922
Query
appengine ja night #923
Query
appengine ja night #924
Query
appengine ja night #925
Index● 使用する全ての Query に対して Index が必要● 問い合わせ時の計算・集約・ Join はできない● プロパティの一部を返すことはできない
( キーだけを返すことは可能 )● Entity を更新したら関係する Index が更新される
appengine ja night #926
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
appengine ja night #927
Query の構成● Kind を指定● 0 個以上のフィルタを指定
=, <=, <, >, >=, !=, IN● 0 個以上のソート順を指定
ASC, DESC
※Kind を指定しない Kindless Query という特別な種類の Query もあります
appengine ja night #928
Query と Kind● Query は単一の Kind の Entity だけを取得
→これが Kind の主な目的
appengine ja night #929
制約● あるプロパティをフィルタまたはソートするには、そ
のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ
ティに限られる● 不等式フィルタで使用されているプロパティは他の
ソート順よりも先にソートする必要がある
appengine ja night #930
制約● あるプロパティをフィルタまたはソートするには、そ
のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ
ティに限られる● 不等式フィルタで使用されているプロパティは他の
ソート順よりも先にソートする必要がある
Query の仕組みを知ることで制約の理由がわかります。
→ 今日の目標
appengine ja night #931
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
appengine ja night #932
Index Tables● 自動で作成される Index
● Kind Index● Single Property Index
● 定義が必要な Index● Custom Index
appengine ja night #933
Kind Index
appengine ja night #934
Kind Index● 特定の Kind の全 Entity を取得
appengine ja night #935
Kind Index● 特定の Kind の全 Entity を取得
● [Kind] Food
appengine ja night #936
Single Property Index● ASC
appengine ja night #937
Single Property Index● DESC
appengine ja night #938
Single Property Index● 1 つのプロパティに対する Filter● 1 つのプロパティに対する Sort● 1 つのプロパティに対する Filter と Sort
appengine ja night #939
Single Property Index● 1 つのプロパティに対する Filter
● [Filter] name = "Suzuki"
appengine ja night #940
Single Property Index● 1 つのプロパティに対する Filter
● [Filter] name > "B" and name < "T"
appengine ja night #941
Single Property Index● 1 つのプロパティに対する Sort
● [Sort] name DESC
appengine ja night #942
Single Property Index● 1 つのプロパティに対する Filter と Sort
● [Filter] name > "B" and name < "T"● [Sort] name ASC
appengine ja night #943
Custom Index
appengine ja night #944
Custom Index● 2 つ以上のプロパティに対する Sort● 2 つ以上のプロパティに対する Filter● Ancestor と Filter または Sort● Key の降順ソート
※ Merge Join (後述)で可能な Query もあります。
appengine ja night #945
Custom Index● Custom Index の定義
appengine ja night #946
Custom Index● 2 つ以上のプロパティに対する Sort● [Sort] height ASC, weight DESC
appengine ja night #947
Custom Index● 2 つ以上のプロパティに対する Filter● [Filter] lastname = "Suzuki" and
firstname = "Jiro"
appengine ja night #948
Custom Index● 2 つ以上のプロパティに対する Filter
● [Filter] lastname = "Suzuki" and firstname >= "B" and firstname < "T"
appengine ja night #949
Custom Index● 2 つ以上のプロパティに対する Filter
● [Filter] height >= 170● [Sort] height ASC, weight DESC
appengine ja night #950
Custom Index● 不等式フィルタ使用時の 3 つのルール● その1
1 つの不等式フィルタと複数の等式フィルタがある場合は、まず等式フィルタのプロパティでソートされ、次に不等式フィルタのプロパティでソートされなければならない
appengine ja night #951
Custom Index● [Filter] height >= 165 and weight = 70● [Sort] height ASC, weight DESC
appengine ja night #952
Custom Index● 不等式フィルタ使用時の 3 つのルール● その 2
1 つの不等式フィルタと複数のソート順がある場合は、まず不等式フィルタのプロパティでソートされ、次にその他のプロパティでソートされなければならない
appengine ja night #953
Custom Index● [Filter] weight > 60● [Sort] height ASC, weight DESC
appengine ja night #954
Custom Index● 不等式フィルタ使用時の 3 つのルール● その 3
不等式フィルタは1つのプロパティにしか適用できない
appengine ja night #955
Custom Index● [Filter] height >= 170 and weight >= 70
appengine ja night #956
Custom Index● [Filter] height >= 170 and weight >= 70
appengine ja night #957
Custom Index● Ancestor と Filter または Sort
● Ancestor Query は今日は説明しません
appengine ja night #958
Custom Index● Key の降順 Sort には Custom Index が必要
appengine ja night #959
ここまでのまとめ● 自動で作成される Index
● Kind Index– 特定の Kind の全 Entity を取得
● Single Property Index– 1 つのプロパティに対する Filter– 1 つのプロパティに対する Sort– 1 つのプロパティに対する Filter と Sort
appengine ja night #960
ここまでのまとめ● 定義が必要な Index
● Custom Index– 2 つ以上のプロパティに対する Sort– 2 つ以上のプロパティに対する Filter– Ancestor と Filter または Sort– キーの降順 Sort
appengine ja night #961
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
appengine ja night #962
Merge Join● 複数のプロパティに対して等式フィルタのみを適用
する場合は、 Custom Index を使用せずに Queryを実行することができる
● 条件● [Filter] 等式フィルタのみ● [Sort] なし
appengine ja night #963
Merge Join● 複数の Single Property Index をマージしながら検
索⇒ "Merge Join"● Key がソートされていることを利用して "zig-zag" ア
ルゴリズムを使用
appengine ja night #964
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #965
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #966
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #967
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #968
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #969
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #970
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #971
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #972
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #973
Merge Join● [Filter] a=1 and b=2 and c=3
appengine ja night #974
Merge Join● データ量が増えてくると Merge Join では処理しき
れなくなる⇒「 Custom Index が必要」というエラーになる
● Custom Index が定義されている場合は Merge Join せずに Custom Index が使用される
appengine ja night #975
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
appengine ja night #976
制約● あるプロパティをフィルタまたはソートするには、そ
のプロパティが存在する必要がある● 不等式フィルタが使用できるのは 1 つのプロパ
ティに限られる● 不等式フィルタで使用されているプロパティは他の
ソート順よりも先にソートする必要がある
appengine ja night #977
Query & Index Tables● Bigtable からのデータ取得● Datastore からのデータ取得● Query● Query と Index● Merge Join● 制約● Query と MVP
appengine ja night #978
MVP と等式フィルタ● Entity1(Key1)
● favorite=["apple", "google"]● Entity2(Key2)
● favorite=["google"]● Entity3(Key3)
● favorite=["orange"]
appengine ja night #979
MVP と等式フィルタ
appengine ja night #980
MVP と等式フィルタ● [Filter] favorite="google"
appengine ja night #981
MVP と等式フィルタ● リスト内のいずれかの値が等式フィルタに一致す
れば取得される
appengine ja night #982
MVP と等式フィルタ● [Filter] favorite="google" and favorite="apple"● Merge Join によって Entity1 が取得される
appengine ja night #983
MVP と不等式フィルタ● Entity1(Key1)
● val=[1, 3, 5]● Entity2(Key2)
● val=[2, 3, 4]
appengine ja night #984
MVP と不等式フィルタ● Entity1(Key1)
● val=[1, 3, 5]● Entity2(Key2)
● val=[2, 3, 4]
appengine ja night #985
MVP と不等式フィルタ● [Filter] val >= 3● 最初にマッチしたものが採用される
appengine ja night #986
MVP とソート順● Entity1(Key1)
● val=[1, 3, 5]● Entity2(Key2)
● val=[2, 3, 4]
appengine ja night #987
MVP とソート順
appengine ja night #988
MVP とソート順● ASC でも DESC でも Entity1,Entity2 の順になる
appengine ja night #989
インデックス爆発● MVP に対するフィルタを複数持つ Custom Index を
作成した場合● Entity1
● val1: 要素数 10● val2: 要素数 10
● Custom Index● [Sort] val1 ASC, val2 ASC⇒Entity1 の Index は 100 行になる
appengine ja night #990
インデックス爆発● 1Entity に対するインデックス数は 5000 まで● Entity2
● val1: 要素数 18● val2: 要素数 18● val3: 要素数 18
● Query● [Filter] val1=x and val2=y and val3=z
⇒ インデックス爆発
appengine ja night #991
インデックス爆発● Ancestor Query の Custom Index
● Ancestor は展開される● 深い EG を形成している場合に MVP との組み合
わせでインデックス爆発になりやすい
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
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/
appengine ja night #994
ありがとうございました