データベース論 - 問合せ最適化編
Sponsored Links
This presentation is the property of its rightful owner.
1 / 155

森下 真一 平成1 5 年度 夏学期 PowerPoint PPT Presentation


  • 122 Views
  • Uploaded on
  • Presentation posted in: General

データベース論 - 問合せ最適化編 参考教科書 H. Garcia-Morina, J. D. Ullman, and J. Widom. Database System Implementation. Prentice Hall, 2000, ISBN 0-13-040264-8 Chapter 6, 7. 森下 真一 平成1 5 年度 夏学期. 問合せの代数. 関係. 属性例 name, department, weight レコード属性の値の線形リスト (Tom, IS)(Paul, Physics) 関係レコードの集合

Download Presentation

森下 真一 平成1 5 年度 夏学期

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


データベース論 - 問合せ最適化編参考教科書H. Garcia-Morina, J. D. Ullman, and J. Widom. Database System Implementation.Prentice Hall, 2000, ISBN0-13-040264-8Chapter 6, 7

森下 真一

平成15年度 夏学期


問合せの代数


関係

属性例name, department,weight

レコード属性の値の線形リスト

(Tom, IS)(Paul, Physics)

関係レコードの集合

R(name, department)

R(name, department)={ (Tom,IS), (John,IS),(Paul,Physics) }

レコード t=(Tom, IS)

t[name] = Tom

t[name,deparment] = (Tom,IS)


Bags と 集合 意味論

Bags 意味論

集合意味論

{ (Tom,32), (Tom,29), (Tom,32), (John,45), (John48) }


問合せの代数

  •  和 交わり 差

  •  重複削除

  •  選択

  •  射影

  •  積

  •  ジョイン (Natural, Equi-, Theta-)

  • dangling レコード

  •  セミジョイン アウタージョイン

  •  グループ分け


和 交わり 差

おなじ属性をもつ関係 R と S

Bags意味論での定義

和R ∪ S各レコード r は R と S に出現する

(Union)回数の和だけ、r は R ∪ S に出現

交わりR ∩ S各レコード r は R と S に出現する回数

(Intersection)で少ない方の回数だけR ∩ S に出現

差R ー S各レコード r は R と S に出現する

(Difference)回数の差だけ R - S に出現

R={0,1,1,1,3,3} S={1,2,2,3,3,3}

R ∪ S = {0,1,1,1,1,2,2,3,3,3,3,3}

R ∩ S = {1,3,3}

R ー S = {0,1,1}


和 交わり 差

Bags 意味論

R={0,1,1,1,3,3} S={1,2,2,3,3,3}

R ∪ S = {0,1,1,1,1,2,2,3,3,3,3,3}

R ∩ S = {1,3,3}

R ー S = {0,1,1}

集合意味論

R={0,1,3} S={1,2,3}

R ∪ S = {0,1,2,3}

R ∩ S = {1,3}

R ー S = {0}


重複削除

関係 R 中の重複したレコードを除く演算 δ(R)

R

δ(R)

SQL では DISTINCT が重複を除去

SQL での UNION, INTERSECT,EXCEPT は集合意味論

R UNION S は δ(R ∪ S) に対応

以降は bags 意味論。 必要におうじて重複除去して集合意味論。


選択 (Selection)

  • 関係 R から条件 C をみたすレコードを選択 σCR

  • 条件 C の中では、たとえば

  •  数式演算 (四則など)や文字列処理演算

  •  比較演算(<,>,等)

  •  命題論理の結合子(AND, OR, NOT)

σa>1R(a,b)

σa>1 AND NOT(a+b>5)R(a,b)


射影(Projection)

  • 関係 R のレコードを属性リスト L へ射影πLR

  • L の属性としては

  •  関係 R の属性そのもの

  • R の属性から、 a+b → x のように属性をつくってもよい

πa+b→x, a+c→yR(a,b,c)

Bags

意味論


積(Product)

関係 R、 S からレコードを選択し連結したレコードの全体 R × S

同一名の属性 a が R と S に現れる場合 R.a, S.a と改名

R × S

R

S

Bags 意味論


ジョイン(Join)

複数の関係に、積・選択・射影を適用してつくる関係

Natural (Equi-)Join R wvS = πL(σC(R × S))

条件 C は R と S に共通する属性 a,b,… を等しいとみなす

R.a=S.a AND R.b=S.b AND …

属性リスト L は a,b,…

属性の重複、たとえば R.a と S.a は一つにまとめる

R

S

R wvS


Natural Join の例

R × S

R

S

R wvS = πR.a→a,b,c(σR.a=S.a(R × S))

σR.a=S.a(R × S)


wv

Windings 3 の wv で代用

正しい ジョイン記号

ジョイン記号の代用


Theta Join

一般的なジョイン

Theta-Join R wvCS = σC(R × S)

関係 R × S の属性にたいする条件 C をつくる

研究当初は x θ y (ただし θ = >, <, …) の条件だけを

扱ったので Theta- (θ) とよばれる


Theta Join の例

R × S

R

S

σb+c>8(R × S)


dangling レコードとジョイン

R

S

R wvS

R の (1,2) は S の中で属性 a が一致するレコードがない。

dangling レコードと呼ぶ。  他の例 (3,5) ∈ S。

R から dangling レコードを除く操作 セミジョイン

R wvS に dangling レコードを残す操作アウタージョイン


dangling レコードの例

遺伝子観測量のデータ

微量に出現しているため観測がむずかしい遺伝子が多い

R

S

R wvS


セミジョイン(semi-join)

R wvS で分かる R の dangling レコードを除く操作

R n S = πL (R wvS)

L は R の属性のリスト(n はフォント msbm5 の n)

R

S

R wvS

R n S


アウタージョイン(outer-join)

R wvS に dangling レコードを追加した関係 

R wvouterS

dangling レコードに null 記号(⊥) を補うことで情報の欠落をふせぐ

R

S

R wvS

R wvouterS


アウタージョインの例

R

S

R wvouterS


正しい

アウタージョイン記号

アウタージョイン記号は…

wvouter

代用品


グループ分け(Grouping)と集約(Aggregation)

3件以上お店のある地域で、一番安いラーメンの価格は?

SQL文

SELECT district, MIN(price) AS min

FROM R

GROUP BY district

HAVING COUNT(name) > 2


グループ分けと集約

3件以上お店のある地域で、一番安いラーメンの価格は?

R1=

γdistrict,MIN(price)→min,COUNT(name)→count R

πdistrict, min(σcount>2 R1)


グループ分けと集約

  • γL R=γdistrict,MIN(price)→min,COUNT(name)→count R

  • L の元は

  • グループ分けの対象となる属性(複数可)district と soup (スープの種類)でグループ分けなど

  • 属性を引数とする集約演算子MIN(price), MAX(price), AVG(price), SUM(price), count(name) など


問合せの代数: ソート

τa1,a2,a3,…,anR

R の元を属性 a1 の値でソートする。

a1 で同一のレコードは a2 でソートし、an まで使って

辞書式順序でソート。

ソートは問合せの実行スピードを上げるのに利用

τa,b,cR


問合せ木(Expression Tree)

πdistrict, min(σcount>2 (γdistrict,MIN(price)→min,COUNT(name)→count R))

πdistrict, min

σcount>2

γdistrict,MIN(price)→min,COUNT(name)→count

R


問合せ木

R

S

σa>1 AND c>5 R wvS


R

S

問合せ木

σa>1 AND c>5

πR.a→a,b,c

σR.a=S.a

×


σa>1 R

σc>5 S

問合せ木の改良

πR.a→a,b,c

σR.a=S.a

×

選択を最初に実行


問合せの代数の実装


講義順序

まず基本演算の実装

∪  ∩  -  δσπwvγ

つづいて演算を複数組み合わせた問合せの実装

σa>1 AND c>5 R wvS

R(a,b,c) wvR(b,c,d) wvR(b,d,e) wvR(c,d,f)

R(a,b) wvR(b,c) wvR(c,d) wvR(d,a)

πa,e,f(R(a,b,c) wvR(b,c,d) wvR(b,d,e) wvR(c,d,f))


ディスク ブロック バッファ データ転送ボトルネック 

主記憶

ディスク

入力バッファ

4kB 平均 15msec

266kB/sec

データ転送量は

3桁以上の差

RDRAM 1.6GB/sec

IBM Regatta 12.8GB/sec

ブロック 4kB~

CPU

出力バッファ


実装の方針

  • データベース(DB)読み込み回数をへらしたい

  • 1回だけDBを走査すればよい容易な場合あり

  • 1回目で前処理

  • データベースをソート

  • ハッシュ表を生成

  • インデックスを生成 2回目の読み込みで結果を書き出す


DBは1回だけ走査  選択σ 射影π

すべてのブロックを

1回だけ読み込む

πa+b→x, a+c→yR(a,b,c)

CPU


DBは1回だけ走査  選択σ 射影π

関係 R は B 個のブロックに

整理して分割

B 個のブロック転送で済む

B=1000 ブロック 

1ブロック=4kB 平均 15msec 15秒


DBは1回だけ走査  選択σ 射影π

関係 R の T 個のレコードが

バラバラのブロックに点在

最悪 T 個のブロック転送

T=100,000レコード  100,000ブロック

1ブロック=4kB 平均 15msec 1500秒


DBは1回だけ走査  重複削除 δ

すべての

ブロックを

1回だけ

読み込む

十分な主記憶があり

既に読んだレコードか

否かの判定を高速に

実行できる場合

ハッシュ表や

平衡2分木で

管理できる

CPU


DBは1回だけ走査  集約δ

主記憶に下の

中間計算結果

が入る場合

すべての

ブロックを

1回だけ

読み込む

CPU

πdistrict, min(σcount>2 (γdistrict,MIN(price)→min,COUNT(name)→count R))


DBは1回だけ走査  和 交わり 差

すべての

ブロックを

1回だけ

読み込む

R ∪ S はブロックを

コピーすればよい

R ∩ S、 R - S は?

R

S

Rのレコードの頻度表

が入る場合

R={0,1,1,1,3,3}

S={1,2,2,3,3,3}

R ∩ S =

{1,3,3}

CPU


DBは1回だけ走査  積

R もしくは S が

主記憶に入る場合

R が入る場合、まず

R を主記憶に格納

R

すべての

ブロックを

1回だけ

読み込む

S

R={0,1,1,1,3,3}

S={1,2,2,3,3,3}

R={0,1,1,1,3,3}

Sの各レコードに対しRの各レコードを連結すればよい

CPU


DBは1回だけ走査  Natural Join

R か S をすべて

主記憶に格納でき、

属性 a の値をもつ

レコードを高速に

検索できる場合

ハッシュ表や平衡2分木

R

S の

ハッシュ表

S

R wvS

R の各レコードを読み、

ハッシュ表を参照

CPU


Nested-Loop Join

R、S どちらも主記憶に格納できない場合

R(a,b)

for s ∈ S do

for r ∈ R do

r と s が属性 a で一致

するならば、r と s を

融合したレコードを出力

S(a,c)

RとSのブロック数 B(R),B(S)

B(R)×B(S)個のブロックが

読み出される

CPU

R wvS


ブロックを考慮した Nested-Loop Join の工夫

外のループ

S はブロック単位に

主記憶にできるだけ、

例えば M-1 ブロック読む。

属性 a で高速検索。

内のループ

R もブロック単位に読み、

属性 a が一致する S の

レコードを高速検索

R(a,b)

S(a,c)

ブロック数 B(R),B(S)

ブロック読み出し総回数

B(S)/(M-1) × (M-1 +B(R))

= B(S)+B(S)B(R)/M-1 ≒B(R)B(S)/M


問合せの代数の実装DBを2回走査することでより大きな DB を処理できる方法ソートをつかう場合


DB を2回走査する方法 ソート

主記憶に入らないDB のソート

Two-Phase Multiway Merge Sort

  • ブロックを M 個 読込む

  • 主記憶内でソート ブロックを読込む 時間内に通常は ソートできる

  • ソートされた M 個の ブロックグループが 複数できる

ブロックを

M 個

読込む

ソート

CPU


4

2

3

1

2

5

4

5

2

1

3

4

6

1

6

1

2

4

1

1

3

3

4

4

Two-Phase Multiway Merge Sort

未処理のレコードへのポインタ

ソートされた

グループから

各々1ブロック

主記憶に読む

未処理の

レコードで

最小値を

選択・出力

CPU


2

5

6

1

2

4

1

1

3

3

4

4

Two-Phase Multiway Merge Sort のデータ量の限界

総ブロック数 B

M 個

B/M 個

未処理の

レコードで

最小値を

選択・出力

主記憶にブロックを M 個保持できる場合、B/M ≦ M

B ≦ M2のデータまでソートできる。  入出力は 4B ブロック。

例 4kBのブロックを, 15msec で転送できる場合の合計時間

M = 103, B = 106主記憶4MBで 4GB を 60,000秒

M = 104, B = 108主記憶40MBで 400GB を 6,000,000秒 (約70日)


2

1

4

2

5

5

3

6

6

1

2

4

1

1

3

3

4

4

ソートをつかい DB を2回走査して重複除去

M 個のブロック毎にソートしておく

未処理の

レコードで

最小値を

重複を除き

出力

CPU


ソートを使ったグループ分けと集約

M 個のブロック毎にグループの対象属性でソートしておく

ソート

Yokohama

Chiba

Tokyo

CPU


ソートを使ったグループ分けと集約

同一グループ属性値をもつデータが順番に入力

Chiba

Tokyo

Yokohama

CPU


ソートを使ったジョインの実装

R(a,b) wvS(a,c)

まず R(a,b) および S(a,c) を属性 a で一気にソートしてしまう

4B(R)+4B(S) 個のブロック転送

R(a,b)

2つのソートされたリストを merge

属性 a の値が一致するレコードは

主記憶内に収まると仮定

ソート済み

S(a,c)

各々、複数ブロック読込む

B(R)+B(S) 個ブロック転送


ソートを使ったジョインの実装

効き目がない最悪のデータ

属性 a の値がすべて同じ

Nested-Loop Join で対応

R(a,b)

S(a,c)


ソートを使ったジョインの実装 (改良版)

M 個のブロック毎に属性 a でソート (全体をソートしない)

2B(R)+2B(S) 個のブロック転送で済ましておく

2

2

3

R(a,b)

1

2

2

B(R)+B(S)個

のブロック転送

S(a,c)

1

1

2

属性 a の値が

最小のレコード

間でジョインを

実行して出力

3

4

5

R(a,b) wvS(a,c)

やはり 属性 a の値が一致するレコードは主記憶内に収まると仮定


ソートを使ったその他の実装

 ∪、∩、- もジョインと同様に実装可能


問合せの代数の実装DBを2回走査することでより大きな DB を処理できる方法ハッシュ関数をつかう場合問合せの並列化


ハッシュ関数をつかって関係を分割 

各ブロックを読込む

各レコードをハッシュ表で

M-1個のバケットに分配

バケットは複数のブロック

一杯になったブロックは

ディスクへ書き出し、

新しい空のブロックを用意

ハッシュ表

ほぼ同じサイズの

バケットに分割

できると仮定

M-1個

M個

CPU

同じバケット毎に整理して

ディスク上に配置

M-1個のバケット


ハッシュをつかった重複除去

R1

R2

R3

R4

R5

同じ値をもつレコードは必ず

同じバケットにあると仮定

(むろん同じ値をもつレコードがバケットに入らないほどあれば、この仮定は崩れる。ソートをつかった方法を利用すべき)

バケット毎に独立して

重複除去を実行できる

DBを一回だけ走査する

重複除去を各バケットに

対して実行

M個

δ(R1)∪δ(R2)∪

δ(R3)∪δ(R4)∪

δ(R5)


DBは1回だけ走査する重複削除を各バケットに適用

R1

すべての

ブロックを

1回だけ

読み込む

十分な主記憶があり

既に読んだレコードか

否かの判定を高速に

実行できる場合

ハッシュ表や

平衡2分木で

管理できる

CPU


ハッシュをつかったグループ分けと集約

γL(R)グループ分けの対象となる属性 L の値をつかい

ハッシュ関数で分割しておく

R1

R2

R3

R4

R5

L が同じ値をもつレコードは

必ず同じバケットと仮定

バケット毎に独立してグループ分けと集約を実行できる

DBを一回だけ走査するグループ分けを各バケットに対して実行

M個


ハッシュ・ジョイン

R(a,b) wvS(a,c)

まず R(a,b) および S(a,c) を属性 a の値によりハッシュで分割

2B(R)+2B(S) 個のブロック転送

R1

R2

R3

R4

R5

属性 a が同じ値をもつレコードは

必ず同じバケットと仮定

バケット毎に独立してジョインを実行

DBを一回だけ走査するジョインを

Riと Siの組に対して実行し和をとる

R(a,b)

S(a,c)

S1

S2

S3

S4

S5

R1(a,b) wvS1(a,c) ∪

R2(a,b) wvS2(a,c) ∪

:

R5(a,b) wvS5(a,c)


Shared-Nothing 型並列計算機でのハッシュ・ジョイン

DB 問合せは、Shared-Nothing 型並列計算機での実行になじむため

Shared-Nothing 型はデータベース用計算機として標準的

Processor

Processor

Processor

Memory

Memory

Memory

Disk

Disk

Disk


R1

R2

R3

R4

R5

R(a,b)

S(a,c)

S1

S2

S3

S4

S5

Shared-Nothing 型並列計算機でのハッシュ・ジョイン

Processor

Processor

Processor

各プロセッサに均等に

分配し個別にジョインする

Memory

Memory

Memory

R1

R4

R2

R5

R3

S1

S4

S2

S5

S3


Shared-Nothing 型並列計算機でのハッシュ・ジョイン

p 個のディスクへ分配し、入出力を並列化することで性能を向上

均等に分配された後は、各プロセッサは1回の入力で

(B(R)+B(S))/p ブロックだけ転送すればよい

B(R)=1000, B(S)=500, プロセッサ数=10

各プロセッサに 150ブロック

ハッシュ後、9プロセッサに 150*9=1350ブロック転送

その後はプロセッサ毎に 150ブロックを入力

Processor

Processor

Processor

Memory

Memory

Memory

R1

R4

R2

R5

R3

S1

S4

S2

S5

S3


問合せの代数の実装インデックスが利用できる場合


インデックス

インデックス: 属性 a の値が v となるレコードが

どのブロックにあるか、おおよその位置を保持した表

例えば、識別子(ID) の順番にレコードをディスク上に格納

インデックスは各 ID が格納されたブロックのおおよその位置を保持

インデックス

ブロック


その他のインデックス

  •  2次的インデックス 

  • 複数の属性にインデックス (例 名前と電話番号)

  • B-木 (B-trees)

  •  ハッシュ表

  • 技術的工夫

    • 更新への対応

    • 大量のデータにもアクセス速度を劣化させない

詳しくは 参考教科書の 4 章を参照H. Garcia-Morina, J. D. Ullman, and J. Widom. Database System Implementation.Prentice Hall, 2000, ISBN0-13-040264-8


インデックスを利用した問合せの高速化

σa=v(R)

属性 a にインデッスクがある場合 

⇒ インデックスをつかった高速なアクセス

R(a,b) wvS(a,c)

S(a,c) の属性 a にインデッスクがある場合 

⇒ R(a,b) の各レコード毎に   インデックスをつかった問合せを実行


問合せの代数の実装DBを2回より多く走査することでより大きな DB を処理できる方法


2回より多く DB を走査する Multiway Merge Sort

M ブロック

ソート

CPU


2回より多く DB を走査する Multiway Merge Sort

ソート

縦が

M ブロック

未処理の

レコードで

最小値を

選択・出力

CPU


2回より多く DB を走査する Multiway Merge Sort

ソート

未処理の

レコードで

最小値を

選択・出力

CPU


2回より多く DB を走査する Multiway Merge Sort

  • B 個のブロックからなる関係 R をソート

  • 主記憶中に M ブロック格納する領域を確保できると仮定

  • ステップ1

    • B ≦ M のとき、関係 R をソート

  • ステップ2

    • B > M のとき、関係R を M 個 R1, R2, ..., RMに分割

    • 各 Riを、ステップ1と2によりソート

    • 最後にR1, R2, ..., RMを merge sort

ステップ1と2を n 回実行すれば最大 Mnブロックのデータまでソート可

M が B1/n個以上で、 B 個のブロックに入ったデータをソート可

入出力されるブロックの総数は 2nB 個


問合せ速度を改善するための代数的操作


交換律と結合律

R × S = S × R(R× S) × T = R × (S × T)

Natural Join

R wvS= S wvR(Rwv S) wv T = R wv (S wv T)

R ∪ S = S ∪ R(R ∪ S) ∪ T = R ∪ (S ∪ T)

R ∩ S = S ∩ R(R ∩ S) ∩ T = R ∩ (S ∩ T)

∪ と ∩ に関する交換律と結合律は、 bags 意味論と集合意味論

のどちらでも成立


代数的操作がうまくゆかない例

  • 集合意味論では成り立つ分配律が bags 意味論だと不成立

  • R=S=T={a}

  • R ∩ (S ∪ T) = {a} ∩ {a,a} = {a} (R ∩ S) ∪ (R ∩ T) = {a} ∪ {a} = {a,a}

  • Theta-Join では 結合律が必ずしも成り立たない

  • R(a,b), S(b,c), T(c,d)

  • (R wvR.b > S.bS) wva < dT

  • R wvR.b > S.b(S wva < dT)a は S と T の属性でない


σa>1 R

σc>5 S

選択を先行実行して効果がある例 

σa>1 AND c>5 R wvS

πR.a→a,b,c

σR.a=S.a

×

R

S


選択を先行実行するための操作  AND, OR

σC1 AND C2(R) = σC1(σC2(R)) = σC2(σC1(R))

C1 と C2 どちらを先に実行してもよい

R が重複したレコードのない集合である場合

σC1 OR C2(R) = σC1(R) ∪set σC2(R)

ただし ∪setは集合和

R が重複したレコードが存在する場合

σC1 OR C2(R) = σC1(R) ∪ σC2(R)

は必ずしも成り立たない

∪ は bag 意味論であることに注意


選択を先行実行するための操作 AND, OR

σC1 OR C2(R) = (σC1(R)) ∪ (σC2(R)) ??

反例

R(a,b) ={(1,2)}

σa>0 OR b>1(R) = {(1,2)}

(σa>0(R)) ∪ (σb>1(R))={(1,2)} ∪ {(1,2)} ={(1,2),(1,2)}

(1,2) が a>0 と b>1 を同時に満たすため

成り立つ場合

σa>0 OR a<0(R) = {(1,2)}

2つの条件 a>0 と a<0 が同時に成り立たない場合

(σa>0(R)) ∪ (σa<0(R)) = {(1,2)} ∪ {} ={(1,2)}


選択を先行実行するための操作  ∪、-、×、wv、∩

σC(R ∪ S) = σC(R) ∪ σC(S)

σC(R ー S) = σC(R) ー σC(S) = σC(R) ー S

以下、条件 C に現れる属性は、すべて R の属性と仮定

σC(R × S) = σC(R) × S

積 × の場合、R と S は共通の属性を含まない

σC(R wv S) = σC(R) wv S

C が R と S に共通する属性を含む場合でも成立

σC(R ∩ S) = σC(R) ∩ S


選択を先行実行するための操作  ∪、-、×、wv、∩

例選択の先行実行

σ(a=1 OR a=3) AND b<c(R(a,b)wvS(b,c))

σC(R wv S) = σC(R) wv S は使えない 

条件が R(a,b) の属性以外に属性 c にも作用するから

    = σa=1 OR a=3 ( σb<c(R(a,b)wvS(b,c)) )

b<c を push

    = σa=1 OR a=3 (R(a,b)wvσb<c S(b,c) )

b<c を さらに push

    = (σa=1 OR a=3 R(a,b))wv(σb<c S(b,c))

a=1 OR a=3 は R(a,b) のみに作用


射影の先行実行

  •  選択の先行実行

  • 計算途中で生成されるレコードの数を減らす効果

  •  射影の先行実行は、効果的か?

  • 表の幅を狭くするが、レコードの数を減らさない

  • (bags 意味論の場合)

  • 選択の先行実行ほどの効果はない

  •  集合意味論の場合

  • 射影すると重複レコードを除ける場合がある


射影を先行実行するための操作

  • ジョイン等を実行するのに必要な属性と被射影属性を残す

  • πL(RwvS) =πL(πMRwvπNS)

  • M = S もしくは L に現れる R の属性全体

  • N = R もしくは L に現れる S の属性全体

  • πa+e→x,b→y(R(a,b,c,d)wvS(c,e,f))

  • =πa+e→x,b→y(πa,b,cR(a,b,c,d)wvπc,eS(c,e,f))

  • πL(RwvCS) =πL(πMRwvCπNS)

  • M = C もしくは L に現れる R の属性全体

  • N = C もしくは L に現れる S の属性全体

  • πL(R × S) =πL(πMR × πNS)

  • M = L に現れる R の属性全体

  • N = L に現れる S の属性全体


射影を先行実行するための操作

  • πL(R∪ S) =πL(R)∪ πL(S)

  • πL(R ∩S) =πL(R)∩ πL(S) は必ずしも成り立たない(∩ は bags 意味論)R(a,b) = {(1,2)}S(a,b) = {(1,3)}πa(R(a,b) ∩ S(a,b)) = πa({}) = {}

  • πaR(a,b) ∩ πaS(a,b) = {(1)} ∩ {(1)} = {(1)}

  • πL(σC(R)) = πL(σC(πM(R)))

  • M は L もしくは C に現れる R の属性


重複除去を先行実行するための操作

重複除去によりレコード数が減ることを期待して

重複除去を先行して実行する

δ(R × S) = δ(R) ×δ(S)

δ(R wv S) = δ(R) wvδ(S)

δ(R wvC S)= δ(R) wvCδ(S)

δ(σC(R))= σC(δ(R))

δ(R ∩ S)= δ(R) ∩ δ(S)


重複除去を先行実行するための操作

成立しない性質

δ(R ∪ S)= δ(R) ∪ δ(S)

δ(R ー S)= δ(R) ー δ(S)

反例R(a)={1,1}, S(a)={1}

δ( πa(R(a,b)) ) = πa( δ(R(a,b)) )

反例R(a,b) = {(1,2), (1,3)}

尚、集合意味論ではこれらの性質は成立

なぜならレコードの重複を許さない意味論だから


SQL 文の構文解析木から効率的な問合せを合成


簡略化した SQL

<Query> ::= <SFW>

<Query> ::= ( <Query> )

<SFW> ::= SELECT <SelList>

FROM <FromList>

WHERE <Condition>

<SelList> ::= <Attribute>, <SelList>

<SelList> ::= <Attribute>

<FromList> ::= <Relation>, <FromList>

<FromList> ::= <Relation>

<Condition> ::=

<Condition> AND <Condition>

<Condition> ::=

<Tuple> IN <Query>

<Condition> ::=

<Attribute> = <Attribute>

<Condition> ::=

<Attribute> LIKE <Pattern>

<Tuple> ::= <Attribute>

StarsIn(title, year, starName)

MovieStar(name, address,

gender, birthdate)

SELECT title

FROM StarsIn

WHERE starName IN (

SELECT name

FROM MovieStar

WHERE birthdate LIKE ‘%1960’

);

SELECT title

FROM StarsIn, MovieStar

WHERE starName = name AND

birthdate LIKE ‘%1960’


SQL文から問合せ木の生成

StarsIn(title, year, starName)

MovieStar(name, address,

gender, birthdate)

SELECT title

FROM StarsIn, MovieStar

WHERE starName = name AND

birthdate LIKE ‘%1960’

πtitle

SQL文の問合せ木への変換

(木の下から順番に)

<FromList> の関係の積

<Condition> を C として

選択 σCを適用

<SelList> の属性リスト L で

射影 πLを適用

σstarName = name AND

birthdate LIKE ‘%1960’

×

StarsIn

MovieStar


問合せ木

StarsIn(title, year, starName)

MovieStar(name, address,

gender, birthdate)

SELECT title

FROM StarsIn

WHERE starName IN (

SELECT name

FROM MovieStar

WHERE birthdate LIKE ‘%1960’

);

πtitle

σ

<Condition>

StarsIn

部分的問合せを

そのままの構造で表示

<Tuple>

IN

πname

σbirthdate LIKE ‘%1960’

<Attribute>

StarName

MovieStar


問合せ木の変換

πtitle

πtitle

σStarName=name

σ

<Condition>

StarsIn

×

<Tuple>

IN

Πname

StarsIn

δ

πname

σbirthdate LIKE ‘%1960’

<Attribute>

σbirthdate LIKE ‘%1960’

StarName

MovieStar

註: ‘<Tuple> IN 関係 R’ で抽出されるレコードは重複しない。

 結果を一致させるため、右の問合せ木で πname の後に

 重複削除する δ をほどこす。

MovieStar


wv

m2.starName = s.name

問合せ木

StarsIn(title, year, starName)

MovieStar(name, address,

gender, birthdate)

SELECT DISTINCT m1.title, m1.year

FROM StarsIn m1

WHERE m1.year - 40 <= (

SELECT AVG(birthdate)

FROM StarsIn m2, MovieStar s

WHERE

m2.starName = s.name AND

m1.title = m2.title AND

m1.year = m2.year

);

δ

Πm1.title, m1.year

σ

<Condition>

StarsIn m1

出演した俳優の平均年齢が

40歳以下の映画の

タイトルと製作年を求めよ

<=

m1.year - 40

γAvg(s.birthdate)

σm1.title = m2.title AND m1.year = m2.year

StarsIn m2

MovieStar s


wv

m1.title = m2.title AND m1.year = m2.year

wv

wv

m2.starName = s.name

m2.starName = s.name

問合せ木の変換

StarsIn(title, year, starName)

MovieStar(name, address,

gender, birthdate)

δ

δ

πm1.title, m1.year

σm1.year-40<=x

πm1.title, m1.year

実行を遅延

σ

<Condition>

StarsIn m1

StarsIn m1

<=

m1.year-40

γAvg(s.birthdate)

γm2.title, m2.year, Avg(s.birthdate)→x

σm1.title = m2.title AND m1.year = m2.year

m1のレコード

がないと計算が

進まない

StarsIn m2

MovieStar s

StarsIn m2

MovieStar s


wv

m1.title = m2.title AND m1.year = m2.year

wv

wv

m2.starName = s.name

m2.starName = s.name

問合せ木の変換

StarsIn(title, year, starName)

MovieStar(name, address,

gender, birthdate)

δ

πm1.title, m1.year

σm1.year-40<=x

m1とm2は

本質的に同じ

δ

πm2.title, m2.year

σm2.year-40<=x

StarsIn m1

γm2.title, m2.year, Avg(s.birthdate)→x

γm2.title, m2.year, Avg(s.birthdate)→x

StarsIn m2

MovieStar s

StarsIn m2

MovieStar s


問合せコストの近似


問合せコストは中間計算結果の大きさに依存

  • 問合せの実行中に生成される中間計算結果

  •  ブロック転送回数を低減するためにもブロックにまとめて保存

  •  中間計算結果の大きさ 

  •   (レコード数 × レコード長)を近似したい

  •  したがってレコード数を近似することが重要


中間計算結果のレコード数を近似

  • 近似の方法

  •  論理的に矛盾がないこと

  • たとえば (RwvT)wvS と Rwv(TwvS) の近似値は同じであるべき

  •  簡単に計算ができること  近似が実際に計算するのと同程度に重たいと無意味

  •  計算が容易なパラメータ (近似は粗くても妥協する)

  • T(R): 関係 R のレコード数

  • V(R,a): 属性 a における、異なる値の数


選択結果のレコード数を近似

S=σa=1(R)

a の値が異なるレコード数が同数ならば(むろん現実には偏りがあるが)

T(S) = T(R) / V(R,a)

T(S), T(R) は S と R のレコード数

S=σa≠1(R) の場合

T(S) = T(R) (V(R,a)-1)/ V(R,a)


選択結果のレコード数を近似

S=σC1 OR C2(R)

C1 をみたすレコードの割合 m1/T(R)

C1 をみたさないレコードの割合 1 - m1/T(R)

T(S) = T(R)×(1 - (1 - m1/T(R))×(1 - m2/T(R)))

C1もC2もみたさないレコードの割合


ジョイン結果のレコード数を近似するためのヒューリスティクス

R(a,b)S(b,c)

T(R)=1000T(S)=2000

V(R,b)=20V(S,b)=50

仮定 1 (属性値の包含)

属性 b の異なる値の数は、R が 20 個、S が 50 個

一般に V(R,b) ≦V(S,b) ならば

R の属性 b の値は、すべて S にも現れると仮定

仮定 2 (属性値の均等分布)

R のレコードは S のレコードと 1/V(S,b) の確率でジョインする

R(a,b) wv S(b,c) のレコード数:

T(R) × (1 / V(S,b)) × T(S) = T(R)T(S) / V(S,b)

属性値の包含性

一般に T(R)T(S) / max{V(R,b), V(S,b)}


ジョイン結果のレコード数を近似

R(a,b)S(b,c)U(c,d)

T(R)=1,000T(S)=2,000T(U)=5,000

V(R,b)=20V(S,b)=50

V(S,c)=100V(U,c)=500

R(a,b) wv S(b,c)

T(R)T(S) / max{V(R,b),V(S,b)} = 40,000

(R(a,b) wv S(b,c)) wv U(c,d)

T(RwvS)T(U) / max{V(RwvS,c),V(U,c)}

仮定 3 (属性値の保存)

RwvS で属性 c の値はジョイン後もすべて残ると仮定

つまり V(RwvS,c) = V(S,c)

= 40,000×5,000 / max{100,500} = 400,000


近似値がジョイン順序に依存しないこと

R(a,b)S(b,c)U(c,d)

T(R)=1,000T(S)=2,000T(U)=5,000

V(R,b)=20V(S,b)=50

V(S,c)=100V(U,c)=500

S(b,c) wv U(c,d)

T(S)T(U) / max{V(S,c),V(U,c)} = 20,000

R(a,b) wv (S(b,c) wv U(c,d))

T(R)T(SwvU) / max{V(R,b),V(SwvU,b)}

    属性値は保存されると仮定 V(SwvU,b)=V(S,b)

= 1,000×20,000 / max{20,50} = 400,000


複数属性上の Natural Join のレコード数を近似

R(a,b1,b2) wv S(b1,b2,c) のレコード数

T(R)T(S)

max{V(R,b1), V(S,b1)} max{V(R,b2), V(S,b2)}

  • R の属性 b1 の値が、S のレコードに現れる確率:

  • 属性値の包含と、均等分布を仮定すると

    • V(R,b1) ≧ V(S,b1) の場合

    • (V(S,b1) / V(R,b1)) × (1 / V(S,b1)) = 1 / V(R,b1)

    • V(R,b1) < V(S,b1) の場合: 1 / V(S,b1)

    • つまり1 / max{V(R,b1), V(S,b1)}

  • b2 の場合も同様に、 確率は  1 / max{V(R,b2), V(S,b2)}

  • 最後に b1 と b2 の値は独立に分布すると仮定


複数属性上の Natural Join のレコード数を近似

例 R(a,b1,b2)S(b1,b2,c)

T(R)=1000T(S)=2000

V(R,b1)=20V(S,b1)=50

V(R,b2)=100V(S,b2)=50

R(a,b1,b2) wv S(b1,b2,c) のレコード数

T(R)T(S)

max{V(R,b1), V(S,b1)} max{V(R,b2), V(S,b2)}

= 1000×2000 / 50×100

= 400


近似値がジョイン順序に依存しないこと

R(a,b)S(b,c)U(c,d)

T(R)=1,000T(S)=2,000T(U)=5,000

V(R,b)=20V(S,b)=50

V(S,c)=100V(U,c)=500

R(a,b) wv U(c,d)T(R)T(U) = 5,000,000

(R(a,b) wv U(c,d)) wv S(b,c)

T(RwvU) T(S)

max{V(RwvU,b),V(S,b)} max{V(RwvU,c),V(S,c)}

V(RwvU,b)=V(R,b), V(RwvU,c)=V(U,c) 属性値の保存より

= (5,000,000×2,000) / (max{20,50} max{500,100})

= 400,000


n個の関係をジョインした結果のレコード数を近似

S = R1wv R2wv R3wv ... wv Rn

属性 a が k 個の関係 R1, R2, R3, ..., Rk に現れ、しかも

V(R1,a) ≦ V(R2,a) ≦ V(R3,a) ≦ ... ≦ V(Rk,a)

であると、ジョインの交換律より、一般性を失わず仮定

R1, R2, R3, ..., Rk から各々レコードを選択したとき、

属性 a の値が一致する確率 P(a) は

1

V(R2,a) V(R3,a) ... V(Rk,a)

ただし 属性値の包含と、均等分布を仮定

S の大きさは 

T(R1)T(R2)... T(Rn) × Π{P(aj) | aj は複数回出現する属性}

この近似値はジョインの順序に依存しない


n個のジョイン結果のレコード数を近似

R(a,b,c)S(b,c,d)U(b,e)

T(R)=1000T(S)=2000T(U)=5000

V(R,a)=100

V(R,b)=20V(S,b)=50V(U,b)=200

V(R,c)=200V(S,c)=100

V(S,d)=400

V(U,e)=500

1

50×200

1

200

1000×2000×5000×

×

属性b

属性c

=5000


問合せコスト近似用のパラメータ

  •  計算が容易なパラメータ

  • T(R): 関係 R のレコード数

  • V(R,a): 属性 a における、異なる値の数

  • V(R,a)の数が少数の場合、  値ごとに頻度分布をとることで、より正確に近似可能


頻度分布を利用してジョインのレコード数を近似

R(a,b)

S(b,c)

R(a,b) wv S(b,c)

V(R,b) = 14

他の値の数は11個

V(S,b) = 13

他の値の数は10個

頻度分布が均一と

考える従来の近似では

1,000×500/14=35,714

0, 1, 2, 5 以外に現れる異なる b の値の数は、

R が10個、Sが9個。 両方に現れるのは9個。


ヒストグラムを利用した近似

過去10年間で、最高気温が同一の3月と7月の日を列挙せよ

March(day, temp)

July(day, temp)

SELECT March.day, July.day

FROM March, July

WHERE March.temp = July.temp

15-19 度20×5/5 = 20 レコード

20-24 度10×20/5 = 40 レコード

合計  60 レコード

均等な頻度分布を仮定して近似すると

310×310 / 40 = 2402.5


問合せ木の代数的変換と最終結果の近似

σa=10(R(a,b)wvS(b,c))

(σa=10R(a,b))wvS(b,c)

σa=10

100×2,000/200

=1,000

wv

50,000/50

=1,000

σa=10

wv

5,000/50

=100

S

5,000×2,000/200

=50,000

R

S

R


複数ジョインの問合せ戦略


復習: 2つの関係をジョインする戦略

R(a,b) wv S(b,c)

R(a,b) が S(b,c) より大きいと仮定

S(b,c) が主記憶に入る場合 (One-pass Join)

S(b,c) のレコードを属性 b の値でハッシュ

R(a,b) をディスクからブロックごとに転送

入らない場合

Nested-Loop Join

インデックスを利用したジョイン

R(a,b) を外側、S(b,c) を内側のループ


ジョイン戦略の例

StarsIn(title, year, starName)

MovieStar(name, address,

gender, birthdate)

SELECT title

FROM StarsIn, MovieStar

WHERE starName = name AND

birthdate LIKE ‘%1960’

πtitle

wv

starName = name

これら2つの関係の

大きさに応じて

ジョイン戦略を

適切に利用

StarsIn

σbirthdate LIKE ‘%1960’

MovieStar


3個以上の関係をジョインする表現: ジョイン木

R wvS wvT wvU

wv

wv

wv

wv

U

wv

wv

R

wv

wv

T

R

S

T

U

S

wv

R

S

T

U

左線形木

右の子は葉ノード

bushy 木

(低木)

右線形木

左の子は葉ノード

さらに各ジョイン木の骨格ごとに関係の順列は 4! 個


ジョイン木の骨格の数

T(n)

wv

T(n-i)

T(i)

各 i = 1, 2, ..., n-1 について


wv

wv

U

wv

T

R

S

左線形木を One-pass Join で実装

  • 利点: One-pass Join を実行し、中間結果は1つだけ保持

  • 中間結果は主記憶に格納できると仮定

  • 中間結果を小さくする工夫:

  • 関係の大きさを昇順 R ≦S ≦ T ≦ U で選ぶ

  • R を読込み、ジョインする属性でハッシュ

  • S を読込み、Sは外側ループで R wvS を計算

  • R を削除し、R wvS をジョインする属性でハッシュ

  • T を読込み、Tは外側ループで(R wvS) wvT を計算


wv

wv

wv

R

S

T

U

bushy 木を One-pass Join で実装

  • 複数の中間結果を管理する必要性

    • 主記憶に格納するか、

    • ディスクに退避するか


動的計画法による最良ジョイン木の選択

  •  レコード数T(R)、異なる値の数 V(R,a) をつかい

  • 中間結果のレコード数を近似

  •  中間結果のレコード数の和を、  ジョイン木の計算コストと考える

  •  最小コストの最良ジョイン木を動的計画法で計算

  •  全ジョイン木を対象にするか?

  •   左線形木に限定するか?


動的計画法の例


{R, S, T}の計算例

5,000×1,000/500

=10,000

2,000×1,000/200

=10,000

1M×1,000/(200×500)

=10,000

wv

wv

wv

5000

wv

T

1M

wv

S

2000

wv

R

R

S

R

T

S

T


RwvTwvSwvU のレコード数

((S wvT) wvR) wvU

10,000×1,000/(100×1,000)=100


RwvTwvSwvU の最良ジョイン木

全ジョイン木

での最良木

(bushy 木を含)


計算コストについての注意

  • 中間結果のレコード数の和を、

  • ジョイン木の計算コストとするのが不正確な場合

  • R(a,b) wvS(b,c)

  • R(a,b) に1つのレコード、S(b,c) の b にインデックスがある  ほとんど計算時間がかからない

  • R(a,b) に1つのレコード、S(b,c) にインデックスが無いS(b,c) の全ブロックを読込む手間

  •  これらの要素を取りこむのは容易  現実の DBシステムでは実行されている


貪欲(greedy)アルゴリズム

  •  動的計画法では i個の関係からなる全部分集合の

  •   最良ジョイン木を生成nC1 + nC2 +nC3 + ... + nCn = 2n -1 個の

  •   部分集合を考慮

  •  計算時間を減らすため貪欲アルゴリズムでは

  •   ジョイン木の計算コストが最小の部分集合だけを

  •   各段階で残す


貪欲(greedy)アルゴリズム

計算しない


ジョイン無矛盾Acyclic Hypergraph

Jeffrey D. Ullman: Principles of Database and Knowledge-base Systems,

Volume II, The New Technologies, Computer Science Press (1989)

ISBN 0-7167-8162X, Chapter 11


動機

ジョインを実行する前に無駄なレコードを減らせないか?

無駄がない状態とは?

関係 R(V1), R(V2), ..., R(Vn) Viは属性のリスト

大域的ジョイン無矛盾 (globally join consistent)

πVi (R(V1) wvR(V2) wv... wvR(Vn))=R(Vi)

すべてのレコードが最終的に使われる

局所的ジョイン無矛盾 (locally join consistent)

πVi (R(Vi) wvR(Vj))=R(Vi) 任意の i, jについて

局所的には無駄がない


ジョイン無矛盾は集合意味論を前提とする

R(a,b) = πa,b(R(a,b)wvR(b,c)) ??

bags 意味論

集合意味論

以後、集合意味論を仮定する


局所的だが、大域的ジョイン無矛盾でない例

R(a,b)wvR(b,c)wvR(c,a)={(2,2,2)}

R(Vi) に出現し、πVi (R(V1) wvR(V2) wv... wvR(Vn))に出現しないレコードを dangling(宙ぶらり)レコード


局所的だが、大域的ジョイン無矛盾でない例

16個の

レコード

すべて

dangling

R(a1,a2)wvR(a2,a3)wvR(a3,a1)= {}

奇 偶

偶 奇

奇 偶

偶 奇

奇 偶

偶 奇


dangling レコードの除去

dangling レコードをジョインを計算する前に

除去できないか?

計算中に生成されるレコードも無駄がなくなる

性質

大域的ジョイン無矛盾の場合は{V1, V2,..., Vn} の

任意の部分集合{W1, W2, ..., Wk} について

πW1 ∪ W2 ∪ ... ∪ Wk(R(V1) wvR(V2) wv... wvR(Vn))

=R(W1) wvR(W2) wv... wvR(Wk)


セミジョイン(semi-join)

R(a,b) n R(a,c) = πa,b(R(a,b) wvR(a,c))

= R(a,b) wvπaR(a,c)

R(a,b)wvR(a,c)

R(a,b)

R(a,b)nR(a,c)

πaR(a,c)

R(a,c)


セミジョインを使った dangling レコード除去

効果がある場合

R(a,b,c)wvR(c,d,e)

において宙ぶらり


セミジョインを使った dangling レコード除去

R(b,c) := R(b,c)nR(c,d)

R(a,b)oR(b,c) ⇒R(b,c)

R(a,b) := R(a,b)nR(b,c)

R(b,c)oR(c,d) ⇒R(c,d)

R(a,b)wvR(b,c)wvR(c,d)

={ (1,2,4,8) }


セミジョインを使った dangling レコード除去

dangling レコードを除去できない局所的ジョイン無矛盾な関係

dangling

レコード

R(a,b) n R(b,c)

= πa,b(R(a,b) wvR(b,c)) セミジョインの定義

= R(a,b)局所的ジョイン無矛盾

セミジョインを使った宙ぶらりレコード除去方法は

どこまで一般化できるか?


データベーススキーム と ハイパーグラフ

a

関係の集合 { R(V1), R(V2), ..., R(Vn) }

データベーススキーム { V1, V2, ..., Vn }

{R(a,d,e),R(b,d,f),R(c,e,f),R(d,e,f)}

{ade, bdf, cef, def}

註:属性の集合 {a,d,e} は

簡潔に ade と記述

データベーススキームの各属性をノード、

各要素(集合)をハイパー辺

(属性を線で囲んで表現)とするグラフ

d

e

b

f

c

{ade, bdf, cef, def}を

2通りのハイパーグラフで表現

d

a

b

e

c

f


GYOのハイパーグラフ簡略化

(Graham-Yu-Ozsoyoglu)

ハイパー辺 V に対して、あるハイパー辺 W が存在し

V の各属性は

(1) V にだけ現れるか、

(2) W にも現れる

のどちらかである場合、V は (W の)耳と呼ぶ

ade は def の耳

bdf は def の耳

V

a

W

d

e

b

f

c


d

e

b

f

c

d

e

f

c

GYOのハイパーグラフ簡略化

  • GYO のハイパーグラフ簡略化

  •  耳は存在する限り削除する

a

d

e

b

f

c

空の

グラフ

d

e

f

註:def は耳


Acyclic Hyper-graph / Full Reducer

GYO の簡略化で空になるハイパーグラフを Acyclic と呼ぶ

データベーススキームが Acyclic のとき、dangling レコードを

完全に除去するプログラム(Full Reducer) を次のように作成

複数のハイパー辺を含む Acyclic hyper-graph Gから

ハイパー辺 V1 が V2 の耳になり削除され、

hypergraph G-{V1} が生成された場合

R(V2) := R(V2) nR(V1)

G-{V1} に本手続きを適用

R(V1) := R(V1) nR(V2)

G-{V1}が1つのハイパー辺だけの場合は、何も生成しない

V1

V2


a

d

e

b

f

c

Full Reducer の例

ハイパー辺が削除された順番 abe, bdf, cef, def

R(d,e,f) := R(d,e,f) nR(a,d,e)

R(d,e,f) := R(d,e,f) nR(b,d,f)

R(d,e,f) := R(d,e,f) nR(c,e,f)

R(c,e,f) := R(c,e,f) nR(d,e,f)

R(b,d,f) := R(b,d,f) nR(d,e,f)

R(a,d,e) := R(a,d,e) nR(d,e,f)

削除

削除

削除


性質

定理

関係の集合 { R(V1), R(V2), ..., R(Vn) } の

データベーススキーム { V1, V2, ..., Vn } に対応する

ハイパーグラフが Acyclic の場合

Full Reducer により、すべての dangling レコードを除去できる

なお、Acyclic データベースが局所的ジョイン無矛盾ならば、

Full Reducer は何も除かない。

つまり dangling レコードは既に存在しないので、

大域的ジョイン無矛盾である 


証明

Full Reducer

R(V2) := R(V2) nR(V1)

G-{V1} の Full Reducer

R(V1) := R(V1) nR(V2)

r1

r2

rj

r

r1’

V1

V2

Vj

  • 帰納法

  • R(Vj) ⊇ πVj (R(V1) wvR(V2) wv... wvR(Vn)) は自明。逆を証明。

  •  最後のセミジョイン R(V1) := R(V1)nR(V2)は、任意の r1 ∈R(V1) に対し、  ある r2 ∈R(V2) が存在し、 r1 と r2 は V1∩V2 上で一致することを保証

  •  帰納法の仮定より r2 ∈πV2(R(V2) wv... wvR(Vn))

  • r1 と r2 は V1∩V2 で一致し、V1 は V2 の耳だから、r1 ∈πV1(R(V1) wvR(V2) wv... wvR(Vn))

  • 帰納法の仮定より、任意の rj∈R(Vj) を拡張した r ∈R(V2)wv...wvR(Vn)   が存在。 最初のセミジョイン R(V2) := R(V2)nR(V1) は、あるr1’∈R(V1)  と r が V1∩V2 上で一致することを保証。  したがってrj ∈πVj (R(V1) wvR(V2) wv... wvR(Vn))


ジョインの射影をAcyclic Hypergraphで効率的に計算

Jeffrey D. Ullman: Principles of Database and Knowledge-base Systems,

Volume II, The New Technologies, Computer Science Press (1989)

ISBN 0-7167-8162X, Chapter 11


a

def

e

d

ade

bdf

cef

b

f

c

i

g

cg

ci

GYOの簡略化プロセスを木構造化

GYO簡略化で V を W の

耳として削除するとき、

V を子、W を親ノードとする

{ade, bdf, cef,

def, cg, ci}


ジョインの射影

πX1, X2, ..., Xk (R(V1) wvR(V2) wv... wvR(Vn))

集合意味論を仮定(bags意味論でない)

ジョイン R(V1) wvR(V2) wv... wvR(Vn)

を計算してから射影するのではなく、

射影を実行しつつジョインを計算することで

効率をあげられないか?

データベーススキームのハイパーグラフが Acyclic だと

効果的な方法がある


Yannakakis のアルゴリズム

πX(R(V1) wvR(V2) wv... wvR(Vn))

{ V1, V2, ..., Vn } のハイパーグラフは Acyclic

X の属性は 「被射影属性」 とよぶ

ステップ1Full Reducer で dangling レコードをすべて除去

ステップ2GYO簡略化プロセスを木構造化し、ボトムアップに走査

(すべての子ノードの後に親ノードを訪問する順番)

ノード V を訪問しているときの親ノードを W

W に加え V にあり W にない被射影属性上に射影した

πW ∪ (X ∩(V - W))(R(W) wvR(V))

を親ノード W の関係として置き換える

ステップ3根ノードに計算された関係を X 上に射影


Yannakakis のアルゴリズムの実行例

被射影属性は {a,g}


Yannakakis のアルゴリズムの実行例

{c,e,f}∪({a,g}∩({c,g}-{c,e,f}))

= {c,e,f,g}

πc,e,f,g(R(c,e,f)wvR(c,g))


Yannakakis のアルゴリズムの実行例

{c,e,f,g}∪({a,g}∩({c,i}-{c,e,f,g}))

= {c,e,f,g}

変化なし

πc,e,f,g(R(c,e,f,g)wvR(c,i))


Yannakakis のアルゴリズムの実行例

{d,e,f}∪({a,g}∩({c,e,f,g}-{d,e,f})) = {d,e,f,g}

πd,e,f,g(R(d,e,f)wvR(c,e,f,g))


Yannakakis のアルゴリズムの実行例

{d,e,f,g}∪({a,g}∩({b,d,f}-{d,e,f,g})) = {d,e,f,g}

R(d,e,f,g)wvR(b,d,f)

πd,e,f,g(R(d,e,f,g)wvR(b,d,f))

集合意味論をとっているので


Yannakakis のアルゴリズムの実行例

{d,e,f,g}∪({a,g}∩({a,d,e}-{d,e,f,g})) = {a,d,e,f,g}

πa,d,e,f,g(R(d,e,f,g)wvR(a,d,e))

被射影属性 a,g 上に

射影しておしまい


Yannakakis のアルゴリズムの正当性

  • ステップ2の各ノード V で以下の性質が成り立つことを、

  • ノードの訪問順序に関する帰納法で証明できる

    • πW ∪ (X ∩(V - W))(R(W) wvR(V))=πW ∪ (X ∩(V - W))(R(V1) wvR(V2) wv... wvR(Vn))中間の計算結果のレコード数は、すべての関係のジョインのレコード数を超えない

    • W ∪ (X ∩(V - W)) は V を根とする部分木に現れる

    • すべての被射影属性を含む

  • 従って根ノードで最終的に計算される関係 R(U) は

    • R(U) = πU(R(V1) wvR(V2) wv... wvR(Vn))

    • X ⊆ U

  • よって R(U) を X 上に射影すれば

  • πx(R(V1) wvR(V2) wv... wvR(Vn)) を計算できる


Yannakakis のアルゴリズムの計算効率

ステップ2でノード V を訪問時に親ノードW(あるViに一致)に

計算される関係は

πW ∪ (X ∩(V - W))(R(V1) wvR(V2) wv... wvR(Vn))

⊆ R(W) × πX ∩(V - W)(R(V1) wvR(V2) wv... wvR(Vn))

W と X ∩(V - W) に共通する属性がないから

|πX ∩(V - W)(R(V1) wvR(V2) wv... wvR(Vn))| ≦

|πX (R(V1) wvR(V2) wv... wvR(Vn))|

つまり中間の関係のレコード数は、ある入力の関係 Vi (=W)のレコード数と、最終計算結果の関係のレコード数の積で抑えられる


  • Login