slide1
Download
Skip this Video
Download Presentation
森下 真一 平成1 5 年度 夏学期

Loading in 2 Seconds...

play fullscreen
1 / 155

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


  • 147 Views
  • Uploaded on

データベース論 - 問合せ最適化編 参考教科書 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) 関係 レコードの集合

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 森下 真一 平成1 5 年度 夏学期' - tavita


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
slide1

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

森下 真一

平成15年度 夏学期

slide3
関係

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

slide4
Bags と 集合 意味論

Bags 意味論

集合意味論

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

slide5
問合せの代数
  •  和 交わり 差
  •  重複削除
  •  選択
  •  射影
  •  積
  •  ジョイン (Natural, Equi-, Theta-)
  • dangling レコード
  •  セミジョイン アウタージョイン
  •  グループ分け
slide6
和 交わり 差

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

slide7
和 交わり 差

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}

slide8
重複削除

関係 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 意味論

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

slide14

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

slide22

正しい

アウタージョイン記号

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

wvouter

代用品

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

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

SQL文

SELECT district, MIN(price) AS min

FROM R

GROUP BY district

HAVING COUNT(name) > 2

slide24
グループ分けと集約

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

R1=

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

πdistrict, min(σcount>2 R1)

slide25
グループ分けと集約
  • γL R=γdistrict,MIN(price)→min,COUNT(name)→count R
  • L の元は
  • グループ分けの対象となる属性(複数可)district と soup (スープの種類)でグループ分けなど
  • 属性を引数とする集約演算子MIN(price), MAX(price), AVG(price), SUM(price), count(name) など
slide26
問合せの代数: ソート

τ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

slide28
問合せ木

R

S

σa>1 AND c>5 R wvS

slide29

R

S

問合せ木

σa>1 AND c>5

πR.a→a,b,c

σR.a=S.a

×

slide30

σa>1 R

σc>5 S

問合せ木の改良

πR.a→a,b,c

σR.a=S.a

×

選択を最初に実行

slide32
講義順序

まず基本演算の実装

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

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

主記憶

ディスク

入力バッファ

4kB 平均 15msec

266kB/sec

データ転送量は

3桁以上の差

RDRAM 1.6GB/sec

IBM Regatta 12.8GB/sec

ブロック 4kB~

CPU

出力バッファ

slide34
実装の方針
  • データベース(DB)読み込み回数をへらしたい
  • 1回だけDBを走査すればよい容易な場合あり
  • 1回目で前処理
  • データベースをソート
  • ハッシュ表を生成
  • インデックスを生成 2回目の読み込みで結果を書き出す
slide35
DBは1回だけ走査  選択σ 射影π

すべてのブロックを

1回だけ読み込む

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

CPU

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

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

整理して分割

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

B=1000 ブロック 

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

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

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

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

最悪 T 個のブロック転送

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

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

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

すべての

ブロックを

1回だけ

読み込む

十分な主記憶があり

既に読んだレコードか

否かの判定を高速に

実行できる場合

ハッシュ表や

平衡2分木で

管理できる

CPU

slide39

DBは1回だけ走査  集約δ

主記憶に下の

中間計算結果

が入る場合

すべての

ブロックを

1回だけ

読み込む

CPU

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

slide40

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

slide41

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

slide45
問合せの代数の実装DBを2回走査することでより大きな DB を処理できる方法ソートをつかう場合
slide46
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日)

slide49

2

1

4

2

5

5

3

6

6

1

2

4

1

1

3

3

4

4

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

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

未処理の

レコードで

最小値を

重複を除き

出力

CPU

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

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

ソート

Yokohama

Chiba

Tokyo

CPU

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

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

Chiba

Tokyo

Yokohama

CPU

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

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

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

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

属性 a の値がすべて同じ

Nested-Loop Join で対応

R(a,b)

S(a,c)

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

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

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

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

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

各ブロックを読込む

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

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

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

一杯になったブロックは

ディスクへ書き出し、

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

ハッシュ表

ほぼ同じサイズの

バケットに分割

できると仮定

M-1個

M個

CPU

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

ディスク上に配置

M-1個のバケット

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

R1

R2

R3

R4

R5

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

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

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

バケット毎に独立して

重複除去を実行できる

DBを一回だけ走査する

重複除去を各バケットに

対して実行

M個

δ(R1)∪δ(R2)∪

δ(R3)∪δ(R4)∪

δ(R5)

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

R1

すべての

ブロックを

1回だけ

読み込む

十分な主記憶があり

既に読んだレコードか

否かの判定を高速に

実行できる場合

ハッシュ表や

平衡2分木で

管理できる

CPU

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

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

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

R1

R2

R3

R4

R5

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

必ず同じバケットと仮定

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

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

M個

slide61
ハッシュ・ジョイン

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

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

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

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

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

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

インデックス

ブロック

slide67
その他のインデックス
  •  2次的インデックス 
  • 複数の属性にインデックス (例 名前と電話番号)
  • B-木 (B-trees)
  •  ハッシュ表
  • 技術的工夫
    • 更新への対応
    • 大量のデータにもアクセス速度を劣化させない

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

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

σa=v(R)

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

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

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

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

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

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 個

slide75
交換律と結合律

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

のどちらでも成立

slide76
代数的操作がうまくゆかない例
  • 集合意味論では成り立つ分配律が 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 の属性でない
slide77

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

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

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

slide82
射影の先行実行
  •  選択の先行実行
  • 計算途中で生成されるレコードの数を減らす効果
  •  射影の先行実行は、効果的か?
  • 表の幅を狭くするが、レコードの数を減らさない
  • (bags 意味論の場合)
  • 選択の先行実行ほどの効果はない
  •  集合意味論の場合
  • 射影すると重複レコードを除ける場合がある
slide83
射影を先行実行するための操作
  • ジョイン等を実行するのに必要な属性と被射影属性を残す
  • π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 の属性全体
slide84
射影を先行実行するための操作
  • π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 の属性
slide85
重複除去を先行実行するための操作

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

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

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

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

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

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

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

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

成立しない性質

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

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

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

slide87
SQL 文の構文解析木から効率的な問合せを合成
slide88
簡略化した 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’

slide89
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

slide90
問合せ木

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

slide91
問合せ木の変換

π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

slide92

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

slide93

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

slide94

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

slide96
問合せコストは中間計算結果の大きさに依存
  • 問合せの実行中に生成される中間計算結果
  •  ブロック転送回数を低減するためにも ブロックにまとめて保存
  •  中間計算結果の大きさ 
  •   (レコード数 × レコード長)を近似したい
  •  したがってレコード数を近似することが重要
slide97
中間計算結果のレコード数を近似
  • 近似の方法
  •  論理的に矛盾がないこと
  • たとえば (RwvT)wvS と Rwv(TwvS) の 近似値は同じであるべき
  •  簡単に計算ができること  近似が実際に計算するのと同程度に重たいと無意味
  •  計算が容易なパラメータ (近似は粗くても妥協する)
  • T(R): 関係 R のレコード数
  • V(R,a): 属性 a における、異なる値の数
slide98
選択結果のレコード数を近似

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)

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

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

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

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

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

V(R,b)=20 V(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)}

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

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

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

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

V(S,c)=100 V(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

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

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

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

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

V(S,c)=100 V(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)=1000 T(S)=2000

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

V(R,b2)=100 V(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

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

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

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

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

V(S,c)=100 V(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

slide106
n個の関係をジョインした結果のレコード数を近似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 は複数回出現する属性}

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

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

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

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

V(R,a)=100

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

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

V(S,d)=400

V(U,e)=500

1

50×200

1

200

1000×2000×5000×

×

属性b

属性c

=5000

slide108
問合せコスト近似用のパラメータ
  •  計算が容易なパラメータ
  • T(R): 関係 R のレコード数
  • V(R,a): 属性 a における、異なる値の数
  • V(R,a)の数が少数の場合、  値ごとに頻度分布をとることで、より正確に近似可能
slide109
頻度分布を利用してジョインのレコード数を近似頻度分布を利用してジョインのレコード数を近似

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

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

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

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

σ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

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

slide114
ジョイン戦略の例

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

slide115
3個以上の関係をジョインする表現: ジョイン木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! 個

slide116
ジョイン木の骨格の数

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 で実装
  • 複数の中間結果を管理する必要性
    • 主記憶に格納するか、
    • ディスクに退避するか
slide119
動的計画法による最良ジョイン木の選択
  •  レコード数T(R)、異なる値の数 V(R,a) をつかい
  • 中間結果のレコード数を近似
  •  中間結果のレコード数の和を、  ジョイン木の計算コストと考える
  •  最小コストの最良ジョイン木を動的計画法で計算
  •  全ジョイン木を対象にするか?
  •   左線形木に限定するか?
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 木を含)

slide124
計算コストについての注意
  • 中間結果のレコード数の和を、
  • ジョイン木の計算コストとするのが不正確な場合
  • 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 個の
  •    部分集合を考慮
  •  計算時間を減らすため貪欲アルゴリズムでは
  •   ジョイン木の計算コストが最小の部分集合だけを
  •   各段階で残す
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

slide128
動機

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

無駄がない状態とは?

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

局所的には無駄がない

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

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

bags 意味論

集合意味論

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

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

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

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

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

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) 局所的ジョイン無矛盾

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

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

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

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

slide138
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

slide139

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)

削除

削除

削除

slide142
性質

定理

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

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

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

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

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

Full Reducer は何も除かない。

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

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

slide143
証明

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

slide145

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}

slide146
ジョインの射影

π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 の属性は 「被射影属性」 とよぶ

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

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

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

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

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

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

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

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

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)のレコード数と、最終計算結果の関係のレコード数の積で抑えられる

ad