• 検索結果がありません。

勉強会 資料 Google Developer Group 京都 ajnk2 QueryAndIndex

N/A
N/A
Protected

Academic year: 2018

シェア "勉強会 資料 Google Developer Group 京都 ajnk2 QueryAndIndex"

Copied!
132
0
0

読み込み中.... (全文を見る)

全文

(1)

Google App Engine:

Datastore を理解しよう 2

@bufferings 2010/05/28

#appengine ja night in kansai 2 ( #ajnk2 )

(2)

京都 GTUG とは ?

正式名称

「Kyoto Google Technology User Group」

Kyoto GTUG 目的

純粋・シンプルにGoogleのテクノロジーを 理解・習得するための活動をする。

(これは、世界中のGTUG共通の目的)

*漢字表記の「京都GTUG」は国内のみの利用でお願いします。

(3)

#appengine ja night in kansai 2 ( #ajnk2 ) 3

Google Technology User Group

現在、全世界で 51 ヶ国 100 を超える地域でローカルな GTUG が設立されています。

http://www.gtugs.org/directory

各地域で、 Google のテクノロジーに興味のある方々が組 織を立ち上げています。

将来的には、地域を越えたイベントもやりたいよね!という 話が、マネージャの ML でやりとりされています。

京都 GTUG は Pulse 世界 1 位です! http://www.gtugs.org/pulse.jsp

(4)

京都 GTUG へ!

まだ、参加してない方はぜひ参加して下さいね!

京都 GTUG

http://kyoto-gtug.org/

京都 GTUG (Google Group) http://group.kyoto-gtug.org/

(5)

#appengine ja night in kansai 2 ( #ajnk2 ) 5

後援:京都リサーチパーク株式会社

京都リサーチパーク株式会社 http://www.krp.co.jp/

この会場は、京都リサーチパーク株式会社の後援

により提供していただいております。

(6)

#appengine ja night in kansai 2

( #ajnk2 )

関西のみんなで GoogleAppEngine(Java/Python) に ついての実践的なノウハウを共有していきましょう!

(7)

#appengine ja night in kansai 2 ( #ajnk2 ) 7

自己紹介

@bufferings

Slim3 サイトの日本語化

http://sites.google.com/site/slim3documentja/

Kotori Web JUnit Runner(ktrwjr ことーじゃ ) http://code.google.com/p/ktrwjr/

(8)

前回のおさらい

(9)

#appengine ja night in kansai 2 ( #ajnk2 ) 9

Datastore

(10)

Bigtable

(11)

#appengine ja night in kansai 2 ( #ajnk2 ) 11

Bigtable

Row name Row data

A distributed, shareded, sorted Array

(12)

Entity

(13)

#appengine ja night in kansai 2 ( #ajnk2 ) 13

Entity

(14)

Entities Table

(15)

#appengine ja night in kansai 2 ( #ajnk2 ) 15

Entities Table

Path

(16)

Entities Table

(17)

#appengine ja night in kansai 2 ( #ajnk2 ) 17

Entities Table

Protocol Buffers

Bigtable や Google Wave で実運用されている オープンソースのシリアライザー

http://code.google.com/p/protobuf/

(18)

Entities Table

(19)

#appengine ja night in kansai 2 ( #ajnk2 ) 19

Entities Table > 例

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

(20)

Entity Group

(21)

#appengine ja night in kansai 2 ( #ajnk2 ) 21

Kind とスキーマ

(22)

ソフトスキーマ

(23)

#appengine ja night in kansai 2 ( #ajnk2 ) 23

Null 値と Unset

(24)

Query & Index Tables

Bigtable からのデータ取得

Datastore からのデータ取得

Query

Query と Index

Merge Join

色々

Query と MVP

(25)

#appengine ja night in kansai 2 ( #ajnk2 ) 25

Read

(26)

Prefix Scan

(27)

#appengine ja night in kansai 2 ( #ajnk2 ) 27

Range Scan

(28)

Query & Index Tables

Bigtable からのデータ取得

Datastore からのデータ取得

Query

Query と Index

Merge Join

色々

Query と MVP

(29)

#appengine ja night in kansai 2 ( #ajnk2 ) 29

Get

(30)

Get

Key = MyApp/Person(1)/Person(10)

(31)

#appengine ja night in kansai 2 ( #ajnk2 ) 31

(参考) Batch Get

(32)

Query

(33)

#appengine ja night in kansai 2 ( #ajnk2 ) 33

Query

(34)

Query

(35)

#appengine ja night in kansai 2 ( #ajnk2 ) 35

Index

使用する全ての Query に対して Index が必要

問い合わせ時の計算・集約・ Join はできない

プロパティの一部を返すことはできない ( キーだけを返すことは可能 )

Entity を更新したら関係する Index が更新される

(36)

Query & Index Tables

Bigtable からのデータ取得

Datastore からのデータ取得

Query

Query と Index

Merge Join

色々

Query と MVP

(37)

#appengine ja night in kansai 2 ( #ajnk2 ) 37

Query の構成

Kind を指定

0 個以上のフィルタを指定

=, <=, <, >, >=, !=, IN

0 個以上のソート順を指定 ASC, DESC

※Kind を指定しない Kindless Query という特別な 種類の Query もあります

(38)

Query と Kind

Query は単一の Kind の Entity だけを取得

→これが Kind の主な目的

(39)

#appengine ja night in kansai 2 ( #ajnk2 ) 39

制約

あるプロパティをフィルタまたはソートするには、そ のプロパティが存在する必要がある

不等式フィルタが使用できるのは 1 つのプロパ ティに限られる

不等式フィルタで使用されているプロパティは他の ソート順よりも先にソートする必要がある

(40)

制約

あるプロパティをフィルタまたはソートするには、そ のプロパティが存在する必要がある

不等式フィルタが使用できるのは 1 つのプロパ ティに限られる

不等式フィルタで使用されているプロパティは他の ソート順よりも先にソートする必要がある

Query の仕組みを知ることで

制約の理由がわかります。

→ 今日の目標

(41)

#appengine ja night in kansai 2 ( #ajnk2 ) 41

制約

あるプロパティをフィルタまたはソートするには、そ のプロパティが存在する必要がある

不等式フィルタが使用できるのは 1 つのプロパ ティに限られる

不等式フィルタで使用されているプロパティは他の ソート順よりも先にソートする必要がある

(42)

Query & Index Tables

Bigtable からのデータ取得

Datastore からのデータ取得

Query

Query と Index

Merge Join

色々

Query と MVP

(43)

#appengine ja night in kansai 2 ( #ajnk2 ) 43

Index Tables

自動で作成される Index

Kind Index

Single Property Index

定義が必要な Index

Custom Index

(44)

Kind Index

(45)

#appengine ja night in kansai 2 ( #ajnk2 ) 45

Kind Index

特定の Kind の全 Entity を取得

(46)

Kind Index

特定の Kind の全 Entity を取得

[Kind] Food

(47)

#appengine ja night in kansai 2 ( #ajnk2 ) 47

Single Property Index

ASC

(48)

Single Property Index

DESC

(49)

#appengine ja night in kansai 2 ( #ajnk2 ) 49

Single Property Index

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

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

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

(50)

Single Property Index

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

[Filter] name = "Suzuki"

(51)

#appengine ja night in kansai 2 ( #ajnk2 ) 51

Single Property Index

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

[Filter] name > "B" and name < "T"

(52)

Single Property Index

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

[Sort] name DESC

(53)

#appengine ja night in kansai 2 ( #ajnk2 ) 53

Single Property Index

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

[Filter] name > "B" and name < "T"

[Sort] name ASC

(54)

Custom Index

(55)

#appengine ja night in kansai 2 ( #ajnk2 ) 55

Custom Index

2 つ以上のプロパティに対する Sort

2 つ以上のプロパティに対する Filter

Ancestor と Filter または Sort

Key の降順ソート

※ Merge Join (後述)で可能な Query もあります。

(56)

Custom Index

Custom Index の定義

(57)

#appengine ja night in kansai 2 ( #ajnk2 ) 57

Custom Index

2 つ以上のプロパティに対する Sort

[Sort] height ASC, weight DESC

(58)

Custom Index

2 つ以上のプロパティに対する Filter

[Filter] lastname = "Suzuki" and firstname = "Jiro"

(59)

#appengine ja night in kansai 2 ( #ajnk2 ) 59

Custom Index

2 つ以上のプロパティに対する Filter

[Filter] lastname = "Suzuki" and

firstname >= "B" and firstname < "T"

(60)

Custom Index

2 つ以上のプロパティに対する Filter

[Filter] height = "170"

[Sort] height ASC, weight DESC

(61)

#appengine ja night in kansai 2 ( #ajnk2 ) 61

Custom Index

不等式フィルタ使用時の 3 つのルール

その1

1 つの不等式フィルタと複数の等式フィルタがあ る場合は、まず等式フィルタのプロパティでソー トされ、次に不等式フィルタのプロパティでソート されなければならない

(62)

Custom Index

[Filter] height >= 165 and weight = 70

[Sort] height ASC, weight DESC

(63)

#appengine ja night in kansai 2 ( #ajnk2 ) 63

Custom Index

不等式フィルタ使用時の 3 つのルール

その 2

1 つの不等式フィルタと複数のソート順がある場 合は、まず不等式フィルタのプロパティでソートさ れ、次にその他のプロパティでソートされなけれ ばならない

(64)

Custom Index

[Filter] weight > 60

[Sort] height ASC, weight DESC

(65)

#appengine ja night in kansai 2 ( #ajnk2 ) 65

Custom Index

不等式フィルタ使用時の 3 つのルール

その 3

不等式フィルタは1つのプロパティにしか適用で きない

(66)

Custom Index

[Filter] height >= 170 and weight >= 70

(67)

#appengine ja night in kansai 2 ( #ajnk2 ) 67

Custom Index

[Filter] height >= 170 and weight >= 70

(68)

Custom Index

Ancestor と Filter または Sort

Ancestor Query は後述

(69)

#appengine ja night in kansai 2 ( #ajnk2 ) 69

Custom Index

Key の降順 Sort には Custom Index が必要

(70)

ここまでのまとめ

自動で作成される Index

Kind Index

特定の Kind の全 Entity を取得

Single Property Index

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

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

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

(71)

#appengine ja night in kansai 2 ( #ajnk2 ) 71

ここまでのまとめ

定義が必要な Index

Custom Index

2 つ以上のプロパティに対する Sort

2 つ以上のプロパティに対する Filter

Ancestor と Filter または Sort

キーの降順 Sort

(72)

Query & Index Tables

Bigtable からのデータ取得

Datastore からのデータ取得

Query

Query と Index

Merge Join

色々

Query と MVP

(73)

#appengine ja night in kansai 2 ( #ajnk2 ) 73

Merge Join

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

条件

[Filter] 等式フィルタのみ

[Sort] なし

(74)

Merge Join

複数の Single Property Index をマージしながら検 索⇒ "Merge Join"

Key がソートされていることを利用して "zig-zag" ア ルゴリズムを使用

(75)

#appengine ja night in kansai 2 ( #ajnk2 ) 75

Merge Join

[Filter] a=1 and b=2 and c=3

(76)

Merge Join

[Filter] a=1 and b=2 and c=3

(77)

#appengine ja night in kansai 2 ( #ajnk2 ) 77

Merge Join

[Filter] a=1 and b=2 and c=3

(78)

Merge Join

[Filter] a=1 and b=2 and c=3

(79)

#appengine ja night in kansai 2 ( #ajnk2 ) 79

Merge Join

[Filter] a=1 and b=2 and c=3

(80)

Merge Join

[Filter] a=1 and b=2 and c=3

(81)

#appengine ja night in kansai 2 ( #ajnk2 ) 81

Merge Join

[Filter] a=1 and b=2 and c=3

(82)

Merge Join

[Filter] a=1 and b=2 and c=3

(83)

#appengine ja night in kansai 2 ( #ajnk2 ) 83

Merge Join

[Filter] a=1 and b=2 and c=3

(84)

Merge Join

[Filter] a=1 and b=2 and c=3

(85)

#appengine ja night in kansai 2 ( #ajnk2 ) 85

Merge Join

データ量が増えてくると Merge Join では処理しき れなくなる

⇒「 Custom Index が必要」というエラーになる

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

(86)

Query & Index Tables

Bigtable からのデータ取得

Datastore からのデータ取得

Query

Query と Index

Merge Join

色々

Query と MVP

(87)

#appengine ja night in kansai 2 ( #ajnk2 ) 87

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

制約

(88)

Keys Only Query

Entity 全体ではなく、キーだけを返す Query

Datastore Data Received from API quota

Datastore CPU Time quota

などを減らすことができる(特に Entity が大きな場 合)

(89)

#appengine ja night in kansai 2 ( #ajnk2 ) 89

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

制約

(90)

Queries on Key

キーに対してフィルタを指定することも可能

等式フィルタを使用するなら Query ではなく Get を使用すればいい

なので、通常は不等式フィルタを使用する

キーの降順ソートには Custom Index が必要

(91)

#appengine ja night in kansai 2 ( #ajnk2 ) 91

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

制約

(92)

Kindless Queries

Kind を指定しない Query

プロパティに対するフィルタやソートは指定できな い

Ancestor と Key フィルタのみ指定可能

※Java 版では Kindless Query には Key フィルタも使 用できない

(93)

#appengine ja night in kansai 2 ( #ajnk2 ) 93

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

制約

(94)

Not-Equal と IN フィルタ

データストア側でサポートされているのではなく DatastoreAPI 側でサポートされている

複数の Query を実行してその結果をマージしてい る

(95)

#appengine ja night in kansai 2 ( #ajnk2 ) 95

Not-Equal フィルタ

prop < value と prop > value の結果をマージ

Not-Equal(!=) は実際は不等式フィルタを実行する ので、不等式フィルタと同じ制約がある

(96)

IN フィルタ

IN は複数の等式フィルタをマージ

複数の IN を持つことは可能

IN(4 コ ) and IN(3 コ ) だと 12 コの Query を走らせ ることになる

(97)

#appengine ja night in kansai 2 ( #ajnk2 ) 97

Not-Equal と IN フィルタ

Not-Equal も IN も複数の Query を実行するので普 通の Query よりも遅い

使う前にパフォーマンスを見ておいたほうがいい

(98)

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

(99)

#appengine ja night in kansai 2 ( #ajnk2 ) 99

Unset and Nonindexed Properties

プロパティが設定されていない場合、その Entity は、そのプロパティに対するフィルタやソートの結 果には含まれない

注: null が設定されている状態とプロパティが設 定されていない状態は異なることに注意

(100)

Unset and Nonindexed Properties

プロパティが Text 型または Blob 型の場合は Index は作成されない

プロパティが Unindexed 指定されている場合は Index は作成されない

Index が作成されない場合は、そのプロパティに対 するフィルタやソートの結果には含まれない

(101)

#appengine ja night in kansai 2 ( #ajnk2 ) 101

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

制約

(102)

Sort Orders and Value Types

プロパティのソート順は型によって決まっている

整数型⇒数値

文字列型⇒ Unicode

(103)

#appengine ja night in kansai 2 ( #ajnk2 ) 103

Sort Orders and Value Types

ただし、 Entity はソフトスキーマであり同じプロパ ティに異なる型のデータを持つことができる

Entity1: propA = 123

Entity2: propA = " 田中 "

(104)

Sort Orders and Value Types

同じプロパティに異なる型のデータがある場合

GAE は、まず型でソートして、次にその型の中の値 でソートする。

例えば整数型は文字列型よりも先になる

Entity1: propA = 100

Entity2: propA = 200

Entity3: propA = "10"

(105)

#appengine ja night in kansai 2 ( #ajnk2 ) 105

Sort Orders and Value Types

注意点:整数型は浮動小数型よりも先になる

Entity1: propA = 15

Entity2: propA = 20

Entity3: propA = 10.5

Entity4: propA = 15.5

(106)

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

(107)

#appengine ja night in kansai 2 ( #ajnk2 ) 107

Ancestor Query

EntityGroup の祖先を指定して Entity を取得する Query

Kindless Ancestor Query

Kind 指定なし

Key フィルタのみ使用可能 (Java は不可 )

Ancestor Query

Kind 指定あり

プロパティフィルタ、ソート順を指定可能 ( 要 Custom Index)

(108)

Ancestor Query

Kindless Ancestor Query

⇒ おそらく Entities Table

Ancestor Query

⇒ おそらく Kind Index

プロパティフィルタ、ソート順を指定

⇒Custom Index

(109)

#appengine ja night in kansai 2 ( #ajnk2 ) 109

Kindless Ancestor Query

[Ancestor] Person(1)/Person(10)

(110)

Ancestor Query

[Kind] Food [Ancestor] User1

(111)

#appengine ja night in kansai 2 ( #ajnk2 ) 111

Ancestor Query

[Kind] Person [Ancestor] Foo1

[Filter] height >= 170 [Sort] height ASC

(112)

Ancestor Query

ルートまでに複数の祖先 Entity が存在する場

合、 Custom Index の Ancestor の部分は各 Entity に展開される

(113)

#appengine ja night in kansai 2 ( #ajnk2 ) 113

色々

Keys Only Query

Queries on Key

Kindless Queries

Not-Equal と IN フィルタ

Unset and Nonindexed Properties

Sort Orders and Value Types

Ancestor Query

制約

(114)

制約

あるプロパティをフィルタまたはソートするには、そ のプロパティが存在する必要がある

不等式フィルタが使用できるのは 1 つのプロパ ティに限られる

不等式フィルタで使用されているプロパティは他の ソート順よりも先にソートする必要がある

(115)

#appengine ja night in kansai 2 ( #ajnk2 ) 115

Query & Index Tables

Bigtable からのデータ取得

Datastore からのデータ取得

Query

Query と Index

Merge Join

色々

Query と MVP

(116)

MVP と等式フィルタ

Entity1(Key1)

favorite=["apple", "google"]

Entity2(Key2)

favorite=["google"]

Entity3(Key3)

favorite=["orange"]

(117)

#appengine ja night in kansai 2 ( #ajnk2 ) 117

MVP と等式フィルタ

(118)

MVP と等式フィルタ

[Filter] favorite="google"

(119)

#appengine ja night in kansai 2 ( #ajnk2 ) 119

MVP と等式フィルタ

リスト内のいずれかの値が等式フィルタに一致す れば取得される

(120)

MVP と等式フィルタ

[Filter] favorite="google" and favorite="apple"

Merge Join によって Entity1 が取得される

(121)

#appengine ja night in kansai 2 ( #ajnk2 ) 121

MVP と不等式フィルタ

Entity1(Key1)

val=[1, 3, 5]

Entity2(Key2)

val=[2, 3, 4]

(122)

MVP と不等式フィルタ

Entity1(Key1)

val=[1, 3, 5]

Entity2(Key2)

val=[2, 3, 4]

(123)

#appengine ja night in kansai 2 ( #ajnk2 ) 123

MVP と不等式フィルタ

[Filter] val >= 3

最初にマッチしたものが採用される

(124)

MVP とソート順

Entity1(Key1)

val=[1, 3, 5]

Entity2(Key2)

val=[2, 3, 4]

(125)

#appengine ja night in kansai 2 ( #ajnk2 ) 125

MVP とソート順

(126)

MVP とソート順

ASC でも DESC でも Entity1,Entity2 の順になる

(127)

#appengine ja night in kansai 2 ( #ajnk2 ) 127

インデックス爆発

MVP に対するフィルタを複数持つ Custom Index を 作成した場合

Entity1

val1: 要素数 10

val2: 要素数 10

Custom Index

[Sort] val1 ASC, val2 ASC

⇒Entity1 の Index は 100 行になる

(128)

インデックス爆発

1Entity に対するインデックス数は 5000 まで

Entity2

val1: 要素数 18

val2: 要素数 18

val3: 要素数 18

Query

[Filter] val1=x and val2=y and val3=z

(129)

#appengine ja night in kansai 2 ( #ajnk2 ) 129

インデックス爆発

Ancestor Query の Custom Index

Ancestor は展開される

深い EG を形成している場合に MVP との組み合 わせでインデックス爆発になりやすい

(130)

Next gen queries

Merge Join と Multi Query(Custom Index を使用す るもの ) の実装がパワーアップするらしい

http://code.google.com/events/io/2010/sessions /next-gen-queries-appengine.html

(131)

#appengine ja night in kansai 2 ( #ajnk2 ) 131

参考

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/

(132)

ありがとうございました

参照

関連したドキュメント

施設長 接遇のあり方、勉強会、資 第2 各部署の委員 料提供など全般 水曜日 ユニットリーダ 内部研修の企画・運営 ー MRSA、インフルエンザ、結 施設長 第1

Google マップ上で誰もがその情報を閲覧することが可能となる。Google マイマップは、Google マップの情報を基に作成されるため、Google

スライド P.12 添付資料1 補足資料1.. 4 審査会合における指摘事項..

• パフォーマンス向上コーディネーター( PICO )を発電所各部に 配置した。 PICO は、⽇々の不適合/改善に関するデータのスク

1.東京都合同チーム ( 東京 )…東京都支部加盟団体 24 団体から選ばれた 70 名が一つとなり渡辺洋一 支部長の作曲による 「 欅

東京都北区地域防災計画においては、首都直下地震のうち北区で最大の被害が想定され

○関計画課長

 本研究では,「IT 勉強会カレンダー」に登録さ れ,2008 年度から 2013 年度の 6 年間に開催され たイベント