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

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


  • 109 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


5

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

森下 真一

平成15年度 夏学期


5

問合せの代数


5

関係

属性例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)


5

Bags と 集合 意味論

Bags 意味論

集合意味論

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


5

問合せの代数

  •  和 交わり 差

  •  重複削除

  •  選択

  •  射影

  •  積

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

  • dangling レコード

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

  •  グループ分け


5

和 交わり 差

おなじ属性をもつ関係 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}


5

和 交わり 差

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}


5

重複削除

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

R

δ(R)

SQL では DISTINCT が重複を除去

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

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

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


Selection

選択 (Selection)

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

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

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

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

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

σa>1R(a,b)

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


Projection

射影(Projection)

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

  • L の属性としては

  •  関係 R の属性そのもの

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

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

Bags

意味論


Product

積(Product)

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

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

R × S

R

S

Bags 意味論


5

ジョイン(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

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)


5

wv

Windings 3 の wv で代用

正しい ジョイン記号

ジョイン記号の代用


Theta join

Theta Join

一般的なジョイン

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

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

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

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


Theta join1

Theta Join の例

R × S

R

S

σb+c>8(R × S)


Dangling

dangling レコードとジョイン

R

S

R wvS

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

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

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

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


Dangling1

dangling レコードの例

遺伝子観測量のデータ

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

R

S

R wvS


Semi join

セミジョイン(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

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

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

R wvouterS

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

R

S

R wvS

R wvouterS


5

アウタージョインの例

R

S

R wvouterS


5

正しい

アウタージョイン記号

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

wvouter

代用品


Grouping aggregation

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

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

SQL文

SELECT district, MIN(price) AS min

FROM R

GROUP BY district

HAVING COUNT(name) > 2


5

グループ分けと集約

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

R1=

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

πdistrict, min(σcount>2 R1)


5

グループ分けと集約

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

  • L の元は

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

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


5

問合せの代数: ソート

τa1,a2,a3,…,anR

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

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

辞書式順序でソート。

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

τa,b,cR


Expression tree

問合せ木(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


5

問合せ木

R

S

σa>1 AND c>5 R wvS


5

R

S

問合せ木

σa>1 AND c>5

πR.a→a,b,c

σR.a=S.a

×


5

σa>1 R

σc>5 S

問合せ木の改良

πR.a→a,b,c

σR.a=S.a

×

選択を最初に実行


5

問合せの代数の実装


5

講義順序

まず基本演算の実装

∪  ∩  -  δσπ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))


5

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

主記憶

ディスク

入力バッファ

4kB 平均 15msec

266kB/sec

データ転送量は

3桁以上の差

RDRAM 1.6GB/sec

IBM Regatta 12.8GB/sec

ブロック 4kB~

CPU

出力バッファ


5

実装の方針

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

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

  • 1回目で前処理

  • データベースをソート

  • ハッシュ表を生成

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


5

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

すべてのブロックを

1回だけ読み込む

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

CPU


5

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

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

整理して分割

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

B=1000 ブロック 

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


5

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

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

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

最悪 T 個のブロック転送

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

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


5

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

すべての

ブロックを

1回だけ

読み込む

十分な主記憶があり

既に読んだレコードか

否かの判定を高速に

実行できる場合

ハッシュ表や

平衡2分木で

管理できる

CPU


5

DBは1回だけ走査  集約δ

主記憶に下の

中間計算結果

が入る場合

すべての

ブロックを

1回だけ

読み込む

CPU

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


5

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


5

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

DBは1回だけ走査  Natural Join

R か S をすべて

主記憶に格納でき、

属性 a の値をもつ

レコードを高速に

検索できる場合

ハッシュ表や平衡2分木

R

S の

ハッシュ表

S

R wvS

R の各レコードを読み、

ハッシュ表を参照

CPU


Nested loop join

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 join1

ブロックを考慮した 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


5

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


5

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

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

Two-Phase Multiway Merge Sort

  • ブロックを M 個 読込む

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

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

ブロックを

M 個

読込む

ソート

CPU


Two phase multiway merge sort

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


Two phase multiway merge sort1

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日)


5

2

1

4

2

5

5

3

6

6

1

2

4

1

1

3

3

4

4

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

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

未処理の

レコードで

最小値を

重複を除き

出力

CPU


5

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

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

ソート

Yokohama

Chiba

Tokyo

CPU


5

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

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

Chiba

Tokyo

Yokohama

CPU


5

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

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) 個ブロック転送


5

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

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

属性 a の値がすべて同じ

Nested-Loop Join で対応

R(a,b)

S(a,c)


5

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

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 の値が一致するレコードは主記憶内に収まると仮定


5

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

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


5

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


5

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

各ブロックを読込む

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

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

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

一杯になったブロックは

ディスクへ書き出し、

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

ハッシュ表

ほぼ同じサイズの

バケットに分割

できると仮定

M-1個

M個

CPU

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

ディスク上に配置

M-1個のバケット


5

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

R1

R2

R3

R4

R5

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

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

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

バケット毎に独立して

重複除去を実行できる

DBを一回だけ走査する

重複除去を各バケットに

対して実行

M個

δ(R1)∪δ(R2)∪

δ(R3)∪δ(R4)∪

δ(R5)


5

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

R1

すべての

ブロックを

1回だけ

読み込む

十分な主記憶があり

既に読んだレコードか

否かの判定を高速に

実行できる場合

ハッシュ表や

平衡2分木で

管理できる

CPU


5

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

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

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

R1

R2

R3

R4

R5

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

必ず同じバケットと仮定

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

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

M個


5

ハッシュ・ジョイン

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

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

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

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

Processor

Processor

Processor

Memory

Memory

Memory

Disk

Disk

Disk


Shared nothing1

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 nothing2

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


5

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


5

インデックス

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

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

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

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

インデックス

ブロック


5

その他のインデックス

  •  2次的インデックス 

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

  • B-木 (B-trees)

  •  ハッシュ表

  • 技術的工夫

    • 更新への対応

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

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


5

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

σa=v(R)

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

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

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

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

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


5

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


Db multiway merge sort

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

M ブロック

ソート

CPU


Db multiway merge sort1

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

ソート

縦が

M ブロック

未処理の

レコードで

最小値を

選択・出力

CPU


Db multiway merge sort2

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

ソート

未処理の

レコードで

最小値を

選択・出力

CPU


Db multiway merge sort3

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 個


5

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


5

交換律と結合律

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 意味論と集合意味論

のどちらでも成立


5

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

  • 集合意味論では成り立つ分配律が 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 の属性でない


5

σ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

選択を先行実行するための操作  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 or1

選択を先行実行するための操作 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)}


5

選択を先行実行するための操作  ∪、-、×、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


5

選択を先行実行するための操作  ∪、-、×、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) のみに作用


5

射影の先行実行

  •  選択の先行実行

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

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

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

  • (bags 意味論の場合)

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

  •  集合意味論の場合

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


5

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

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

  • π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 の属性全体


5

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

  • π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 の属性


5

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

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

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

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

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

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

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

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


5

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

成立しない性質

δ(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)}

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

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


5

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


5

簡略化した 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’


5

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


5

問合せ木

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


5

問合せ木の変換

π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


5

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


5

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


5

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


5

問合せコストの近似


5

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

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

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

  •  中間計算結果の大きさ 

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

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


5

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

  • 近似の方法

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

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

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

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

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

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


5

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

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)


5

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

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もみたさないレコードの割合


5

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

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)}


5

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

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


5

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

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 join1

複数属性上の 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 join2

複数属性上の 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


5

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

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


5

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 は複数回出現する属性}

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


5

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


5

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

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

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

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

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


5

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

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個。


5

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

過去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


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


5

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


5

復習: 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) を内側のループ


5

ジョイン戦略の例

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


5

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! 個


5

ジョイン木の骨格の数

T(n)

wv

T(n-i)

T(i)

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


One pass join

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 を計算


Bushy one pass join

wv

wv

wv

R

S

T

U

bushy 木を One-pass Join で実装

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

    • 主記憶に格納するか、

    • ディスクに退避するか


5

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

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

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

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

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

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

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


5

動的計画法の例


R s t

{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


R wv t wv s wv u

RwvTwvSwvU のレコード数

((S wvT) wvR) wvU

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


R wv t wv s wv u1

RwvTwvSwvU の最良ジョイン木

全ジョイン木

での最良木

(bushy 木を含)


5

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

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

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

  • 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

貪欲(greedy)アルゴリズム

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

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

  •   部分集合を考慮

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

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

  •   各段階で残す


Greedy1

貪欲(greedy)アルゴリズム

計算しない


Acyclic hypergraph

ジョイン無矛盾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


5

動機

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

無駄がない状態とは?

関係 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について

局所的には無駄がない


5

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

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

bags 意味論

集合意味論

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


5

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

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

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


5

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

16個の

レコード

すべて

dangling

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

奇 偶

偶 奇

奇 偶

偶 奇

奇 偶

偶 奇


Dangling2

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 join1

セミジョイン(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)


Dangling3

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

効果がある場合

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

において宙ぶらり


Dangling4

セミジョインを使った 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) }


Dangling5

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

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

dangling

レコード

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

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

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

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

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


5

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

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


5

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


5

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

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


Full reducer

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)

削除

削除

削除


5

性質

定理

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

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

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

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

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

Full Reducer は何も除かない。

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

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


5

証明

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 hypergraph1

ジョインの射影を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


5

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}


5

ジョインの射影

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

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

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

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

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

効率をあげられないか?

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

効果的な方法がある


Yannakakis

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 上に射影


Yannakakis1

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

被射影属性は {a,g}


Yannakakis2

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))


Yannakakis3

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))


Yannakakis4

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))


Yannakakis5

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))

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


Yannakakis6

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 上に

射影しておしまい


Yannakakis7

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)) を計算できる


Yannakakis8

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