%!PS-Adobe-2.0 %%Creator: dvips 5.55 Copyright 1986, 1994 Radical Eye Software %%Title: diss.dvi %%CreationDate: Fri Apr 21 20:10:46 1995 %%Pages: 131 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: Times-Roman Times-Bold Times-Italic Courier %%EndComments %DVIPSCommandLine: dvips -D 600 diss -o %DVIPSParameters: dpi=600, comments removed %DVIPSSource: TeX output 1995.04.21:2008 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginProcSet: /u/ddas/tex/pstricks/ps/pstricks.pro % PostScript prologue for pstricks.tex. % Created 1993/3/12. Source file was pstricks.doc % Version 0.93a, 93/03/12. % For use with Rokicki's dvips. /tx@Dict 200 dict def tx@Dict begin /ADict 25 dict def /CM { matrix currentmatrix } bind def /SLW /setlinewidth load def /CLW /currentlinewidth load def /CP /currentpoint load def /ED { exch def } bind def /L /lineto load def /T /translate load def /Atan { /atan load stopped { pop pop 0 } if } def /Div { dup 0 eq { pop } { div } ifelse } def /NET { neg exch neg exch T } def /Pyth { dup mul exch dup mul add sqrt } def /PtoC { 2 copy cos mul 3 1 roll sin mul } def /PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def /PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def } { /y ED /x ED PathLength@ } {} { /y y2 def /x x2 def PathLength@ } pathforall z } def /STP { .996264 dup scale } def /STV { SDict begin normalscale end STP } def /DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y mul sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup y mul /y ED x mul /x ED x 0 eq y 0 eq and { /x 1 def /y 1 def } if [ y x ] 1 a sub y mul setdash stroke } def /DotLine { /b PathLength def /a ED /z ED /y CLW def /z y z add def a 0 gt { /b b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add def } if } ifelse } ifelse [ 0 b b z Div round Div dup 0 le { pop 1 } if ] a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1 setlinecap stroke } def /LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED /x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul def newpath 2 setlinecap n { currentstrokeadjust == x1 y1 moveto x2 y1 L stroke /y1 y1 a add def } repeat grestore } def /LineFill { abs CLW add /a ED gsave clip pathbbox a Div ceiling /y2 ED /x2 ED a Div floor /y1 ED /x1 ED /n y2 y1 sub 1 add cvi def /y1 a y1 mul def newpath 2 setlinecap systemdict /currentstrokeadjust known { currentstrokeadjust } { false } ifelse { /t { } def } { /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform } bind def } ifelse n { x1 y1 t moveto x2 y1 t L stroke /y1 y1 a add def } repeat grestore } def /BeginArrow { ADict begin /@mtrx CM def gsave 2 copy T 2 index sub neg exch 3 index sub exch Atan rotate newpath } def /EndArrow { @mtrx setmatrix CP grestore end } def /Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED { 0 h T 1 -1 scale } if w neg h moveto 0 0 L w h L w neg a neg rlineto gsave fill grestore } def /Tbar { CLW mul add /z ED z -2 div CLW 2 div moveto z 0 rlineto stroke 0 CLW moveto } def /Bracket { CLW mul add dup CLW sub 2 div /x ED mul CLW add /y ED /z CLW 2 div def x neg y moveto x neg CLW 2 div L x CLW 2 div L x y L stroke 0 CLW moveto } def /RoundBracket { CLW mul add dup 2 div /x ED mul /y ED /mtrx CM def 0 CLW 2 div T x y mul 0 ne { x y scale } if 1 1 moveto .85 .5 .35 0 0 0 curveto -.35 0 -.85 .5 -1 1 curveto mtrx setmatrix stroke 0 CLW moveto } def /Shadow { [ { /moveto load } { /lineto load } { /curveto load } { /closepath load } pathforall ] cvx newpath 3 1 roll T exec } def /SD { 0 360 arc fill } def /SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def /ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def /SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore } def /NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch cvi def } def /NArray { /f ED counttomark 2 div dup cvi /n ED n eq not { exch pop } if f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse } def /Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def n { Lineto } repeat CP 4 2 roll ArrowB L pop pop } if } def /Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 } ifelse { pop } repeat a } def /CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq and { pop pop /n n 1 sub def } if } def /Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop } repeat } { n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1 ED /x1 ED x1 y1 /x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1 moveto /n n 2 sub def n { Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto Lineto pop pop closepath } ifelse } def /CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth def } def /CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth def } def /CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1 def CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp mul dy1 l0 c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos abs b exp a mul dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def /y2 y l0 dy mul m mul sub def /dx l1 dx mul m mul neg def /dy l1 dy mul m mul neg def } def /IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } ifelse /a a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def } def /BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def /NC { CC x1 y1 x2 y2 x y curveto } def /EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def /BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def /NAC { x2 y2 x y curveto CC x1 y1 } def /EAC { x2 y2 x y ArrowB curveto pop pop } def /OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def n { NC } repeat EOC } ifelse } def /AltCurve { { false NArray n 2 mul 2 roll [ n 2 mul 3 sub 1 roll ] aload /Points ED n 2 mul -2 roll } { false NArray } ifelse n 4 lt { n { pop pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse } def /ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt { CheckClosed } if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC } repeat closepath pop pop } ifelse } def /EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS CLW sub SD } if 0 DS z add CLW 4 div sub moveto } def /Rect { x1 y1 y2 add 2 div moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto x1 y1 lineto closepath } def /OvalFrame { x1 x2 eq y1 y2 eq or { pop pop x1 y1 moveto x2 y2 L } { y1 y2 sub abs x1 x2 sub abs 2 copy gt { exch pop } { pop } ifelse 2 div exch { dup 3 1 roll mul exch } if 2 copy lt { pop } { exch pop } ifelse /b ED x1 y1 y2 add 2 div moveto x1 y2 x2 y2 b arcto x2 y2 x2 y1 b arcto x2 y1 x1 y1 b arcto x1 y1 x1 y2 b arcto 16 { pop } repeat closepath } ifelse } def /Frame { CLW mul /a ED 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add /y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED 1 index 0 eq { pop pop Rect } { OvalFrame } ifelse } def /Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1 sub 3 div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0 y0 x0 2 mul x1 sub y1 ] def } def /Grid { /a 4 string def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED c div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy div cvi /y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy div cvi /y1 ED cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2 div add def /Helvetica findfont b scalefont setfont /b b .95 mul CLW 2 div add def } if gsave n 0 gt { 1 setlinecap [ 0 cy n div ] 0 setdash } { 2 setlinecap } ifelse /c x1 def /i 500 w mul x1 add def /e y cy mul def /f y1 cy mul def /g y2 cy mul def x1 cx mul 0 T { newpath 0 e moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse h 0 gt {b neg} {z1} ifelse rmoveto show grestore } if 0 f moveto 0 g L stroke cx w mul 0 T c x2 eq c i eq or {exit} if /c c w add def } loop grestore gsave n 0 gt { 1 setlinecap [ 0 cx n div ] 0 setdash } { 2 setlinecap } ifelse /c y1 def /i 500 h mul y1 add def /e x cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul T { newpath e 0 moveto b 0 gt { gsave d c a cvs dup stringwidth pop /z2 ED w 0 gt {z1 z2 add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto show grestore } if f 0 moveto g 0 L stroke 0 cy h mul T c y2 eq c i eq or {exit} if /c c h add def } loop grestore } def /ArcArrow { /d ED /b ED /a ED gsave newpath 0 -1000 moveto clip newpath 0 1 0 0 b grestore c mul /e ED pop pop pop r a e d PtoC y add exch x add exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c mul neg d } def /Ellipse { /mtrx CM def T scale 0 0 1 5 3 roll arc mtrx setmatrix } def /Rot { CP CP translate 3 -1 roll neg rotate NET } def /PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def /PutBegin { /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def CP 4 2 roll T moveto } def /PutEnd { CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto } def /Uput { /a ED add 2 div /h ED 2 div /w ED /s a sin def /c a cos def /b s abs c abs 2 copy gt dup /q ED { pop } { exch pop } ifelse def /w1 c b div w mul def /h1 s b div h mul def q { w1 abs w sub dup c mul abs } { h1 abs h sub dup s mul abs } ifelse } def /UUput { /z ED abs /y ED /x ED q { x s div c mul abs y gt } { x c div s mul abs y gt } ifelse { x x mul y y mul sub z z mul add sqrt z add } { q { x s div } { x c div } ifelse abs } ifelse a PtoC h1 add exch w1 add exch } def /BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit T moveto /IfVisible true def } if } { IfVisible { CP OLUnit NET moveto /IfVisible false def } if } ifelse } def /InitOL { /OLUnit [ gsave CM STV 2890.79999 dup moveto setmatrix CP grestore ] cvx def /BOL { BeginOL } def /IfVisible true def } def end %%EndProcSet %%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-coil.pro % PostScript prologue for pst-coil.tex. % Created 1993/3/12. Source file was pst-coil.doc % Version 0.93a, 93/03/12. % For use with Rokicki's dvips. /tx@CoilDict 40 dict def tx@CoilDict begin /CoilLoop { /t ED t sin AspectSin mul t 180 div AspectCos mul add t cos lineto } def /Coil { /Inc ED dup sin /AspectSin ED cos /AspectCos ED /ArmB ED /ArmA ED /h ED /w ED /y1 ED /x1 ED /y0 ED /x0 ED x0 y0 translate y1 y0 sub x1 x0 sub 2 copy Pyth /TotalLength ED Atan rotate /BeginAngle ArmA AspectCos Div w h mul Div 360 mul def /EndAngle TotalLength ArmB sub AspectCos Div w h mul Div 360 mul def 1 0 0 0 ArrowA ArmA 0 lineto /mtrx CM def w h mul 2 Div w 2 Div scale BeginAngle Inc EndAngle { CoilLoop } for EndAngle CoilLoop mtrx setmatrix TotalLength ArmB sub 0 lineto CP TotalLength 0 ArrowB lineto } def /AltCoil { /Inc ED dup sin /AspectSin ED cos /AspectCos ED /h ED /w ED /EndAngle ED /BeginAngle ED /mtrx CM def w h mul 2 Div w 2 Div scale BeginAngle sin AspectSin mul BeginAngle 180 div AspectCos mul add BeginAngle cos /lineto load stopped { moveto } if BeginAngle Inc EndAngle { CoilLoop } for EndAngle CoilLoop mtrx setmatrix } def /ZigZag { /ArmB ED /ArmA ED 2 div /w ED w mul /h ED /y1 ED /x1 ED /y0 ED /x0 ED x1 y1 translate y0 y1 sub x0 x1 sub 2 copy Pyth /TotalLength ED Atan rotate TotalLength ArmA sub ArmB sub dup h div cvi /n ED n h mul sub 2 div dup ArmA add /ArmA ED ArmB add /ArmB ED /x ArmB h 2 div add def mark 0 0 ArmB 0 n { x w /w w neg def /x x h add def } repeat TotalLength ArmA sub 0 TotalLength 0 } def end %%EndProcSet %%BeginProcSet: /u/ddas/tex/pstricks/ps/pst-node.pro % PostScript prologue for pst-node.tex. % Created 1993/3/12. Source file was pst-node.doc % Version 0.93a, 93/03/12. % For use with Rokicki's dvips. /tx@NodeDict 200 dict def tx@NodeDict begin /NewNode { gsave /next ED dict dup 3 -1 roll ED begin tx@Dict begin STV CP T exec end /NodeMtrx CM def next end grestore } def /InitPnode { /Y ED /X ED /NodePos { Nodesep Cos mul Nodesep Sin mul } def } def /InitCnode { /r ED /Y ED /X ED /NodePos { Nodesep r add dup Cos mul exch Sin mul } def } def /GetRnodePos { Cos 0 gt { /dx r Nodesep add def } { /dx l Nodesep sub def } ifelse Sin 0 gt { /dy u Nodesep add def } { /dy d Nodesep sub def } ifelse dx Sin mul abs dy Cos mul abs gt { dy Cos mul Sin div dy } { dx dup Sin mul Cos Div } ifelse } def /InitRnode { /r ED r mul neg /l ED /r r l add def /X l neg def { neg /d ED /u ED /Y 0 def } { neg /Y ED Y sub /u ED u mul neg /d ED /u u d add def /Y Y d sub def } ifelse /NodePos { GetRnodePos } def } def /InitRNode { /Y ED /X ED /r ED /X r 2 div X add def /r r X sub def /l X neg def Y add neg /d ED Y sub /u ED /NodePos { GetRnodePos } def } def /GetOnodePos { /ww w Nodesep add def /hh h Nodesep add def Sin ww mul Cos hh mul Atan dup cos ww mul exch sin hh mul } def /GetCenter { begin X Y NodeMtrx transform CM itransform end } def /GetAngle { nodeA GetCenter nodeB GetCenter 3 -1 roll sub 3 1 roll sub neg Atan } def /GetEdge { begin /Nodesep ED dup 1 0 NodeMtrx dtransform CM idtransform exch atan sub dup sin /Sin ED cos /Cos ED NodePos Y add exch X add exch NodeMtrx transform CM itransform end 4 2 roll 1 index 0 eq { pop pop } { 2 copy 5 2 roll cos mul add 4 1 roll sin mul sub exch } ifelse } def /GetPos { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED OffsetB AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED } def /InitNC { /nodeB ED /nodeA ED /NodesepB ED /NodesepA ED /OffsetB ED /OffsetA ED tx@NodeDict nodeA known tx@NodeDict nodeB known and dup { /nodeA nodeA load def /nodeB nodeB load def } if } def /LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t mul add exch 6 2 roll sub 3 1 roll sub Atan } def /NCCoor { GetAngle /AngleA ED /AngleB AngleA 180 add def GetPos /LPutVar [ x2 x1 y2 y1 ] cvx def /LPutPos { LPutVar LineMP } def x1 y1 x2 y2 } def /NCLine { NCCoor tx@Dict begin ArrowB 4 2 roll ArrowA lineto end } def /BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED /t ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3 mul cx sub def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx sub def /ay y3 y0 sub cy sub by sub def ax t 3 exp mul bx t t mul mul add cx t mul add x0 add ay t 3 exp mul by t t mul mul add cy t mul add y0 add 3 ay t t mul mul mul 2 by t mul mul add cy add 3 ax t t mul mul mul 2 bx t mul mul add cx add atan } def /GetArms { /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul y2 add def } def /NCCurve { GetPos x1 x2 sub y1 y2 sub Pyth 2 div dup 3 -1 roll mul /armA ED mul /armB ED GetArms x1a y1a x1 y1 tx@Dict begin ArrowA end x2a y2a x2 y2 tx@Dict begin ArrowB end curveto /LPutVar [ x1 y1 x1a y1a x2a y2a x2 y2 ] cvx def /LPutPos { t LPutVar BezierMidpoint } def } def /AnglesMP { LPutVar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def 10 -2 roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse } ifelse } ifelse 6 { pop } repeat 3 -1 roll exch LineMP } def /NCAngles { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x0 y0 x1a y1a x1 y1 ] cvx def /LPutPos { AnglesMP } def } def /NCAngle { GetPos /x2a armB AngleB cos mul x2 add def /y2a armB AngleB sin mul y2 add def /mtrx AngleA matrix rotate def x2a y2a mtrx transform pop x1 y1 mtrx transform exch pop mtrx itransform /y0 ED /x0 ED mark armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def /LPutPos { AnglesMP } def } def /NCBar { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx transform pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1 roll 0 gt { /y2a exch y2a add def /x2a exch x2a add def } { /y1a exch neg y1a add def /x2a exch neg x2a add def } ifelse mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def /LPutPos { LPutVar AnglesMP } def } def /NCDiag { GetPos GetArms mark x2 y2 x2a y2a x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2a y2a x1a y1a x1 y1 ] cvx def /LPutPos { AnglesMP } def } def /NCDiagg { OffsetA AngleA NodesepA nodeA GetEdge /y1 ED /x1 ED /x1a armA AngleA cos mul x1 add def /y1a armA AngleA sin mul y1 add def nodeB GetCenter y1a sub exch x1a sub Atan 180 add /AngleB ED OffsetB AngleB NodesepB nodeB GetEdge /y2 ED /x2 ED mark x2 y2 x1a y1a x1 y1 tx@Dict begin false Line end /LPutVar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def /LPutPos { AnglesMP } def } def /LoopMP { /t t abs def [ LPutVar ] length 2 div 1 sub dup t lt { /t ED } { pop } ifelse mark LPutVar t cvi { /t t 1 sub def pop pop } repeat counttomark 1 add 4 roll cleartomark 3 -1 roll exch LineMP } def /NCLoop { GetPos GetArms /mtrx AngleA matrix rotate def x1a y1a mtrx transform loopsize add /y1b ED /x1b ED /x2b x2a y2a mtrx transform pop def x2b y1b mtrx itransform /y2b ED /x2b ED x1b y1b mtrx itransform /y1b ED /x1b ED mark armB 0 ne { x2 y2 } if x2a y2a x2b y2b x1b y1b x1a y1a armA 0 ne { x1 y1 } if tx@Dict begin false Line end /LPutVar [ x2 y2 x2a y2a x2b y2b x1b y1b x1a y1a x1 y1 ] cvx def /LPutPos { LoopMP } def } def /NCCircle { nodeA GetCenter 0 0 NodesepA nodeA GetEdge pop 3 1 roll /Y ED /X ED X sub 2 div dup 2 exp r r mul sub abs sqrt atan 2 mul /a ED r AngleA 90 add PtoC Y add exch X add exch 2 copy /LPutVar [ 4 2 roll r a ] def /LPutPos { LPutVar aload pop t 360 mul add dup 5 1 roll 90 sub PtoC 3 -1 roll add 3 1 roll add exch 3 -1 roll } def r AngleA 90 sub a add AngleA 270 add a sub tx@Dict begin /angleB ED /angleA ED /r ED /c 57.2957 r Div def /y ED /x ED } def /LPutCoor { tx@NodeDict /LPutPos known { gsave LPutPos tx@Dict begin /langle ED CM 3 1 roll STV CP 3 -1 roll sub neg 3 1 roll sub exch moveto setmatrix CP end grestore } { 0 0 tx@Dict /langle 0 def end } ifelse } def end %%EndProcSet %%BeginProcSet: texps.pro TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2 index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def} ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict end definefont 3 -1 roll makefont /setfont load]cvx def}def /ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def /ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def end %%EndProcSet %%BeginProcSet: special.pro TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{ /CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{ 10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{} N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{itransform lineto} }{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{ itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{ closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp {pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray} N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial {CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath }N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{ end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin} N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{ /SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin @defspecial TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4 copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch } if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min radius sub /miny exch store max radius add /maxy exch store 2 copy min radius sub /minx exch store max radius add /maxx exch store newpath minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end TeXDict begin /box{newpath 2 copy moveto 3 copy pop exch lineto 4 copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind def /min{ 2 copy gt { exch } if pop } bind def/max{ 2 copy lt { exch } if pop } bind def/roundedbox{/radius exch store 3 2 roll 2 copy min radius sub /miny exch store max radius add /maxy exch store 2 copy min radius sub /minx exch store max radius add /maxx exch store newpath minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx miny radius arcto 16 {pop} repeat closepath }bind def /rectcartouche{box gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def /cartouche{roundedbox gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def end @fedspecial end TeXDict begin 40258431 52099146 1000 600 600 (/v/ahhnold/v3/ddas/research/dissertation/diss.dvi) @start /Fa 6 56 df<03FE000FFFC03FFFF07E07F8F803FCFC01FCFC00FEFC00FEFC007E7800FE 0000FE0000FE0001FC0001F80003F00007E0000F80003E00007C0000F00E01E00E07801C 0FFFFC1FFFFC7FFFFCFFFFFCFFFFF8FFFFF8171C7C9B1F>50 D<00FF800003FFE0000FFF F8001F01FC003E00FE003F007E003F007E003F007E003F00FE000C00FC000001FC000003 F00000FFC00000FFF0000001FC000000FE0000007F0000003F8000003F8030003F80FC00 3F80FC003F80FC003F80FC007F00F800FF007E01FE003FFFF8000FFFF00001FF8000191D 7D9B1F>I<0003F0000003F0000007F000000FF000001DF0000039F0000039F0000071F0 0000E1F00001C1F0000381F0000701F0000701F0000E01F0001C01F0003801F0007001F0 00F001F000FFFFFF80FFFFFF80FFFFFF800003F0000003F0000003F0000003F00000FFFF 8000FFFF8000FFFF80191C7D9B1F>I<3800783FFFF83FFFF03FFFE03FFF803FFE003FF0 003C00003C00003C00003CFF003FFFC03F03F03E01F83C00FC38007C00007E00007E0000 7E78007EFC007EFC007EFC00FCF800FC7801F87E03F03FFFE00FFF8003FE00171D7C9B1F >I<001FE00000FFF80003FFFC0007F03E000FC07E001F807E003F007E003E007E007E00 3C007E000000FC3F8000FCFFF000FDC0FC00FF807E00FF003F00FE001F00FE001F80FC00 1F80FC001F80FC001F807C001F807E001F807E001F803E003F003F003F001F80FE000FFF F80003FFF000007F8000191D7D9B1F>I<380000003FFFFF803FFFFF807FFFFF807FFFFF 007FFFFE007FFFFC007000F800E001F000E003E0000007C000000F8000001F0000001F00 00003E0000007E0000007C0000007C000000FC000000FC000000F8000001F8000001F800 0001F8000001F8000001F8000001F8000001F8000000F00000191D7C9B1F>I E /Fb 5 89 df<0000300000700000E00001C00003C0000780000F00000F00001E00003C 00003C0000780000F80000F00001F00001E00003E00003E00007C00007C00007C0000F80 000F80000F80001F80001F00001F00003F00003F00003F00003E00003E00007E00007E00 007E00007E00007E00007E00007C0000FC0000FC0000FC0000FC0000FC0000FC0000FC00 00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00 00FC00007C00007E00007E00007E00007E00007E00007E00003E00003E00003F00003F00 003F00001F00001F00001F80000F80000F80000F800007C00007C00007C00003E00003E0 0001E00001F00000F00000F800007800003C00003C00001E00000F00000F000007800003 C00001C00000E00000700000301462738226>0 DI<0000 000001E00000000003E00000000007C0000000000F80000000001F80000000001F000000 00003E00000000007C0000000000F80000000001F80000000001F00000000003E0000000 0007E0000000000FC0000000000F80000000001F80000000003F00000000003E00000000 007E0000000000FC0000000000FC0000000001F80000000003F80000000003F000000000 07F00000000007E0000000000FE0000000000FC0000000001FC0000000001F8000000000 3F80000000003F00000000007F00000000007E0000000000FE0000000000FC0000000001 FC0000000001FC0000000001F80000000003F80000000003F00000000007F00000000007 F00000000007E0000000000FE0000000000FE0000000001FC0000000001FC0000000001F C0000000003F80000000003F80000000003F80000000007F80000000007F00000000007F 0000000000FF0000000000FE0000000000FE0000000000FE0000000001FE0000000001FC 0000000001FC0000000001FC0000000003FC0000000003FC0000000003F80000000003F8 0000000007F80000000007F80000000007F80000000007F00000000007F0000000000FF0 000000000FF0000000000FF0000000000FE0000000000FE0000000000FE0000000001FE0 000000001FE0000000001FE0000000001FE0000000001FC0000000001FC0000000003FC0 000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 000000003F80000000007F80000000007F80000000007F80000000007F80000000007F80 000000007F80000000007F80000000007F80000000007F80000000007F80000000007F80 000000007F80000000007F0000000000FF0000000000FF0000000000FF0000000000FF00 00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 00000000FF0000000000FF0000000000FF0000000000FF00000000007F00000000007F80 000000007F80000000007F80000000007F80000000007F80000000007F80000000007F80 000000007F80000000007F80000000007F80000000007F80000000007F80000000003F80 000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 000000003FC0000000001FC0000000001FC0000000001FE0000000001FE0000000001FE0 000000001FE0000000000FE0000000000FE0000000000FE0000000000FF0000000000FF0 000000000FF00000000007F00000000007F00000000007F80000000007F80000000007F8 0000000003F80000000003F80000000003FC0000000003FC0000000001FC0000000001FC 0000000001FC0000000001FE0000000000FE0000000000FE0000000000FE0000000000FF 00000000007F00000000007F00000000007F80000000003F80000000003F80000000003F 80000000001FC0000000001FC0000000001FC0000000000FE0000000000FE00000000007 E00000000007F00000000007F00000000003F00000000003F80000000001F80000000001 FC0000000001FC0000000000FC0000000000FE00000000007E00000000007F0000000000 3F00000000003F80000000001F80000000001FC0000000000FC0000000000FE000000000 07E00000000007F00000000003F00000000003F80000000001F80000000000FC00000000 00FC00000000007E00000000003E00000000003F00000000001F80000000000F80000000 000FC00000000007E00000000003E00000000001F00000000001F80000000000F8000000 00007C00000000003E00000000001F00000000001F80000000000F800000000007C00000 000003E00000000001E02BF86C8242>32 D I88 D E /Fc 133[22 25 3[28 17 1[22 1[28 25 1[41 14 2[14 3[22 3[25 59[50 37[{}13 50.000000 /Times-Bold rf /Fd 171[51 46 55 2[60 60 3[32 28 3[51 69[{}8 83.333336 /Times-Roman rf /Fe 166[60 3[60 55 46 60 65 51 65 60 78 55 2[32 65 65 1[55 60 60 55 60 65[{}19 83.333336 /Times-Bold rf /Ff 139[45 6[45 3[45 3[45 101[{}4 75.000000 /Courier rf /Fg 3 52 df<00600001E0000FE000FFE000F1E00001E00001 E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001 E00001E00001E00001E00001E00001E00001E00001E0007FFF807FFF80111C7B9B1C>49 D<03FC000FFF801C0FC03003E06001F0E000F0E000F8F00078F000786000780000F80000 F00001F00001E00003C0000700000E00001C0000300000E0000180180300180600180800 383FFFF07FFFF0FFFFF0FFFFF0151C7D9B1C>I<03FC000FFF001C07C03001E07001F078 01F07800F03001F00001F00001E00003C0000780001E0003FC000007800003C00001E000 00F00000F80000F86000F8F000F8F000F8E000F06001F07003E03C07C00FFF0003FC0015 1D7D9B1C>I E /Fh 81[28 52[25 25 2[25 14 19 17 1[25 25 25 39 14 1[14 14 25 25 17 22 25 22 25 22 3[17 1[17 1[36 36 2[36 30 28 33 36 28 36 36 44 30 1[19 17 36 36 28 30 36 33 33 36 1[22 10[25 25 25 25 49[{}51 50.000000 /Times-Roman rf /Fi 135[55 3[55 55 3[55 55 55 55 2[55 2[55 55 1[55 55 55 97[{}13 91.249977 /Courier rf /Fj 1 42 df<0000000000F0000000000000 0000F00000000000000000F800000000000000007C00000000000000003C000000000000 00003E00000000000000001F00000000000000001F00000000000000000F800000000000 000007C00000000000000003E000007FFFFFFFFFFFF00000FFFFFFFFFFFFF80000FFFFFF FFFFFFFC00007FFFFFFFFFFFFF00000000000000001F80000000000000000FE000000000 00000003F00000000000000001FE00000000000000007F80000000000000001FF0000000 000000001FF0000000000000007F8000000000000001FE0000000000000003F000000000 0000000FE0000000000000001F80007FFFFFFFFFFFFF0000FFFFFFFFFFFFFC0000FFFFFF FFFFFFF800007FFFFFFFFFFFF00000000000000003E00000000000000007C00000000000 00000F80000000000000001F00000000000000001F00000000000000003E000000000000 00003C00000000000000007C0000000000000000F80000000000000000F0000000000000 0000F0000000442A7CA74D>41 D E /Fk 1 69 df68 D E /Fl 12 64 df<0000C00001C0000380000F00000E00001C00003C000078 0000F00000F00001E00003C00003C00007C0000780000F80000F00001F00001F00001E00 003E00003E00003E00003C00007C00007C00007C00007C00007C0000F80000F80000F800 00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800 00F800007C00007C00007C00007C00007C00003C00003E00003E00003E00001E00001F00 001F00000F00000F800007800007C00003C00003C00001E00000F00000F000007800003C 00001C00000E00000F000003800001C00000C0124A79B71E>40 DI<000FE000007FFC0000F83E0003E00F8007C007C0078003C00F0001E01F0001F0 1E0000F03E0000F83E0000F83E0000F87E0000FC7C00007C7C00007C7C00007C7C00007C FC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007E FC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007E 7C00007C7C00007C7C00007C7C00007C7E0000FC3E0000F83E0000F83E0000F81E0000F0 1F0001F00F0001E0078003C007C007C003E00F8000F83E00007FFC00000FE0001F347DB1 26>48 D<00070000000F0000001F0000007F000007FF0000FFBF0000F83F0000003F0000 003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000 003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000 003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000 003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000 003F0000003F0000003F000000FFC0007FFFFF807FFFFF8019327AB126>I<003FC00000 FFF00003C07C000F003F001C001F8018000FC038000FE0700007E0600007F0600007F0FC 0003F0FE0003F8FF0003F8FF0003F8FF0003F8FF0003F87E0003F83C0003F8000003F800 0007F0000007F0000007F000000FE000000FE000001FC000001F8000003F0000003F0000 007E000000FC000001F8000001F0000003C00000078000000F0000001E0000003C000000 7800180070001800E0001801C0003003800030070000300E0000701FFFFFF01FFFFFF03F FFFFF07FFFFFE0FFFFFFE0FFFFFFE01D327CB126>I<001FE00000FFFC0001E03F000780 1FC00E000FE01C0007F0180007F03F0003F83F8003F83F8003F83FC003F83F8003F83F80 03F81F0003F8000003F0000007F0000007F0000007E000000FC000001F8000001F000000 3E000001F800007FE000007FFC0000003F0000001F8000000FE0000007F0000007F00000 03F8000003FC000003FC000001FC000001FE000001FE7E0001FEFF0001FEFF0001FEFF00 01FEFF0001FEFF0001FCFE0003FC780003FC700003F8300007F0380007F01C000FE00F00 1F8003E03F0000FFFC00001FE0001F347DB126>I<000001C000000001C000000003C000 000007C000000007C00000000FC00000001FC00000001FC00000003FC00000007FC00000 006FC0000000CFC0000001CFC00000018FC00000030FC00000070FC00000060FC000000E 0FC000001C0FC00000180FC00000380FC00000300FC00000600FC00000E00FC00000C00F C00001800FC00003800FC00003000FC00006000FC0000E000FC0000C000FC00018000FC0 0038000FC00030000FC00060000FC000E0000FC000FFFFFFFF80FFFFFFFF8000000FC000 00000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000 000FC00000000FC00000001FE0000007FFFF800007FFFF8021337EB226>I<0C0000C00F C00FC00FFFFF800FFFFF000FFFFE000FFFFC000FFFF0000FFFC0000C1800000C0000000C 0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0FC0000C 7FF8000CF07C000FC03F000F001F800F000F800E000FC00C0007E00C0007E0000007F000 0003F0000003F0000003F8000003F8000003F8000003F8180003F87E0003F8FE0003F8FE 0003F8FE0003F8FE0003F8FE0003F0F80007F0600007E0600007E070000FC030000FC038 001F801C003F000E007E0007C0F80001FFE000003F80001D347CB126>I<000FE000007F FC0000F01F0003C00780078003C00F0001E00E0001F01E0000F01C0000F83C0000783C00 00783C0000783E0000783E0000783F0000F83F8000F03FC001F01FF001E01FF803C00FFE 078007FF0F0003FFFE0001FFF80000FFF800003FFE00003FFF0000F7FFC003E3FFE00780 FFF00F007FF81E001FF83E0007FC3C0003FC780001FC780000FEF800007EF000003EF000 003EF000001EF000001EF000001EF000001EF800001C7800003C7C0000383C0000781E00 00F00F0001E007C003C003F01F0000FFFC00001FE0001F347DB126>56 D<3C7EFFFFFFFF7E3C000000000000000000000000000000003C7EFFFFFFFF7E3C08207A 9F15>58 D<7FFFFFFFFFFFC0FFFFFFFFFFFFE0FFFFFFFFFFFFE07FFFFFFFFFFFC0000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000007FFFFFFFFFFFC0FFFFFFFFFFFFE0FFFFFFFFFFFFE07FFFFFFFFFFF C033147C9C3C>61 D<00FFC00003FFF8000F00FE001C003F0038001F8070000FC0700007 C0FC0007E0FE0007E0FE0007E0FE0007E0FE0007E07C0007E000000FC000000FC000001F 8000003F0000007E000000F8000001F0000001E0000003C0000007800000078000000700 00000E0000000E0000000C0000001C0000001C0000001800000018000000180000001800 000018000000180000001800000018000000000000000000000000000000000000000000 000000000000000000003C0000007E000000FF000000FF000000FF000000FF0000007E00 00003C00001B357CB424>63 D E /Fm 8 69 df<000E00003E0001FE00FFFE00FFFE00FE FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE007FFFFE7FFFFE7FFFFE17217BA023>49 D<00FF800007FFF0001FFFFC007F01FF007C 00FF80FF003FC0FF003FC0FF001FE0FF001FE0FF001FE07E000FE018001FE000001FE000 001FE000003FC000003F8000007F000000FE000001FC000003F0000007E000001F800000 3F01E0007C01E000F803E003E003C007FFFFC00FFFFFC01FFFFFC07FFFFFC0FFFFFF80FF FFFF80FFFFFF801B217DA023>I<007FC00001FFF80007C0FE000F007F001E007F803F80 3F803FC03F803FC03F803FC07F803FC07F801F807F000F00FF000001FE000003FC0000FF F00000FFC00000FFF8000000FE0000007F8000003FC000003FC03E001FE07F001FE0FF80 1FE0FF801FE0FF801FE0FF801FE0FF803FC07F003FC07E007F803F80FF000FFFFE0007FF F80000FFC0001B227DA023>I<00007E000000FE000001FE000001FE000003FE000007FE 00000F7E00001F7E00003E7E00003C7E0000787E0000F07E0001E07E0003E07E0007C07E 0007807E000F007E001E007E003C007E007C007E00F8007E00FFFFFFF8FFFFFFF8FFFFFF F80000FE000000FE000000FE000000FE000000FE000000FE00003FFFF8003FFFF8003FFF F81D217EA023>I<180003001F003F001FFFFF001FFFFE001FFFFC001FFFF8001FFFE000 1FFF80001EF800001E0000001E0000001E0000001E3FC0001EFFF8001FFFFE001FC0FF00 1F003F801E003FC01C001FC000001FE000001FE000001FE07C001FE0FE001FE0FF001FE0 FF001FE0FF001FC0FE003FC07C003F807C007F803F01FF001FFFFC0007FFF00000FF8000 1B227DA023>I<0007F800003FFE0000FC0F0003F0078007C00FC00FC01FC01F801FC03F 001FC03F001FC07F000F807E0000007E000000FE1FF000FE7FFC00FEFFFF00FFC03F80FF 801F80FF801FC0FF000FC0FF000FE0FE000FE0FE000FE0FE000FE07E000FE07E000FE07E 000FE07F000FE03F001FC01F801FC01F803F800FE07F0007FFFE0001FFF800003FC0001B 227DA023>I<3C0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFF FF0078003E00F8007C00F000F800F001F0000003E0000007C0000007C000000F8000001F 0000001F0000003F0000007E0000007E0000007E000000FE000000FC000000FC000001FC 000001FC000001FC000001FC000001FC000001FC000001FC000001FC0000007000001C22 7CA023>I68 D E /Fn 5 111 df<78FCFCFEFE7E0606060C0C1C1830604007107A8513>59 D<00FFFFFFFC00FFFFFFFC0007C000FC0007C0003C000F80001C000F80001C000F80000C 000F80000C001F00000C001F00000C001F00300C001F00300C003E006000003E00600000 3E00E000003E01E000007FFFC000007FFFC000007C03C000007C01C00000F801800000F8 01800000F801800000F801800001F000000001F000000001F000000001F000000003E000 000003E000000003E000000007E0000000FFFF800000FFFF80000026227CA127>70 D<0000FE030007FFC6000F01EE003C007E0070003E00E0001C00C0001C01C0001C01C000 1C03C0001803C0001803C0000003E0000003F0000001FE000000FFE000007FFE00003FFF 00000FFF800000FFC000000FE0000003E0000001E0000000F0000000F0300000E0300000 E0300000E0300001C0700001C078000380780007007E000E00E7807C00C3FFF000807F80 0020247CA226>83 D<0038007C007C00780070000000000000000000000000000007801F C038E030E060F0C1E0C1E0C1E003C003C003C0078007800F000F040F061E0C1E0C1E181C 181E700FE007800F237DA116>105 D<0F00FC001FC3FF0031C7078061EC038061F803C0 C1F003C0C1F003C0C1E003C003C0078003C0078003C0078003C00F0007800F0007800F00 07801E0407801E060F001E0C0F003C0C0F003C180F003C381E001C701E001FE00C000780 1F177D9526>110 D E /Fo 10 108 df<0001E0000003E000001FE00000FFE000FFFFE0 00FFFFE000FF3FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0 00003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0 00003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0 00003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0 007FFFFFF07FFFFFF07FFFFFF01C2C7AAB29>49 D<003FF00001FFFE0007FFFF801FC07F E03F003FF07C001FF87F000FFCFF8007FEFFC007FEFFC003FFFFC003FFFFC003FFFFC003 FF7F8003FF3F0003FF000003FF000003FF000007FE000007FE00000FFC00000FF800001F F000001FE000003FC000007F800000FE000001FC000003F8000007E000000FC00F001F80 0F003E000F007C001F00F8001E01F0001E03FFFFFE07FFFFFE0FFFFFFE1FFFFFFE3FFFFF FE7FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC202C7CAB29>I<000FFC0000007FFF800001F8 1FE00003E00FF80007C00FFC000F8007FC000FE007FE001FF007FE001FF807FE001FF807 FE001FF807FE001FF807FE001FF807FC000FF00FFC0007E00FF80000001FF80000001FF0 0000003FE0000000FF8000003FFE0000003FFC0000003FFF800000001FF00000000FF800 000007FE00000003FF00000003FF00000001FF80000001FF801F0001FFC07FC001FFC0FF E001FFC0FFE001FFC0FFE001FFC0FFE001FFC0FFE001FFC0FFE001FF807FC003FF807F80 03FF003E0007FE001F000FFC000FF01FF80007FFFFE00000FFFF8000001FFC0000222D7D AB29>I<000000F800000001F800000001F800000003F800000007F80000000FF8000000 1FF80000003FF80000003FF80000007FF8000000F7F8000001F7F8000003E7F8000003C7 F800000787F800000F07F800001E07F800003E07F800007C07F800007807F80000F007F8 0001E007F80003E007F80007C007F800078007F8000F0007F8001E0007F8003C0007F800 7C0007F800F80007F800FFFFFFFFF0FFFFFFFFF0FFFFFFFFF000000FF80000000FF80000 000FF80000000FF80000000FF80000000FF80000000FF80000000FF800000FFFFFF0000F FFFFF0000FFFFFF0242C7EAB29>I<1C0000381FC003F81FFFFFF81FFFFFF01FFFFFE01F FFFFC01FFFFF801FFFFF001FFFFC001FFFF0001FFF00001E0000001E0000001E0000001E 0000001E0000001E1FF8001E7FFF001FFFFFC01FF01FE01FC00FF01F0007F81E0007FC0C 0007FC000003FE000003FE000003FF000003FF0C0003FF3F0003FF7F8003FFFF8003FFFF C003FFFFC003FFFFC003FFFF8003FEFF8007FE7E0007FC7C0007FC3E000FF81F001FF00F C07FC007FFFF8001FFFC00003FE000202D7CAB29>I<0000FF80000007FFF000001FC0F8 00007F003C0000FE001E0003FC007E0007F800FF0007F001FF000FF001FF001FE001FF00 1FE001FF003FE000FE003FE0007C007FC00000007FC00000007FC0000000FFC3FF8000FF C7FFE000FFCFBFF000FFDC03FC00FFF803FE00FFF001FF00FFF000FF00FFE000FF80FFE0 00FF80FFE000FFC0FFC000FFC0FFC000FFC0FFC000FFC0FFC000FFC07FC000FFC07FC000 FFC07FC000FFC07FC000FFC03FC000FFC03FC000FF803FE000FF801FE000FF000FE001FF 000FF001FE0007F803FC0003FC0FF80000FFFFE000003FFF80000007FC0000222D7DAB29 >I<3C000000003F000000003FFFFFFFE03FFFFFFFE03FFFFFFFE03FFFFFFFC07FFFFFFF 807FFFFFFF007FFFFFFE007FFFFFFC007FFFFFF8007C0001F000780001E000F80003E000 F00007C000F0000F8000F0001F000000003E000000007C000000007C00000000F8000000 01F800000001F000000003F000000007F000000007E00000000FE00000000FE00000000F E00000001FE00000001FC00000003FC00000003FC00000003FC00000003FC00000007FC0 0000007FC00000007FC00000007FC00000007FC00000007FC00000007FC00000007FC000 00007FC00000003F800000001F000000232E7CAC29>I68 D<07C00FE01FF03FF83FF83FF83FF83FF81FF00FE007C000000000000000000000000003 F0FFF0FFF0FFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00F F00FF00FF00FF00FF00FF00FF00FF00FF0FFFFFFFFFFFF102F7CAE17>105 D<03F0000000FFF0000000FFF0000000FFF00000000FF00000000FF00000000FF0000000 0FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000F F00000000FF00000000FF003FFF00FF003FFF00FF003FFF00FF000FF000FF000FC000FF0 03F8000FF007F0000FF00FC0000FF03F80000FF07F00000FF0FC00000FF1F800000FF7FC 00000FFFFE00000FFFFF00000FFFFF00000FFEFF80000FF87FC0000FF03FE0000FE01FF0 000FE00FF8000FE00FF8000FE007FC000FE003FE000FE001FF000FE000FF800FE000FFC0 FFFE03FFFCFFFE03FFFCFFFE03FFFC262E7DAD2B>107 D E /Fp 3 80 df68 D73 D<0000003FFF00000000000003FFFFF000000000001FFFFFFE00000000007FF807FF8000 000001FFC000FFE000000007FF00003FF80000000FFC00000FFC0000003FF8000007FF00 00007FF0000003FF800000FFE0000001FFC00001FFE0000001FFE00001FFC0000000FFE0 0003FF800000007FF00007FF800000007FF80007FF000000003FF8000FFF000000003FFC 001FFF000000003FFE001FFE000000001FFE001FFE000000001FFE003FFE000000001FFF 003FFE000000001FFF003FFE000000001FFF007FFC000000000FFF807FFC000000000FFF 807FFC000000000FFF807FFC000000000FFF80FFFC000000000FFFC0FFFC000000000FFF C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFF C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFF C0FFFC000000000FFFC0FFFC000000000FFFC0FFFC000000000FFFC07FFC000000000FFF 807FFE000000001FFF807FFE000000001FFF807FFE000000001FFF803FFE000000001FFF 003FFE000000001FFF003FFF000000003FFF001FFF000000003FFE001FFF000000003FFE 000FFF800000007FFC000FFF800000007FFC0007FFC0000000FFF80003FFC0000000FFF0 0003FFE0000001FFF00001FFE0000001FFE00000FFF0000003FFC000007FF8000007FF80 00003FFE00001FFF0000001FFF00003FFE00000007FFC000FFF800000001FFF807FFE000 000000FFFFFFFFC0000000001FFFFFFE000000000003FFFFF00000000000003FFF000000 0042407ABE4F>79 D E /Fq 12 121 df<0000FF000007FFE0003FFFF8007E00FC01F000 3C03C0000C07000000060000000E0000000C0000000C0000000C0000000E000000060000 00079FF00001FFFC0001FFF800079FF0000E0000001C0000003800000070000000600000 0060000000E0000000C0000000C0000000C0000040E00000C0E00001C070000380380007 803F003E000FFFFC0003FFF00000FF80001E247EA124>34 D<3C7EFFFFFFFF7E3C08087A 8715>58 D<3C007E00FF00FF00FF80FF807F803D80018001800180018003800300030007 0006000E000C001C0038007000600009177A8715>I<0000000003000000000000070000 000000000F0000000000000F0000000000001F8000000000001F8000000000003F800000 0000007F8000000000007F800000000000DF800000000000DF8000000000019F80000000 00031F8000000000031FC000000000061FC000000000060FC0000000000C0FC000000000 180FC000000000180FC000000000300FC000000000700FC000000000600FC000000000C0 0FC000000000C00FE0000000018007E0000000038007E0000000030007E0000000060007 E0000000060007E00000000C0007E00000001C0007E0000000180007E0000000300007F0 000000300003F00000007FFFFFF0000000FFFFFFF0000000C00003F0000001800003F000 0001800003F0000003000003F0000006000003F0000006000003F800000C000003F80000 0C000001F8000018000001F8000030000001F8000070000001F8000060000001F80000E0 000001F80001E0000001F80003E0000001FC000FF0000003FC00FFFE0000FFFFF0FFFE00 00FFFFF034367DB53A>65 D<000FFFFFFFFFF8000FFFFFFFFFF800003FC0000FF000001F 800001F000003F800000F000003F800000F000003F0000007000003F0000007000007F00 00007000007F0000007000007E0000006000007E000000600000FE000000600000FE0000 00600000FC000000600000FC000C00600001FC001C00600001FC001800000001F8001800 000001F8001800000003F8003800000003F8003000000003F0007000000003F001F00000 0007FFFFF000000007FFFFF000000007E001E000000007E000E00000000FE000E0000000 0FE000C00000000FC000C00000000FC000C00000001FC001C00000001FC001800000001F 8001800000001F8000000000003F8000000000003F8000000000003F0000000000003F00 00000000007F0000000000007F0000000000007E0000000000007E000000000000FE0000 00000000FE000000000000FC000000000000FC000000000001FE0000000000FFFFFE0000 0000FFFFFE0000000035337CB231>70 D<000FFF800007FFFC000FFFC00007FFFC00001F C000003F8000001FE000001E0000003FE000001C0000003FF000001C00000033F0000018 00000033F000001800000073F800003800000071F800003000000061FC00003000000060 FC000030000000E0FE000070000000E07E000060000000C07E000060000000C07F000060 000001C03F0000E0000001C03F8000C0000001801F8000C0000001801FC000C000000380 0FC001C0000003800FC00180000003000FE001800000030007E001800000070007F00380 0000070003F003000000060003F003000000060001F8030000000E0001F8070000000E00 01FC060000000C0000FC060000000C0000FE060000001C00007E0E0000001C00007E0C00 00001800007F0C0000001800003F0C0000003800003F9C0000003800001F980000003000 001FD80000003000000FD80000007000000FF80000007000000FF000000060000007F000 000060000007F0000000E0000003F0000000E0000003E0000001E0000001E0000003E000 0001E0000007F0000001E00000FFFF800000C00000FFFF800000C000003E337CB23D>78 D<000000FF0018000007FFE03800001F00F87800007C001C780000F0000EF00001E00007 F00003C00003F00007800003F0000F000003E0000E000001E0001E000001E0003E000001 E0003C000001C0003C000001C0003C000001C0007C000001C0007C00000180007E000001 80007E00000000007F00000000003F80000000003FC0000000003FF8000000001FFF8000 00001FFFF80000000FFFFF00000003FFFFC0000001FFFFE00000003FFFF000000003FFF0 000000003FF80000000007F80000000003F80000000001FC0000000000FC0000000000FC 00000000007C000C0000007C000C0000007C001C00000078001800000078001800000078 0018000000F80038000000F00038000000F0003C000001E0003C000003C0007C000003C0 007E00000780007F00000F00007B80003C0000F1E000780000E07C03E00000E01FFF8000 00C003FE0000002D377CB42F>83 D<07FFFFFFFFFFE00FFFFFFFFFFFE00FE000FE001FC0 0F8000FC0007C01E0001FC0003C01C0001FC0001C01C0001F80001C0380001F800018038 0003F8000180300003F8000180700003F0000180600003F0000380600007F0000300E000 07F0000300C00007E0000300C00007E0000300C0000FE000030000000FE000000000000F C000000000000FC000000000001FC000000000001FC000000000001F8000000000001F80 00000000003F8000000000003F8000000000003F0000000000003F0000000000007F0000 000000007F0000000000007E0000000000007E000000000000FE000000000000FE000000 000000FC000000000000FC000000000001FC000000000001FC000000000001F800000000 0001F8000000000003F8000000000003F8000000000003F0000000000003F00000000000 07F0000000000007F0000000000007E000000000000FE000000000001FF0000000003FFF FFF80000003FFFFFF800000033337EB22D>I<0003FFFF8007FFFC0003FFFF8007FFFC00 001FF80000FFC000000FF000007E00000007E000007C00000007F000007000000007F000 00E000000003F80001C000000003F800038000000001FC00070000000001FC000E000000 0000FC001C0000000000FE001800000000007E003000000000007F006000000000003F00 C000000000003F818000000000003F830000000000001FC60000000000001FCC00000000 00000FF80000000000000FF000000000000007E000000000000007F000000000000003F0 00000000000003F800000000000007F80000000000000FFC0000000000001DFC00000000 000038FE00000000000070FE000000000000E07E000000000001C07F000000000003803F 000000000007003F80000000000E001F80000000000C001FC00000000018001FC0000000 0030000FE00000000060000FE000000000C00007F000000001800007F000000003000003 F000000006000003F80000000E000001F80000003C000001FC00000078000001FC000001 FC000001FE000007FC000003FF0000FFFF80003FFFF800FFFF80003FFFF8003E337EB23F >88 DI<0001C00007E00007F0000FF0000FE00007E00003800000000000000000 0000000000000000000000000000000000000000000000F00003FC00071E000E1F001C1F 00381F00301F00301F00703F00603F00603E00E07E00407C00007C0000FC0000F80001F8 0001F80001F00003F00003E00003E02007E07007C0600FC0600FC0E00F80C00F80C00F81 C00F83800F8700078E0003FC0000F00014337EB11A>105 D<000F801F80007FE03FE000 F0F0F07001C079C0F803803D83F807003F83F80E003F03F80C003F03F01C003E03F01800 3E01C018007E000038007C000010007C000000007C00000000FC00000000F800000000F8 00000000F800000001F800000001F800000001F000000001F000400003F000E00003F000 C01C03E000C07E03E001C07E07E00180FE07E00380FE0FE00700FE0DE00E00F81CF01C00 70787878003FE03FF0000FC00F800025227EA02C>120 D E /Fr 138[37 21 29 29 1[37 1[37 54 3[21 1[37 21 33 3[37 97[{}12 75.000000 /Times-Italic rf /Fs 21 121 df<38FEFEFEFEFE3807077A8614>58 D<38FEFEFFFFFF3B0303030706060E0C1C3830706008147A8614>I<0000000000800000 000003C0000000000FC0000000003F8000000000FE0000000003F8000000000FE0000000 003F8000000000FE0000000003F8000000000FE0000000003F8000000000FE0000000003 F8000000000FE0000000003F8000000000FE0000000003F8000000000FE0000000003F80 00000000FE0000000000F80000000000FE00000000003F80000000000FE00000000003F8 0000000000FE00000000003F80000000000FE00000000003F80000000000FE0000000000 3F80000000000FE00000000003F80000000000FE00000000003F80000000000FE0000000 0003F80000000000FE00000000003F80000000000FC00000000003C00000000000802A2B 7AA537>I<000000C0000001C0000003C000000380000003800000078000000700000007 0000000F0000000E0000000E0000001E0000001C0000001C0000003C0000003800000078 0000007000000070000000F0000000E0000000E0000001E0000001C0000001C0000003C0 0000038000000780000007000000070000000F0000000E0000000E0000001E0000001C00 00001C0000003C00000038000000380000007800000070000000F0000000E0000000E000 0001E0000001C0000001C0000003C00000038000000380000007800000070000000F0000 000E0000000E0000001E0000001C0000001C0000003C0000003800000038000000780000 007000000070000000F0000000E0000000E00000001A437CB123>I<0000000070000000 0000700000000000F00000000001F00000000001F00000000003F80000000003F8000000 0007F8000000000DF8000000000DF80000000019F80000000039F80000000031F8000000 0061FC0000000060FC00000000C0FC0000000180FC0000000180FC0000000300FC000000 0700FC0000000600FC0000000C00FE0000000C007E00000018007E00000030007E000000 30007E00000060007E000000E0007E000000C0007E00000180007F000001FFFFFF000003 FFFFFF00000600003F00000600003F00000C00003F00001C00003F00001800003F000030 00003F80003000001F80006000001F8000C000001F8001C000001F8003C000001F8007C0 00001F800FC000003FC0FFF80007FFFEFFF80007FFFE2F2F7DAE35>65 D<0000007FC003000003FFF80700001FC03E0F00007E00071F0001F80003BF0003F00001 FE000FC00000FE001F8000007E003F0000007E007E0000007C00FC0000003C01F8000000 3C03F80000003C07F0000000380FE0000000380FE0000000381FC0000000381FC0000000 303F80000000003F80000000007F80000000007F00000000007F00000000007F00000000 00FF0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE00000000 00FE0000000180FE0000000380FE0000000300FE00000003007E00000007007E00000006 007E0000000E003F0000001C003F00000038001F80000070000F800000E00007C00001C0 0003E00007800001F8001E0000007E00F80000001FFFE000000003FF000000302F7CAD32 >67 D<003FFFFFFFFF80003FFFFFFFFF800000FE00007F800000FE00000F800000FC0000 07800000FC000007800001FC000003800001FC000003000001F8000003000001F8000003 000003F8000003000003F8000003000003F0000003000003F0003003000007F000700300 0007F0007000000007E0006000000007E000E00000000FE000E00000000FE001E0000000 0FC007C00000000FFFFFC00000001FFFFFC00000001FC007C00000001F8003800000001F 8003800000003F8003800000003F8003800000003F0003000C00003F0003000C00007F00 03001C00007F0000001800007E0000003800007E000000300000FE000000700000FE0000 00E00000FC000000E00000FC000001C00001FC000003C00001FC000007800001F800000F 800001F800001F800003F80001FF0000FFFFFFFFFF0000FFFFFFFFFE0000312D7DAC34> 69 D<0000007FC000000007FFF80000001F807E0000007C001F800001F0000FC00007E0 0003E0000F800003F0001F000001F0003E000000F8007C000000FC00F8000000FC01F800 0000FC03F00000007E07E00000007E07E00000007E0FC00000007E1FC00000007E1FC000 00007E3F800000007E3F80000000FE3F00000000FE7F00000000FE7F00000000FE7F0000 0000FEFE00000001FCFE00000001FCFE00000001FCFE00000003F8FE00000003F8FE0000 0003F0FE00000007F0FE00000007E0FE0000000FE0FE0000001FC0FE0000001F807E0000 003F007E0000007F003F0000007E003F000000FC001F800001F8001F800003E0000FC000 0FC00007E0001F000003F8007E000000FE03F80000003FFFC000000007FE0000002F2F7C AD36>79 D<003FFFFFF80000003FFFFFFF00000000FE001FC0000000FE0007E0000000FC 0003F0000000FC0001F8000001FC0000FC000001FC0000FC000001F80000FE000001F800 00FE000003F80000FE000003F80001FC000003F00001FC000003F00001FC000007F00003 F8000007F00003F0000007E00007E0000007E0000FC000000FE0001F8000000FE0007E00 00000FC003F80000000FFFFFE00000001FFFFF000000001FC007C00000001F8003E00000 001F8001F00000003F8001F80000003F8000F80000003F0000FC0000003F0000FC000000 7F0001FC0000007F0001FC0000007E0001F80000007E0001F8000000FE0003F8000000FE 0003F8000000FC0003F8000000FC0003F8000001FC0003F8038001FC0003F8030001F800 03F8030001F80003F8070003F80001FC0E00FFFFE000FC3C00FFFFE0007FF00000000000 0FC000312E7CAC35>82 D<000007F00600003FFE0E0000F80F9E0003E001FE00078000FE 000F00007C001E00007C003C00003C003C00003C00780000380078000038007800003800 F800003800F800003000F800003000FC00000000FC00000000FE000000007F800000007F F80000003FFF8000003FFFF000001FFFFC000007FFFE000000FFFF0000001FFF00000001 FF800000003F800000001F800000000F800000000F800000000780180000078018000007 8018000007801800000F803800000F003800000F003800001E003800001E007C00003C00 7E000078007F0000F0007B8003E000F1F00F8000E07FFE0000C00FF00000272F7CAD2B> I<0FFFFFFFFFFF0FFFFFFFFFFF1FC003F8003F1F0003F8001F1C0003F0000E3C0003F000 0E380007F00006300007F00006700007E0000E700007E0000E60000FE0000CE0000FE000 0CC0000FC0000CC0000FC0000CC0001FC0000C00001FC0000000001F80000000001F8000 0000003F80000000003F80000000003F00000000003F00000000007F00000000007F0000 0000007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC0000 000001FC0000000001FC0000000001F80000000001F80000000003F80000000003F80000 000003F00000000003F00000000007F00000000007F00000000007E0000000000FE00000 00001FE00000001FFFFFF000001FFFFFF00000302D7FAC29>I<000FFFFC007FFF000FFF FC007FFF00007FC0000FF000003F80000F8000003F80000F0000001FC0001E0000001FC0 00180000000FC000300000000FE0006000000007E000C000000007F0018000000003F003 0000000003F8060000000003F80C0000000001FC180000000001FC300000000000FE6000 00000000FEC000000000007F8000000000007F0000000000003F8000000000003F800000 0000001FC000000000003FC000000000006FC00000000000CFE0000000000187E0000000 000307F0000000000703F0000000000E03F8000000001C03F8000000003801FC00000000 7001FC00000000E000FE00000001C000FE0000000380007F0000000700007F0000000E00 003F8000001C00003F8000003800001FC000007000001FC00001F000001FE00007F80000 3FE000FFFE0003FFFF00FFFE0003FFFF00382D7EAC3A>88 DI<0007E000001FF800007C1CE000 F80DE001F00FE003E007E007C007E00FC007E01F8007C01F8007C03F0007C03F000FC07F 000F807E000F807E000F807E001F80FE001F00FC001F00FC001F00FC003F02FC003E06FC 003E06F8003E06F8007E0E7C00FE0C7C00FC0C7C01FC1C3E07BE181F0E1E380FFC0FF003 F003C01F1F7D9D25>97 D<00F800001FF800001FF8000001F8000001F8000001F0000001 F0000003F0000003F0000003E0000003E0000007E0000007E0000007C0000007C000000F C000000FC7E0000F9FF8000FB83C001FF01E001FE01F001FC01F001F800F803F000F803F 000F803E000F803E000F807E001F807E001F807C001F807C001F807C003F80FC003F00F8 003F00F8003F00F8007E00F8007E00F8007C00F800FC00F800F8007801F0007803F00078 07E0003C0F80001E1F00000FFC000003F00000192F7DAD1E>I<0001F800000FFE00003E 0780007C018001F801C003F007C007E00FC00FC00FC00F800F801F800F803F0000003F00 00007F0000007E0000007E0000007E000000FE000000FC000000FC000000FC000000FC00 0000FC000000FC0000607C0000E07C0001C07C0003803E000F001E001C000F81F80007FF E00000FE00001B1F7D9D1F>I<000700000F80001FC0001FC0000F800007000000000000 0000000000000000000000000000000000000000000001E00007F8000E3C001C3E00383E 00303E00703E00607E00E07C00C07C00C0FC0080F80000F80001F80001F00003F00003E0 0003E00007E00007C04007C0C00FC0C00F80C00F81C01F01801F03801F07000F06000F1E 0007F80001F000122E7EAC18>105 D<000000E0000001F0000003F0000003F0000003F0 000001C00000000000000000000000000000000000000000000000000000000000000000 0000000000007C000003FE0000078F80000E0780001C0780003807C0003007C000700FC0 00600F8000E00F8000C00F8000801F8000001F8000001F0000001F0000003F0000003F00 00003E0000003E0000007E0000007E0000007C0000007C000000FC000000FC000000F800 0000F8000001F8000001F8000001F0000001F0000003F0000003F0000003E0000003E000 0007E0003807C000FC0FC000FC0F8000FC1F0000F83E0000F0F800007FF000001F800000 1C3B81AC1D>I<078007F0007E00001FE01FFC03FF800018F0781F0783E0003878E00F1E 01E0003079C00FB801F000707F800FB001F000607F000FF001F00060FE000FE001F000E0 FE000FC001F000C0FC000FC001F000C0F8000F8001F00081F8001F8003F00001F8001F80 03E00001F0001F0003E00001F0001F0003E00003F0003F0007E00003F0003F0007C00003 E0003E0007C00003E0003E000FC00007E0007E000F808007E0007E000F818007C0007C00 1F818007C0007C001F01800FC000FC003F03800FC000FC003E03000F8000F8003E07000F 8000F8003E0E001F8001F8001E0C001F8001F8001E3C001F0001F0000FF0000E0000E000 03E000391F7E9D3E>109 D<07C007E0001FE03FF80018F8783E003879E01E00307B801F 00707F001F00607F001F0060FE001F00E0FC001F00C0FC001F00C0F8001F0081F8003F00 01F8003E0001F0003E0001F0003E0003F0007E0003F0007C0003E0007C0003E000FC0007 E000F80807E000F81807C001F81807C001F0180FC001F0380FC003E0300F8003E0700F80 03E0E01F8001E0C01F8001E3C01F0000FF000E00003E00251F7E9D2B>I<003F007C0000 FFC1FF0001C1E383800380F703C00700F60FC00E00FE0FC01C00FC0FC01800FC0FC03800 FC07003000F800003000F800002001F800000001F000000001F000000001F000000003F0 00000003E000000003E000000003E000000007E001000007E003000007C003003807C007 007C0FC00600FC0FC00E00FC1FC00C00FC1BC01C00F03BE038007071E0F0003FE0FFC000 0F803F0000221F7E9D28>120 D E /Ft 5 49 df0 D<006000007000006000006000406020E06070F861F07C63E00F6F0003 FC0000600003FC000F6F007C63E0F861F0E0607040602000600000600000700000600014 157B9620>3 D<00000000060000000000000E0000000000000700000000000007000000 000000078000000000000380000000000003C0000000000001C0000000000000E0000000 00000070000000000000780000000000001E007FFFFFFFFFFF80FFFFFFFFFFFFE07FFFFF FFFFFF8000000000001E0000000000007800000000000070000000000000E00000000000 01C0000000000003C0000000000003800000000000078000000000000700000000000007 0000000000000E000000000000060000331B7C993D>33 D<0000000380000000000001C0 000000000001C0000000000000E000000000000070000000000000780000000000003800 00FFFFFFFFFC0000FFFFFFFFFF0000FFFFFFFFFF80000000000003C0000000000000F000 00000000007C0000000000001F80000000000007E000000000001F8000000000007C0000 00000000F0000000000003C000FFFFFFFFFF8000FFFFFFFFFF0000FFFFFFFFFC00000000 0000380000000000007800000000000070000000000000E0000000000001C00000000000 01C0000000000003800000331D7C9A3D>41 D<01E003F003F003F003F007E007E007C00F C00FC00F800F801F001F001E001E003E003C003C007800780078007000F000E00060000C 1A7E9B12>48 D E /Fu 14 64 df<78FCFCFCFCFCFCFCFC787878787878787878787830 30303030300000000030FCFCFCFC3006247AA312>33 D<000C0038007000E001C0038003 0007000E000E001C001C003800380038007800700070007000F000F000F000F000F000F0 00F000F000F000F000F00070007000700078003800380038001C001C000E000E00070003 00038001C000E000700038000C0E317AA418>40 DI<00E00001E00007E000FFE000F9E00001E000 01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000 01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000 03F000FFFFC0FFFFC012217AA01E>49 D<01FC0007FF801C0FC03003E06001F06000F8F8 00F8FC00FCFC00FCFC007C78007C3000FC0000FC0000F80000F80001F00003E00003C000 0780000F00001E0000380000700000E00001C00C03800C0600180C00181800183FFFF87F FFF8FFFFF0FFFFF016217CA01E>I<00FF0003FFC00F03E01C00F01C00F83E00FC3E007C 3E007C1E00FC0C00FC0000F80000F80001F00003E0000FC001FF0001FF000003E00000F0 00007800007C00003E00003F30003F78003FFC003FFC003FFC003EF8007E60007C3800F8 1E03F00FFFC001FF0018227DA01E>I<0000E00001E00001E00003E00007E00007E0000D E0001DE00039E00031E00061E000E1E000C1E00181E00381E00701E00601E00C01E01C01 E01801E03001E07001E0E001E0FFFFFFFFFFFF0001E00001E00001E00001E00001E00001 E00003F0003FFF003FFF18227DA11E>I<1000301E01F01FFFE01FFFC01FFF801FFE001B F00018000018000018000018000018000018FE001BFF801F03C01C01E01800F01800F800 007800007800007C00007C30007C78007CF8007CF8007CF80078F000F86000F07001E038 01E01E078007FF0001F80016227CA01E>I<000FC0007FF001F03803C01807803C0F007C 1E007C1C00383C00003C00007C0000780000787FC0F8FFE0F980F0FA0038FE003CFC001E FC001EF8001FF8001FF8001FF8001F78001F78001F78001F3C001E3C001E1C003C1E0038 0F00700781E001FFC0007F0018227DA01E>I<3000003C00003FFFFF3FFFFF7FFFFE7FFF FC60001C600038600070C000E0C000C00001C0000380000700000600000E00001C00001C 0000380000380000780000780000780000F00000F00000F00000F00001F00001F00001F0 0001F00001F00001F00001F00000E00018237CA11E>I<007F0003FFC00781E00E00701C 003818001C38001C38001C38001C3C001C3F00381FC0781FE0F00FF9E007FF8001FF8001 FFC007FFF00F0FF81C03FC3801FE70007E70001FE0000FE00007E00007E00007E0000670 000E78000C3C00381F00F007FFC000FF0018227DA01E>I<78FCFCFCFC78000000000000 00000078FCFCFCFC7806157A9412>58 D61 D<03FE000FFF803C03E07001F06000F0F000F8F800F8F800F87000F82001F00001F00003 E00007C0000F00001E00001C000038000030000030000070000060000060000060000060 0000600000600000000000000000000000000000600001F80001F80001F80001F8000060 0015247CA31D>63 D E /Fv 21 112 df<38FEFEFEFEFEFEFEFEFE7C7C7C7C7C7C7C7C7C 7C7C3838383838383838383838380000000000000038FEFEFEFEFE38072F7AAE14>33 D<0001F00000000007FC000000001F0C000000003E0E000000003C060000000078070000 0000780300000000F80300000000F80300000000F80300000000F80300000000F8070000 0000F80600000000F80E00000000F81C00000000F838000000007C30000000007C700000 00007CE0003FFF007FC0003FFF007F80000FF8003F000007E0003F00000380001F000003 80003F80000700007F8000060000EFC0000E0001CFC0001C000387E00018000707F00038 000F03F00070001E01F80060003E01FC00E0007C00FE01C0007C007E018000FC003F0380 00FC003F870000FC001FCE0000FC000FDC0000FC0007F80006FE0003F000067E0001F800 067E0001FC000C3F0007FE001C1F800E1F80380FC07C07E0F003FFF001FFE0007F80007F 8030307DAE37>38 D<00030007000E001C0038007000F001E001C003C0078007800F000F 001E001E001E003C003C003C003C0078007800780078007800F800F800F000F000F000F0 00F000F000F000F000F000F000F000F800F800780078007800780078003C003C003C003C 001E001E001E000F000F000780078003C001C001E000F000700038001C000E0007000310 437AB11B>40 DI<0000038000000000038000000000038000000000038000000000038000000000 038000000000038000000000038000000000038000000000038000000000038000000000 038000000000038000000000038000000000038000000000038000000000038000000000 03800000000003800000000003800000000003800000000003800000FFFFFFFFFFFCFFFF FFFFFFFCFFFFFFFFFFFC0000038000000000038000000000038000000000038000000000 038000000000038000000000038000000000038000000000038000000000038000000000 038000000000038000000000038000000000038000000000038000000000038000000000 038000000000038000000000038000000000038000000000038000000000038000002E2F 7CA737>43 D<003FC00000FFF00003E07C0007C03E000F801F000F000F001E0007801E00 07803E0007C03E0007C07C0003E07C0003E07C0003E07C0003E07C0003E0FC0003F0FC00 03F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F0FC00 03F0FC0003F0FC0003F0FC0003F0FC0003F0FC0003F07C0003E07C0003E07C0003E07E00 07E03E0007C03E0007C03E0007C01F000F800F000F000F801F0007C03E0003F0FC0000FF F000003FC0001C2D7DAB23>48 D<000C00003C00007C0003FC00FFFC00FC7C00007C0000 7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000 7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000 7C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000FE007FFFFE7F FFFE172C7AAB23>I<007F800001FFF0000780FC000E003F001C001F8038000FC070000F C0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F07C0007F0000007 F0000007F0000007E000000FE000000FC000001FC000001F8000003F0000007E0000007C 000000F8000001F0000003E0000007C000000F8000001E0000003C00000078000000F000 3000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE07FFFFFC0FFFFFF C0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C003F001C001F80 3F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000001F8000001F80 00003F0000003E0000007C000000F8000003F00000FFC00000FFF0000000FC0000003F00 00001F8000001FC000000FC000000FE000000FE0000007F0000007F0380007F07C0007F0 FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038001F801E003F00 0780FC0001FFF000007FC0001C2D7DAB23>I<00000E0000000E0000001E0000003E0000 003E0000007E000000FE000000FE000001BE000003BE0000033E0000063E00000E3E0000 0C3E0000183E0000383E0000303E0000603E0000E03E0000C03E0001803E0003803E0003 003E0006003E000E003E000C003E0018003E0038003E0030003E0060003E00E0003E00FF FFFFFCFFFFFFFC00003E0000003E0000003E0000003E0000003E0000003E0000003E0000 003E0000003E0000007F00001FFFFC001FFFFC1E2D7EAC23>I<0C0001800FC01F800FFF FF000FFFFE000FFFFC000FFFF0000FFFC0000C7E00000C0000000C0000000C0000000C00 00000C0000000C0000000C0000000C0000000C1FC0000C7FF8000DE07C000F801F000F00 1F800E000F800C0007C0000007E0000007E0000003E0000003F0000003F0000003F00000 03F0780003F0FC0003F0FC0003F0FC0003F0FC0003F0F80007E0E00007E0600007C07000 0FC038000F801C001F000E003E000780F80001FFE000007F80001C2D7DAB23>I<0003F8 00000FFE00003E078000F8018001F007C003E00FC007C00FC00F800FC00F800FC01F0007 801F0000003E0000003E0000007E0000007E0000007C0000007C0FC000FC3FF000FCF07C 00FDC01E00FF800F00FF000F80FF0007C0FE0007E0FE0007E0FE0003E0FC0003F0FC0003 F0FC0003F0FC0003F07C0003F07C0003F07C0003F07E0003F07E0003F03E0003E03E0007 E01E0007E01F0007C00F000F8007801F0003C03E0001E07C00007FF000001FC0001C2D7D AB23>I<300000003C0000003FFFFFF83FFFFFF83FFFFFF07FFFFFF07FFFFFE0700001C0 6000018060000380C0000700C0000E00C0000C0000001C00000038000000300000007000 0000E0000001C0000001C00000038000000380000007000000070000000F0000000E0000 001E0000001E0000003E0000003E0000003E0000003C0000007C0000007C0000007C0000 007C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000 00FC0000007800001D2E7CAC23>I<001FC00000FFF00003E07C0007801E000F000F001E 0007801E0007803C0003C03C0003C03C0003C03C0003C03E0003C03E0007C03F0007801F C00F801FE00F001FF81E000FFC3C0007FFF80003FFE00000FFE000003FF80000FFFC0003 C7FF000783FF801F00FFC01E003FC03C001FE07C0007E0780003F0F80003F0F00001F0F0 0000F0F00000F0F00000F0F00000F0F80000E0780001E07C0001C03C0003C01E0007800F 800F0007E03C0001FFF000003FC0001C2D7DAB23>I<38FEFEFEFEFE3800000000000000 000000000000000038FEFEFEFEFE38071D7A9C14>58 D<38FEFEFEFEFE38000000000000 00000000000000000038FCFEFEFEFE3E060606060E0C0C1C1838706060072A7A9C14>I< 7FFFFFFFFFF8FFFFFFFFFFFCFFFFFFFFFFFC000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000FFFFFFFFFFFCFFFFFFFFFFFC 7FFFFFFFFFF82E137C9937>61 D<00FF0007FFE01F01F83800FC70007E60003EF8003FFC 003FFC003FFC003FFC003F30003F00007E00007E0000FC0001F80003E00003C000078000 0F00000F00000E00001C00001C0000180000180000180000180000180000180000180000 180000180000000000000000000000000000000000000000000000380000FE0000FE0000 FE0000FE0000FE00003800182F7CAE21>63 D<003F00F800FFC3FE03E1FF1E07807C1E0F 807C0C1F003E001F003E003E001F003E001F003E001F003E001F003E001F003E001F003E 001F001F003E001F003E000F807C00078078000FE1F0000CFFC0001C3F00001C0000001C 0000001C0000001E0000001F0000000FFFF8000FFFFF0007FFFFC00FFFFFF01E0007F83C 0000F87800007CF800007CF000003CF000003CF000003CF000003CF800007C7C0000F83E 0001F01F0003E007E01F8001FFFE00003FF0001F2D7E9D23>103 D<07C0FFC0FFC00FC007C007C007C007C007C007C007C007C007C007C007C007C007C007 C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 C007C007C007C007C007C007C007C00FE0FFFEFFFE0F2E7EAD14>108 D<001FE000007FF80001F03E0003C00F00078007800F0003C01F0003E03E0001F03E0001 F07C0000F87C0000F87C0000F8FC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000 FCFC0000FCFC0000FCFC0000FC7C0000F87C0000F83E0001F03E0001F01F0003E01F0003 E00F8007C007C00F8001F03E00007FF800001FE0001E207E9E23>111 D E /Fw 1 4 df<7FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF0FFFFFFFF FFFFFFF0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0 F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000 000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0 F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000 000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0 F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000 000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0 F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000 000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0 F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000 000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0 F0000000000000F0F0000000000000F0F0000000000000F0F0000000000000F0F0000000 000000F0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0 3C3E7BBD47>3 D E /Fx 167[53 7[40 2[65 44 6[44 3[53 65[{}6 72.999954 /Times-Roman rf /Fy 69[33 10[42 42 3[33 47[33 37 37 54 37 37 21 29 25 37 37 37 37 58 21 37 21 21 37 37 25 33 37 33 37 33 3[25 1[25 1[54 54 71 54 54 46 42 50 54 42 54 54 66 46 1[29 25 54 54 42 46 54 50 50 54 5[21 1[37 37 37 37 37 37 37 37 37 37 1[19 25 19 42 1[25 25 25 39[{}74 75.000000 /Times-Roman rf /Fz 134[37 37 2[42 25 29 33 42 42 37 42 62 21 2[21 42 37 25 33 42 33 1[37 12[50 1[54 58 46 58 5[29 2[46 50 54 2[54 1[37 15[21 47[{}32 75.000000 /Times-Bold rf /FA 14 64 df<1E007F80FFC0FFC0FFC0FFC0FF C0FFC0FFC0FFC0FFC07F807F807F807F807F807F807F807F807F807F803F003F003F003F 003F003F003F003F003F003F001E001E001E001E001E001E001E001E001E001E000C000C 000C000C000C000000000000000000000000000000000000001E007F807F80FFC0FFC0FF C0FFC07F807F801E000A4179C019>33 D<0000300000700000E00001C000038000070000 0F00001E00003C00003C0000780000F00000F00001E00001E00003C00003C00007C00007 80000F80000F80000F00001F00001F00001E00003E00003E00003E00003C00007C00007C 00007C00007C00007C00007C0000780000F80000F80000F80000F80000F80000F80000F8 0000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8000078 00007C00007C00007C00007C00007C00007C00003C00003E00003E00003E00001E00001F 00001F00000F00000F80000F800007800007C00003C00003C00001E00001E00000F00000 F000007800003C00003C00001E00000F000007000003800001C00000E000007000003014 5A77C323>40 DI<00000006 000000000000000F000000000000000F000000000000000F000000000000000F00000000 0000000F000000000000000F000000000000000F000000000000000F000000000000000F 000000000000000F000000000000000F000000000000000F000000000000000F00000000 0000000F000000000000000F000000000000000F000000000000000F000000000000000F 000000000000000F000000000000000F000000000000000F000000000000000F00000000 0000000F000000000000000F000000000000000F000000000000000F000000000000000F 000000007FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0 0000000F000000000000000F000000000000000F000000000000000F000000000000000F 000000000000000F000000000000000F000000000000000F000000000000000F00000000 0000000F000000000000000F000000000000000F000000000000000F000000000000000F 000000000000000F000000000000000F000000000000000F000000000000000F00000000 0000000F000000000000000F000000000000000F000000000000000F000000000000000F 000000000000000F000000000000000F000000000000000F000000000000000F00000000 00000006000000003C3C7BB447>43 D<0001FE0000000FFFC000003F03F000007C00F800 00F8007C0001F0003E0003E0001F0007C0000F8007C0000F800FC0000FC01F800007E01F 800007E01F800007E03F800007F03F800007F03F000003F07F000003F87F000003F87F00 0003F87F000003F87F000003F87F000003F8FF000003FCFF000003FCFF000003FCFF0000 03FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003 FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FC FF000003FCFF000003FC7F000003F87F000003F87F000003F87F000003F87F000003F83F 800007F03F800007F03F800007F01F800007E01F800007E01F800007E00FC0000FC00FC0 000FC007E0001F8003E0001F0001F0003E0000F8007C00007C00F800003F03F000000FFF C0000001FE0000263F7DBC2D>48 D<0000C0000003C0000007C000001FC000007FC00007 FFC000FFFFC000FF9FC000F81FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000007FF000FFFFFFF8FF FFFFF8FFFFFFF81D3D78BC2D>I<0007FC0000003FFF800000FFFFE00001F01FF8000780 03FC000F0001FE000E0000FF001C00007F803800007FC03000003FC07000003FE0600000 1FE06000001FE0FE00001FF0FF00001FF0FF80001FF0FF80000FF0FF80000FF0FF80000F F0FF80001FF07F00001FF01C00001FF00000001FE00000001FE00000003FE00000003FC0 0000003FC00000007F800000007F80000000FF00000000FE00000001FC00000003F80000 0003F000000007E00000000FC00000001F800000003F000000003E000000007C00000000 F800000001F000000003E000000007C00000000F800000001F000030001E000030003C00 0030007800003000F000006001E0000060038000006007000000600E000000E00FFFFFFF E01FFFFFFFE03FFFFFFFE07FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0243D7CBC2D >I<0007FC0000003FFF800000F80FE00001C003F800078001FC000E0000FE000C0000FF 001C00007F801F80007F803FC0007FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC0 3FE0003FC01FC0007FC00700007FC00000007F800000007F800000007F00000000FF0000 0000FE00000001FE00000001FC00000003F800000007E00000000FC00000003F0000001F FC0000001FFF800000000FE000000003F800000001FC00000000FE000000007F00000000 7F800000003FC00000003FC00000003FE00000003FE00000001FE00000001FF00000001F F00C00001FF03F00001FF07F80001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF0 FFC0003FE0FF80003FE07F00003FC07000003FC07000007F803800007F801C0000FF000F 0001FE0007C003FC0003F80FF00000FFFFE000003FFF80000007FC0000243F7CBC2D>I< 0000000E000000000E000000001E000000003E000000003E000000007E00000000FE0000 0000FE00000001FE00000003FE000000037E000000067E0000000E7E0000000C7E000000 187E000000387E000000307E000000607E000000E07E000000C07E000001807E00000380 7E000003007E000006007E00000E007E00000C007E000018007E000038007E000030007E 000060007E0000E0007E0000C0007E000180007E000380007E000300007E000600007E00 0E00007E000C00007E001800007E003800007E003000007E006000007E00E000007E00FF FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FE00000000FE00000000FE00000000FE000000 00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000 FE00000001FF000001FFFFFF0001FFFFFF0001FFFFFF283E7EBD2D>I<00001FE0000000 FFF8000003F01E00000FC00700001F000380003E000180007C000FC000F8001FC001F800 3FC003F0003FC003F0003FC007E0003FC00FE0001F800FC0000F001FC00000001FC00000 001F800000003F800000003F800000003F800000007F800000007F000000007F01FE0000 7F07FF8000FF0E03E000FF1C01F000FF3800FC00FF70007E00FF60003E00FFE0003F00FF C0001F80FFC0001FC0FF80001FC0FF80001FE0FF80000FE0FF80000FE0FF00000FF0FF00 000FF0FF00000FF0FF00000FF0FF00000FF07F00000FF07F00000FF07F00000FF07F0000 0FF07F00000FF07F80000FF03F80000FF03F80000FE03F80000FE01F80000FE01F80001F C01FC0001FC00FC0001F800FC0003F8007E0003F0003F0007E0001F800FC0000FC01F800 007E07F000003FFFE000000FFF80000003FC0000243F7CBC2D>54 D<1E007F807F80FFC0FFC0FFC0FFC07F807F801E00000000000000000000000000000000 00000000000000000000000000000000000000000000001E007F807F80FFC0FFC0FFC0FF C07F807F801E000A2779A619>58 D<1E007F807F80FFC0FFC0FFC0FFC07F807F801E0000 000000000000000000000000000000000000000000000000000000000000000000000000 001E007F00FF80FF80FFC0FFC0FFC0FFC07FC01EC000C000C000C000C001C00180018001 8003800300070006000E000C001C003800300030000A3979A619>I<7FFFFFFFFFFFFFE0 FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE0000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFE0 FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE03C167BA147>61 D<001FF80000FFFF0003E01FC00F0007F01C0003F8380001FC700001FE600000FEFC0000 FFFE0000FFFF0000FFFF0000FFFF0000FFFF0000FF7E0000FF3C0000FF000001FE000001 FE000003FC000007F8000007F000000FC000001F8000003F0000003E0000007C00000078 000000F8000000F0000000E0000001E0000001C0000001C0000001800000038000000380 000003000000030000000300000003000000030000000300000003000000030000000300 000000000000000000000000000000000000000000000000000000000000000000000000 0000078000001FE000001FE000003FF000003FF000003FF000003FF000001FE000001FE0 000007800020407BBF2B>63 D E /FB 8 104 df0 D<38FEFEFEFEFE3807077A9314>I<000C0000001E0000001E0000 001E0000001E0000001E0000601E0180781E0780FC0C0FC07F0C3F803F8C7F0007CCF800 01FFE000007F8000001E0000007F800001FFE00007CCF8003F8C7F007F0C3F80FC0C0FC0 781E0780601E0180001E0000001E0000001E0000001E0000001E0000000C00001A1D7C9E 23>3 D<00000000000E000000000000000E000000000000000E000000000000000F0000 000000000007000000000000000780000000000000038000000000000003C00000000000 0001C000000000000001E000000000000000F00000000000000078000000000000007C00 0000000000003E000000000000000F0000000000000007C0FFFFFFFFFFFFFFF8FFFFFFFF FFFFFFFCFFFFFFFFFFFFFFF800000000000007C00000000000000F000000000000003E00 0000000000007C000000000000007800000000000000F000000000000001E00000000000 0001C000000000000003C000000000000003800000000000000780000000000000070000 00000000000F000000000000000E000000000000000E000000000000000E00003E237CA1 47>33 D<000000000E000000000000000F00000000000000070000000000000007800000 00000000038000000000000003C000000000000001E000000000000000F0000000000000 0078000000000000003C00007FFFFFFFFFFE0000FFFFFFFFFFFF0000FFFFFFFFFFFF8000 000000000003C000000000000001F0000000000000007C000000000000003F0000000000 00000FE000000000000003FC00000000000001FC00000000000007E00000000000001F80 0000000000007C00000000000000F800000000000001E000000000000007C000FFFFFFFF FFFF8000FFFFFFFFFFFE00007FFFFFFFFFFC000000000000007800000000000000700000 0000000000F000000000000001E000000000000003C00000000000000380000000000000 078000000000000007000000000000000F000000000000000E0000003E277CA347>41 D<003800FE00FE00FE00FE01FE01FC01FC03F803F803F803F007F007F007E007E00FC00F C00FC01F801F801F801F003F003E003E003E007C007C007C007800F800F800F0000F227E A413>48 D<00001F0000FF0003F0000FC0001F80001F00003F00003E00003E00003E0000 3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0000 3E00003E00003E00003E00003E00007E00007C0000FC0001F80003F0007FC000FF00007F C00003F00001F80000FC00007C00007E00003E00003E00003E00003E00003E00003E0000 3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0000 3E00003E00003F00001F00001F80000FC00003F00000FF00001F18437BB123>102 DI E /FC 7 106 df<7FFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFE 3804799847>0 D<000FFC0000003FFF000000FFFFC00003FFFFF00007FFFFF8000FFFFF FC001FFFFFFE003FFFFFFF003FFFFFFF007FFFFFFF807FFFFFFF807FFFFFFF80FFFFFFFF C0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0 FFFFFFFFC0FFFFFFFFC07FFFFFFF807FFFFFFF807FFFFFFF803FFFFFFF003FFFFFFF001F FFFFFE000FFFFFFC0007FFFFF80003FFFFF00000FFFFC000003FFF0000000FFC00002222 7BA72D>15 D<000000000001E0000000000000000001F0000000000000000000F0000000 000000000000F8000000000000000000780000000000000000007C000000000000000000 3E0000000000000000003E0000000000000000001F0000000000000000000F8000000000 0000000007C0000000000000000007E0000000000000000003E0000000000000000001F0 00007FFFFFFFFFFFFFFC0000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFFFFFF00007FFFFFFF FFFFFFFF80000000000000000007E0000000000000000003F0000000000000000001FC00 00000000000000007F0000000000000000001FC000000000000000000FF8000000000000 000003FF000000000000000003FF00000000000000000FF800000000000000001FC00000 0000000000007F000000000000000001FC000000000000000003F0000000000000000007 E0007FFFFFFFFFFFFFFF8000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFE00007FFFFFFF FFFFFFFC000000000000000001F0000000000000000003E0000000000000000007E00000 00000000000007C000000000000000000F8000000000000000001F000000000000000000 3E0000000000000000003E0000000000000000007C000000000000000000780000000000 00000000F8000000000000000000F0000000000000000001F0000000000000000001E000 000050327BAF5B>41 D<0000003F000003FF00000FE000003F8000007E000001FC000001 F8000003F0000003F0000007E0000007E0000007E0000007E0000007E0000007E0000007 E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 E0000007E0000007E0000007E000000FE000000FC000001FC000003F8000003F000000FE 000003F800007FE00000FF0000007FE0000003F8000000FE0000003F0000003F8000001F C000000FC000000FE0000007E0000007E0000007E0000007E0000007E0000007E0000007 E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 E0000007E0000007E0000007E0000003F0000003F0000001F8000001FC0000007E000000 3F8000000FE0000003FF0000003F205B7AC32D>102 DI<0000 600000F00001F00001F00001E00003E00003E00003C00007C00007C0000F80000F80000F 00001F00001F00001E00003E00003E00007C00007C0000780000F80000F80000F00001F0 0001F00001E00003E00003E00007C00007C0000780000F80000F80000F00001F00001F00 003E00003E00003C00007C00007C0000780000F80000F80000F80000F800007800007C00 007C00003C00003E00003E00001F00001F00000F00000F80000F800007800007C00007C0 0003E00003E00001E00001F00001F00000F00000F80000F800007800007C00007C00003E 00003E00001E00001F00001F00000F00000F80000F800007C00007C00003C00003E00003 E00001E00001F00001F00000F0000060145A77C323>I<600000F00000F80000F8000078 00007C00007C00003C00003E00003E00001F00001F00000F00000F80000F800007800007 C00007C00003E00003E00001E00001F00001F00000F00000F80000F800007800007C0000 7C00003E00003E00001E00001F00001F00000F00000F80000F800007C00007C00003C000 03E00003E00001E00001F00001F00001F00001F00001E00003E00003E00003C00007C000 07C0000F80000F80000F00001F00001F00001E00003E00003E00007C00007C0000780000 F80000F80000F00001F00001F00001E00003E00003E00007C00007C0000780000F80000F 80000F00001F00001F00003E00003E00003C00007C00007C0000780000F80000F80000F0 0000600000145A7BC323>I E /FD 81[45 51[35 40 40 61 40 45 25 35 35 45 45 45 45 66 25 40 25 25 45 45 25 40 45 40 45 45 9[76 56 1[51 45 56 66 56 66 1[76 51 61 40 30 66 66 56 56 66 61 56 56 6[30 45 45 45 45 1[45 45 45 45 45 2[30 23 44[{}60 91.249977 /Times-Italic rf /FE 134[33 1[48 1[37 22 26 29 1[37 33 37 55 18 2[18 37 1[22 29 37 29 37 14[37 83[{}19 66.666664 /Times-Bold rf /FF 134[33 33 48 33 33 18 26 22 33 33 33 33 52 18 33 18 18 33 33 22 29 33 29 33 29 3[22 1[22 5[48 41 37 44 1[37 48 48 59 41 1[26 22 2[37 41 48 44 44 48 1[29 1[37 1[18 1[33 33 33 33 33 33 33 33 33 33 1[17 22 17 2[22 22 2[55 3[22 33[{}64 66.666664 /Times-Roman rf /FG 135[86 3[57 1[76 1[96 1[96 4[48 96 2[76 96 2[86 29[124 115 124 9[86 86 86 86 86 86 86 49[{}20 172.833374 /Times-Bold rf /FH 31 121 df<00001FF0000001FFFC000007FFFF00001FFFFFC0007F801FE000FC0007E001 E00001E003C00000000700000000070000000006000000000E000000000C000000000C00 0000000E0000000006000000000700000000038FFF000001FFFF800001FF1F0000039FFE 00000700E000000E000000001C00000000380000000070000000006000000000E0000000 00C000000000C000000000C000000000C000000000C000000000C000000600E000000E00 F000001C0078000038007C0000F0003F8007E0001FFFFFC00007FFFF000001FFFC000000 7FE00000232B7DA82A>34 D<1E007F807F80FFC0FFC0FFC0FFC07F807F801E000A0A7989 19>58 D<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60006000600060006000E000C0 00C000C001C001800380030007000E001C001800380030000B1C798919>I<0000000000 00060000000000001F0000000000007F000000000001FF000000000007FC00000000001F F000000000007FC00000000001FF000000000007FC00000000003FF00000000000FFC000 00000003FF00000000000FFC00000000003FE00000000000FF800000000003FE00000000 000FF800000000007FE00000000001FF800000000007FE00000000001FF800000000007F C00000000001FF000000000007FC00000000001FF000000000007FC00000000000FF0000 00000000FF0000000000007FC000000000001FF0000000000007FC000000000001FF0000 000000007FC000000000001FF8000000000007FE000000000001FF8000000000007FE000 000000000FF8000000000003FE000000000000FF8000000000003FE000000000000FFC00 0000000003FF000000000000FFC000000000003FF0000000000007FC000000000001FF00 00000000007FC000000000001FF0000000000007FC000000000001FF0000000000007F00 00000000001F00000000000006383679B147>I<000000018000000003C000000007C000 000007C000000007800000000F800000000F800000000F000000001F000000001F000000 001E000000003E000000003E000000003C000000007C000000007C000000007800000000 F800000000F800000000F000000001F000000001F000000001E000000003E000000003E0 00000003C000000007C000000007C000000007800000000F800000000F800000001F0000 00001F000000001E000000003E000000003E000000003C000000007C000000007C000000 007800000000F800000000F800000000F000000001F000000001F000000001E000000003 E000000003E000000003C000000007C000000007C000000007800000000F800000000F80 0000000F000000001F000000001F000000001E000000003E000000003E000000007C0000 00007C000000007800000000F800000000F800000000F000000001F000000001F0000000 01E000000003E000000003E000000003C000000007C000000007C000000007800000000F 800000000F800000000F000000001F000000001F000000001E000000003E000000003E00 0000003C000000007C000000007C000000007800000000F800000000F800000000F00000 00006000000000225B7BC32D>I<60000000000000F8000000000000FE000000000000FF 8000000000003FE000000000000FF8000000000003FE000000000000FF8000000000003F E000000000000FFC000000000003FF000000000000FFC000000000003FF0000000000007 FC000000000001FF0000000000007FC000000000001FF0000000000007FE000000000001 FF8000000000007FE000000000001FF8000000000003FE000000000000FF800000000000 3FE000000000000FF8000000000003FE000000000000FF000000000000FF000000000003 FE00000000000FF800000000003FE00000000000FF800000000003FE00000000001FF800 000000007FE00000000001FF800000000007FE00000000001FF000000000007FC0000000 0001FF000000000007FC00000000003FF00000000000FFC00000000003FF00000000000F FC00000000003FE00000000000FF800000000003FE00000000000FF800000000003FE000 00000000FF800000000000FE000000000000F800000000000060000000000000383679B1 47>I<0000000000030000000000000007000000000000000F000000000000000F000000 000000001F000000000000003F000000000000003F000000000000007F80000000000000 7F80000000000000FF80000000000001FF80000000000001FF800000000000037F800000 000000037F800000000000067F8000000000000E7F8000000000000C7F80000000000018 7FC00000000000187FC00000000000307FC00000000000703FC00000000000603FC00000 000000C03FC00000000000C03FC00000000001803FC00000000003803FC0000000000300 3FC00000000006003FC00000000006003FE0000000000C003FE0000000001C001FE00000 000018001FE00000000030001FE00000000030001FE00000000060001FE0000000006000 1FE000000000C0001FE00000000180001FE00000000180001FF00000000300001FF00000 000300000FF000000007FFFFFFF00000000FFFFFFFF00000000FFFFFFFF0000000180000 0FF00000001800000FF00000003000000FF00000006000000FF00000006000000FF80000 00C000000FF8000000C000000FF800000180000007F800000300000007F8000003000000 07F800000600000007F800000600000007F800000C00000007F800001C00000007F80000 3800000007F800007800000007FC0000FC00000007FC0007FE0000001FFE00FFFFE00007 FFFFFCFFFFE00007FFFFFCFFFFE00007FFFFF83E417DC044>65 D<000000001FF8000300 000001FFFF00070000000FFFFFC00E0000003FF007E01E000000FF8000F03E000003FC00 00387E00000FF000001CFC00001FE000000FFC00007F8000000FFC0000FF00000007FC00 01FE00000003F80003FC00000003F8000FF800000001F8001FF000000001F8001FE00000 0001F0003FC000000000F0007F8000000000F000FF8000000000F001FF0000000000E001 FE0000000000E003FE0000000000E007FC0000000000E007FC0000000000C00FF8000000 0000C00FF80000000000C01FF00000000000C01FF00000000000003FF00000000000003F E00000000000003FE00000000000007FE00000000000007FC00000000000007FC0000000 0000007FC0000000000000FFC0000000000000FF80000000000000FF80000000000000FF 80000000000000FF80000000000000FF80000000000000FF00000000000000FF00000000 001C00FF00000000001C00FF00000000001800FF00000000001800FF00000000003800FF 00000000003000FF000000000070007F800000000060007F8000000000E0007F80000000 01C0003F800000000180003FC00000000380003FC00000000700001FE00000000E00000F E00000001C00000FF000000038000007F800000070000003FC000001E0000001FE000003 C0000000FF00000F800000003FC0003E000000001FF803F80000000007FFFFE000000000 00FFFF8000000000001FF80000000040427BBF41>67 D<0001FFFFFFFFF800000001FFFF FFFFFF00000001FFFFFFFFFFC000000001FF00003FF000000001FF00000FF800000001FE 000003FC00000001FE000000FE00000001FE0000007F00000003FE0000003F80000003FC 0000003F80000003FC0000001FC0000003FC0000001FC0000007FC0000000FE0000007F8 0000000FE0000007F80000000FF0000007F80000000FF000000FF800000007F000000FF0 00000007F000000FF000000007F000000FF000000007F800001FF000000007F800001FE0 00000007F800001FE000000007F800001FE00000000FF800003FE00000000FF800003FC0 0000000FF800003FC00000000FF800003FC00000000FF000007FC00000000FF000007F80 0000001FF000007F800000001FF000007F800000001FF00000FF800000001FE00000FF00 0000003FE00000FF000000003FE00000FF000000003FC00001FF000000007FC00001FE00 0000007FC00001FE000000007F800001FE00000000FF800003FE00000000FF000003FC00 000000FF000003FC00000001FE000003FC00000001FC000007FC00000003FC000007F800 000003F8000007F800000007F0000007F80000000FF000000FF80000001FE000000FF000 00001FC000000FF00000003F8000000FF00000007F0000001FF0000000FE0000001FE000 0001FC0000001FE0000007F80000003FE000000FE00000003FE000003FC00000003FC000 01FF000000007FC0000FFC000000FFFFFFFFFFF0000000FFFFFFFFFFC0000000FFFFFFFF FC00000000453E7DBD4B>I<0001FFFFFFFFFFFFC00001FFFFFFFFFFFFC00001FFFFFFFF FFFFC0000001FF000001FFC0000001FF0000001FC0000001FE0000000FC0000001FE0000 0007C0000001FE0000000780000003FE0000000380000003FC0000000380000003FC0000 000380000003FC0000000380000007FC0000000380000007F80000000380000007F80000 000300000007F8000000030000000FF8000000030000000FF0000300030000000FF00003 00030000000FF0000700070000001FF0000600060000001FE0000600000000001FE0000E 00000000001FE0000E00000000003FE0001C00000000003FC0001C00000000003FC0003C 00000000003FC001FC00000000007FFFFFF800000000007FFFFFF800000000007FFFFFF8 00000000007F8001F80000000000FF8000F00000000000FF0000700000000000FF000070 0000000000FF0000700000000001FF0000600000000001FE0000600000000001FE000060 000C000001FE0000E0001C000003FE0000C00018000003FC0000C00038000003FC000000 0030000003FC0000000030000007FC0000000070000007F80000000060000007F8000000 00E0000007F800000000C000000FF800000001C000000FF0000000038000000FF0000000 038000000FF0000000078000001FF00000000F0000001FE00000001F0000001FE0000000 3E0000003FE00000007E0000003FE0000000FC0000003FC0000007FC0000007FC000007F FC0000FFFFFFFFFFFFF80000FFFFFFFFFFFFF80000FFFFFFFFFFFFF00000423E7DBD43> I<0001FFFFFFFFFFFF0001FFFFFFFFFFFF0001FFFFFFFFFFFF000001FF000003FF000001 FF0000007F000001FE0000003F000001FE0000001F000001FE0000001E000003FE000000 0E000003FC0000000E000003FC0000000E000003FC0000000E000007FC0000000E000007 F80000000E000007F80000000C000007F80000000C00000FF80000000C00000FF0000000 0C00000FF00006000C00000FF0000E001C00001FF0000C001800001FE0000C000000001F E0000C000000001FE0001C000000003FE00018000000003FC00038000000003FC0007800 0000003FC000F8000000007FC003F0000000007FFFFFF0000000007FFFFFF0000000007F FFFFF000000000FF8003E000000000FF0001E000000000FF0000E000000000FF0000E000 000001FF0000C000000001FE0000C000000001FE0000C000000001FE0001C000000003FE 00018000000003FC00018000000003FC00018000000003FC00000000000007FC00000000 000007F800000000000007F800000000000007F80000000000000FF80000000000000FF0 0000000000000FF00000000000000FF00000000000001FF00000000000001FE000000000 00001FE00000000000003FE00000000000003FE00000000000003FC00000000000007FE0 0000000000FFFFFFF800000000FFFFFFF800000000FFFFFFF800000000403E7DBD3A>I< 0001FFFFFFC00003FFFFFFC00003FFFFFFC0000001FF8000000001FF0000000001FE0000 000001FE0000000001FE0000000003FE0000000003FC0000000003FC0000000003FC0000 000007FC0000000007F80000000007F80000000007F8000000000FF8000000000FF00000 00000FF0000000000FF0000000001FF0000000001FE0000000001FE0000000001FE00000 00003FE0000000003FC0000000003FC0000000003FC0000000007FC0000000007F800000 00007F80000000007F8000000000FF8000000000FF0000000000FF0000000000FF000000 0001FF0000000001FE0000000001FE0000000001FE0000000003FE0000000003FC000000 0003FC0000000003FC0000000007FC0000000007F80000000007F80000000007F8000000 000FF8000000000FF0000000000FF0000000000FF0000000001FF0000000001FE0000000 001FE0000000003FE0000000003FE0000000003FC000000000FFE0000000FFFFFFE00000 FFFFFFE00000FFFFFFE000002A3E7DBD28>73 D<0001FFFF00000000003FFFF00001FFFF 80000000003FFFE00001FFFF80000000007FFFE0000001FF8000000000FFE000000001FF 8000000000FFC000000001BF8000000001BF8000000001BF80000000033F80000000019F C0000000037F80000000039FC0000000067F80000000031FC00000000C7F00000000031F C00000000C7F00000000031FC000000018FF00000000071FC000000030FF00000000061F C000000030FE00000000060FE000000060FE00000000060FE0000000C1FE000000000E0F E0000000C1FE000000000C0FE000000181FC000000000C0FE000000181FC000000000C0F E000000303FC000000001C0FE000000603FC000000001807F000000603F8000000001807 F000000C03F8000000001807F000001807F8000000003807F000001807F8000000003007 F000003007F0000000003007F000006007F0000000003007F00000600FF0000000007003 F80000C00FF0000000006003F80001800FE0000000006003F80001800FE0000000006003 F80003001FE000000000E003F80003001FE000000000C003F80006001FC000000000C001 FC000C001FC000000000C001FC000C003FC000000001C001FC0018003FC0000000018001 FC0030003F80000000018001FC0030003F80000000018001FC0060007F80000000038001 FC00C0007F80000000030000FE00C0007F00000000030000FE0180007F00000000030000 FE030000FF00000000070000FE030000FF00000000060000FE060000FE00000000060000 FE0C0000FE00000000060000FE0C0001FE000000000E00007F180001FE000000000C0000 7F180001FC000000000C00007F300001FC000000000C00007F600003FC000000001C0000 7F600003FC000000001800007FC00003F8000000001800007F800003F800000000380000 3F800007F8000000007800003F000007F800000000FC00003E000007F000000003FE0000 3E00000FF8000000FFFFF8003C001FFFFFF80000FFFFF80038001FFFFFF80000FFFFF800 18001FFFFFF000005C3E7DBD58>77 D<0001FFFF800000FFFFF80001FFFF800000FFFFF0 0001FFFF800000FFFFF0000000FFC0000007FE00000001FFC0000001F000000001BFE000 0001E000000001BFE0000000C0000000019FF0000001C0000000039FF0000001C0000000 030FF800000180000000030FF8000001800000000307F8000003800000000707FC000003 800000000607FC000003000000000603FE000003000000000603FE000007000000000E01 FF000007000000000C01FF000006000000000C00FF000006000000000C00FF80000E0000 00001C00FF80000E0000000018007FC0000C0000000018007FC0000C0000000018003FE0 001C0000000038003FE0001C0000000030001FE000180000000030001FF0001800000000 30000FF000380000000070000FF800380000000060000FF8003000000000600007FC0030 00000000600007FC007000000000E00003FC007000000000C00003FE006000000000C000 01FE006000000000C00001FF00E000000001C00001FF00E000000001800000FF80C00000 0001800000FF80C0000000018000007F81C0000000038000007FC1C0000000030000003F C180000000030000003FE180000000030000003FE380000000070000001FF38000000006 0000001FF300000000060000000FFB00000000060000000FFF000000000E00000007FF00 0000000C00000007FE000000000C00000007FE000000000C00000003FE000000001C0000 0003FE000000001800000001FC000000001800000001FC000000003800000000FC000000 007800000000FC00000000FC000000007800000003FE0000000078000000FFFFF8000000 78000000FFFFF800000038000000FFFFF8000000300000004D3E7DBD49>I<000000003F F0000000000003FFFF00000000001FC03FC0000000007E0007E000000001F80001F80000 0007E00000FC0000000FC000007E0000003F0000003F0000007E0000001F800000FC0000 001FC00003F80000000FC00007F00000000FE0000FE00000000FE0001FC000000007F000 1FC000000007F0003F8000000007F8007F0000000007F800FF0000000007F801FE000000 0003F801FE0000000003F803FC0000000003FC03FC0000000003FC07F80000000003FC0F F80000000007FC0FF00000000007FC1FF00000000007FC1FF00000000007FC1FE0000000 0007FC3FE00000000007FC3FE00000000007F87FC0000000000FF87FC0000000000FF87F C0000000000FF87FC0000000000FF8FF80000000001FF0FF80000000001FF0FF80000000 001FF0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF00000000007FC0FF 00000000007FC0FF0000000000FF80FF0000000000FF80FF0000000000FF00FF00000000 01FE00FF0000000003FE00FF0000000003FC00FF0000000007F8007F8000000007F8007F 800000000FF0007F800000001FE0003F800000001FC0003F800000003F80001FC0000000 7F00001FC0000000FE00000FE0000001FC00000FE0000003F8000007F0000007E0000003 F800001FC0000001FC00003F80000000FE0000FE000000003F8003F8000000000FE01FE0 0000000003FFFF0000000000007FF0000000003E427BBF45>I<0001FFFFFFFFF0000000 01FFFFFFFFFF00000001FFFFFFFFFFC000000001FF00007FE000000001FF00000FF80000 0001FE000003FC00000001FE000001FC00000003FE000001FE00000003FE000000FF0000 0003FC000000FF00000003FC000000FF00000007FC000000FF00000007FC000000FF8000 0007F8000000FF80000007F8000000FF8000000FF8000000FF8000000FF8000001FF0000 000FF0000001FF0000000FF0000001FF0000001FF0000001FE0000001FF0000003FE0000 001FE0000003FC0000001FE0000007FC0000003FE0000007F80000003FE000000FF00000 003FC000001FE00000003FC000003FC00000007FC000007F800000007FC00000FE000000 007F800003FC000000007F80003FF000000000FFFFFFFFC000000000FFFFFFFC00000000 00FF0000000000000000FF0000000000000001FF0000000000000001FF00000000000000 01FE0000000000000001FE0000000000000003FE0000000000000003FE00000000000000 03FC0000000000000003FC0000000000000007FC0000000000000007FC00000000000000 07F80000000000000007F8000000000000000FF8000000000000000FF800000000000000 0FF0000000000000000FF0000000000000001FF0000000000000001FF000000000000000 1FE0000000000000001FE0000000000000003FE0000000000000003FE000000000000000 3FC0000000000000007FE0000000000000FFFFFFE00000000000FFFFFFE00000000000FF FFFFE00000000000413E7DBD3A>I<0001FFFFFFFF8000000001FFFFFFFFF800000001FF FFFFFFFF0000000001FF0001FF8000000001FF00003FE000000001FE00000FF000000001 FE000007F800000001FE000003FC00000003FE000003FC00000003FC000001FE00000003 FC000001FE00000003FC000001FE00000007FC000001FF00000007F8000001FF00000007 F8000001FF00000007F8000001FF0000000FF8000003FE0000000FF0000003FE0000000F F0000003FE0000000FF0000007FC0000001FF0000007FC0000001FE000000FF80000001F E000000FF00000001FE000001FE00000003FE000003FC00000003FC000007F800000003F C00000FE000000003FC00003FC000000007FC0000FF0000000007F8000FF80000000007F FFFFFC00000000007FFFFFF80000000000FF8001FE0000000000FF00007F8000000000FF 00001FC000000000FF00001FE000000001FF00000FF000000001FE000007F000000001FE 000007F000000001FE000007F800000003FE000007F800000003FC000007F800000003FC 000007F800000003FC00000FF800000007FC00000FF800000007F800000FF800000007F8 00000FF000000007F800001FF00000000FF800001FF00000000FF000001FF00000000FF0 00001FF00000000FF000001FF00000001FF000003FF00000001FE000003FF00180001FE0 00003FE00180003FE000003FE00380003FE000003FE00300003FC000001FE00700007FE0 00001FE00600FFFFFFE0000FF00E00FFFFFFE00007F01C00FFFFFFE00003F87800000000 000000FFE0000000000000003F800041407DBD45>82 D<00000007FC000C0000003FFF80 1C000000FFFFE038000003F803F07800000FE00078F800001F80003DF800003F00001FF0 00007E00000FF00000FC000007F00001F8000007F00001F0000003E00003F0000003E000 07E0000001E00007E0000001E0000FE0000001C0000FC0000001C0000FC0000001C0000F C0000001C0001FC000000180001FC000000180001FC000000180001FE000000180001FE0 00000000001FF000000000001FF800000000001FFE00000000000FFFC0000000000FFFFC 0000000007FFFFC000000007FFFFF800000003FFFFFE00000001FFFFFF00000000FFFFFF 800000003FFFFFC000000007FFFFE000000000FFFFE0000000000FFFF00000000000FFF0 00000000003FF000000000001FF800000000000FF8000000000007F8000000000007F800 0000000003F8000600000003F8000E00000003F8000E00000003F0000C00000003F0000C 00000003F0001C00000007F0001C00000007E0001C00000007E0001C0000000FC0003C00 00000FC0003E0000001F80003E0000001F80003F0000003F00007F0000007E00007F8000 00FC00007FC00001F800007DE00003F00000F8F8000FE00000F03F803F800000E01FFFFE 000000E007FFF8000000C0007FC000000036427BBF38>I<01FFFFFFFFFFFFFC01FFFFFF FFFFFFFC03FFFFFFFFFFFFFC03FE0003FE0007FC03F00003FC0000FC07C00003FC000078 07800007FC00007807000007FC0000380F000007F80000380E000007F80000381C00000F F80000381C00000FF80000381800000FF00000303800000FF00000303000001FF0000030 3000001FF00000307000001FE00000306000001FE00000306000003FE0000070E000003F E0000060C000003FC00000600000003FC00000000000007FC00000000000007FC0000000 0000007F800000000000007F80000000000000FF80000000000000FF80000000000000FF 00000000000000FF00000000000001FF00000000000001FF00000000000001FE00000000 000001FE00000000000003FE00000000000003FE00000000000003FC00000000000003FC 00000000000007FC00000000000007FC00000000000007F800000000000007F800000000 00000FF80000000000000FF80000000000000FF00000000000000FF00000000000001FF0 0000000000001FF00000000000001FE00000000000001FE00000000000003FE000000000 00003FE00000000000003FC00000000000003FC00000000000007FC00000000000007FC0 000000000000FFC0000000000001FFE0000000001FFFFFFFFC0000001FFFFFFFFC000000 1FFFFFFFF80000003E3D7FBC35>I<00007FFFFF8007FFFFC00000FFFFFF8007FFFFC000 00FFFFFF8007FFFFC0000001FFF800007FF0000000007FE000003F80000000007FC00000 3E00000000003FC000003C00000000003FE000003800000000003FE00000700000000000 1FF00000C000000000001FF000018000000000000FF800038000000000000FF800070000 000000000FF8000E00000000000007FC001C00000000000007FC003800000000000003FE 003000000000000003FE006000000000000003FE00C000000000000001FF018000000000 000001FF030000000000000000FF860000000000000000FF8C0000000000000000FF9C00 000000000000007FF800000000000000007FF000000000000000003FE000000000000000 003FE000000000000000003FE000000000000000001FF000000000000000001FF0000000 00000000000FF800000000000000001FF800000000000000003FF8000000000000000067 FC0000000000000000C7FC0000000000000001C3FE000000000000000383FE0000000000 00000703FE000000000000000E01FF000000000000001C01FF000000000000003800FF80 0000000000003000FF800000000000006000FF80000000000000C0007FC0000000000001 80007FC000000000000300003FE000000000000600003FE000000000000C00003FE00000 0000001C00001FF000000000003800001FF000000000007000000FF80000000000E00000 0FF80000000001C000000FF8000000000380000007FC000000000780000007FC00000000 1F80000003FE000000003F80000007FE00000003FFC000001FFF0000007FFFFC0001FFFF FE0000FFFFFC0003FFFFFE0000FFFFF80003FFFFFE00004A3E7EBD4B>88 DI<00003F00000001FFC000 0003E0E0E0000F8073F0001F003BF0007E001FF000FC001FE001F8000FE001F8000FE003 F0000FE007F0000FC00FE0000FC00FE0000FC01FC0001FC01FC0001F803F80001F803F80 001F803F80003F807F80003F007F00003F007F00003F007F00007F00FF00007E00FE0000 7E00FE00007E00FE0000FE00FE0000FC03FE0000FC03FC0000FC03FC0001FC07FC0001F8 067C0001F8067C0003F8067E0007F80E3E000FF80C3E001DF81C1F0038F8180F0070F838 07C1E07C7003FF803FE0007E000F8028297CA730>97 D<001FC000000FFFC000000FFF80 00000FFF800000003F800000003F800000003F000000003F000000007F000000007F0000 00007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC000000 01FC00000001F800000001F800000003F800000003F800000003F000000003F03F000007 F0FFC00007F3C1F00007E700F80007EE007C000FFC007E000FF8003E000FF0003F000FE0 003F001FC0003F001FC0003F001F80003F801F80003F803F80003F803F80003F803F0000 3F803F00003F807F00007F807F00007F007E00007F007E00007F007E0000FF00FE0000FE 00FC0000FE00FC0000FE00FC0001FC00FC0001FC00FC0001F800FC0003F800F80003F000 F80007F000FC0007E0007C000FC0007C001F80007C001F00003E003E00001E007C00001F 00F800000F83E0000003FF80000000FE00000021407CBE27>I<00000FE00000007FFC00 0001F81E000007C00700001F800380003F0001C0007E000FC000FC003FC001F8003FC003 F0003FC007F0003F8007E0003F800FE0003F001FC00000001FC00000003FC00000003F80 0000003F800000007F800000007F000000007F000000007F00000000FF00000000FE0000 0000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000C07E000000 C07E000001C07E000003803E000007003F00000E001F00003C000F8000700007C003E000 03E01F800000FFFC0000003FE0000022297CA727>I<00003FC0000001FFF0000007E03C 00001F801E00003F000E0000FC000F0001F800070003F800070007F00007000FE0000F00 0FC0000E001FC0000E001F80001E003F80003C003F800078007F0003F0007F003FC000FF FFFE0000FFFFE00000FE00000000FE00000000FE00000000FE00000000FC00000000FC00 000000FC00000000FC00000000FC00000000FC00000000FC00000180FC000001807C0000 03807C000007007E00000E003E00001C003F000078001F0000E0000F8007C00007C03F00 0001FFF80000007FC0000021297BA72A>101 D<00003C0000FE0000FE0001FE0001FE00 01FE0001FC00007000000000000000000000000000000000000000000000000000000000 0000000000000000000000007E0001FF800387C00703C00E03E00C03E01C03E01807E038 07E03007E0700FE0600FC0600FC0E01FC0E01F80001F80003F80003F00007F00007E0000 7E0000FE0000FC0000FC0001FC0001F80003F80603F00603F00607F00E07E00C07E00C07 E01C07C01807C03807C07007C06007C0E003E3C001FF00007C00173E7EBC1F>105 D<00000001C000000007F000000007F00000000FF00000000FF00000000FF00000000FE0 000000038000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 03E00000000FF80000003C3E000000701E000000E01F000001C01F000003801F80000700 1F800006001F80000E003F80000C003F00001C003F000018003F000038007F000038007F 000000007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC00 000001FC00000001F800000001F800000003F800000003F800000003F000000003F00000 0007F000000007F000000007E000000007E00000000FE00000000FE00000000FC0000000 0FC00000001FC00000001FC00000001F800000001F800000003F800000003F800000003F 000000003F000000007F000000007E000000007E00001C00FE00007F00FC0000FF01FC00 00FF01F80000FF03F00000FF07E00000FE0FC00000F81F800000703E0000003FF8000000 0FE0000000245081BC25>I<0001FC00000000FFFC00000000FFF800000000FFF8000000 0003F80000000003F80000000003F00000000003F00000000007F00000000007F0000000 0007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC0000000 001FC0000000001FC0000000001F80000000001F80000000003F80000000003F80000000 003F00000000003F0000FC00007F0003FE00007F000F0780007E003C0F80007E00703F80 00FE00E03F8000FE01C07F8000FC03807F8000FC07007F8001FC0E007F0001FC1C001C00 01F83800000001F87000000003F8E000000003F9C000000003F38000000003FF00000000 07FF0000000007FFF000000007E3FE00000007E07F8000000FE01FC000000FE00FE00000 0FC007E000000FC007F000001FC003F000001FC003F006001F8003F006001F8003F00600 3F8003F00E003F8007F00C003F0007E00C003F0007E01C007F0007E018007F0007E01800 7E0003E038007E0003E07000FE0001E06000FE0001F1E000FC00007F80003800003E0000 29407CBE2F>I<01F0000FF0000007FC003FFE0000061F00F01F00000E1F03C00F80001C 0F87000FC000180F8E0007C000380FDC0007E000300FF80007E000300FF00007E000701F E00007E000601FE00007E000601FC00007E000601FC00007E000E01F80000FE000E03F80 000FC000003F00000FC000003F00000FC000003F00001FC000007F00001F8000007E0000 1F8000007E00003F8000007E00003F000000FE00003F000000FC00007F000000FC00007E 000000FC00007E000001FC0000FE018001F80000FC018001F80000FC018001F80001FC03 8003F80001F8030003F00001F8030003F00001F8070003F00001F0060007F00001F00E00 07E00001F01C0007E00001F0180007E00001F038000FE00000F8F0000FC000007FC00003 8000001F000031297EA737>110 D<0007C000FC00000FF003FF00001C7C0F07C000383C 1C03E000703E3801F000603E7001F800E03FE000F800C03FC000FC00C03F8000FC00C07F 0000FC01C07E0000FC01807E0000FE01807E0000FE0380FE0000FE0380FE0000FE0000FC 0000FE0000FC0000FE0001FC0001FE0001FC0001FC0001F80001FC0001F80001FC0003F8 0003FC0003F80003F80003F00003F80003F00003F80007F00007F00007F00007F00007E0 0007E00007E0000FE0000FE0000FC0000FE0001FC0000FC0001F80000FE0003F00001FE0 007E00001FE0007C00001FF000F800001FB001F000003FB803E000003F9E0F8000003F07 FE0000003F01F80000007F00000000007F00000000007E00000000007E0000000000FE00 00000000FE0000000000FC0000000000FC0000000001FC0000000001FC0000000001F800 00000001F80000000003F80000000003F800000000FFFFE0000000FFFFE0000000FFFFE0 0000002F3A84A72E>112 D<0001F8003F00000FFE00FFE0001E0F81C0F0007807C380F8 00E003C703F800C003EE03F801C003EC07F8038003FC07F8070003F807F8060003F807F0 060003F801C00E0003F000000C0003F000001C0007F000001C0007F00000000007E00000 000007E0000000000FE0000000000FC0000000000FC0000000000FC0000000001FC00000 00001F80000000001F80000000001F80000000003F80000000003F0000C000003F0000C0 00003F0000C000007F0001C01E007F0001803F007E0003807F80FE0003007F80FE000700 FF81FE000E00FF019F001C00FE039F0038007C070F807000381E07C1E0001FF801FF8000 07E0007E00002D297EA734>120 D E /FI 81[51 51[40 45 45 66 45 51 30 35 40 1[51 45 51 76 25 51 1[25 51 45 30 40 51 40 51 45 10[66 1[61 51 66 1[56 71 2[61 2[35 1[71 56 61 66 66 61 66 6[30 45 45 45 45 45 45 45 45 45 45 1[23 30 45[{}53 91.249977 /Times-Bold rf /FJ 134[45 45 1[45 45 25 35 30 2[45 45 4[25 45 1[30 40 3[40 11[66 56 6[81 11[66 7[45 3[45 3[45 49[{.167 SlantFont}21 91.249977 /Times-Roman rf /FK 187[72 68[{}1 100.000000 /Times-Roman rf /FL 172[44 4[58 4[27 58 2[49 3[58 65[{}6 79.999924 /Times-Roman rf /FM 81[115 51[92 103 103 149 1[115 69 80 92 1[115 103 115 172 57 115 1[57 115 103 69 92 115 92 115 103 10[149 1[138 115 149 1[126 161 2[138 2[80 1[161 126 1[149 149 138 149 6[69 12[69 45[{}40 207.333359 /Times-Bold rf /FN 47[100 85[44 50 50 1[50 55 33 39 44 1[55 50 55 83 28 55 1[28 55 50 33 44 55 44 55 50 11[72 66 55 72 78 61 78 72 94 66 2[39 1[78 1[66 72 72 66 72 6[33 1[50 1[50 50 50 50 50 50 2[25 33 25 44[{}52 100.000000 /Times-Bold rf /FO 81[66 51[53 60 60 86 60 66 40 47 53 1[66 60 66 100 33 66 1[33 66 60 40 53 66 53 66 60 9[120 86 86 80 66 86 93 73 93 86 113 80 2[47 2[73 80 86 86 80 86 7[60 60 60 60 60 60 60 60 60 2[30 40 45[{}55 119.999947 /Times-Bold rf /FP 47[91 7[30 5[30 7[40 8[45 1[51 51 3[40 47[40 45 45 66 45 45 25 35 30 45 45 45 45 71 25 45 25 25 45 45 30 40 45 40 45 40 3[30 1[30 56 66 66 86 66 66 56 51 61 66 51 66 66 81 56 66 35 30 66 66 51 56 66 61 61 66 1[40 1[51 1[25 25 45 45 45 45 45 45 45 45 45 45 25 23 30 23 51 1[30 30 30 1[76 37[{}85 91.249977 /Times-Roman rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 1766 2310 a FP(Copyright)1905 2536 y(by)1739 2762 y(Dinesh)24 b(Das)1859 2988 y(1995)p eop %%Page: 2 2 2 1 bop 766 391 a FO(Making)30 b(Database)f(Optimizers)h(Mor)n(e)g (Extensible)1905 806 y FP(by)1314 1126 y FN(Dinesh)25 b(Das,)g(B.T)-9 b(ech.,)26 b(M.S.C.S.)1693 1966 y(Dissertation)1031 2192 y FP(Presented)f(to)f(the)f(Faculty)i(of)e(the)h(Graduate)h (School)f(of)1333 2418 y(The)f(University)j(of)d(T)-6 b(exas)24 b(at)f(Austin)1571 2644 y(in)h(Partial)g(Ful\256llment)1581 2870 y(of)g(the)g(Requirements)1638 3096 y(for)g(the)g(Degree)g(of)1502 3416 y FN(Doctor)h(of)g(Philosophy)1097 4256 y FO(The)30 b(University)g(of)g(T)-11 b(exas)29 b(at)g(Austin)1764 4576 y FP(May)24 b(1995)p eop %%Page: 3 3 3 2 bop 766 1041 a FO(Making)30 b(Database)f(Optimizers)h(Mor)n(e)g (Extensible)2017 2423 y FN(Appr)n(oved)d(by)2017 2536 y(Dissertation)e(Committee:)p 2017 2900 1583 4 v 2017 3136 V 2017 3372 V 2017 3609 V 2017 3845 V eop %%Page: 4 4 4 3 bop 1982 1180 a FM(Acknowledgments)299 1681 y FP(I)23 b(am)f(deeply)i(indebted)i(to)c(my)h(advisor)l(,)i(Don)d(Batory)-6 b(,)24 b(for)f(many)g(years)h(of)f(encouragement)j(and)e(ad-)300 1851 y(vice,)29 b(for)f(providing)i(constant)g(direction)g(and)e(focus) h(to)f(my)f(research,)j(and)e(for)g(reading)i(countless)300 2020 y(drafts)25 b(of)e(my)g(dissertation.)34 b(I)23 b(am)g(a)g(much)h(better)h(researcher)h(because)f(of)f(his)g(excellent) h(guidance.)576 2190 y(I)16 b(am)f(also)i(thankful)i(to)d(my)g (committee)h(members,)i(Professors)f(Don)e(Fussell,)i(Dan)e(Miranker)l (,)300 2359 y(and)27 b(A)-7 b(vi)27 b(Silberschatz,)j(and,)d (especially)-6 b(,)30 b(to)d(Dr)-5 b(.)40 b(Jos)2065 2358 y(\302)2060 2359 y(e)27 b(Blakeley)h(for)f(their)h(meticulous)h (reading)f(of)300 2528 y(my)23 b(dissertation)k(and)d(probing)h (questions.)583 2698 y(T)-6 b(o)25 b(my)g(friends)j(Eleonora)f(Drakou,) g(G.)d(Neelakantan)k(Kartha,)f(Sharad)f(Mehrotra,)i(Rajeev)299 2867 y(Rastogi,)23 b(Probal)g(Shome,)f(Nandit)h(Soparkar)l(,)h(Thomas)f (W)-7 b(oo,)22 b(and)h(Y)-9 b(ogesh)23 b(W)-7 b(agle,)23 b(I)f(owe)g(a)g(special)295 3036 y(round)f(of)e(thanks)i(for)f(the)f (many)h(hours)g(of)f(late-night)j(philosophizing,)j(pleasant)c (conservations,)j(and)297 3206 y(perspective)f(on)e(life.)30 b(V)-5 b(ivek)21 b(Singhal,)g(Jef)n(f)h(Thomas,)f(and)g(Millie)g(V)-5 b(illareal)21 b(provided)i(a)d(very)h(enjoy-)300 3375 y(able)28 b(working)g(environment.)44 b(Finally)-6 b(,)29 b(my)d(parents)j(were)e(a)g(constant)i(source)f(of)f(support)i(and)f (en-)300 3545 y(couragement.)580 3714 y(This)20 b(research)i(was)e (supported)j(in)d(part)h(by)f(grants)i(from)e(The)g(University)i(of)f (T)-6 b(exas)20 b(Applied)300 3883 y(Research)25 b(Laboratories,)h (Schlumber)n(ger)l(,)g(and)e(Digital)g(Equipment)h(Corporation.)3052 4525 y FK(D)t FL(I)t(N)t(E)t(S)t(H)33 b FK(D)t FL(A)t(S)350 4889 y FJ(The)23 b(University)i(of)f(T)-6 b(exas)23 b(at)h(Austin)350 5058 y(May)f(1995)1915 5349 y FP(iv)p eop %%Page: 5 5 5 4 bop 766 571 a FO(Making)30 b(Database)f(Optimizers)h(Mor)n(e)g (Extensible)1181 1033 y FP(Publication)c(No.)p 1774 1035 945 4 v 1613 1439 a(Dinesh)e(Das,)f(Ph.D.)1220 1608 y(The)g(University) i(of)f(T)-6 b(exas)23 b(at)h(Austin,)f(1995)1512 2014 y(Supervisor:)33 b(Don)24 b(Batory)312 2390 y(Query)19 b(optimizers)i(are)e(fundamental)i(components)g(of)d(database)j (management)g(systems)e(\(DBMSs\).)299 2560 y(An)k(optimizer)h (consists)h(of)e(three)h(features:)33 b(a)23 b(search)h(space,)g(a)f (cost)g(model,)h(and)f(a)g(search)h(strategy)-6 b(.)299 2729 y(The)23 b(experience)j(of)c(many)h(researchers)j(has)e(shown)f (that)h(hard-wiring)h(these)f(features)h(results)f(in)f(an)300 2898 y(optimizer)i(that)f(is)g(very)g(in\257exible)h(and)f(dif)n (\256cult)h(to)f(modify)-6 b(.)583 3068 y(Rule-based)34 b(optimizers)f(have)f(been)g(developed)j(to)c(alleviate)i(some)f(of)f (the)g(problems)i(of)300 3237 y(monolithic)c(optimizers.)42 b(Unfortunately)-6 b(,)30 b(contemporary)g(rule-based)f(optimizers)g (do)d(not)h(provide)297 3406 y(enough)c(support)g(to)d(enable)j (database)g(implementors)g(\(DBI\))d(to)h(fully)h(realize)g(the)f (potential)i(of)e(open)300 3576 y(systems.)31 b(W)-7 b(e)23 b(have)h(identi\256ed)g(four)g(requirements)i(that)e(a)e (rule-based)k(optimizer)f(should)g(satisfy)g(to)296 3745 y(address)c(these)g(needs.)31 b(First,)20 b(rules)h(should)g(be)f (speci\256ed)h(using)g(high-level)i(abstractions,)h(insulating)296 3914 y(the)d(DBI)d(from)j(underlying)i(implementation)g(details.)31 b(Second,)21 b(rule)g(sets)g(should)g(be)g(easily)g(extensi-)298 4084 y(ble,)g(with)h(a)f(minimum)g(of)g(reprogramming)j(required.)32 b(Third,)22 b(rule)g(sets)g(should)h(be)f(easily)g(recon\256g-)297 4253 y(urable,)g(that)g(is,)e(changeable)k(to)d(meet)g(a)f(variety)i (of)f(user)g(needs,)i(interfaces,)g(database)g(schemas,)f(etc.)300 4423 y(Fourth,)28 b(rule-based)i(optimizers)f(should)g(be)e(fast,)h (that)g(is,)g(performance)h(should)g(not)f(be)f(sacri\256ced)300 4592 y(for)d(the)g(sake)g(of)f(high-level)k(speci\256cations.)578 4761 y(In)19 b(this)h(dissertation,)j(we)18 b(describe)j(Prairie,)f(an) f(environment)j(for)d(specifying)i(rules)f(for)f(rule-)300 4931 y(based)26 b(optimizers)h(that)e(satis\256es)h(all)f(four)g(of)g (the)g(above)h(requirements.)38 b(The)24 b(Prairie)h(speci\256cation) 294 5100 y(language)20 b(is)d(presented)k(and)d(we)f(show)h(how)f(it)h (allows)g(a)f(DBI)g(to)g(design)j(an)d(easily)i(extensible)i(rule)d (set)1927 5349 y(v)p eop %%Page: 6 6 6 5 bop 300 391 a FP(for)25 b(a)f(rule-based)k(optimizer)-5 b(.)36 b(Experimental)27 b(results)g(are)e(presented)i(using)f(the)f(T) -6 b(exas)25 b(Instruments)298 561 y(Open)d(OODB)d(optimizer)24 b(rule)e(set)g(to)g(validate)h(the)f(claim)g(of)g(good)h(performance)h (using)f(Prairie.)31 b(Fi-)299 730 y(nally)-6 b(,)23 b(a)f(building)i(blocks)g(approach)h(of)d(constructing)k(rule)d(sets)g (is)f(presented;)j(this)e(results)h(in)e(easily)300 899 y(recon\256gurable)28 b(rule)e(sets)f(whose)h(features)h(are)e (changeable)j(simply)e(by)f(assembling)i(the)f(blocks)g(in)300 1069 y(various)f(ways.)1915 5349 y(vi)p eop %%Page: 7 7 7 6 bop 2808 1056 a FM(Contents)300 1591 y FI(Acknowledgments)2517 b(iv)300 1795 y(Abstract)2918 b(v)300 1999 y(List)23 b(of)h(T)-8 b(ables)2733 b(x)300 2203 y(List)23 b(of)h(Figur)n(es)2666 b(xi)300 2407 y(Chapter)23 b(1)91 b(Intr)n(oduction)2281 b(1)436 2520 y FP(1.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:) g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167 b FP(1)436 2633 y(1.2)96 b(Related)25 b(W)-7 b(ork)26 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167 b FP(5)645 2745 y(1.2.1)110 b(T)m(raditional)26 b(Query)e(Optimizers)78 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g (:)f(:)h(:)167 b FP(5)645 2858 y(1.2.2)110 b(Rule-Based)25 b(Optimizers)g(\320)e(The)g(Next)g(Generation)39 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167 b FP(6)436 2971 y(1.3)96 b(Outline)25 b(of)e(Dissertation)50 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)167 b FP(9)300 3175 y FI(Chapter)23 b(2)91 b(The)23 b(V)-8 b(olcano)23 b(Optimizer)h (Generator)1396 b(10)436 3288 y FP(2.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 121 b FP(10)436 3401 y(2.2)96 b(De\256nitions)53 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)124 b FP(1)m(1)436 3514 y(2.3)96 b(V)-12 b(olcano)25 b(Optimization)h (Paradigm)64 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:) f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(16)436 3627 y(2.4)96 b(Rules)24 b(in)g(V)-12 b(olcano)50 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(17)436 3740 y(2.5)96 b(T)m(ransformation)27 b(Rules)88 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(18)436 3853 y(2.6)96 b(Implementation)27 b(Rules)75 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(19)436 3965 y(2.7)96 b(Support)25 b(Functions)71 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:) f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)121 b FP(21)436 4078 y(2.8)96 b(Drawbacks)25 b(of)f(V)-12 b(olcano)55 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(21)645 4191 y(2.8.1)110 b(Explicit)25 b(vs.)31 b(Implicit)24 b(Rules)52 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(22)645 4304 y(2.8.2)110 b(Property)25 b(Representation)i(and)d(T)m(ransformation)32 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(23)436 4417 y(2.9)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:) g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(25)300 4621 y FI(Chapter)23 b(3)91 b(Prairie:)32 b(A)23 b(Language)g(for)h (Rule)f(Speci\256cation)1061 b(26)436 4734 y FP(3.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:) h(:)g(:)f(:)h(:)121 b FP(26)436 4847 y(3.2)96 b(Notation)25 b(and)f(Assumptions)54 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(27)436 4960 y(3.3)96 b(Prairie)25 b(Optimization)g(Paradigm)48 b FH(:)d(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:) g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(31)436 5073 y(3.4)96 b(Rules)24 b(in)g(Prairie)32 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:) f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)121 b FP(32)1902 5349 y(vii)p eop %%Page: 8 8 8 7 bop 436 391 a FP(3.5)96 b(T)m(ransformation)27 b(Rules)88 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(33)436 504 y(3.6)96 b(Implementation)27 b(Rules)75 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(35)645 617 y(3.6.1)110 b(The)23 b(Null)h(Algorithm)75 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(38)436 730 y(3.7)96 b(Advantages)26 b(of)e(Prairie)88 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(39)436 843 y(3.8)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:) g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(40)300 1047 y FI(Chapter)23 b(4)91 b(The)23 b(Prairie-to-V)-8 b(olcano)26 b(Pr)n(epr)n(ocessor)1308 b(41)436 1160 y FP(4.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:) g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(41)436 1273 y(4.2)96 b(Correspondence)28 b(of)23 b(Elements)h(in)g(Prairie)g(and)g(V)-12 b(olcano)60 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(42)645 1386 y(4.2.1)110 b(Operators,)25 b(Algorithms,)g(and)f (Enforcers)68 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g (:)f(:)h(:)121 b FP(42)645 1498 y(4.2.2)110 b(Operator)25 b(T)m(rees)f(and)g(Access)g(Plans)j FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(44)645 1611 y(4.2.3)110 b(Descriptors)26 b(and)e(Properties)51 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)121 b FP(45)436 1724 y(4.3)96 b(T)m(ranslating)26 b(T)-8 b(-rules)51 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 121 b FP(48)436 1837 y(4.4)96 b(T)m(ranslating)26 b(I-rules)69 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(51)645 1950 y(4.4.1)110 b(T)m(ranslating)26 b(Enforcers)87 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(54)436 2063 y(4.5)96 b(Rule)24 b(Compaction)31 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:) g(:)f(:)h(:)121 b FP(56)436 2176 y(4.6)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 121 b FP(60)300 2380 y FI(Chapter)23 b(5)91 b(Performance)25 b(Results)1917 b(61)436 2493 y FP(5.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 121 b FP(61)436 2606 y(5.2)96 b(A)23 b(Centralized)j(Relational)f (Query)f(Optimizer)43 b FH(:)i(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(62)645 2718 y(5.2.1)110 b(Programmer)25 b(Productivity)89 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(63)645 2831 y(5.2.2)110 b(Generating)26 b(Benchmark)f(Queries)75 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)121 b FP(63)645 2944 y(5.2.3)110 b(Performance)26 b(Results)e(Using)g(the)g(Centralized)i(Optimizer)42 b FH(:)k(:)f(:)h(:)g(:)f(:)h(:)121 b FP(65)436 3057 y(5.3)96 b(The)24 b(T)-6 b(exas)23 b(Instruments)j(Open)e(OODB)d(Query)j (Optimizer)44 b FH(:)i(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(66)645 3170 y(5.3.1)110 b(Programmer)25 b(Productivity)89 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)121 b FP(66)645 3283 y(5.3.2)110 b(Generating)26 b(Benchmark)f(Queries)75 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:) h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(67)645 3396 y(5.3.3)110 b(Performance)26 b(Results)e(Using)g(the)g(Open)f(OODB)f (Optimizer)55 b FH(:)45 b(:)h(:)g(:)f(:)h(:)121 b FP(70)436 3509 y(5.4)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(75)300 3713 y FI(Chapter)23 b(6)91 b(Recon\256gurable)24 b(Optimizers)1680 b(76)436 3826 y FP(6.1)96 b(Overview)28 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:) h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(76)436 3938 y(6.2)96 b(Layered)25 b(Rule-Based)g(Optimizers)63 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(78)645 4051 y(6.2.1)110 b(Layers)60 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 121 b FP(78)645 4164 y(6.2.2)110 b(Composing)25 b(Layers)42 b FH(:)k(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:) h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(80)436 4277 y(6.3)96 b(Examples)25 b(of)e(Layered)i(Optimizers)30 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(82)645 4390 y(6.3.1)110 b(Example)24 b(Layers)67 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:) f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(82)645 4503 y(6.3.2)110 b(An)23 b(Optimizer)i(for)e(a)g (Centralized)j(Database)89 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)121 b FP(84)645 4616 y(6.3.3)110 b(Another)25 b(Optimizer)f(for)g(a)f(Centralized)j(Database)43 b FH(:)j(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(86)645 4729 y(6.3.4)110 b(An)23 b(Optimizer)i(for)e(a)g(Distributed)j(Database)i FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(87)645 4842 y(6.3.5)110 b(An)23 b(Optimizer)i(for)e(a)g (Replicated)j(Database)48 b FH(:)e(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)121 b FP(87)436 4955 y(6.4)96 b(Compacting)26 b(Layered)e(Optimizers)43 b FH(:)j(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(90)436 5068 y(6.5)96 b(Benchmarking)26 b(Layered)f(Optimizers)94 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)121 b FP(93)1889 5349 y(viii)p eop %%Page: 9 9 9 8 bop 436 391 a FP(6.6)96 b(Related)25 b(W)-7 b(ork)26 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(96)436 504 y(6.7)96 b(Summary)32 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:) g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(98)300 708 y FI(Chapter)23 b(7)91 b(Conclusion)2293 b(99)436 821 y FP(7.1)96 b(Contributions)27 b(of)d(Dissertation)34 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(99)436 934 y(7.2)96 b(Future)25 b(W)-7 b(ork)66 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:) f(:)h(:)g(:)f(:)h(:)76 b FP(101)436 1047 y(7.3)96 b(Retrospective)30 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)76 b FP(104)300 1251 y FI(Appendix)22 b(A)70 b(Complexity)24 b(of)g(the)f(System)g(R)f(Optimizer)1125 b(106)300 1454 y(Appendix)22 b(B)75 b(Bene\256ts)23 b(of)g(Rule)g(Compaction)1518 b(108)300 1658 y(Appendix)22 b(C)70 b(The)22 b(Open)g(OODB)g(Rule)g (Set)1601 b(109)300 1862 y(Bibliography)2660 b(1)-5 b(13)300 2066 y(V)m(ita)3006 b(1)-5 b(19)1915 5349 y FP(ix)p eop %%Page: 10 10 10 9 bop 2414 1056 a FM(List)52 b(of)g(T)-19 b(ables)436 1584 y FP(2.1)96 b(Operators)26 b(and)e(algorithms)h(in)f(a)f (centralized)j(V)-12 b(olcano)25 b(query)g(optimizer)86 b FH(:)46 b(:)f(:)h(:)121 b FP(13)436 1696 y(2.2)96 b(Properties)26 b(of)d(nodes)i(in)f(an)f(operator)j(tree)e(in)f(V)-12 b(olcano)71 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 121 b FP(15)436 1809 y(2.3)96 b(Support)25 b(functions)h(in)e(a)f(V)-12 b(olcano)25 b(optimizer)93 b FH(:)45 b(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(22)436 2005 y(3.1)96 b(Operators)26 b(and)e(algorithms)h(in)f(a)f(centralized)j(Prairie)e (query)h(optimizer)69 b FH(:)46 b(:)g(:)f(:)h(:)121 b FP(29)436 2118 y(3.2)96 b(Properties)26 b(of)d(nodes)i(in)f(an)f (operator)j(tree)e(in)f(Prairie)53 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(31)436 2314 y(5.1)96 b(Queries)25 b(used)f(in)g(benchmarking)j(the)c(Open)h(OODB)d (optimizer)41 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(68)1927 5349 y(x)p eop %%Page: 11 11 11 10 bop 2319 1056 a FM(List)51 b(of)h(Figur)l(es)436 1584 y FP(1.1)96 b(Query)24 b(processing)j(in)c(a)g(database)j(system) 40 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h (:)g(:)f(:)h(:)167 b FP(2)436 1779 y(2.1)96 b(Schematic)25 b(representation)j(of)23 b(the)h(V)-12 b(olcano)25 b(optimizer)g (generator)92 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)121 b FP(10)436 1892 y(2.2)96 b(General)25 b(form)e(of)h(a)f(V)-12 b(olcano)25 b(rule)32 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(17)436 2005 y(2.3)96 b(General)25 b(form)e(of)h(a)f (transformation)k(rule)d(in)f(V)-12 b(olcano)89 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(18)436 2118 y(2.4)96 b(Join)25 b(associativity)i(transformation)g (rule)e FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(19)436 2231 y(2.5)96 b(General)25 b(form)e(of)h(an)f(implementation)k(rule)d(in)f(V)-12 b(olcano)78 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(20)436 2344 y(2.6)96 b(Nested)25 b(loops)f(implementation)j(rule) 75 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(21)436 2457 y(2.7)96 b(An)23 b(implicit)i(rule)f(in)f(V)-12 b(olcano)30 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(22)436 2570 y(2.8)96 b(General)25 b(form)e(of)h(V)-12 b(olcano)25 b(transformation)i(and)d(implementation)i(rules)h FH(:)46 b(:)g(:)f(:)h(:)121 b FP(24)436 2766 y(3.1)96 b(Schematic)25 b(representation)j(of)23 b(the)h(Prairie)g(optimizer)h(paradigm)74 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(27)436 2879 y(3.2)96 b(Example)24 b(of)g(an)f(operator)j(tree)e(and)g(access)h (plan)55 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:) f(:)h(:)121 b FP(30)436 2992 y(3.3)96 b(General)25 b(form)e(of)h(a)f (Prairie)h(rule)86 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(32)436 3104 y(3.4)96 b(General)25 b(form)e(of)h(a)f(Prairie)h(T)-8 b(-rule)78 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(33)436 3217 y(3.5)96 b(Join)25 b(associativity)i(T)-8 b(-rule)80 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g (:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(35)436 3330 y(3.6)96 b(General)25 b(form)e(of)h(a)f(Prairie)h(I-rule)i FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(36)436 3443 y(3.7)96 b(Nested)25 b(loops)f(I-rule)43 b FH(:)j(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:) g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g (:)f(:)h(:)121 b FP(37)436 3556 y(3.8)96 b(Mer)n(ge)25 b(sort)f(I-rule)50 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:) h(:)121 b FP(37)436 3669 y(3.9)96 b(The)24 b(\252Null\272)g(algorithm)h (concept)77 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g (:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(38)436 3865 y(4.1)96 b(Identifying)27 b(implicit)e(operators,)h(algorithms,)f (and)f(rules)60 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 121 b FP(43)436 3978 y(4.2)96 b(General)25 b(expressions)i(in)c(V)-12 b(olcano,)25 b(Prairie,)f(and)g(P2V)-8 b(-generated)25 b(speci\256cations)33 b FH(:)121 b FP(45)436 4091 y(4.3)96 b(Identifying)27 b(operator)f(ar)n(guments)36 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)121 b FP(47)436 4204 y(4.4)96 b(Identifying)27 b(physical)f(properties)50 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(48)436 4317 y(4.5)96 b(T)m(ranslating)26 b(T)-8 b(-rules)51 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f (:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(49)436 4430 y(4.6)96 b(T)m(ranslating)26 b(the)e(join)g (associativity)j(T)-8 b(-rule)89 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:) g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(50)436 4542 y(4.7)96 b(T)m(ranslating)26 b(T)-8 b(-rules)24 b(with)f(enforcer)n(-operator)q(s)98 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:) f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(51)436 4655 y(4.8)96 b(T)m(ranslating)26 b(I-rules)69 b FH(:)46 b(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:) g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(52)436 4768 y(4.9)96 b(T)m(ranslating)26 b(the)e(nested)h(loops)g(I-rule)61 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)121 b FP(53)436 4881 y(4.10)51 b(T)m(ranslating)26 b(I-rules)f(with)e(enforcer)n(-algorith)q(ms)64 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(55)436 4994 y(4.1)m(1)54 b(Rule)24 b(compaction)52 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g (:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(56)1915 5349 y(xi)p eop %%Page: 12 12 12 11 bop 436 391 a FP(4.12)51 b(Examples)25 b(of)e(rule)h(compaction)j FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(58)436 587 y(5.1)96 b(Benchmarking)26 b(a)e(simple)g(centralized)i(optimizer)74 b FH(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(64)436 700 y(5.2)96 b(Expressions)27 b(used)d(in)f(generating)k (benchmark)e(queries)h(for)d(Open)h(OODB)35 b FH(:)46 b(:)f(:)h(:)121 b FP(68)436 813 y(5.3)96 b(Benchmarking)26 b(the)e(Open)g(OODB)d(optimizer)k(\320)e(queries)i(E1)m(1)e(and)h(E12) 78 b FH(:)46 b(:)f(:)h(:)121 b FP(70)436 926 y(5.4)96 b(Benchmarking)26 b(the)e(Open)g(OODB)d(optimizer)k(\320)e(queries)i (E21)e(and)h(E22)75 b FH(:)46 b(:)f(:)h(:)121 b FP(71)436 1039 y(5.5)96 b(Benchmarking)26 b(the)e(Open)g(OODB)d(optimizer)k(\320) e(queries)i(E31)e(and)h(E32)75 b FH(:)46 b(:)f(:)h(:)121 b FP(72)436 1152 y(5.6)96 b(Benchmarking)26 b(the)e(Open)g(OODB)d (optimizer)k(\320)e(queries)i(E41)e(and)h(E42)75 b FH(:)46 b(:)f(:)h(:)121 b FP(73)436 1265 y(5.7)96 b(Equivalent)26 b(expressions)h(in)c(the)h(Open)g(OODB)d(optimizer)74 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(74)436 1461 y(6.1)96 b(General)25 b(form)e(of)h(a)f(Prairie)h (layer)g(and)g(an)g(example)89 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(79)436 1574 y(6.2)96 b(The)24 b(Prairie)g(layered)h(optimizer)g(paradigm)84 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f (:)h(:)121 b FP(81)436 1686 y(6.3)96 b(Example)24 b(layers)36 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h (:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(83)436 1799 y(6.4)96 b(An)23 b(optimizer)i(for)f(a)f(centralized)k (database)87 b FH(:)46 b(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:) f(:)h(:)g(:)f(:)h(:)121 b FP(85)436 1912 y(6.5)96 b(An)23 b(alternative)k(optimizer)e(for)f(a)f(centralized)j(database)35 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(86)436 2025 y(6.6)96 b(An)23 b(optimizer)i(for)f(a)f(distributed)k (database)f FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)121 b FP(88)436 2138 y(6.7)96 b(An)23 b(optimizer)i(for)f(a)f(replicated)j(database)57 b FH(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g (:)f(:)h(:)121 b FP(89)436 2251 y(6.8)96 b(Compacting)26 b(the)d(layered)j(centralized)g(Prairie)e(rule)g(set)k FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)121 b FP(91)436 2364 y(6.9)96 b(T)m(ranslating)26 b(the)e(join)g (associativity)j(T)-8 b(-rule)24 b(in)f(the)h(SEQUENTIAL)19 b(layer)60 b FH(:)46 b(:)f(:)h(:)121 b FP(92)436 2477 y(6.10)51 b(Benchmarking)26 b(layered)g(optimizers)74 b FH(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f (:)h(:)g(:)f(:)h(:)121 b FP(95)436 2673 y(C.1)80 b(V)-12 b(olcano)25 b(rules)g(for)f(the)f(Open)h(OODB)d(optimizer)30 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:) 79 b FP(1)m(10)436 2786 y(C.2)h(Prairie)25 b(rules)f(for)g(the)g(Open)f (OODB)e(optimizer)84 b FH(:)46 b(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:) f(:)h(:)g(:)f(:)h(:)82 b FP(1)m(1)m(1)436 2899 y(C.3)e(Comparison)26 b(of)d(an)h(Open)f(OODB)f(rule)60 b FH(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g (:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)79 b FP(1)m(12)1902 5349 y(xii)p eop %%Page: 1 13 1 12 bop 2859 1118 a FG(Chapter)44 b(1)2479 1657 y FM(Intr)l(oduction) 300 2214 y FO(1.1)119 b(Overview)300 2477 y FP(Database)35 b(management)f(systems)h(\(DBMSs\))d(are)h(basic)h(tools)g(for)g (information)i(storage)e(and)g(re-)300 2646 y(trieval.)e(A)23 b(well-designed)k(and)d(implemented)h(DBMS)d(can)i(not)g(only)g(act)g (as)f(a)g(data)i(repository)-6 b(,)26 b(but)300 2815 y(also)k(facilitate)h(ef)n(\256cient)f(querying)h(and)f(gathering)h (information)g(about)g(the)e(stored)h(data.)47 b(A)28 b(good)300 2985 y(user)c(interface)i(is)d(critical)i(for)f(this)g (purpose.)577 3154 y(Query)18 b(processing)i(is)d(a)h(fundamental)i (part)e(of)f(DBMSs.)27 b(It)17 b(is)h(the)f(process)j(of)d(retrieving)j (data)298 3324 y(that)i(match)f(user)n(-speci\256ed)k(requirements.)33 b(Figure)22 b(1.1)f(shows)h(the)g(three)g(basic)h(steps)f(in)g (evaluating)300 3493 y(a)k(query)-6 b(.)39 b(A)25 b(compiler)i(parses)g (and)g(translates)h(a)e(query)h(\(expressed)i(in)d(a)f(high-level)k (language)g(like)293 3662 y(SQL\))16 b(into)i(a)f(representation)22 b(known)c(as)g(an)f(operator)j(tree.)29 b(A)17 b(query)h(optimizer)h (then)g(transforms)g(this)300 3832 y(operator)26 b(tree)e(into)g(an)g (access)h(plan.)31 b(Finally)-6 b(,)25 b(the)f(execution)i(module)e (executes)i(the)e(access)h(plan)f(to)300 4001 y(return)h(the)f(results) h(of)e(the)h(SQL)d(query)-6 b(.)583 4170 y(As)26 b(shown)i(in)e(Figure) i(1.1,)f(query)h(optimization)h([29,)16 b(34,)g(35,)g(51])27 b(is)g(an)f(important)j(step)e(in)295 4340 y(query)20 b(processing.)32 b(It)18 b(is)h(the)g(process)h(of)f(generating)i(an)e (ef)n(\256cient)h(access)g(plan)g(for)e(a)h(database)i(query)-6 b(.)295 4509 y(Informally)g(,)21 b(an)e(access)h(plan)g(is)e(an)h (execution)i(strategy)g(for)e(a)f(query;)k(it)d(is)f(the)h(sequence)i (of)e(low-level)300 4678 y(database)25 b(retrieval)g(operations)h (that,)e(when)f(executed,)i(produce)h(the)d(database)i(records)g(that)f (satisfy)300 4848 y(the)k(query)-6 b(.)47 b(There)28 b(are)g(three)h(basic)h(aspects)f(that)g(de\256ne)g(and)f(in\257uence)i (query)f(optimization:)44 b(the)300 5017 y(search)25 b(space,)f(the)g(cost)g(model,)g(and)g(the)g(search)h(strategy)-6 b(.)1927 5349 y(1)p eop %%Page: 2 14 2 13 bop 323 403 3237 4 v 323 2862 4 2460 v 1199 631 a FP(SQL)22 b(Query)737 2766 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 81.09029 239.00296 81.09029 256.0746 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 204.85968 0.0 239.00296 162.18057 239.00296 162.18057 204.85968 0.0 204.85968 /Lineto /lineto load def false Polygon gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1238 945 a(Compiler)737 2766 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 187.78804 81.09029 204.85968 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial 1156 1299 a(Operator)i(T)m(ree)737 2766 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 81.09029 155.35202 81.09029 170.7164 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 0.0 119.50148 0.0 153.64476 162.18057 153.64476 162.18057 119.50148 0.0 119.50148 /Lineto /lineto load def false Polygon gsave 0.5 setgray fill grestore gsave 2.6 SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end @endspecial 1101 1654 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651 neg 77.5029 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(Query)g(Optimizer) 737 2766 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 102.42984 81.09029 119.50148 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial 1189 2017 a(Access)g(Plan)737 2766 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 81.09029 68.28656 81.09029 85.3582 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 34.14328 0.0 68.28656 162.18057 68.28656 162.18057 34.14328 0.0 34.14328 /Lineto /lineto load def false Polygon gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1073 2372 a(Execution)h(Module)737 2766 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 81.09029 17.07164 81.09029 34.14328 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1150 2676 a(Output)g(T)m(uples)2228 498 y FF(Find)17 b(salaries)h(of)e(all)i(dept)f(chairmen.)2228 652 y FE(select)109 b FF(chairman,)19 b(salary)2228 731 y FE(fr)o(om)124 b FF(dept,)18 b(emp)2228 810 y FE(wher)o(e)91 b FF(dept.chairman)20 b(=)d(emp.name)2228 888 y FE(order)i(by)d FF(salary)2603 1088 y tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2603 1088 a FF(SOR)l(T)2614 1230 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2614 1230 a FF(JOIN)2544 1491 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 1491 a 2481 1371 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2481 1371 a FF(RET)2765 1371 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2765 1371 a FF(RET)2544 1491 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 1491 a 2544 1491 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 1491 a 2487 1506 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2487 1506 a FF(dept)2770 1499 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2770 1499 a FF(emp)2544 1491 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 1491 a 2544 1491 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 1491 a 2538 1789 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2538 1789 a FF(Mer)o(ge)p 2713 1789 20 4 v 25 w(sort)2536 1931 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2536 1931 a FF(Mer)o(ge)p 2711 1931 20 4 v 25 w(join)2544 2200 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 2200 a 2421 2080 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2421 2080 a FF(File)p 2527 2080 20 4 v 26 w(scan)2705 2080 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2705 2080 a FF(File)p 2811 2080 20 4 v 25 w(scan)2544 2200 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 2200 a 2544 2200 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 2200 a 2487 2215 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2487 2215 a FF(dept)2770 2208 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2770 2208 a FF(emp)2544 2200 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 2200 a 2544 2200 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2544 2200 a 2436 2538 a FF(Thompson)149 b(40)2436 2617 y(Smith)275 b(45)2436 2696 y(Brown)253 b(52)737 2766 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 295.33942 221.93132 179.25221 221.93132 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 295.33942 136.57312 179.25221 136.57312 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 295.33942 51.21492 179.25221 51.21492 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 3557 2862 4 2460 v 323 2865 3237 4 v 3558 2882 19 2466 v 340 2882 3237 19 v 736 3078 a FP(Figure)24 b(1.1:)31 b(Query)24 b(processing)i(in)e(a)f(database)j (system)e(and)g(an)f(example)583 3455 y(The)28 b FD(sear)m(ch)g(space)h FP(is)e(the)h(set)g(of)f(access)i(plans)g(that)f(can)g(evaluate)i(a)d (query)-6 b(.)44 b(All)27 b(plans)h(of)300 3624 y(a)d(query')-5 b(s)28 b(search)f(space)f(return)h(the)f(same)g(result;)i(however)l(,)f (some)f(plans)h(are)f(more)f(ef)n(\256cient)i(than)300 3793 y(others.)43 b(The)27 b FD(cost)g(model)h FP(assigns)h(a)d(cost)i (to)f(each)h(plan)g(in)f(the)g(search)i(space.)42 b(The)27 b(cost)h(of)f(a)f(plan)299 3963 y(is)c(an)g(estimate)i(of)e(the)h (resources)h(used)f(when)g(the)g(plan)g(is)f(executed;)j(the)e(lower)f (the)h(cost,)g(the)f(better)300 4132 y(the)i(plan.)33 b(The)24 b FD(sear)m(ch)h(strategy)h FP(is)e(a)f(speci\256cation)k(of)d (which)g(plans)h(in)f(the)h(search)g(space)g(are)f(to)g(be)295 4302 y(examined.)31 b(If)19 b(the)g(search)i(space)f(is)f(small,)h(a)e (typical)j(search)f(strategy)i(is)c(to)h(enumerate)i(and)f(compare)300 4471 y(the)30 b(costs)h(of)e(all)h(plans)h(against)h(one)e(another)-5 b(.)51 b(However)l(,)32 b(most)d(search)j(spaces,)g(even)f(for)f (simple)295 4640 y(queries,)21 b(are)e(enormous,)i(and)e(thus)h(query)g (optimizers)h(often)e(need)h(heuristics)h(to)e(control)h(the)g(number) 300 4810 y(of)j(plans)i(to)f(be)f(examined.)579 4979 y(Query)d(optimizers)h(have)f(traditionally)j(been)d(built)g(as)g (monolithic)h(subsystems)h(of)d(DBMSs.)1927 5349 y(2)p eop %%Page: 3 15 3 14 bop 296 391 a FP(This)19 b(simply)h(re\257ects)g(the)g(fact)g (that)g(traditional)i(database)g(systems)f(are)e(themselves)j (monolithic:)31 b(the)300 561 y(algorithms)c(that)f(are)g(used)g(to)f (store)i(and)e(retrieve)j(data)e(are)f(hard-wired)j(and)d(are)h(rather) g(dif)n(\256cult)h(to)294 730 y(change.)k(The)18 b(need)h(to)f(have)h (extensible)i(database)f(systems,)g(and)f(in)f(turn)h(extensible)i (optimizers,)g(has)300 899 y(long)j(been)g(recognized)j(in)c(systems)h (like)g(EXODUS)c([17],)k(Starburst)h([43],)f(Genesis)g([4],)f(and)h (Post-)298 1069 y(gres)e([49].)30 b(Rule-based)24 b(query)e(optimizers) i([25,)16 b(28,)g(30,)f(31,)h(33,)g(36])22 b(are)f(among)h(the)g(major) g(concep-)297 1238 y(tual)f(advances)i(that)e(have)g(been)g(proposed)i (to)d(deal)i(with)e(query)i(optimizer)g(extensibility)-6 b(.)33 b(A)20 b(primary)295 1408 y(advantage)i(of)d(rule-based)j (optimizers)g(over)e(traditional)i(ones)e(is)f(the)g(ability)i(to)e (introduce)j(new)d(func-)300 1577 y(tionality)30 b(in)f(a)e(query)j (algebra)g(without)f(changing)i(the)d(optimization)j(algorithm.)47 b(W)-7 b(e)27 b(will)h(review)300 1746 y(some)c(well-known)h(query)f (optimizers,)i(both)e(traditional)i(and)e(rule-based,)j(later)d(in)f (this)h(chapter)-5 b(.)583 1916 y(DBMSs)28 b(are)i(increasingly)k (being)c(used)h(to)f(store)g(and)g(retrieve)i(not)e(only)h(lar)n(ger)g (amounts)300 2085 y(of)23 b(information,)i(but)f(more)f(novel)i(types)f (of)f(data)h(as)f(well)g(\(object-oriented,)28 b(multimedia,)d(etc.\).) 31 b(T)-6 b(o)300 2254 y(ensure)32 b(that)f(a)f(DBMS)e(scales)k(well)e (to)g(these)i(emer)n(ging)g(needs,)h(it)d(is)h(important)h(to)e(better) i(design)298 2424 y(and)23 b(implement)g(\252open\272)h(DBMSs)c(which)j (have)g(well-designed)i(components)f(with)e(clearly)i(de\256ned)300 2593 y(interfaces)i(that)f(are)f(easily)h(adaptable.)35 b(Since)24 b(optimizers)i(are)e(critical)h(components)i(of)d(DBMSs,)d (it)300 2762 y(is)i(necessary)j(to)e(ensure)h(that)f(they)g(meet)g (four)g(speci\256c)g(goals:)436 2997 y FC(\017)46 b FI(Abstractions.)53 b FP(Optimizers)31 b(should)h(be)e(constructed)k(using)e(clearly)g (de\256ned)f(abstractions)527 3166 y(that)23 b(encapsulate)i (fundamental)f(concepts)h(of)c(optimizers.)33 b(That)21 b(is,)h(the)g(abstractions)k(should)527 3336 y(represent)h(the)d (distinct)j(steps)e(inherent)h(in)e(an)h(optimization.)35 b(Moreover)l(,)26 b(these)g(abstractions)527 3505 y(should)20 b(be)e(suf)n(\256ciently)j(high-level)f(that)f(a)e(change)j(in)e(their) h(implementation)i(does)d(not)h(funda-)527 3674 y(mentally)k(change)f (the)g(design)g(of)f(the)h(optimizer)-5 b(.)31 b(This)21 b(has)h(the)f(advantage)j(that)e(any)f(changes)527 3844 y(to)27 b(an)h(optimizer)h(consists)g(of)e(changing)j(the)d FD(implementation)j FP(of)d(abstractions,)32 b(not)27 b(the)h(ab-)527 4013 y(stractions)e(themselves.)436 4253 y FC(\017)46 b FI(Extensibility)-5 b(.)47 b FP(As)28 b(mentioned)j(earlier)l(,)g(optimizers)f(in)f(next-generation)k(DBMSs) 27 b(will)h(in-)527 4423 y(creasingly)f(be)d(required)j(to)d(deal)h (with)f(a)f(wider)i(range)g(of)f(data)h(operators)h(and)f(data)g (types.)33 b(It)527 4592 y(is)20 b(imperative,)i(therefore,)h(that)d (optimizers)i(should)g(be)d(designed)k(and)d(constructed)j(in)d(a)f (man-)527 4761 y(ner)28 b(that)h(is)e(amenable)j(to)d(easy)i(and)f (quick)h(changes.)46 b(This)27 b(property)j(is)e(known)h(as)e FD(extensi-)527 4931 y(bility)p FP(.)42 b(Abstractions)30 b(mentioned)e(above)h(help)e(in)g(the)g FD(conceptual)j FP(design)e(of)f(an)g(optimizer)-5 b(.)527 5100 y(The)19 b FD(framework)i FP(used)f(to)f(build)h(\(i.e.,)f(specify\))i (optimizers)f(should)h(also)f(ensure)g(that)f(the)g(con-)1927 5349 y(3)p eop %%Page: 4 16 4 15 bop 527 391 a FP(structs)25 b(used)g(de\256ne)f(interfaces)i (which)e(closely)h(represent)h(the)e(abstractions)j(de\256ned)d(above.) 436 635 y FC(\017)46 b FI(Performance.)30 b FP(Optimizers)19 b(generate)h(a)d(\252good\272)j(access)f(plan)f(for)g(a)g(user)g(query) -6 b(.)30 b(This)18 b(metric)527 805 y(is)27 b(de\256ned)h(by)f(the)h (cost)f(model)h(of)f(the)g(optimizer)l(,)j(and)d(measures)i(the)e (estimated)i(resources)527 974 y(used)d(by)e(the)h(execution)i(module)e (\(see)g(Figure)g(1.1\))g(to)f(process)i(the)f(query)-6 b(.)35 b(It)24 b(is)g(also)h(impor)n(-)527 1144 y(tant)30 b(that)f(an)g(optimal)h(access)g(plan)g(be)f(found)h(ef)n(\256ciently) -6 b(,)33 b(i.e.,)c(that)g(the)g(optimizer)i(be)e(fast.)527 1313 y(This,)j(in)e(turn,)i(requires)g(that)f(the)f(abstractions)j (embodied)f(in)e(the)h(optimizer)g(speci\256cation)527 1482 y(have)25 b(ef)n(\256cient)g(implementations.)436 1726 y FC(\017)46 b FI(Recon\256gurability)-5 b(.)30 b FP(T)-6 b(o)15 b(be)i(able)g(to)g(optimize)h(a)e(wider)h(and)g(more)g (diverse)i(set)e(of)f(queries,)k(and)527 1896 y(to)i(facilitate)i(easy) e(and)g FD(seamless)i FP(changes)f(to)f(an)g(existing)h(optimizer)l(,)h (optimizers)g(should)f(be)527 2065 y(speci\256ed)28 b(using)f FD(building-blocks)k FP(that)c(can)g(be)f(arranged)j(in)d(various)i (ways)e(to)g(construct)j(an)527 2234 y(optimizer)-5 b(.)31 b(These)18 b(building-blocks)23 b(can)18 b(be)g(used)h(to)f (encapsulate)j(abstractions.)33 b(This)18 b(means)527 2404 y(that)24 b(an)f(optimizer)i(can)e(be)h(changed)h(quickly)g (simply)f(by)f(changing)j(the)d(arrangement)j(of)d(the)527 2573 y(building-blocks,)i(or)19 b(by)h(changing)i(the)d(abstractions)k (encapsulated)g(in)d(an)f(existing)j(building-)527 2743 y(block.)583 2987 y(In)g(this)i(dissertation,)i(we)c(propose)j(a)d (well-de\256ned,)j(algebraic)g(framework,)f(called)g(Prairie,)300 3156 y(for)j(specifying)i(rules)e(in)g(a)f(query)i(optimizer)g(that)f (meets)g(all)f(of)h(the)f(four)h(goals)h(listed)g(above.)41 b(The)300 3325 y(algebra)28 b(that)f(we)f(propose)j(is)d(similar)i(to)e (the)h(rule)g(speci\256cation)j(languages)f(in)d(Starburst)i([36])g (and)299 3495 y(V)-12 b(olcano)23 b([31],)g(but)g(provides)i(a)d (cleaner)i(abstraction)h(of)d(the)h(actions)h(of)e(an)h(optimizer;)h (as)e(such,)i(it)e(is)300 3664 y(much)k(easier)h(to)f(write)g(and)g (read)h(rules)g(in)f(our)g(proposed)i(model.)39 b(The)25 b(algebra)j(allows)f(a)e(database)300 3833 y(implementor)g(\(DBI\))e (to)h(specify)h(transformations)i(of)d(a)f(query)i(using)f(rewrite)h (rules)f(that)g(may)f(have)300 4003 y(conditions.)46 b(The)27 b(rules)h(determine)h(the)f(search)h(space)f(and)g(cost)g (model)g(of)g(the)f(optimizer)-5 b(.)45 b(W)-7 b(e)26 b(do)296 4172 y(not)21 b(propose)h(a)e(search)h(strategy;)j(we)19 b(intend)j(to)e(implement)i(a)d(preprocessor)24 b(that)d(can)g (translate)h(rules)297 4342 y(in)f(our)h(model)f(to)g(those)h(in)f(V) -12 b(olcano,)23 b(since)f(V)-12 b(olcano)22 b(has)g(an)f(ef)n (\256cient)h(search)g(strategy)h(and)f(is)f(freely)300 4511 y(available.)583 4680 y(Below)-6 b(,)23 b(we)g(brie\257y)h(review) g(some)g(related)h(work)f(on)f(optimizers.)1927 5349 y(4)p eop %%Page: 5 17 5 16 bop 300 391 a FO(1.2)119 b(Related)31 b(W)-7 b(ork)300 659 y FN(1.2.1)99 b(T)-7 b(raditional)25 b(Query)g(Optimizers)300 890 y FP(The)e(System)g(R)f(optimizer)j([46])f(was)f(one)h(of)f(the)h (earliest)h(query)g(optimizers)g(proposed)h(and)e(imple-)300 1059 y(mented.)33 b(It)24 b(was)f(built)i(for)g(the)f(System)g(R)f (database)j(system)f([1].)32 b(System)24 b(R)f(is)h(a)g(centralized,)i (rela-)294 1229 y(tional)19 b(DBMS)c(where)j(users)h(specify)g(their)g (queries)g(in)f(SQL.)d(The)i(System)h(R)e(optimizer)k(is)d(still)i FD(the)f(de)299 1398 y(facto)25 b FP(industry)g(standard;)g(it)e(was)g (the)g(\256rst)g(to)g(show)g(the)g(practical)i(viability)h(of)d(query)h (optimization)300 1567 y(in)f(a)h(commercial)g(setting.)581 1737 y(The)d(basic)h(philosophy)i(of)d(the)h(System)f(R)f(optimizer)j (was)d(a)h(bottom-up)i(exhaustive)h(search)300 1906 y(strategy)33 b(with)e(dynamic)h(programming.)55 b(Some)30 b(of)h(the)g(salient)i (features)g(it)d(embodied)j(are)e(listed)300 2075 y(below:)436 2319 y FC(\017)46 b FP(It)28 b(employed)h(a)e(bottom-up)j(strategy)-6 b(.)45 b(That)28 b(is,)g(children)h(of)f(nodes)h(in)f(an)f(operator)j (tree)e(are)527 2489 y(optimized)e(before)f(the)e(node)i(itself)f(is)g (optimized.)436 2733 y FC(\017)46 b FP(It)20 b(used)g(two)g(join)g (algorithms,)i(nested)g(loops)e(and)h(mer)n(ge)f(join)h(\(\256rst)e (introduced)k(in)d([16]\),)h(and)527 2902 y(two)i(relation)j(retrieval) f(algorithms,)h(segment)f(scan)f(and)g(variations)i(of)e(index)g(scan.) 436 3146 y FC(\017)46 b FP(The)17 b(concept)i(of)e(\252interesting\272) k(orders)d(was)f(introduced)j(to)d(generate)i(only)f(those)g(access)g (plans)527 3316 y(in)k(the)f(search)i(space)f(that)g(were)g(likely)g (to)g(be)f(part)h(of)f(other)i(access)f(plans.)32 b(It)21 b(also)h(limited)g(the)527 3485 y(search)j(space)f(by)f(considering)j (only)e(left-deep)h(operator)g(trees)f(\(in)f(which)g(the)g(inner)h (relation)527 3654 y(was)f(always)i(a)e(stored)i(\256le\),)d(and)i(by)g (delaying)i(cross-products)i(as)23 b(far)h(as)f(possible.)436 3899 y FC(\017)46 b FP(It)28 b(introduced)j(a)d(fairly)h(elaborate)i (scheme)e(using)g(\252selectivity)j(factors\272)e(to)e(estimate)h (cardi-)527 4068 y(nalities)d(of)d(streams)i(generated)h(by)d (computations)k(on)d(other)g(streams.)436 4312 y FC(\017)46 b FP(Dynamic)25 b(programming)i(was)d(used)h(to)f(control)j(the)d (expansion)k(of)c(the)h(search)g(space.)35 b(Basi-)527 4481 y(cally)-6 b(,)23 b(the)e(optimizer)i(maintained)g(an)f (equivalence)i(class)e(of)g(access)g(plans,)h(and)e(as)g(each)h(plan) 527 4651 y(was)27 b(generated,)j(its)d(cost)g(was)f(computed,)k(and)d (if)f(its)h(cost)h(was)e(greater)j(than)e(the)g(minimum)527 4820 y(cost)c(of)g(any)g(plan)g(in)f(its)h(equivalence)j(class,)d(it)f (was)g(discarded)j(since)f(it)e(would)h(not)g(be)f(a)g(sub-)527 4989 y(plan)j(of)g(another)h(optimal)f(access)h(plan.)35 b(This)24 b(process)i(ensured)g(that)f(the)g(optimization)i(time)1927 5349 y(5)p eop %%Page: 6 18 6 17 bop 527 391 a FP(was)30 b(exponential)k(\(in)d(the)g(number)g(of)g (joining)h(relations\))h(as)e(opposed)h(to)f(a)f(factorial)i(time)527 561 y(complexity)26 b(\(see)e(Appendix)h(A)e(for)h(a)f(proof)h(of)g (the)g(algorithm)h(complexity\).)436 805 y FC(\017)46 b FP(The)25 b(System)f(R)g(optimizer)i(also)f(had)g(a)g(fairly)h (elaborate)h(cost)e(model)g(involving)i(a)e(weighted)527 974 y(sum)f(of)f(CPU)f(and)i(I/O)e(costs.)577 1218 y(R)638 1185 y FB(\003)694 1218 y FP(is)17 b(a)g(distributed)k(relative)f(of)d (System)h(R.)e(The)h(stored)i(relations)h(are)e(located)h(at)f (distributed)299 1388 y(sites.)31 b(R)574 1355 y FB(\003)613 1388 y FP(')-5 b(s)22 b(query)i(processor)h([20,)16 b(37,)g(45])23 b(works)g(in)f(essentially)j(the)e(same)g(way)f(as)g(that)h(of)f (System)300 1557 y(R,)j(except)i(for)f(some)h(subtle)g(complications)i (introduced)g(by)d(the)h(distribution)i(of)d(relations.)41 b(These)295 1726 y(complications)22 b(arise)e(mostly)g(in)f (authentication)24 b(and)19 b(catalog)i(sharing)g(between)f(remote)g (sites.)30 b(Con-)300 1896 y(ceptually)-6 b(,)26 b(however)l(,)f(the)e (R)1222 1863 y FB(\003)1284 1896 y FP(optimizer)i(builds)g(upon)g(the)f (System)f(R)g(optimizer)-5 b(.)583 2065 y(Like)31 b(System)g(R,)e(the)i (search)h(strategy)h(in)d(R)2073 2032 y FB(\003)2112 2065 y FP(')-5 b(s)31 b(optimizer)h(also)g(employs)f(an)g(exhaustive) 294 2234 y(examination)21 b(of)d(its)g(search)h(space)g(to)f(\256nd)g (an)g(optimal)h(plan.)30 b(Heuristics)20 b(are)e(used)h(to)f(limit)g (the)g(space.)295 2404 y(The)g(retrieval)i(methods)g(available)h(are)e (segment)h(scan)f(and)g(index)h(scan.)30 b(Single)19 b(site)g(joins)h(\(i.e.,)f(joins)292 2573 y(in)d(which)h(both)h (streams)f(are)f(located)j(at)d(the)h(same)f(site\))h(are)g(optimized)h (in)e(the)h(same)f(way)g(as)h(in)f(System)300 2743 y(R)22 b(using)j(nested)g(loops)g(or)e(mer)n(ge)i(join.)580 2912 y(The)c(case)g(of)f(joins)i(in)f(which)g(the)g(two)f(input)i (streams)f(are)g(located)i(at)d(dif)n(ferent)j(sites)f(is)e(what)298 3081 y(distinguishes)26 b(R)855 3048 y FB(\003)915 3081 y FP(from)21 b(System)h(R.)e(R)1566 3048 y FB(\003)1626 3081 y FP(handles)k(this)e(case)h(by)e(transfering)k(both)e(streams)f (to)g(a)f(com-)300 3251 y(mon)i(site)h(before)h(joining.)33 b(T)-6 b(wo)22 b(transfer)j(strategies)h(are)e(considered,)i (tuple-at-a-time)h(and)d(whole.)583 3420 y(The)e(cost)i(model)f(used)h (by)f(R)1527 3387 y FB(\003)1566 3420 y FP(')-5 b(s)23 b(optimizer)h(is)f(similar)h(to)e(System)h(R,)f(except)i(for)f (multi-site)300 3589 y(joins)i(in)e(which)h(case)g(the)g(cost)g(of)g (transfering)i(relations)g(is)d(also)h(added.)300 3896 y FN(1.2.2)99 b(Rule-Based)26 b(Optimizers)f(\320)f(The)i(Next)f (Generation)297 4126 y FP(Both)c(System)g(R)f(and)i(R)1076 4094 y FB(\003)1135 4126 y FP(have)g(existed)h(for)e(a)g(long)h(time.) 29 b(Lately)-6 b(,)22 b(however)l(,)h(researchers)h(have)e(been)295 4296 y(looking)e(at)f(extensible)i(query)f(optimizers.)31 b(This)19 b(is)f(in)h(keeping)i(with)d(the)h(trend)h(toward)f (constructing)293 4465 y(extensible)h(DBMSs.)27 b(Extensibility)-6 b(,)21 b(in)c(short,)j(is)d(the)g(process)i(of)e(augmenting)j(or)d (removing)i(features)299 4635 y(easily)k(from)f(a)g(system)h(in)g (order)g(to)f(customize)i(it)e(for)h(an)f(application.)34 b(Extensibility)25 b(of)d(query)i(opti-)300 4804 y(mizers)h(refers)g (to)f(the)g(ease)h(of)f(constructing)j(optimizers)f(for)e(extensible)j (DBMSs.)k(It)23 b(also)i(refers)g(to)300 4973 y(the)f(easy)g (customizability)j(of)d(an)f(existing)j(query)f(optimizer)g(to)e(a)h (new)f(application.)1927 5349 y(6)p eop %%Page: 7 19 7 18 bop 583 391 a FP(Rule-based)25 b(query)e(optimizers)i(have)f(been) f(proposed)j(as)c(a)g(means)i(of)e(constructing)27 b(exten-)298 561 y(sible)22 b(optimizers.)32 b(The)21 b(primary)i(advantage)h(of)d (rule-based)k(query)d(optimizers)i(is)d(the)h(ability)h(to)e(add)300 730 y(new)28 b(operators)j(and)e(algorithms)h(without)g(a)e(costly)h (rewrite)g(of)g(the)f(entire)i(optimizer)-5 b(.)47 b(Below)-6 b(,)29 b(we)300 899 y(review)24 b(a)f(few)g(of)h(the)f(more)h (well-known)h(rule-based)h(optimizers.)580 1069 y(The)20 b(Starburst)i(query)g(optimizer)g([33,)16 b(36,)g(43])21 b(uses)g(rules)g(for)g(all)g(decisions)i(that)e(need)g(to)g(be)300 1238 y(taken)27 b(by)e(the)h(query)h(optimizer)-5 b(.)39 b(The)25 b(rules)i(are)e(functional)k(in)c(nature)i(and)g(transform)g (a)e(given)i(op-)300 1408 y(erator)d(tree)g(into)g(another)-5 b(.)32 b(The)23 b(rules)h(are)f(commonly)i(those)f(that)g(re\257ect)f (relational)j(calculus)f(trans-)297 1577 y(formations.)33 b(In)21 b(Starburst,)i(the)e(query)h(rewriting)h(phase)f(is)f(dif)n (ferent)j(from)d(the)h(optimization)i(phase.)300 1746 y(The)i(rewriting)i(phase)g(transforms)h(the)e(query)h(itself)f(into)h (equivalent)h(operator)g(trees)e(based)h(on)f(re-)300 1916 y(lational)f(calculus)g(rules.)34 b(The)23 b(plan)i(optimization)i (phase)e(selects)h(algorithms)g(for)e(each)h(operator)h(in)298 2085 y(the)c(operator)i(tree)e(that)h(is)f(obtained)i(after)e (rewriting.)32 b(As)21 b(the)h(designers)i(of)e(Starburst)i(point)e (out,)h(the)300 2254 y(disadvantage)28 b(of)c(separating)i(the)f(query) g(rewrite)f(and)h(the)f(optimization)j(phases)e(is)f(that)g(pruning)i (of)300 2424 y(the)j(search)h(space)f(is)g(not)g(possible)h(during)g (query)g(rewrite,)g(since)g(the)e(rewrite)i(phase)f(is)g(non-cost-)297 2593 y(based.)i(Also,)21 b(the)f(rewrite)i(phase)g(uses)f(heuristics)i (to)e(prune)g(the)g(search)h(space)g(before)g(the)f(optimiza-)300 2762 y(tion)j(phase;)h(this)f(can)g(lead)g(to)g(a)f(sub-optimal)j (plan.)583 2932 y(Lohman)31 b(describes)h(rules)f(for)g(the)f (optimization)j(phase)e(of)f(Starburst)i([36].)51 b(These)30 b(rules)300 3101 y(represent)c(alternative)g(access)f(paths,)g(join)f (algorithms,)h(and)f(site)g(choices)h(in)f(a)f(distributed)k(DBMS.)300 3271 y(However)l(,)k(even)e(though)i(these)f(rules)g(transform)g(an)f (operator)i(tree)e(into)h(a)e(valid)i(access)g(plan,)h(the)300 3440 y(cost)f(computation)j(is)d(not)g(done)h(until)f(all)g(rules)h (are)f(applied.)52 b(In)29 b(other)i(words,)h(the)e(rewrite)g(rules)300 3609 y(of)e(Starburst)h(are)f(purely)i(syntactic)g(transformations)i (of)c(one)g(query)h(representation)j(into)d(another)-5 b(.)300 3779 y(Thus,)26 b(all)g(operator)i(trees)e(are)g(subjected)i (to)e(all)g(applicable)i(rules)f(before)g(costs)f(are)g(computed)i(and) 300 3948 y(the)c(search)h(space)f(can)g(be)g(pruned.)583 4117 y(Freytag)j([25])f(describes)i(a)d(rule-based)j(query)f(optimizer) g(similar)f(to)f(Starburst.)38 b(The)25 b(rules)296 4287 y(are)20 b(based)g(on)g(LISP-like)g(representations)k(of)19 b(access)i(plans.)31 b(The)19 b(rules)i(themselves)h(are)d(recursively) 298 4456 y(de\256ned)j(on)g(smaller)g(expressions)j(\(operator)f (trees\).)31 b(Although)23 b(several)h(expressions)h(can)c(contain)j(a) 292 4625 y(common)17 b(sub-expression,)22 b(Freytag)c(doesn')n(t)h (consider)f(the)f(possibility)j(of)c(sharing.)31 b(Expressions)19 b(are)300 4795 y(evaluated)27 b(each)f(time)e(they)h(are)g (encountered.)38 b(In)24 b(addition,)j(as)e(in)f(the)h(rewrite)h(phase) f(of)g(Starburst,)299 4964 y(he)d(doesn')n(t)j(consider)f(the)f(cost)g (transformations)j(inherent)f(in)d(any)h(query)g(transformation;)k (rules)c(are)1927 5349 y(7)p eop %%Page: 8 20 8 19 bop 300 391 a FP(syntactic)26 b(transformation)h(rules.)576 561 y(The)17 b(EXODUS)c(project)19 b([17])e(has)h(similar)f(goals)h(as) f(those)h(of)f(Starburst,)i(to)e(provide)i(a)d(frame-)300 730 y(work)25 b(in)g(which)h(DBMSs)e(can)h(be)h(easily)g(implemented)h (as)f(extensions)i(of)d(existing)i(DBMSs,)d(or)h(to)300 899 y(design)30 b(completely)g(new)e(DBMSs.)43 b(The)28 b(query)i(optimizer)f(in)g(EXODUS)c([28,)16 b(30])28 b(is,)h(in)g(fact,)g(an)297 1069 y FD(optimizer)23 b(generator)g FP(which)f(accepts)g(the)f(speci\256cation)j(of)d(the)g(data)h(model)f (and)g(operators)j(in)c(a)h(de-)297 1238 y(scription)i(\256le.)29 b(The)20 b(optimizer)j(generator)g(compiles)f(these)g(rules,)g (together)g(with)f(pre-de\256ned)i(rules,)300 1408 y(to)g(generate)j (an)e(optimizer)h(for)f(the)f(particular)k(data)d(model)g(and)g(set)g (of)f(operators.)33 b(Unlike)25 b(Freytag,)297 1577 y(the)c(optimizer)h (generator)h(for)e(EXODUS)d(allows)j(for)g(C)f(code)h(along)h(with)f (de\256nitions)i(of)d(new)h(rules.)300 1746 y(This)i(allows)h(the)g (DBI)f(the)g(freedom)i(to)e(associate)j(any)e(action)h(with)f(a)f (particular)j(rule.)582 1916 y(Operator)e(trees)g(in)e(EXODUS)e(are)i (constructed)k(bottom-up)f(from)d(previously)k(constructed)300 2085 y(sub-trees.)41 b(Common)26 b(sub-expressions)31 b(are)c(shared)g(as)g(far)f(as)g(possible.)41 b(Each)26 b(access)i(plan)f(in)f(the)298 2254 y(search)d(space)f(has)g(a)f(cost)h (factor)h(associated)h(with)d(it;)h(plans)h(are)e(examined)j(based)e (on)g(their)g(cost)g(fac-)300 2424 y(tors.)33 b(It)24 b(is)f(not)i(clear)g(if)e(these)i(cost)g(factors)h(have)f(any)f (relation)i(to)e(the)g(actual)i(costs)f(of)f(the)g(plans)h(\(as)300 2593 y(estimated)h(by)f(the)g(cost)g(model\),)h(and)f(if)f(so,)h(what)g (the)g(relation)h(is.)34 b(The)25 b(EXODUS)c(optimizer)26 b(uses)300 2762 y(the)e(cost)g(factor)h(with)e(an)h(exhaustive)i (search)f(strategy)h(to)d(guide)i(the)f(exploration)i(of)e(access)h (plans.)579 2932 y(The)19 b(V)-12 b(olcano)21 b(optimizer)h(generator)g (project)f([31])f(evolved)i(from)d(the)h(EXODUS)d(project.)31 b(It)300 3101 y(is)23 b(dif)n(ferent)i(from)e(all)h(the)f(above)i (optimizers)g(in)e(one)h(signi\256cant)h(way:)30 b(it)23 b(is)g(a)g(top-down)i(optimizer)300 3271 y(compared)k(with)d(the)i (bottom-up)h(strategy)g(of)e(the)g(others.)42 b(Operator)29 b(trees)e(are)g(optimized)i(starting)300 3440 y(from)d(the)h(root)g (while)f(sub-trees)j(are)d(not)h(yet)f(optimized.)41 b(This)26 b(leads)h(to)f(a)g(constraint-driven)31 b(gen-)299 3609 y(eration)25 b(of)e(the)g(search)h(space.)32 b(While)24 b(this)f(method)h(results)g(in)f(a)g(tight)h(control)g(of)f(the)h (search)g(space,)300 3779 y(it)i(is)h(unconventional)k(and)c(requires)h (careful)h(attention)f(on)f(the)g(part)g(of)f(the)h(DBI)f(to)g(ensure)i (that)f(no)300 3948 y(valid)d(operator)i(trees)e(are)g(accidently)i (left)e(out)g(of)f(the)h(search)h(space.)32 b(W)-7 b(e)23 b(will)g(discuss)i(the)f(V)-12 b(olcano)300 4117 y(optimizer)25 b(generator)h(in)e(greater)h(detail)f(in)g(Chapter)g(2.)583 4287 y(Fegaras,)29 b(Maier)l(,)f(and)g(Sheard)f([24])h(describe)h(a)e (declarative)j(optimizer)e(generator)i(frame-)300 4456 y(work)24 b(for)g(specifying)k(query)d(optimizers.)34 b(The)24 b(premise)h(in)f(their)h(work)f(is)g(that)h(much)f(of)g(the)h (speci-)298 4625 y(\256cation)d(in)g(current)h(optimizers)h(consists)f (of)f(procedurally)j(de\256ned)d(actions;)j(making)d(these)h(actions) 296 4795 y(declarative)g(results)f(in)e(a)g(cleaner)h(speci\256cation)i (language.)32 b(T)-6 b(o)19 b(this)i(end,)g(Fegaras)g(et)f(al)g(use)g (a)g(re\257ec-)295 4964 y(tive)g(functional)h(programming)h(language,)g (called)e(CRML,)c(as)j(the)h(basis)g(for)f(their)h(speci\256cation)i (lan-)1927 5349 y(8)p eop %%Page: 9 21 9 20 bop 298 391 a FP(guage.)31 b(The)21 b(term)h(re\257ective)h (describes)h(an)d(environment)k(that)d(not)g(only)g(can)g(specify)h(an) f(optimizer)l(,)300 561 y(but)i(also)g(enables)h(a)e(DBI)f(to)h(embed)h (metadata)h(\(or)f(parameters\))h(to)f(guide)g(the)g(optimizer)h (generator)300 730 y(in)h(generating)j(an)e(optimizer)h(for)e(a)g (speci\256c)h(tar)n(get.)41 b(An)26 b(optimizer)i(is)e(speci\256ed)i (by)e(using)i(rewrite)300 899 y(rules)e(that)g(are)g(based)g(on)g (pattern)h(matching.)38 b(In)25 b(addition)i(to)f(this)g(syntactic)h (transformation,)i(rules)300 1069 y(also)c(consist)h(of)e(semantic)h (context-dependent)30 b(conditions.)35 b(However)l(,)25 b(the)g(framework)g(described)300 1238 y(by)i(Fegaras)h(et)f(al)f (still)i(contains)h(some)e(implementation-level)32 b(details)c(at)f (the)g(speci\256cation)j(level.)298 1408 y(These)21 b(drawbacks)j (parallel)f(those)g(in)e(V)-12 b(olcano)23 b(\(which)f(is)f(described)j (in)e(more)f(detail)i(in)e(Chapter)i(2\),)295 1577 y(and)c(mainly)g (concern)i(the)d(representation)23 b(and)c(transformation,)k(using)d (rewrite)f(rules,)h(of)f(the)g(various)300 1746 y(expressions)27 b(and)d(their)g(abstractions.)300 2113 y FO(1.3)119 b(Outline)31 b(of)f(Dissertation)297 2376 y FP(All)20 b(of)g(the)h(rule-based)j (query)d(optimizers)i(discussed)g(in)e(Section)g(1.2.2)g(take)g(an)g FD(ad)f(hoc)i FP(approach)g(to)298 2545 y(the)h(speci\256cation)h(of)e (rules.)31 b(W)-7 b(e)22 b(introduce)i(a)e FD(well-de\256ned)k FP(and)d FD(structur)m(ed)j(algebra)e FP(called)f(Prairie)300 2715 y(to)j(specify)i(rules)f(for)f(a)g(rule-based)i(optimizer)-5 b(.)40 b(Because)28 b(of)e(a)f(rigorous)j(algebra,)h(it)c(is)h(easier)h (for)g(a)300 2884 y(DBI)c(to)h(write)g(rules,)h(as)f(well)g(as)g(for)g (readers)i(to)e(read)h(and)g(understand)i(the)d(semantics)i(of)e(the)h (rules.)295 3053 y(However)l(,)c(rules)f(by)f(themselves)i(do)e(not)h (constitute)i(an)d(optimizer;)j(we)d(need)g(a)g(search)i(strategy)g (also.)300 3223 y(Since)26 b(search)h(strategies)h(are)d (well-understood,)30 b(we)25 b(do)g(not)h(propose)i(to)d(study)i(them.) 37 b(Instead,)27 b(we)298 3392 y(will)21 b(use)h(the)g(V)-12 b(olcano)23 b(search)g(engine)g(to)e(drive)i(our)f(optimizer)l(,)h (since)g(V)-12 b(olcano)23 b(has)f(a)f(very)h(ef)n(\256cient)300 3562 y(search)j(strategy)-6 b(.)33 b(However)l(,)24 b(this)g(requires)h (that)g(we)d(translate)k(Prairie)e(rules)h(into)f(V)-12 b(olcano)25 b(rules.)583 3731 y(The)h(V)-12 b(olcano)28 b(optimizer)g(generator)g(is)e(described)j(in)d(Chapter)h(2.)38 b(W)-7 b(e)25 b(describe)k(Prairie)d(in)300 3900 y(Chapter)f(3)e(and)h (show)f(how)h(it)f(can)h(be)f(used)i(to)e(specify)i(optimizers)h(using) f(high-level)h(abstractions.)300 4070 y(Chapter)31 b(4)e(describes)j (the)e(process)i(of)d(translating)k(Prairie)d(rules)h(into)f(V)-12 b(olcano)32 b(rules.)50 b(Chapter)31 b(5)296 4239 y(presents)21 b(some)f(experimental)j(results)e(validating)h(the)e(ef)n(\256ciency)i (of)d(Prairie)i(optimizers.)31 b(Chapter)21 b(6)300 4408 y(describes)33 b(how)e(layered)i(optimizers)g(can)e(be)g(built)h(using) g(Prairie,)h(and)f(how)f(this)g(leads)h(to)f(easier)300 4578 y(recon\256gurability)-6 b(.)35 b(Finally)-6 b(,)24 b(we)f(end)h(with)f(some)h(conclusions)j(and)d(future)h(work)e(in)h (Chapter)g(7.)1927 5349 y(9)p eop %%Page: 10 22 10 21 bop 2859 1118 a FG(Chapter)44 b(2)573 1657 y FM(The)51 b(V)-19 b(olcano)52 b(Optimizer)f(Generator)296 2159 y FP(This)19 b(chapter)i(describes)h(the)e(V)-12 b(olcano)21 b(optimizer)g(generator)-5 b(.)32 b(The)19 b(features)i(that)f(are)g (relevant)i(to)d(this)300 2328 y(dissertation)27 b(are)d(presented,)h (but)f(more)g(details)h(can)f(be)f(found)i(in)f([31,)16 b(38].)300 2695 y FO(2.1)119 b(Overview)581 2958 y FP(V)-12 b(olcano)23 b(is)e(a)g(rule-based)j(query)e(optimizer)h(generator)h (that)e(is)f(designed)j(to)d(be)g(\257exible)h(and)299 3127 y(extensible)k(to)c(speci\256c)i(database)h(architectures.)34 b(\(Henceforth,)25 b(when)e(we)f(talk)h(of)g(V)-12 b(olcano,)24 b(we)e(are)299 3297 y(referring)k(to)d(the)g(\252V)-12 b(olcano)25 b(optimizer)f(generator)s(\272.\))34 b(It)23 b(implements)i(a)d(top-down)j(query)f(optimizer)300 3466 y(in)g(the)h(sense)h(that)f(parents)h(of)e(nodes)i(in)e(an)h(operator)h (tree)f(are)g(optimized)h(before)g(the)f(node)g(itself)g(is)p 323 3655 3237 4 v 323 4697 4 1042 v 1475 3772 a(Operator)f(T)m(ree)1375 4814 y @beginspecial @setspecial tx@Dict begin STP newpath 2.6 SLW 0. setgray [ -17.07164 110.96565 153.64476 110.96565 153.64476 42.6791 -17.07164 42.6791 /Lineto /lineto load def false Polygon gsave 0.5 setgray fill grestore gsave 2.6 SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 42.6791 67.43292 42.6791 122.91574 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 42.6791 67.43292 42.6791 122.91574 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1877 4065 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488 neg 66.36697 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(V)-12 b(olcano)25 b(Rules)1375 4814 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { /ArrowAc [ 6 2 roll ] cvx def ArrowAc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowAc ArrowA pop pop ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1556 4339 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651 neg 95.86615 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(V)-12 b(olcano)25 b(Rule)f(Engine)1375 4814 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1721 4600 a(Access)g(Plan)p 3557 4697 V 323 4700 3237 4 v 3558 4717 19 1049 v 340 4717 3237 19 v 633 4913 a(Figure)g(2.1:)31 b(Schematic)25 b(representation)i(of)d(the)g(V)-12 b(olcano)25 b(optimizer)g(generator)1905 5349 y(10)p eop %%Page: 11 23 11 22 bop 300 391 a FP(optimized.)36 b(Roughly)26 b(speaking,)h(V)-12 b(olcano)26 b(provides)h(two)e(major)g(components)i(of)e(an)f (optimizer:)36 b(a)300 561 y(search)28 b(engine)h(and)e(a)g(rule)h (speci\256cation)h(language.)44 b(The)27 b(schematic)h(design)h(of)e (the)g(V)-12 b(olcano)29 b(op-)300 730 y(timizer)g(generator)i(is)e (depicted)h(in)f(Figure)g(2.1.)45 b(A)28 b(DBI)f(writes)i(rules)g(in)g (V)-12 b(olcano')-5 b(s)30 b(speci\256cation)300 899 y(language,)c(which)e(are)f(then)i(compiled)g(with)e(the)h(rule)g (engine)h(to)e(generate)j(an)e(optimizer)-5 b(.)580 1069 y(The)21 b(search)h(engine)g(is)f(hard-coded)i(and)f(is)e(not)h (changeable)j(by)d(the)g(DBI.)e(The)h(search)i(strat-)300 1238 y(egy)j(is)g(exhaustive,)i(meaning)f(that)f(all)g(operator)i (trees)e(that)g(are)g(generated)i(by)e(application)j(of)c(rules)300 1408 y(are)k(evaluated)j(before)e(an)f(optimal)h(plan)f(is)g(returned.) 46 b(Dynamic)29 b(programming)h(is)d(used)i(to)f(prune)300 1577 y(the)d(search)h(space)g(as)f(much)g(as)g(possible.)37 b(Since)25 b(this)g(process)i(of)e(pruning)i(is)d(similar)i(to)f(the)g (one)g(in)300 1746 y(System)e(R)g([46],)h(we)e(will)i(not)g(describe)h (it)e(further)-5 b(.)583 1916 y(The)31 b(rule)h(speci\256cation)i (language)g(is)d(the)h(part)g(of)f(V)-12 b(olcano)33 b(that)f(allows)g(a)f(DBI)f(to)h(spec-)300 2085 y(ify)h(how)f(operator) j(trees)e(are)g(transformed)i(to)e(generate)i(access)f(plans.)56 b(The)31 b(optimizer)i(is)f(speci-)300 2254 y(\256ed)25 b(as)h(a)f(set)h(of)f(operators,)j(algorithms,)g(and)e(rules)h(with)e (associated)k(actions.)38 b(V)-5 b(iewed)25 b(as)h(a)f(state-)298 2424 y(transformation)f(operation,)h(the)c(optimizer)i(transforms)h(an) d(initial)i(state)f(\(operator)i(tree\))e(into)g(a)f(\256nal)297 2593 y(one)h(\(access)h(plan\))f(while)f(also)h(translating)i (associated)g(state)e(information)h(in)e(the)h(process.)32 b(The)20 b(fol-)300 2762 y(lowing)k(sections)i(describe)g(the)d(V)-12 b(olcano)25 b(rule)f(speci\256cation)j(language)f(in)d(greater)i (detail.)300 3129 y FO(2.2)119 b(De\256nitions)300 3392 y FP(Before)24 b(we)f(describe)i(the)f(V)-12 b(olcano)25 b(rule)f(speci\256cation)j(language,)e(we)e(need)h(a)f(few)g (de\256nitions.)296 3694 y FI(Stor)n(ed)e(Files)f(and)f(Str)n(eams.)92 b FP(A)19 b(relation)j(or)e(\256le)g(is)g FD(stor)m(ed)j FP(if)d(its)h(tuples)g(reside)h(on)e(disk.)30 b(A)20 b FD(str)m(eam)300 3863 y FP(is)25 b(a)g(sequence)i(of)e(tuples)h(and)g (is)f(the)g(result)i(of)e(a)f(computation)k(on)d(one)h(or)f(more)g (streams)h(or)f(stored)300 4033 y(\256les;)i(tuples)g(of)e(streams)i (are)f(returned)i(one)e(at)f(a)h(time,)f(typically)j(on)e(demand.)38 b(Streams)26 b(are)g(either)297 4202 y(named,)c(denoted)h(by)e FA(?)p FH(n)p FP(,)f(where)i FH(n)d FP(is)i(an)g(integer)l(,)j(or)d (unnamed)h(operator)h(trees)f(\(de\256ned)g(below\).)31 b(In)300 4371 y(V)-12 b(olcano,)26 b(all)e(operations)k(accept)d(zero)h (or)e(more)g(streams)i(as)e(input,)h(or)g(one)g(or)f(more)g(stored)i (\256les)e(as)300 4541 y(input.)300 4842 y FI(Database)k(Operations.)92 b FP(An)26 b FD(operation)j FP(is)e(a)g(computation)i(on)e(one)h(or)e (more)h(streams)h(or)f(stored)299 5012 y(\256les.)k(There)23 b(are)g(three)h(types)g(of)f(database)i(operations)g(in)e(V)-12 b(olcano:)33 b(abstract)25 b(\(or)e(implementation-)1906 5349 y(1)m(1)p eop %%Page: 12 24 12 23 bop 300 391 a FP(unspeci\256ed\))26 b(operators,)g(concrete)f (algorithms,)h(and)e(enforcers.)33 b(Each)23 b(is)h(detailed)h(below)-6 b(.)527 660 y FI(Operators.)47 b FP(Abstract)24 b FD(operators)g FP(specify)g(computations)h(on)e(streams)f(or)g(stored)i(\256les;)e (they)727 830 y(are)d(denoted)h(in)e(this)h(dissertation)j(by)d(all)f (capital)i(letters)g(\(e.g.,)e(JOIN\).)g(Associated)i(with)727 999 y(every)28 b(operator)g(is)e(an)g FD(operator)j(ar)m(gument)f FP(which)f(speci\256es)h(additional)h(information)727 1168 y(needed)18 b(to)e(execute)i(the)e(operator)-5 b(.)31 b(The)15 b(type)i(of)f(an)g(operator)i(ar)n(gument)g(can)f(be)f (virtually)727 1338 y(anything;)26 b(V)-12 b(olcano)24 b(allows)g(it)e(to)h(be)g(de\256ned)g(as)g(an)g(arbitrary)i(C)c (struct.)32 b(As)22 b(examples,)727 1507 y(some)f(operators)j(are)d (described)i(below;)f(for)f(each,)h(we)e(describe)j(what)e(the)g (operator)i(ar)n(-)727 1677 y(gument)i(might)f(be.)806 1879 y FC(\017)46 b FP(RET)22 b(retrieves)k(tuples)g(of)d(a)h(stored)h (\256le.)32 b(The)23 b(operator)j(ar)n(gument)g(might)e(specify)897 2048 y(the)g(name)g(of)f(the)h(stored)h(\256le)e(to)g(be)h(retrieved.) 806 2234 y FC(\017)46 b FP(JOIN)23 b(joins)i(two)e(streams.)31 b(The)24 b(operator)h(ar)n(gument)h(of)d(JOIN)g(could)i(specify)g(the) 897 2404 y(join)d(predicate.)33 b(In)21 b(our)h(examples,)h(we)d(will)h (assume)h(that)g(the)g(operator)h(ar)n(gument)897 2573 y(for)28 b(JOIN)f(speci\256es)j(an)d(equijoin)k(predicate)f(of)e(the)g (form)g FH(a)39 b FA(=)h FH(b)27 b FP(where)h FH(a)f FP(is)h(an)897 2743 y(attribute)e(of)d(the)h(outer)h(stream)f(and)g FH(b)f FP(is)g(an)h(attribute)h(of)f(the)g(inner)g(stream.)527 2945 y FI(Algorithms.)47 b FD(Algorithms)20 b FP(are)f(concrete)i (implementations)h(of)d(abstract)i(operators;)i(they)d(are)727 3114 y(represented)25 b(in)d(lower)g(case)g(with)g(the)g(\256rst)f (letter)i(capitalized)i(\(e.g.,)d(Nested)p 3226 3114 28 4 v 34 w(loops\).)31 b(A)727 3284 y(single)h(operator)h(can)e(be)g (implemented)h(by)f(several)h(algorithms,)j(and)c(a)f(single)i(algo-) 727 3453 y(rithm)22 b(can)g(implement)h(many)e(operators.)33 b(Corresponding)25 b(to)c(the)h(operator)i(ar)n(guments)727 3623 y(of)29 b(operators,)i(algorithms)g(have)e FD(algorithm)h(ar)m (guments)p FP(.)47 b(In)29 b(many)f(cases,)i(algorithm)727 3792 y(ar)n(guments)25 b(are)d(the)g(same)g(as)g(the)g(operator)i(ar)n (guments)h(of)d(the)g(operators)i(that)f(they)g(im-)727 3961 y(plement;)28 b(however)l(,)e(sometimes)h(algorithms)g(don')n(t)f (implement)h(any)e(particular)j(oper)n(-)727 4131 y(ator)21 b(\(see)f(below\),)h(so,)g(in)f(general,)i(algorithm)f(ar)n(guments)i (are)d(dif)n(ferent)i(from)e(operator)727 4300 y(ar)n(guments.)527 4503 y FI(Enfor)n(cers.)48 b FD(Enfor)m(cers)21 b FP(are)f(special)i (algorithms)h(that)d(are)h(not)f(implementations)k(of)c(any)g(par)n(-) 727 4672 y(ticular)g(operator;)i(rather)l(,)f(they)e(are)g(algorithms)h (that)f(can)g(accept)g(their)h(input)f(from)f(other)727 4841 y(algorithms)24 b(and)e(return)h(an)e(output)i(that)g(can)f(be)f (fed)h(to)f(other)i(algorithms)h(or)d(enforcers.)1905 5349 y(12)p eop %%Page: 13 25 13 24 bop 785 412 2331 13 v 785 503 4 92 v 838 521 a Fz(Operator)p 1187 503 V 104 w(Description)p 1858 503 V 1911 476 a(Operator/Algorithm)p 2613 503 V 2666 521 a(Algorithm)p 3112 503 V 785 595 V 1187 595 V 1858 595 V 1911 567 a(Argument)p 2613 595 V 3112 595 V 785 607 2331 13 v 785 699 4 92 v 838 723 a Fy(JOIN)p 1187 699 V 240 w(Join)19 b(two)g(streams)p 1858 699 V 1911 716 a(join)p 2031 716 23 4 v 27 w(predicate)p 2613 699 4 92 v 2666 671 a(Nested)p 2877 671 23 4 v 27 w(loops)p 3112 699 4 92 v 2616 702 500 4 v 785 790 4 92 v 1187 790 V 1858 790 V 2613 790 V 2666 762 a(Mer)o(ge)p 2863 762 23 4 v 27 w(join)p 3112 790 4 92 v 785 793 2331 4 v 785 884 4 92 v 838 909 a(RET)p 1187 884 V 260 w(Retrieve)f(stored)i (\256le)p 1858 884 V 102 w(relation)f(name)p 2613 884 V 2666 857 a(File)p 2787 857 23 4 v 26 w(scan)p 3112 884 4 92 v 2616 888 500 4 v 785 976 4 92 v 1187 976 V 1858 976 V 2613 976 V 2666 948 a(Index)p 2839 948 23 4 v 28 w(scan)p 3112 976 4 92 v 785 979 2331 4 v 785 1070 4 92 v 1187 1070 V 1240 1043 a(Sort)f(stream)p 1858 1070 V 329 w(tuple)h(order)p 2613 1070 V 430 w(Mer)o(ge)p 2863 1043 23 4 v 27 w(sort)p 3112 1070 4 92 v 785 1083 2331 13 v 300 1236 a FP(T)-6 b(able)23 b(2.1:)31 b(Operators)25 b(and)f(algorithms)i(in)d(a)g(centralized)j(V)-12 b(olcano)25 b(query)g(optimizer)g(and)f(their)g(op-)300 1349 y(erator/algorithm)30 b(ar)n(guments.)42 b(Note)26 b(that)h(Mer)n(ge)p 1958 1349 28 4 v 34 w(sort)g(does)g(not)g(implement)g(any)g(operator)i(and)d (is)300 1462 y(an)e(enforcer)-5 b(.)727 1820 y(T)f(able)22 b(2.1)h(lists)g(some)f(operators)j(and)e(algorithms)h(implementing)h (them)d(together)i(with)727 1989 y(their)29 b(operator/algorithm)k(ar)n (guments.)47 b(Note)28 b(that)h(Mer)n(ge)p 2681 1989 V 34 w(sort)g(does)g(not)f(implement)727 2158 y(any)22 b(particular)h(operator)g(because)g(it)e(is)g(actually)i(an)e(enforcer) -5 b(.)32 b(These)21 b(operators,)j(algo-)727 2328 y(rithms,)g(and)g (enforcers)i(will)d(be)h(used)g(in)g(subsequent)i(examples)f(in)f(this) g(chapter)-5 b(.)300 2729 y FI(Operator)29 b(T)-7 b(r)n(ee.)92 b FP(An)27 b FD(operator)j(tr)m(ee)e FP(is)g(a)g(rooted)h(tree)g(whose) f(non-leaf,)j(or)d FD(interior)p FP(,)j(nodes)e(are)300 2899 y(database)i(operations)i(\(operators,)g(algorithms,)f(or)e (enforcers\))i(and)d(whose)h(leaf)g(nodes)g(are)g(stored)300 3068 y(\256les.)45 b(Operator)30 b(trees)f(\(also)h(called)g FD(expr)m(essions)p FP(\))h(are)e(represented)j(in)c(LISP-like)g (pre\256x)h(notation)300 3237 y(form.)302 3506 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)h FP(1)t(.)162 b(The)23 b(expression,)948 3750 y(\(JOIN)g(?op)p 1333 3750 V 34 w(ar)n(g1)h(\(\(RET)e(?op)p 1934 3750 V 34 w(ar)n(g2)j(\(\)\))f(\(RET)d(?op)p 2619 3750 V 34 w(ar)n(g3)k(\(\)\)\))300 3994 y(denotes)i(a)e(stream)h(that)g (\256rst)f(RET)m(rieves)g(two)g(stored)i(relations,)h(and)d(then)h (JOINs)f(them.)37 b FA(?)p FP(op)p 3412 3994 V 33 w(ar)n(g)r FA(2)300 4164 y FP(and)21 b FA(?)p FP(op)p 589 4164 V 34 w(ar)n(g)q FA(3)g FP(are)f(the)h(operator)i(ar)n(guments)g(of)e(the) g(two)f(RET)-6 b(s)19 b(respectively)-6 b(,)24 b(and)d(are)g(the)g (names)g(of)300 4333 y(the)j(stored)h(\256les)f(to)f(be)h(retrieved.)34 b FA(?)p FP(op)p 1571 4333 V 33 w(ar)n(g)r FA(1)23 b FP(is)h(the)g(operator)i(ar)n(gument)f(of)f(the)g(JOIN)f(operator)j (and)300 4503 y(denotes)f(the)f(join)g(predicate.)2278 b Fw(\003)298 4804 y FI(Access)23 b(Plan.)90 b FP(An)22 b FD(access)h(plan)g FP(is)f(an)g(operator)i(tree)e(in)g(which)g(all)h (interior)g(nodes)h(are)e(algorithms)300 4974 y(or)h(enforcers.)1905 5349 y(13)p eop %%Page: 14 26 14 25 bop 294 391 a FI(Pr)n(operties.)93 b FD(Pr)m(operties)19 b FP(are)f(information)i(associated)h(with)c(each)i(node)f(in)g(an)g (operator)h(tree.)30 b(Each)296 561 y(node)21 b(has)f(a)f(speci\256c)i (value)g(for)f(every)h(property)h(associated)h(with)c(it,)h(and)h(the)f (complete)h(property)h(set)300 730 y(speci\256es)k(a)e(node)h(uniquely) -6 b(.)37 b(In)24 b(V)-12 b(olcano,)26 b(in)e(addition)j(to)e(the)f (operator/algorithm)30 b(ar)n(guments)d(that)300 899 y(we)c(have)h(seen)g(above,)h(there)f(are)g(four)g(sets)g(of)g (properties:)436 1144 y FC(\017)46 b FI(Logical)34 b(Pr)n(operties.)59 b FD(Logical)33 b(pr)m(operties)i FP(are)d(those)i(properties)h(of)d(a) g(node)i(that)e(can)h(be)527 1313 y(uniquely)24 b(determined)g FD(prior)f FP(to)f(optimization.)33 b(Logical)22 b(properties)i(of)e (an)g(abstract)h(operator)527 1482 y(are)f(computed)h(bottom-up,)g (i.e.,)e(from)g(the)g(leaves)i(of)e(an)g(operator)i(tree.)31 b(The)20 b(logical)j(proper)n(-)527 1652 y(ties)g(of)e(an)h(algorithm)i (are)e(the)g(same)g(as)g(the)g(logical)h(properties)i(of)d(the)g (abstract)i(operator)g(that)527 1821 y(it)d(implements,)h(and)f(the)g (logical)h(properties)i(of)c(an)h(enforcer)i(are)e(the)g(same)f(as)h (those)h(of)e(its)h(in-)527 1990 y(put.)30 b(For)19 b(instance,)k(the)d (list)g(of)g(attributes)i(of)e(a)f(stored)i(\256le)e(or)h(a)f(stream)i (\(without)g(projections\))527 2160 y(can)j(be)g(determined)h(from)f (database)i(catalogs)f(before)g(optimization.)436 2404 y FC(\017)46 b FI(System)27 b(Pr)n(operties.)41 b FD(System)27 b(pr)m(operties)i FP(are)d(a)g(special)i(class)f(of)g(logical)h (properties,)h(con-)527 2573 y(sisting)f(of)e(the)h(two)f(properties)j (\252cardinality\272)g(and)e(\252record)p 2505 2573 28 4 v 35 w(width\272.)40 b(For)26 b(all)g(practical)i(pur)n(-)527 2743 y(poses,)23 b(these)g(two)e(properties)k(are)d(exactly)h(like)g (logical)g(properties.)33 b(The)21 b(rationale)j(for)e(treat-)527 2912 y(ing)i(them)g(dif)n(ferently)j(is)c(not)h(clearly)h(de\256ned)f (in)g(the)g(V)-12 b(olcano)25 b(literature.)436 3156 y FC(\017)46 b FI(Physical)22 b(Pr)n(operties.)32 b FD(Physical)23 b(pr)m(operties)h FP(are)e(properties)i(associated)h(with)c(the)h(data) h(pro-)527 3325 y(duced)d(by)f(an)f(algorithm)j(or)d(enforcer)-5 b(.)31 b(Physical)20 b(properties)h(are)e(propagated)j(bottom-up,)f (i.e.,)527 3495 y(physical)e(properties)h(of)d(a)g(node)g(are)h (computed)g(as)f(a)g(function)i(of)e(the)g(properties)j(\(logical,)g (sys-)527 3664 y(tem,)j(and)h(physical\))i(of)e(its)f(inputs.)436 3908 y FC(\017)46 b FI(Cost.)34 b FP(This)25 b(property)i(represents)g (the)e(cost)h(of)e(a)g(node;)j(it)d(has)h(a)g(meaningful)i(value)e (only)h(for)527 4078 y(algorithm)f(and)e(enforcer)h(nodes.)32 b(Cost)22 b(is)h(not)g(a)f(logical)i(or)f(system)g(property)i(since)e (its)g(value)527 4247 y(cannot)i(be)f(determined)i(solely)f(from)e (abstract)i(operators.)2435 4214 y Fv(1)297 4491 y FP(The)20 b(DBI)f(has)i(to)f(specify)i(the)f(list)g(of)f(properties,)k(and)d(the) g(type)g(\(logical,)i(system,)e(physical,)i(or)e(cost\))300 4660 y(of)27 b(each.)40 b(Generally)29 b(speaking,)g(if)d(the)h (property)i(value)f(of)e FD(each)i FP(node)f(in)g(an)f(operator)j(tree) e(can)g(be)p 300 4741 1320 4 v 400 4795 a Fu(1)434 4827 y Fy(In)15 b(many)g(real-world)f(query)h(optimizers)f(\(e.g.,)h(System) f(R)f([46])i(and)g(R)2304 4795 y Ft(\003)2354 4827 y Fy([45]\),)f(the)h(cost)f(of)g(a)g(node)i(is)d(a)i(function)f(of)h(the) 300 4918 y(costs)i(of)f(its)g(inputs.)24 b(Thus,)17 b(in)f(V)-10 b(olcano')l(s)17 b(terminology)-5 b(,)18 b(cost)f(should)g(really)f(be) h(a)f(physical)h(property)-5 b(.)25 b(However)m(,)17 b(V)-10 b(olcano)300 5010 y(treats)19 b(cost)g(as)f(a)h(fourth)h (category)g(of)e(property)-5 b(.)1905 5349 y FP(14)p eop %%Page: 15 27 15 26 bop 671 412 2558 13 v 671 503 4 92 v 724 476 a Fz(Pr)o(operty)p 1162 503 V 206 w(T)-6 b(ype)p 1518 503 V 200 w(Description)p 3225 503 V 671 516 2558 13 v 671 607 4 92 v 724 580 a Fy(tuple)p 877 580 23 4 v 28 w(order)p 1162 607 4 92 v 157 w(Physical)p 1518 607 V 103 w(tuple)20 b(order)f(of)g(resulting)g(stream,)g(DONT)p 2726 580 23 4 v 26 w(CARE)f(if)g(none)p 3225 607 4 92 v 671 611 2558 4 v 671 702 4 92 v 724 674 a(cardinality)p 1162 702 V 172 w(System)p 1518 702 V 136 w(number)i(of)f(tuples)h(of)e (resulting)i(stream)p 3225 702 V 671 705 2558 4 v 671 796 4 92 v 724 769 a(record)p 918 769 23 4 v 28 w(width)p 1162 796 4 92 v 103 w(System)p 1518 796 V 136 w(size)f(of)g(individual) h(tuple)f(in)g(stream)p 3225 796 V 671 800 2558 4 v 671 891 4 92 v 724 864 a(attributes)p 1162 891 V 213 w(Logical)p 1518 891 V 128 w(list)g(of)f(attributes)p 3225 891 V 671 894 2558 4 v 671 986 4 92 v 724 958 a(cost)p 1162 986 V 371 w(Cost)p 1518 986 V 219 w(estimated)i(cost)f(of)g(algorithm)p 3225 986 V 671 998 2558 13 v 853 1151 a FP(T)-6 b(able)24 b(2.2:)31 b(Properties)25 b(of)f(nodes)g(in)g(an)f(operator)j(tree)e (in)f(V)-12 b(olcano)300 1528 y(determined)28 b(before)f(any)f(rules)h (are)f(applied)h(to)f(it,)g(it)f(is)h(a)f(logical)i(property)h(\(or)e (system)h(property)g(if)298 1697 y(it)22 b(is)f(one)i(of)e(two)h (special)h(properties\),)i(and)d(if)g(a)f(property)j(value)f(can)f(be)g (determined)i(only)f(when)f(the)300 1867 y(node)27 b(is)f(an)h (algorithm)h(or)e(an)g(enforcer)l(,)j(it)d(is)g(a)g(physical)j (property)-6 b(.)41 b(If)26 b(the)h(property)h(computes)g(the)300 2036 y(relative)d(merit)e(of)h(an)f(access)i(plan,)f(then)g(the)g (property)h(is)e(the)h(cost.)31 b(Furthermore,)25 b(logical,)g(system,) 300 2205 y(and)j(physical)i(properties)g(are)e(computed)h(bottom-up;)j (the)27 b(dif)n(ference)k(is)c(that)h(logical)h(and)f(system)298 2375 y(properties)c(are)e(determined)h(prior)g(to)e(optimization,)j (whereas)f(physical)g(properties)i(are)c(determined)300 2544 y(after)j(a)f(tree)h(\(or)g(subtree\))i(has)e(been)g(optimized.) 583 2713 y(It)g(is)g(worth)g(noting)h(that)g(some)f(properties)i (\(such)f(as)f(attributes)i(of)e(a)f(stream\))i(can)f(be)g(either)292 2883 y(physical)19 b(or)d(logical)i(depending)h(on)e(the)g(semantics)h (of)e(the)h(operators)i(in)d(the)g(database)j(schema.)29 b(Thus,)299 3052 y(altering)c(the)f(semantics)h(of)e(an)g(optimizer)h (requires)i(the)d(DBI)f(to)h(re-examine)i(the)e(partition)j(of)d(prop-) 300 3222 y(erties.)32 b(This,)23 b(as)g(it)h(turns)g(out,)g(is)f (problematic)j(for)e(V)-12 b(olcano)25 b(optimizer)g(designers.)576 3391 y(T)-6 b(able)16 b(2.2)g(lists)h(the)g(dif)n(ferent)h(properties)h (and)e(their)g(types)h(that)f(we)e(will)h(use)h(in)f(our)h(examples.) 292 3560 y(The)f(only)h(logical)h(property)g(is)e(the)h(list)g(of)f (\252attributes\272,)21 b(and)16 b(the)h(system)g(properties)i(are)d (\252cardinality\272)300 3730 y(and)24 b(\252record)p 729 3730 28 4 v 35 w(width\272.)31 b(The)23 b(single)i(physical)g (property)h(is)d(the)g(\252tuple)p 2560 3730 V 35 w(order)s(\272)i(of)f (the)f(output)i(stream.)300 3899 y(The)e(cost)h(property)i(will)d(be)h (called)h(\252cost\272.)292 4201 y FI(Constraints.)92 b FD(Constraints)19 b FP(are)e(requirements)i(on)e(physical)i(property) f(values)g(that)f(are)g(imposed)h(on)295 4370 y(an)h(operator)h(tree.) 30 b(An)18 b(access)i(plan)g(for)f(an)g(operator)h(tree)g(is)e (acceptable)k(if)c(and)i(only)f(if)g(it)f(satis\256es)i(the)296 4539 y(constraints)j(that)e(are)g(imposed)g(upon)g(it.)30 b(There)20 b(are)g(two)g(types)h(of)f(constraints)j(in)d(V)-12 b(olcano.)32 b(The)19 b(\256rst)300 4709 y(type)25 b(is)e(represented)k (by)e(a)e FD(needed)j(pr)m(operty)f(vector)p FP(.)34 b(This)23 b(speci\256es)j(the)e(list)g(of)g(physical)i(property)292 4878 y(values)18 b(that)f(an)f(access)i(plan)f FD(must)h FP(have)f(to)f(be)h(an)f(acceptable)j(plan.)30 b(The)15 b(second)k(type)e(of)f(constraint)j(is)297 5048 y(represented)25 b(by)c(an)g FD(excluded)i(pr)m(operty)g(vector)g FP(and)f(it)e (speci\256es)j(a)d(list)i(of)f(physical)i(property)g(values)1905 5349 y(15)p eop %%Page: 16 28 16 27 bop 297 391 a FP(that)22 b(a)f(plan)h FD(must)f(not)h FP(have)g(to)f(be)g(acceptable.)33 b(Each)21 b(node)h(in)f(an)h (operator)h(tree)e(may)g(have)h(dif)n(ferent)300 561 y(constraints)30 b(on)d(it;)h(however)l(,)h(it)d(is)h(the)g (constraints)j(on)c(the)h(root)h(of)e(an)h(operator)i(tree)e(that)g (must)g(be)300 730 y(satis\256ed)e(for)e(an)h(access)h(plan)f(to)g(be)f (acceptable.)302 999 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(2)t(.)162 b(Consider)25 b(the)f(expression,)948 1243 y(\(JOIN)f(?op)p 1333 1243 28 4 v 34 w(ar)n(g1)h(\(\(RET)e(?op)p 1934 1243 V 34 w(ar)n(g2)j(\(\)\))f(\(RET)d(?op)p 2619 1243 V 34 w(ar)n(g3)k(\(\)\)\))300 1487 y(to)19 b(be)f(optimized.)31 b(If)19 b(\252need)p 1201 1487 V 34 w(pv\272)h(denotes)g(the)f(needed)h (property)h(vector)l(,)g(and)f(\252excl)p 3015 1487 V 34 w(pv\272)f(denotes)i(the)300 1657 y(excluded)27 b(property)f(vector) l(,)g(then)f(we)e(can)i(specify)h(the)f(constraints)i(by)d(setting)i (appropriate)i(values)300 1826 y(for)c(the)g(physical)h(properties)i (in)c(need)p 1543 1826 V 34 w(pv)h(and)g(excl)p 1995 1826 V 34 w(pv)-6 b(.)31 b(Thus,)23 b(setting)300 2070 y(need)p 475 2070 V 34 w(pv)-6 b(.tuple)p 796 2070 V 36 w(order)24 b(=)f(DONT)p 1374 2070 V 31 w(CARE)300 2239 y(excl)p 455 2239 V 34 w(pv)-6 b(.tuple)p 776 2239 V 35 w(order)25 b(=)e FH(b)300 2483 y FP(speci\256es)18 b(that)g(any)f(access)h(plan)g(that)f(implements)h(the)g(JOIN)e (expression)j(above)g(can)e(return)h(tuples)g(in)300 2653 y(any)f(order)h(\(DONT)p 944 2653 V 32 w(CARE\),)d(as)h(long)i(as) f(they)h(are)f(not)h(in)e FH(b)h FP(order)h(\()p FH(b)e FP(has)i(to)e(be)h(an)g(attribute)j(of)d(at)f(least)300 2822 y(one)25 b(of)g(the)g(two)g(relations)i(RET)m(rieved\).)35 b(An)24 b(access)i(plan)g(that)f(does)h(not)f(satisfy)h(these)g (constraints)300 2992 y(would)e(not)g(be)f(a)h(valid)g(implementation)j (of)c(the)h(operator)h(tree.)1155 b Fw(\003)583 3227 y FP(V)-12 b(olcano)27 b(uses)f(both)g(needed)g(property)h(vectors)g (and)f(excluded)h(property)g(vectors)g(to)e(select)300 3397 y(a)i(plan.)42 b(In)27 b(the)g(above)i(example,)g(suppose)g(there) f(exists)g(an)f(access)i(plan)e(of)h(the)f(given)h(tree)g(with)f(a)300 3566 y(tuple)p 485 3566 V 35 w(order)f(of)g FH(b)p FP(.)36 b(If)25 b(we)g(only)i(looked)g(at)e(the)h(needed)i(property)f(vector)l (,)h(we)d(would)h(be)g(inclined)h(to)300 3735 y(accept)g(this)g(plan,)g (since)g(the)f(needed)i(property)g(vector)g(speci\256es)f(that)g(the)f (plan)h(return)g(a)f(stream)g(in)300 3905 y(DONT)p 559 3905 V 31 w(CARE)c(order)j(\(i.e.,)e(any)i(order\).)33 b(However)l(,)25 b(the)f(excluded)j(property)f(vector)f(speci\256es)h (that)300 4074 y(this)e(plan)g(is)g(not)g(acceptable.)300 4441 y FO(2.3)119 b(V)-11 b(olcano)30 b(Optimization)h(Paradigm)296 4704 y FP(V)-12 b(olcano)22 b(employs)g(a)d(top-down)j(query)g (optimization)h(paradigm)e(that)g(rewrites)g(operator)i(trees)e(start-) 300 4873 y(ing)26 b(from)f(the)g(root.)36 b(Parents)26 b(are)g(considered)i(before)e(children)i(for)d(optimization.)39 b(Informally)-6 b(,)27 b(ab-)300 5043 y(stract)g(operators)h(are)e (transformed)i(into)e(algorithms)i(top-down)f(until)g(an)e(access)i (plan)g(is)e(obtained.)1905 5349 y(16)p eop %%Page: 17 29 17 28 bop 371 403 3142 4 v 371 1620 4 1218 v 425 691 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.3 true 3.8 neg 6.71495 neg 89.15826 32.61813 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -169 x FH(E)5 b(;)15 b(E)609 489 y FB(0)634 522 y FP(:)30 b(Expression)425 691 y FH(P)483 705 y Fs(i)512 691 y FH(;)15 b(P)623 658 y FB(0)610 715 y Fs(i)646 691 y FP(:)31 b(Property)1517 853 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -22.19318 17.07164 -22.19318 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -37.55754 17.07164 -37.55754 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -52.92218 17.07164 -52.92218 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -68.28656 17.07164 -68.28656 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -68.28656 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -52.92218 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1381 884 a FH(E)1609 877 y(P)1667 891 y Fv(1)1609 1062 y FH(P)1667 1076 y Fv(2)1609 1189 y FH(P)1667 1203 y Fv(3)1609 1317 y FH(P)1667 1331 y Fv(4)1609 1444 y FH(P)1667 1458 y Fv(5)1885 866 y(=)-12 b FB(\))1517 853 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -68.28656 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -52.92218 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -37.55754 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -22.19318 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2220 888 a FH(E)2292 855 y FB(0)2460 876 y FH(P)2531 843 y FB(0)2518 900 y Fv(1)2721 874 y FP(Operator)25 b(Ar)n(gument)2460 1061 y FH(P)2531 1028 y FB(0)2518 1084 y Fv(2)2721 1058 y FP(Logical)g(Property)2460 1188 y FH(P)2531 1155 y FB(0)2518 1211 y Fv(3)2721 1186 y FP(System)f(Property)2460 1316 y FH(P)2531 1283 y FB(0)2518 1339 y Fv(4)2721 1313 y FP(Physical)h(Property)2460 1443 y FH(P)2531 1410 y FB(0)2518 1466 y Fv(5)2721 1450 y FP(Cost)p 3509 1620 V 371 1623 3142 4 v 3511 1640 19 1225 v 388 1640 3142 19 v 300 1836 a(Figure)d(2.2:)31 b(General)23 b(form)f(of)f(a)h(V)-12 b(olcano)23 b(rule.)31 b(Single)22 b(arrows)h(denote)g(one)g(or)f(more)g(DBI-de\256ned)300 1949 y(support)k(functions.)33 b(The)24 b(properties)i(that)e(are)g (translated)j(by)c(the)h(rule)h(or)e(by)h(support)i(functions)g(are)300 2062 y(listed)f(on)e(the)h(right.)292 2438 y(The)16 b(search)i(engine)g (provided)g(by)f(V)-12 b(olcano)18 b(uses)f(dynamic)g(programming)i(to) d(prune)i(the)e(search)i(space)300 2607 y(by)24 b(discarding)i (operator)g(trees)e(that)g(are)g(determined)i(to)d(lead)h(to)g(a)f (sub-optimal)j(access)f(plan.)583 2777 y(Before)j(the)f(start)g(of)g (optimization,)j(certain)f(properties)g(of)e(the)g(original)i(operator) g(tree)e(are)294 2946 y(initialized.)k(As)17 b(described)k(in)c (Section)i(2.2,)g(logical)g(and)f(system)h(properties)h(of)e(nodes)h (of)f(an)f(operator)300 3116 y(tree)25 b(can)f(be)h(determined)h(prior) f(to)f(optimization.)36 b(The)24 b(initialization)k(of)c(these)h (properties)i(for)d(each)300 3285 y(subtree)h(is)f(done)g(by)g (DBI-de\256ned)g(functions;)i(these)f(are)f(de\256ned)g(in)f(Section)i (2.7.)300 3651 y FO(2.4)119 b(Rules)30 b(in)h(V)-11 b(olcano)578 3914 y FP(Rules)20 b(in)e(V)-12 b(olcano)21 b(correspond)h(to)d (rewrites)h(between)g(pairs)g(of)e(expressions,)23 b(or)c(between)h(an) 299 4084 y(expression)26 b(and)d(an)g(access)i(plan.)31 b(Figure)23 b(2.2)g(shows)g(the)g(general)i(format)e(of)g(a)g(V)-12 b(olcano)24 b(rule.)31 b(This)293 4253 y(general)20 b(rule)e(results)h (in)e(two)g(types)i(of)e(transformations)22 b(\(or)17 b FD(r)m(ewrite)h(rules)p FP(\))h(in)f(V)-12 b(olcano:)30 b(transforma-)299 4423 y(tion)24 b(rules)g(and)f(implementation)j (rules.)32 b(Each)23 b(rule)g(transforms)i(an)e(expression)j(into)e (another)h(based)300 4592 y(on)31 b(additional)i(conditions;)k(the)31 b(transformation)j(also)d(triggers)h(execution)i(of)c(other)i (DBI-de\256ned)297 4761 y(functions)23 b(that)f(results)g(in)f(a)f (mapping)i(of)f(properties)i(between)f(expressions.)33 b(This)21 b(is)f(shown)i(clearly)296 4931 y(in)f(Figure)f(2.2,)h(where) f(the)h(single)g(arrows)g(represent)i(functions)g(executed)f(as)e(a)g (result)h(of)g(application)300 5100 y(of)28 b(a)g(V)-12 b(olcano)29 b(rule.)45 b(T)m(ransformation)31 b(and)d(implementation)j (rules)e(are)f(de\256ned)h(precisely)h(in)e(Sec-)1905 5349 y(17)p eop %%Page: 18 30 18 29 bop 312 303 3260 4 v 312 1056 4 753 v 386 383 a Fv(\()p Fs(E)23 b FF(?op)p 587 383 20 4 v 25 w(ar)o(g1)d Fv(\(?1)13 b Fs(:)e(:)h(:)o Fv(?)p Fs(n)p Fv(\)\))21 b FB(!)e Fv(\()p Fs(E)1258 356 y Ft(0)1300 383 y FF(?op)p 1399 383 V 25 w(ar)o(g2)h Fv(\(?1)13 b Fs(:)f(:)f(:)p Fv(?)p Fs(n)p Fv(\)\))1516 b FF(\(2.1\))386 462 y(\045cond)p 573 462 V 25 w(code)386 541 y FB(ff)601 620 y FF(test)386 699 y FB(gg)386 778 y FF(\045appl)p 558 778 V 25 w(code)386 857 y FB(ff)601 936 y FF(post-test)19 b(statements)386 1014 y FB(gg)p 3568 1056 4 753 v 312 1059 3260 4 v 3570 1076 19 760 v 328 1076 3260 19 v 844 1272 a FP(Figure)24 b(2.3:)31 b(General)24 b(form)g(of)f(a)g(transformation)k(rule)e(in)e (V)-12 b(olcano)296 1648 y(tions)22 b(2.5)e(and)g(2.6)g(and)h(are)f (illustrated)j(with)d(examples.)31 b(The)20 b(examples)i(are)e(chosen)i (from)e(rules)h(that)297 1818 y(would)g(be)g(used)h(in)e(a)g (centralized)k(relational)g(query)d(optimizer;)j(the)d(operators,)j (algorithms,)f(and)e(en-)297 1987 y(forcers)i(are)e(subsets)i(of)e (those)h(in)f(T)-6 b(able)21 b(2.1.)30 b(DBI-de\256ned)21 b(functions)j(are)d(described)j(in)d(more)g(detail)300 2157 y(in)i(Section)i(2.7.)300 2523 y FO(2.5)119 b(T)-9 b(ransformation)29 b(Rules)582 2786 y FD(T)-5 b(ransformation)25 b(rules)p FP(,)e(or)e(trans)p 1671 2786 28 4 v 35 w(rules,)i(in)e(V)-12 b(olcano)24 b(de\256ne)e(mappings)i(from)e(one)g(operator)300 2956 y(tree)h(to)h(another)-5 b(.)32 b(Let)23 b FH(E)28 b FP(and)23 b FH(E)1336 2923 y FB(0)1383 2956 y FP(be)g(expressions)j (that)e(involve)i(only)e(abstract)h(operators.)33 b(Equation)293 3125 y(\(2.1\))17 b(\(shown)g(in)g(Figure)g(2.3\))g(shows)g(the)h (general)g(form)f(of)f(a)h(trans)p 2441 3125 V 34 w(rule)h(in)e(V)-12 b(olcano.)30 b(The)17 b(expression)300 3294 y FH(E)30 b FP(on)c(the)h(left)f(side)g(is)g(transformed)i(into)f(the)f (expression)j FH(E)2306 3261 y FB(0)2355 3294 y FP(on)c(the)i(right)f (side.)39 b(The)25 b(actions)j(of)e(a)300 3464 y(trans)p 480 3464 V 34 w(rule)32 b(de\256ne)f(equivalences)j(between)e(the)f (operator)i(ar)n(guments)g(of)d(the)h(input)h(expression)i FH(E)296 3633 y FP(with)20 b(the)g(operator)j(ar)n(guments)f(of)e(the)g (output)i(expression)h FH(E)2283 3600 y FB(0)2306 3633 y FP(.)29 b(A)19 b(test)i(is)f(needed)h(to)f(determine)i(if)e(the)300 3802 y(transformation)27 b(is)c(indeed)i(applicable.)583 3972 y(The)g(\256rst)g(part)g(of)g(the)h(actions)h(associated)h(with)c (a)h(trans)p 2426 3972 V 35 w(rule)g(is)g(the)h(test,)f(called)i FD(condition)292 4141 y(code)17 b FP(in)g(V)-12 b(olcano.)29 b(This)17 b(is)f(any)h(arbitrary)h(section)g(of)f(C)e(code)2252 4108 y Fv(2)2308 4141 y FP(that)i(tests)h(whether)f(the)g (transformation)293 4311 y(rule)h(can)g(indeed)h(be)f(applied)h(to)e (the)h(expression)i FH(E)5 b FP(.)29 b(The)17 b(test)h(can)g(reference) h(the)f(operator)i(ar)n(guments)298 4480 y(of)i(the)g(expressions)k(on) c(the)g(left)g(side)h(and/or)g(the)g(logical)g(or)f(system)h (properties)h(of)e(any)h(of)f(the)g(input)300 4649 y(streams.)32 b(If)23 b(the)h(rule)g(does)g(not)g(apply)-6 b(,)25 b(then)f(the)g (expression)i FH(E)i FP(is)c(left)g(unchanged.)583 4819 y(If)j(the)g(trans)p 987 4819 V 35 w(rule)g(does)h(apply)g(to)f FH(E)5 b FP(,)27 b(then)h(post-test)h(actions,)g(called)f FD(application)j(code)c FP(in)p 300 4900 1320 4 v 400 4954 a Fu(2)434 4985 y Fy(The)16 b(condition)h(code)f(doesn')o(t)g (return)g(a)f(boolean)i(value.)25 b(It)15 b(succeeds)h(if)f(a)h(REJECT) e(statement)i(is)f(not)h(processed,)h(and)300 5077 y(fails)h (otherwise.)1905 5349 y FP(18)p eop %%Page: 19 31 19 30 bop 312 403 3260 4 v 312 1229 4 827 v 386 478 a Fv(\()p FF(JOIN)19 b(?op)p 675 478 20 4 v 25 w(ar)o(g5)i Fv(\(\()p FF(JOIN)f(?op)p 1150 478 V 25 w(ar)o(g4)g Fv(\(?1)h(?2\)\))g (?3\)\))g FB(!)e Fv(\()p FF(JOIN)h(?op)p 2089 478 V 25 w(ar)o(g7)g Fv(\(?1)h(\()p FF(JOIN)f(?op)p 2652 478 V 25 w(ar)o(g6)g Fv(\(?2)h(?3\)\)\)\))292 b FF(\(2.2\))386 557 y(\045cond)p 573 557 V 25 w(code)386 635 y FB(ff)601 714 y FF(?op)p 700 714 V 25 w(ar)o(g6)21 b Fv(=)e FF(predicate)p 1176 714 V 27 w(intersect)h Fv(\(?2)p Fs(;)13 b FF(?op)p 1668 714 V 24 w(ar)o(g5)q Fv(\))k(;)601 793 y FF(if)h Fv(\()p FF(empty)g Fv(\()p FF(?op)p 995 793 V 25 w(ar)o(g6)q Fv(\)\))f FF(REJECT)f Fv(;)386 872 y FB(gg)386 951 y FF(\045appl)p 558 951 V 25 w(code)386 1030 y FB(ff)601 1109 y FF(?op)p 700 1109 V 25 w(ar)o(g7)21 b Fv(=)e FF(?op)p 1031 1109 V 25 w(ar)o(g4)e Fv(;)386 1188 y FB(gg)p 3568 1229 4 827 v 312 1232 3260 4 v 3570 1249 19 833 v 328 1249 3260 19 v 1060 1445 a FP(Figure)24 b(2.4:)31 b(Join)24 b(associativity)k(transformation)f(rule)300 1822 y(V)-12 b(olcano,)27 b(are)e(executed.)38 b(This)24 b(is)h(an)g(arbitrary)j (piece)e(of)f(C)f(code)i(that)f(sets)h(the)f(operator)i(ar)n(gument)300 1991 y(of)d(the)h(expression)j FH(E)1019 1958 y FB(0)1066 1991 y FP(on)c(the)h(right)g(side.)35 b(The)24 b(application)j(code)f (is)e(executed)j(immediately)f(if)e(the)300 2160 y(condition)i(code)f (is)e(satis\256ed.)580 2330 y(As)d(mentioned)j(in)e(Section)g(2.3,)g(a) f(trans)p 1885 2330 28 4 v 35 w(rule)h(in)g(V)-12 b(olcano)22 b(triggers)h(two)d(DBI-de\256ned)h(func-)299 2499 y(tions)j(for)f (determining)j(the)d(logical)h(and)g(system)f(properties)j(of)d(any)g (new)f(expressions)27 b(obtained)e(by)294 2668 y(application)c(of)d (the)h(rule.)29 b(Since)18 b(a)g(trans)p 1586 2668 V 34 w(rule)h(only)g(transforms)h(logical)g(expressions,)i(physical)e (prop-)300 2838 y(erties)25 b(and)f(cost)g(\(as)g(shown)g(in)f(Figure)h (2.2\))g(are)g(not)f(transformed)j(in)e(a)f(trans)p 2823 2838 V 34 w(rule.)302 3107 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(3)t(.)164 b(The)25 b(associativity)k(of)c(JOINs)g(is)g(expressed)j (by)d(trans)p 2712 3107 V 35 w(rule)h(\(2.2\))f(in)h(Figure)g(2.4.)300 3276 y(The)c(condition)j(code)e(of)f(trans)p 1298 3276 V 35 w(rule)g(\(2.2\))h(determines)i(the)d(operator)j(ar)n(gument)f (\(i.e.,)e(the)g(join)h(pred-)300 3445 y(icate\))29 b(of)f(the)h(inner) g(join)g(on)f(the)h(right)g(side.)46 b(If)28 b(it)g(is)g(empty)-6 b(,)29 b(implying)h(a)e(cross-product,)33 b(the)c(rule)300 3615 y(is)e(rejected,)i(and)f(the)f(expression)j(on)d(the)h(left)f (side)h(remains)g(unchanged.)44 b(If,)27 b(however)l(,)j(the)d(test)g (is)300 3784 y(successful,)h(the)d(application)j(code)e(assigns)h(the)e (operator)i(ar)n(gument)g(\(join)f(predicate\))h(of)e(the)g(outer)300 3954 y(join)e(on)f(the)g(right)h(side.)31 b(Logical)23 b(and)g(system)g(properties)i(of)d(the)g(new)g(subexpressions)27 b(on)22 b(the)g(right)300 4123 y(side)i(of)g(Equation)h(2.2)e(are)h (computed)h(by)f(DBI-de\256ned)g(functions,)i(externally)g(to)d(the)h (rule.)208 b Fw(\003)300 4490 y FO(2.6)119 b(Implementation)30 b(Rules)580 4753 y FD(Implementation)24 b(rules)p FP(,)e(or)e(impl)p 1662 4753 V 33 w(rules,)i(in)f(V)-12 b(olcano)22 b(specify)g (implementations)i(of)d(abstract)300 4922 y(operators.)38 b(Let)25 b FH(O)i FP(be)f(an)f(operator)i(and)f FH(A)f FP(be)g(an)g(algorithm)i(that)f(implements)h FH(O)s FP(.)35 b(Equation)27 b(\(2.3\))300 5091 y(\(shown)f(in)f(Figure)g(2.5\))g (shows)g(the)h(general)g(form)f(of)g(an)g(impl)p 2376 5091 V 33 w(rule)h(in)e(V)-12 b(olcano.)37 b(A)23 b(test)j(is)f(needed) 1905 5349 y(19)p eop %%Page: 20 32 20 31 bop 312 303 3260 4 v 312 1051 4 748 v 386 378 a Fv(\()p Fs(E)23 b FF(?op)p 587 378 20 4 v 25 w(ar)o(g1)d Fv(\(?1)13 b Fs(:)e(:)h(:)o Fv(?)p Fs(n)p Fv(\)\))21 b FB(!)e Fv(\()p Fs(A)h FF(?al)p 1355 378 V 26 w(ar)o(g1)g Fv(\(?1)13 b Fs(:)e(:)g(:)p Fv(?)p Fs(n)p Fv(\)\))1560 b FF(\(2.3\))386 457 y(\045cond)p 573 457 V 25 w(code)386 536 y FB(ff)601 615 y FF(test)386 694 y FB(gg)386 772 y FF(\045appl)p 558 772 V 25 w(code)386 851 y FB(ff)601 930 y FF(post-test)19 b(statements)386 1009 y FB(gg)p 3568 1051 4 748 v 312 1054 3260 4 v 3570 1070 19 754 v 328 1070 3260 19 v 803 1266 a FP(Figure)24 b(2.5:)32 b(General)24 b(form)f(of)h(an)f(implementation)k(rule)d(in)f(V)-12 b(olcano)300 1643 y(to)23 b(determine)j(if)d(the)h(implementation)i (rule)e(is)g(indeed)h(applicable.)579 1812 y(The)19 b(actions)j (associated)g(with)d(an)h(impl)p 1864 1812 28 4 v 33 w(rule)g(are)g(speci\256ed)h(in)f(two)f(parts,)i(as)e(in)h(a)f(trans)p 3411 1812 V 34 w(rule.)293 1982 y(The)d(\256rst)g(part,)j(the)e(test,)h (called)h FD(condition)g(code)p FP(,)g(is)d(used)i(to)f(test)g(if)g (the)g(rule)g(applies)i(to)d(the)i(expression)292 2151 y(on)e(the)h(left)g(side.)29 b(It)16 b(is)g(an)g(arbitrary)j(piece)e (of)f(C)f(code)i(that)g(references)i(the)e(operator)h(ar)n(guments)h (and/or)300 2320 y(any)30 b(logical)h(or)e(system)h(properties)i(of)d (subexpressions)34 b(on)29 b(the)h(left)g(side.)48 b(As)29 b(in)g(trans)p 3230 2320 V 35 w(rules,)i(the)298 2490 y(REJECT)19 b(keyword)k(is)f(used)g(to)g(reject)g(the)g(rule.)31 b(However)l(,)23 b(unlike)g(trans)p 2692 2490 V 34 w(rules,)g(impl)p 3113 2490 V 33 w(rules)g(have)f(to)297 2659 y(satisfy)g(another)g(test) f FD(in)f(addition)j FP(to)d(the)h(one)g(in)f(the)h(cond)p 2178 2659 V 34 w(code)g(section;)j(this)d(extra)g(test)g(is)f (speci\256ed)300 2829 y(by)k(a)f(DBI-written)h(support)h(function)h (\(called)f(do)p 1930 2829 V 34 w(any)p 2094 2829 V 34 w(good\))g(described)h(in)d(Section)i(2.7.)583 2998 y(The)h(second)h (part)g(of)f(the)g(actions,)i(the)e(post-test)i(statements,)g(called)f FD(application)i(code)p FP(,)e(is)300 3167 y(executed)f(immediately)g (if)d(the)i(condition)h(code)f(is)e(satis\256ed.)33 b(The)24 b(application)j(code)e(sets)f(the)g(algo-)300 3337 y(rithm)g(ar)n (gument)h(of)f(the)f(algorithm)j(on)d(the)h(right)h(side.)583 3506 y(The)30 b(cost)g(of)f(using)i(algorithm)g FH(A)e FP(for)h(the)g(operator)i FH(O)f FP(in)f(\(2.3\))g(is)f(computed)i(by)f (a)f(DBI-)300 3675 y(de\256ned)d(function)g(for)f(algorithm)i FH(A)d FP(\(this)h(function)i(is)e(described)i(in)e(Section)g(2.7\).)35 b(The)24 b(cost)i(of)e(an)299 3845 y(algorithm)h(node)e(in)g(V)-12 b(olcano)24 b(is)f(implicitly)i(assumed)f(to)e(be)h(the)g(sum)g(of)g (costs)g(of)g(all)g(its)g(inputs)h(plus)300 4014 y(an)j(additional)j (term)c(that)i(is)f(a)f(function)j FD(only)f FP(of)f(the)g(logical)i (and)e(system)h(properties)i(of)c FH(A)h FP(and)g(its)300 4183 y(inputs.)302 4452 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)j FP(4)t(.)172 b(Impl)p 1131 4452 V 34 w(rule)34 b(\(2.4\))g(in)g(Figure) g(2.6)g(shows)g(an)g(implementation)i(rule.)62 b(It)34 b(selects)300 4622 y(Nested)p 556 4622 V 34 w(loops)28 b(as)e(an)h(implementation)i(for)d(the)h(JOIN)f(operator)-5 b(.)41 b(The)26 b(condition)j(code)e(of)g(this)g(rule)300 4791 y(is)i(empty)-6 b(,)31 b(implying)g(that)f(the)f(rule)h(is)f (applied)i(immediately)-6 b(.)50 b(The)28 b(application)33 b(code)d(sets)g(the)f(al-)300 4961 y(gorithm)g(ar)n(gument)g(\(i.e.,)f (the)g(join)g(predicate\))j(of)c(the)h(Nested)p 2368 4961 V 34 w(loops)h(node)g(to)e(be)h(the)g(same)f(as)h(the)1905 5349 y(20)p eop %%Page: 21 33 21 32 bop 312 403 3260 4 v 312 1150 4 748 v 386 478 a Fv(\()p FF(JOIN)19 b(?op)p 675 478 20 4 v 25 w(ar)o(g1)i Fv(\(?1)f(?2\)\))h FB(!)f Fv(\()p FF(Nested)p 1396 478 V 25 w(loops)h(?al)p 1661 478 V 25 w(ar)o(g1)g Fv(\(?1)f(?2\)\))1337 b FF(\(2.4\))386 557 y(\045cond)p 573 557 V 25 w(code)386 635 y FB(ff)386 793 y(gg)386 872 y FF(\045appl)p 558 872 V 25 w(code)386 951 y FB(ff)601 1030 y FF(?al)p 681 1030 V 26 w(ar)o(g1)20 b Fv(=)g FF(?op)p 1013 1030 V 25 w(ar)o(g1)d Fv(;)386 1109 y FB(gg)p 3568 1150 4 748 v 312 1153 3260 4 v 3570 1170 19 754 v 328 1170 3260 19 v 1121 1366 a FP(Figure)24 b(2.6:)31 b(Nested)24 b(loops)h (implementation)h(rule)300 1743 y(operator)g(ar)n(gument)f(\(join)g (predicate\))h(of)d(the)h(JOIN)f(node.)1308 b Fw(\003)300 2109 y FO(2.7)119 b(Support)31 b(Functions)300 2372 y FP(As)f(mentioned)j(earlier)l(,)h(and)d(as)g(can)g(be)g(seen)g(from)g (Figure)g(2.2,)i(most)d(of)h(the)g(actions)i(and)e(prop-)296 2542 y(erty)21 b(computations)i(in)d(V)-12 b(olcano)22 b(rules)f(are)f(done)h(by)g FD(support)i FP(functions)f(de\256ned)f(by) g(the)f(DBI.)f(These)298 2711 y(functions)24 b(are)e(de\256ned)h(for)f (each)g(operator)l(,)j(algorithm,)e(or)f(enforcer)i(and)e(are)g (triggered)i(upon)f(appli-)296 2880 y(cation)e(of)f(rules.)30 b(Some)20 b(are)g(executed)i(only)f(when)e(trans)p 2135 2880 28 4 v 35 w(rules)i(are)f(applied,)i(some)e(when)g(impl)p 3399 2880 V 33 w(rules)300 3050 y(are)k(applied,)h(and)f(others)h(when) e(neither)j(is)d(applied)i(\(i.e.,)e(enforcers\).)583 3219 y(The)i(required)j(support)f(functions)i(that)d(appear)g(in)g(a)f (V)-12 b(olcano)27 b(optimizer)g(are)f(summarized)300 3389 y(in)d(T)-6 b(able)24 b(2.3.)300 3755 y FO(2.8)119 b(Drawbacks)31 b(of)e(V)-11 b(olcano)294 4018 y FP(In)18 b(the)h(previous)i(sections,)g(we)c(have)i(seen)g(how)g(V)-12 b(olcano)19 b(uses)g(abstractions)j(to)c(allow)h(a)f(DBI)f(to)h(spec-) 298 4188 y(ify)j(a)g(rule-based)j(query)f(optimizer)-5 b(.)31 b(However)l(,)23 b(these)f(abstractions)j(are)c(not)h(suf)n (\256ciently)i(high-level)299 4357 y(to)f(insulate)h(the)f(DBI)f(from)g (implementation-level)28 b(details.)k(Moreover)l(,)24 b(some)f(of)g(the)g(constructs)i(in)298 4526 y(the)d(rule)h (speci\256cation)i(language)f(are)e(motivated)i(not)e(by)g FD(conceptual)j FP(details)f(of)d(the)i(optimizer)l(,)h(but)300 4696 y(by)i FD(implementation)i FP(details)f(with)f(an)f(eye)h(toward)h (constructing)i(ef)n(\256cient)e(optimizers.)39 b(The)25 b(result)300 4865 y(is)k(often)h(an)f(optimizer)i(that)f(is)f(fast,)h (but)g(often)g(quite)g(brittle)h(and)e(in\257exible.)49 b(In)29 b(this)h(section,)i(we)300 5034 y(describe)26 b(some)d(of)h(the)g(concepts)h(in)f(V)-12 b(olcano)25 b(that)f(are)g(bottlenecks)i(to)e(a)f(clean)i(speci\256cation.)1905 5349 y(21)p eop %%Page: 22 34 22 33 bop 312 412 3277 13 v 312 503 4 92 v 365 476 a Fz(Function)p 904 503 V 305 w(Fr)o(equency)p 1346 503 V 101 w(Description)p 3585 503 V 312 516 3277 13 v 312 607 4 92 v 365 580 a Fy(derive)p 555 580 23 4 v 28 w(log)p 678 580 V 27 w(prop)p 904 607 4 92 v 121 w(Operator)p 1346 607 V 176 w(Compute)20 b(logical)f(properties)h(of)f(node)h(given) f(logical)g(properties)h(of)f(children)p 3585 607 V 312 611 3277 4 v 312 702 4 92 v 365 674 a(derive)p 555 674 23 4 v 28 w(sys)p 678 674 V 27 w(prop)p 904 702 4 92 v 121 w(Operator)p 1346 702 V 176 w(Compute)h(system)f(properties)h(of) f(node)h(given)f(system)h(properties)f(of)g(children)p 3585 702 V 312 705 3277 4 v 312 796 4 92 v 365 814 a(derive)p 555 814 23 4 v 28 w(phy)p 694 814 V 28 w(prop)p 904 796 4 92 v 958 769 a(Algorithm)p 1346 796 V 1399 776 a(Compute)h(physical)g (properties)f(of)g(node)h(given)g(physical)g(properties)f(of)1399 867 y(children)p 3585 796 V 312 888 V 904 888 V 958 860 a(Enforcer)p 1346 888 V 3585 888 V 312 891 3277 4 v 312 982 4 92 v 365 1000 a(get)p 460 1000 23 4 v 27 w(input)p 640 1000 V 28 w(pv)p 904 982 4 92 v 958 955 a(Algorithm)p 1346 982 V 1399 954 a(Compute)h(needed)g(physical)g(properties)g(of)f (node)h(given)f(needed)h(physical)1399 1045 y(properties)g(of)f(parent) p 3585 982 V 312 1074 V 904 1074 V 958 1046 a(Enforcer)p 1346 1074 V 3585 1074 V 312 1077 3277 4 v 312 1168 4 92 v 365 1186 a(do)p 443 1186 23 4 v 28 w(any)p 578 1186 V 27 w(good)p 904 1168 4 92 v 958 1141 a(Algorithm)p 1346 1168 V 1399 1140 a(T)-5 b(est)19 b(whether)g(algorithm)g(or)g (enforcer)h(applies)f(given)h(needed)g(physical)1399 1231 y(properties)p 3585 1168 V 312 1260 V 904 1260 V 958 1232 a(Enforcer)p 1346 1260 V 3585 1260 V 312 1263 3277 4 v 312 1354 4 92 v 365 1376 a(cost)p 904 1354 V 958 1327 a(Algorithm)p 1346 1354 V 1399 1372 a(Compute)g(cost)f(of)g (algorithm)g(or)g(enforcer)p 3585 1354 V 312 1446 V 904 1446 V 958 1418 a(Enforcer)p 1346 1446 V 3585 1446 V 312 1458 3277 13 v 300 1611 a FP(T)-6 b(able)16 b(2.3:)28 b(Support)18 b(functions)h(in)d(a)h(V)-12 b(olcano)18 b(optimizer)-5 b(.)30 b(The)16 b(frequency)j(column)f(denotes)g (whether)300 1724 y(a)23 b(function)j(is)d(de\256ned)i(for)e(each)i (operator)l(,)g(algorithm,)g(or)f(enforcer)-5 b(.)p 323 1946 3237 4 v 323 2563 4 617 v 1525 2206 a tx@Dict begin tx@NodeDict begin { } /TheNoderet 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1525 2206 a FF(RET)1543 2344 y tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1543 2344 a Fs(R)1596 2353 y Fu(1)1375 2467 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderet /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1375 2467 a @beginspecial @setspecial tx@Dict begin STP newpath 2.6 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.7 0.6 2.0 2.5 Arrow EndArrow } def 42.6791 25.60745 75.1151 25.60745 1. 8.53581 6.82854 6.82854 tx@CoilDict begin ZigZag end /r 0.85362 def /Lineto { Arcto } def false Line gsave 2.6 SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 2077 2100 a tx@Dict begin tx@NodeDict begin { } /TheNodems 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2077 2100 a FF(Mer)o(ge)p 2252 2100 20 4 v 25 w(sort)2103 2277 y tx@Dict begin tx@NodeDict begin { } /TheNodefs 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2103 2277 a FF(File)p 2209 2277 20 4 v 25 w(scan)2181 2443 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2181 2443 a Fs(R)2234 2452 y Fu(1)1375 2467 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodems /TheNodefs InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1375 2467 a 1375 2467 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefs /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1375 2467 a 3557 2563 4 617 v 323 2566 3237 4 v 3558 2583 19 624 v 340 2583 3237 19 v 742 2779 a FP(Figure)24 b(2.7:)32 b(An)22 b(implicit)j(rule)f(in)g(V)-12 b(olcano.)32 b(Mer)n(ge)p 2457 2779 28 4 v 34 w(sort)24 b(is)g(an)f(enforcer)-5 b(.)300 3156 y FN(2.8.1)99 b(Explicit)25 b(vs.)33 b(Implicit)24 b(Rules)583 3386 y FP(The)i(general)j(form)d(of)g(a)g(V)-12 b(olcano)28 b(rule)f(is)f(shown)h(in)g(Figure)g(2.2.)39 b(This)26 b(\256gure)h(shows)g(that)298 3555 y(V)-12 b(olcano)22 b(rules)h(transform)g(an)e(abstract)i(expression)i(into)d (either)g(an)f(abstract)j(expression)g(or)d(an)h(algo-)295 3725 y(rithm.)29 b(Such)19 b(rules)h(are)f(called)h FD(explicit)h (rules)p FP(.)30 b(An)19 b(example)h(of)e(an)h(explicit)i(rule)f(is)e (the)i(impl)p 3304 3725 V 33 w(rule)f(2.4)294 3894 y(in)f(Figure)g (2.6.)29 b(An)17 b(explicit)j(rule)e(involves)i(abstract)g(operators,)h (and)d(sometimes,)i(algorithms.)31 b(How-)296 4063 y(ever)l(,)21 b(there)g(is)e(another)i(class)g(of)f(transformations,)k FD(implicit)c(rules)p FP(,)i(that)e(don')n(t)h(have)f(the)g(form)g (shown)300 4233 y(in)25 b(Figure)g(2.2.)34 b(Such)24 b(transformations)29 b(typically)e(involve)f(enforcers)h(since)f (enforcers)h(are)e(not)g(im-)300 4402 y(plementations)i(of)c(any)h (speci\256c)h(operators)h(\(e.g.,)d(Mer)n(ge)p 2193 4402 V 34 w(sort)h(in)g(T)-6 b(able)23 b(2.1\).)583 4572 y(Consider)j(the)f (transformation)i(in)e(Figure)f(2.7.)33 b(File)p 2298 4572 V 33 w(scan)25 b(is)f(an)h(implementation)i(for)d(RET)300 4741 y(and)j(assume)g(there)g(is)g(an)f(impl)p 1326 4741 V 33 w(rule)h(for)g(this)g(transformation.)43 b(However)l(,)27 b(since)h(Mer)n(ge)p 3237 4741 V 34 w(sort)f(is)f(an)299 4910 y(enforcer)l(,)e(there)f(is)f(no)g(rule)h(involving)i(it.)30 b(Nevertheless,)25 b(the)e(transformation)i(shown)e(in)f(Figure)h(2.7) 300 5080 y(is)g(a)g(valid)i(rewrite)f(in)g(V)-12 b(olcano.)32 b(This)23 b(is)h(an)f(example)i(of)e(an)h(implicit)h(rule.)1905 5349 y(22)p eop %%Page: 23 35 23 34 bop 583 391 a FP(Implicit)25 b(rules)g(are)f(present)i(in)e(V)-12 b(olcano)25 b(for)f(ef)n(\256ciency)i(and)f(to)e(aid)i(in)f(generating) i(an)e(opti-)293 561 y(mizer)-5 b(.)29 b(However)l(,)19 b(since)f(enforcers)h(\(i.e.,)f(algorithms)h(in)e(implicit)h(rules\))h (behave)f(like)g(algorithms)h(for)295 730 y(all)g(practical)j (purposes,)g(their)e(separate)h(classi\256cation)h(introduces)g(an)d (additional)j(detail)e(that)g(creates)300 899 y(an)26 b(asymmetric)h(framework)f(of)g(rewrite)g(rules.)38 b(In)26 b(other)h(words,)f(transformations)j(\(both)e(between)298 1069 y(operator)c(trees)g(and)f(their)g(associated)i(property)g(sets\)) e(are)g(dif)n(ferent)i(for)e(explicit)h(and)f(implicit)h(rules.)300 1238 y(This,)g(in)h(turn,)f(leads)i(to)e(two)h(other)g(problems:)436 1482 y FC(\017)46 b FP(Are)20 b(new)g(operators,)k(algorithms,)f(or)d (rules)i(explicit)g(or)e(implicit?)32 b(That)20 b(is,)h(when)g(an)f (existing)527 1652 y(V)-12 b(olcano)25 b(optimizer)g(is)e(modi\256ed)h (by)f(adding)i(operators,)g(algorithms,)g(or)e(rules,)h(the)g(DBI)e (has)527 1821 y(to)17 b(re-examine)i(the)e FD(entir)m(e)h FP(new)e(schema)i(\(i.e.,)f(operators,)k(algorithms,)e(enforcers,)i (properties,)527 1990 y(rules\))k(to)e(determine)j(which)e(rules)g(are) g(explicit)h(and)f(which)g(are)g(implicit.)436 2234 y FC(\017)46 b FP(Since)21 b(implicit)h(rules)f(do)g(not)g(have)h(the)f (same)f(form)h(as)f(explicit)j(rules)f(\(i.e.,)e(the)h(one)g(shown)g (in)527 2404 y(Figure)i(2.2\),)e(property)j(transformations)i(in)c (implicit)g(rules)h(are)f(also)g(dif)n(ferent)j(from)c(those)i(in)527 2573 y(explicit)e(rules.)30 b(As)18 b(before,)i(this)f(means)g(that)g (extensibility)k(of)18 b(an)h(optimizer)h(is)e(accomplished)527 2743 y(dif)n(ferently)27 b(when)d(explicit)h(rules)g(are)e(added)i (than)f(when)g(implicit)h(rules)f(are)g(introduced.)577 2987 y(The)18 b(solutions)i(to)e(these)g(problems)i(is)d(obvious:)31 b(treat)19 b(all)e(operators)k(and)d(algorithms)i(as)e(\256rst-)293 3156 y(class)g(objects.)30 b(This)17 b(implies)h(that)f(enforcers)j (are)d(treated)i(just)e(like)h(regular)g(algorithms,)j(with)16 b(explicit)300 3325 y(rules)24 b(implementing)i(them,)e(and)g(with)f (similar)h(property)i(transformation)h(mechanisms.)300 3632 y FN(2.8.2)99 b(Pr)n(operty)26 b(Repr)n(esentation)g(and)g(T)-7 b(ransformation)583 3862 y FP(Properties)30 b(are)e(crucial)h(for)f (storing)i(state)e(\(operator)i(tree\))f(information,)i(and)d(for)g (guiding)300 4032 y(the)d(search.)34 b(When)25 b(an)g(operator)h(tree)f (is)f(transformed)j(into)e(another)l(,)i(so)d(are)h(the)f(properties)k (associ-)300 4201 y(ated)f(with)g(the)g(operator)i(tree.)41 b(The)26 b(more)h(separate)h(property)h(structures,)h(the)d(greater)h (the)f(number)300 4371 y(of)e(property)j(transformations.)39 b(As)25 b(can)g(be)h(seen)g(from)f(Figure)h(2.2,)f(most)g(of)g(the)h (property)h(transla-)300 4540 y(tions)g(in)f(V)-12 b(olcano)28 b(rules)f(are)f(done)h(by)g(DBI-de\256ned)g(functions)h(\(as)f (described)h(in)e(Section)h(2.7\).)39 b(In)300 4709 y(fact,)27 b(this)f(general)i(form)e(of)g(a)f(rule)i(results)g(in)f(two)g (distinctly)i(dif)n(ferent)h(forms)d(for)g(trans)p 3237 4709 28 4 v 35 w(rules)h(and)300 4879 y(impl)p 471 4879 V 33 w(rules)g(in)f(V)-12 b(olcano)27 b(as)f(shown)g(in)g(Figure)g (2.8.)38 b(This)25 b(results)j(in)d(a)h(somewhat)g(lar)n(ge)i(number)e (of)300 5048 y(support)k(functions)g(which)f(often)g(carry)g(a)e (greater)j(burden)f(of)f(property)i(transformations)i(than)d(the)1905 5349 y(23)p eop %%Page: 24 36 24 35 bop 348 403 3187 4 v 348 2573 4 2171 v 425 859 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.3 true 3.8 neg 6.71495 neg 89.15826 53.01814 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -339 x FH(E)5 b(;)15 b(E)609 487 y FB(0)634 520 y FP(:)30 b(Expression)425 690 y FH(A)p FP(:)h(Algorithm)425 859 y FH(P)483 873 y Fs(i)512 859 y FH(;)15 b(P)623 826 y FB(0)610 883 y Fs(i)646 859 y FP(:)31 b(Property)1517 936 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -22.19318 17.07164 -22.19318 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -37.55754 17.07164 -37.55754 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1381 967 a FH(E)1609 960 y(P)1667 974 y Fv(1)1609 1145 y FH(P)1667 1159 y Fv(2)1609 1272 y FH(P)1667 1286 y Fv(3)1885 949 y(=)-12 b FB(\))1517 936 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -37.55754 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -22.19318 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2220 971 a FH(E)2292 938 y FB(0)2460 959 y FH(P)2531 926 y FB(0)2518 983 y Fv(1)2721 957 y FP(Operator)25 b(Ar)n(gument)2460 1144 y FH(P)2531 1111 y FB(0)2518 1167 y Fv(2)2721 1141 y FP(Logical)g(Property)2460 1271 y FH(P)2531 1238 y FB(0)2518 1294 y Fv(3)2721 1269 y FP(System)f(Property)1340 1495 y Fy(\(a\))18 b(General)h(form)g(of)g(a) g(V)-10 b(olcano)20 b(trans)p 2404 1495 23 4 v 28 w(rule)p 399 1595 3086 4 v 1517 1890 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -22.19318 17.07164 -22.19318 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 105.8441 -37.55754 17.07164 -22.19318 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1381 1921 a FH(E)1609 1914 y(P)1667 1928 y Fv(1)1609 2099 y FH(P)1667 2113 y Fv(2)1885 1903 y(=)-12 b FB(\))1517 1890 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -37.55754 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 -22.19318 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2234 1921 a FH(A)2460 1914 y(P)2531 1881 y FB(0)2518 1937 y Fv(1)2721 1911 y FP(Algorithm)25 b(Ar)n(gument)2460 2098 y FH(P)2531 2065 y FB(0)2518 2121 y Fv(2)2721 2096 y FP(Physical)g(Property)2460 2225 y FH(P)2531 2192 y FB(0)2518 2249 y Fv(3)2721 2232 y FP(Cost)1342 2449 y Fy(\(b\))19 b(General)g(form)g(of)g(a)f(V)-10 b(olcano)21 b(impl)p 2403 2449 23 4 v 27 w(rule)p 3532 2573 4 2171 v 348 2576 3187 4 v 3534 2593 19 2177 v 365 2593 3187 19 v 300 2789 a FP(Figure)k(2.8:)33 b(General)25 b(form)g(of)f(V)-12 b(olcano)26 b(trans)p 1843 2789 28 4 v 34 w(rules)g(and)f(impl)p 2399 2789 V 33 w(rules)h(\(cf.)33 b(Figure)25 b(2.2\).)34 b(Single)25 b(ar)n(-)300 2902 y(rows)f(denote)i(one)f(or)g(more)f(DBI-de\256ned)h(support)i (functions.)36 b(The)24 b(properties)j(that)e(are)g(translated)300 3015 y(by)f(the)f(rule)i(or)e(by)h(support)h(functions)h(are)e(listed)h (on)e(the)h(right.)300 3379 y(rules)h(themselves.)33 b(This)24 b(decidedly)i(asymmetric)g(manner)e(of)g(treating)h(trans)p 2840 3379 V 35 w(rules)g(and)f(impl)p 3395 3379 V 33 w(rules)300 3549 y(and)g(the)g(lar)n(ge)h(number)f(of)g(property)h (structures)h(leads)f(to)e(a)h(few)f(problems:)436 3777 y FC(\017)46 b FP(Deciding)25 b(which)f(set)g(a)f(particular)j (property)g(belongs)f(to)f(is)f(implementation-depend)q(en)q(t.)436 4015 y FC(\017)46 b FP(Modifying)31 b(any)e(existing)i(operator)l(,)h (algorithm,)f(enforcer)l(,)h(rule,)e(or)e(property)j(might)e(entail)527 4185 y(a)c(repartitioning)k(of)c(the)h(property)h(sets.)36 b(This)25 b(can)h(lead)f(to)g(a)g(cascading)j(ef)n(fect)e(of)f(having)i (to)527 4354 y(modify)22 b(the)f(lar)n(ge)h(number)g(of)f(support)i (functions)g(\320)e(hardly)h(conducive)i(to)d(easy)g(extensibil-)527 4523 y(ity)-6 b(.)436 4761 y FC(\017)46 b FP(Extensibility)29 b(in)d(V)-12 b(olcano)27 b(is)f(complicated)j(by)d(its)g(extensive)i (use)f(of)f(support)h(functions)i(for)527 4931 y(transformations)i(of)c (its)g(multiple)h(property)i(sets.)41 b(For)27 b(example,)i(from)e (Figure)g(2.3,)h(we)e(can)527 5100 y(see)k(that)h(addition)h(of)d(a)h (single)h(algorithm)h(requires)f(the)g(DBI)d(to)i(de\256ne)g FD(four)h FP(new)e(support)1905 5349 y(24)p eop %%Page: 25 37 25 36 bop 527 391 a FP(functions)21 b(for)e(property)h (transformations.)33 b(Even)19 b(addition)h(of)f(an)f(operator)j (requires)f(de\256ning)527 561 y(two)j(new)h(support)h(functions.)583 805 y(Property)j(partitions)g(are)f(geared)g(toward)g(generating)i(ef)n (\256cient)e(optimizers.)40 b(However)l(,)27 b(as)298 974 y(we)21 b(have)h(seen,)g(they)h(result)f(in)g(poor)g(extensibility) -6 b(.)34 b(The)21 b(solution)j(to)e(this)g(problem)g(is)g(also)g (obvious:)300 1144 y(treat)i(all)f(properties)k(as)c(equivalent,)j (with)d(property)j(transformations)h(being)d(done)h(at)e(the)h(rule)f (level)300 1313 y(\(rather)31 b(than)e(a)g(plethora)i(of)e(support)i (functions\).)51 b(However)l(,)31 b(noting)f(that)g(property)h (partitions)h FD(do)300 1482 y FP(result)d(in)e(fast)i(optimizers,)h(a) d(preprocessor)k(should)f(be)d(able)i(to)e(automatically)k(partition)f (property)300 1652 y(sets)24 b(based)h(on)e(need.)300 2018 y FO(2.9)119 b(Summary)300 2281 y FP(In)26 b(this)g(chapter)l(,)i (we)d(have)i(seen)g(the)f(rule)g(speci\256cation)j(framework)e(for)f(V) -12 b(olcano.)39 b(V)-12 b(olcano)27 b(is)f(the)293 2451 y(only)19 b(public-domain)i(rule-based)f(query)f(optimizer)-5 b(.)31 b(\(T)-6 b(o)16 b(our)i(knowledge,)j(there)d(are)g(two)f(other)i (rule-)298 2620 y(based)24 b(optimizers,)g(the)e(EXODUS)d(optimizer)24 b(generator)g(which)e(is)g(an)g(earlier)i(version)g(of)e(V)-12 b(olcano,)300 2789 y(and)24 b(the)g(Starburst)h(rule-based)h(optimizer) -5 b(.)33 b(The)23 b(Starburst)i(optimizer)g(is)e(not)h(publicly)i (available.\))583 2959 y(V)-12 b(olcano)30 b(provides)h(an)d(ef)n (\256cient)h(search)h(strategy)g(for)f(optimizing)h(queries.)46 b(However)l(,)30 b(as)300 3128 y(we)24 b(have)i(seen)f(it)g(also)g (presents)i(the)e(DBI)f(with)g(an)h(in\257exible)i(and)e (hard-to-extend)k(framework)d(for)300 3298 y(specifying)g(optimizer)f (rules)f(and)g(actions.)33 b(This)23 b(results)i(in)e(optimizers)i (which)f(consist)h(of)f(a)e(mix)h(of)295 3467 y(high-level)e (abstractions)h(\(operators,)g(algorithms,)g(rules\))e(together)g(with) f(implementation-level)k(de-)298 3636 y(tails)f(\(enforcers,)i (property)g(partitions,)g(support)f(functions)h(for)e(property)h (transformations,)i(implicit)300 3806 y(rules\).)54 b(Extensibility)33 b(in)e(such)g(an)g(environment)j(is)c(dif)n(\256cult)i(to)f (accomplish.)55 b(The)30 b(next)h(chapter)300 3975 y(describes)25 b(Prairie,)f(our)f(solution)j(to)d(the)g(problem)i(of)e(providing)j(a)c (rule)i(speci\256cation)i(environment)294 4144 y(consisting)20 b(of)e(high-level)j(abstractions,)h(yet)c(which)g(can)g(also)h(be)f (used)g(to)g(generate)i(a)d(fast)i(optimizer)-5 b(.)1905 5349 y(25)p eop %%Page: 26 38 26 37 bop 2859 1118 a FG(Chapter)44 b(3)990 1657 y FM(Prairie:)69 b(A)52 b(Language)f(for)h(Rule)2475 2031 y(Speci\256cation)300 2532 y FP(Prairie)28 b(is)f(an)g(algebraic)i(framework)g(and)e (language)j(for)d(specifying)j(rewrite)e(rules)g(for)f(rule-based)300 2702 y(query)32 b(optimizers.)55 b(W)-7 b(e)30 b(present)j(the)e (framework)h(and)f(language)j(in)d(this)g(chapter)-5 b(.)55 b(W)-7 b(e)30 b(begin)i(by)297 2871 y(introducing)24 b(basic)d(concepts)i(and)e(notation)i(and)e(then)g(present)i(a)d(means) h(by)f(which)h(the)g(mappings)i(of)300 3041 y(search)h(spaces)h(and)e (cost)h(models)g(are)f(expressed)j(as)d(rewrite)h(rules.)31 b(Thus,)23 b(the)g(goal)h(of)f(this)h(chapter)300 3210 y(is)f(to)h(lay)g(a)f(foundation)j(for)e(reasoning)i(about)f(query)g (optimizers)g(algebraically)-6 b(.)300 3577 y FO(3.1)119 b(Overview)576 3840 y FP(In)17 b(the)g(previous)i(chapter)l(,)h(we)15 b(described)20 b(V)-12 b(olcano')-5 b(s)19 b(rule)e(speci\256cation)i (language)g(and)f(listed)297 4009 y(some)j(of)f(its)h(shortcomings.)33 b(In)20 b(particular)l(,)k(V)-12 b(olcano)22 b(does)g(not)f(provide)h (suf)n(\256ciently)i(high-level)f(ab-)299 4178 y(stractions)h(that)f (would)g(insulate)h(a)e(DBI)f(from)h(low-level)i(details)f(and)g (provide)h(a)e(comfortable)j(envi-)300 4348 y(ronment)j(for)e (extensibility)-6 b(.)44 b(T)-6 b(o)25 b(remedy)j(this,)f(we)f(propose) j(a)d(rule)h(speci\256cation)i(language)g(called)297 4517 y(Prairie)22 b([21\26123].)32 b(The)21 b(Prairie)h(optimizer)g (paradigm)h(is)e(depicted)j(schematically)g(in)d(Figure)h(3.1.)30 b(As)294 4686 y(we)17 b(will)g(see)h(in)g(this)h(chapter)l(,)h(rules)f (in)f(Prairie)g(are)g(speci\256ed)i(at)d(a)h(conceptual)j(rather)e (than)f(implemen-)295 4856 y(tation)j(level.)30 b(This)20 b(high-level)i(speci\256cation)g(is)d(translated)j(to)d(generate)j(a)d (V)-12 b(olcano)21 b(speci\256cation)h(by)300 5025 y(a)k(Prairie-to-V) -12 b(olcano)31 b(\(or)c(P2V\))e(preprocessor)30 b(\(as)d(shown)g(in)g (Figure)g(3.1\).)40 b(The)26 b(P2V)f(preproces-)1905 5349 y(26)p eop %%Page: 27 39 27 38 bop 323 303 3237 4 v 323 1912 4 1609 v 1475 420 a FP(Operator)24 b(T)m(ree)1375 2029 y @beginspecial @setspecial tx@Dict begin STP newpath 2.6 SLW 0. setgray [ -17.07164 179.25221 153.64476 179.25221 153.64476 42.6791 -17.07164 42.6791 /Lineto /lineto load def false Polygon gsave 0.5 setgray fill grestore gsave 2.6 SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 42.6791 67.43292 42.6791 191.2023 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 42.6791 67.43292 42.6791 191.2023 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1904 713 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488 neg 59.87334 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(Prairie)g(Rules)1375 2029 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 135.71948 92.18674 155.35202 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 135.71948 92.18674 155.35202 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1813 987 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651 neg 81.76248 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(P2V)f(Preprocessor)1375 2029 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 100.72256 92.18674 120.0136 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 100.72256 92.18674 120.0136 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1877 1280 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488 neg 66.36697 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(V)-12 b(olcano)25 b(Rules)1375 2029 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { /ArrowAc [ 6 2 roll ] cvx def ArrowAc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowAc ArrowA pop pop ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1556 1554 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651 neg 95.86615 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(V)-12 b(olcano)25 b(Rule)f(Engine)1375 2029 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1721 1815 a(Access)g(Plan)p 3557 1912 V 323 1915 3237 4 v 3558 1932 19 1616 v 340 1932 3237 19 v 660 2128 a(Figure)g(3.1:)31 b(Schematic)25 b(representation)i(of)d(the)g(Prairie)g(optimizer)h (paradigm)300 2505 y(sor)g(is)g(described)j(in)c(greater)j(detail)f(in) f(Chapter)h(4.)35 b(This)25 b(chapter)h(describes)i(the)d(rule)g (speci\256cation)300 2674 y(language)h(of)d(Prairie.)300 3041 y FO(3.2)119 b(Notation)30 b(and)g(Assumptions)299 3304 y FP(This)23 b(section)i(lists)e(the)h(terminology)h(used)f(in)f (Prairie.)31 b(Some)22 b(of)h(the)g(concepts)i(are)e(similar)h(to)f (those)300 3473 y(used)h(in)g(V)-12 b(olcano)25 b(\(see)f(Section)g (2.2\).)31 b(However)l(,)24 b(there)h(are)e(some)h(semantic)h(dif)n (ferences.)300 3775 y FI(Stor)n(ed)i(Files)g(and)e(Str)n(eams.)92 b FP(A)26 b(\256le)g(is)h FD(stor)m(ed)j FP(if)c(its)h(tuples)i(reside) f(on)f(disk.)41 b(In)27 b(the)g(case)g(of)g(re-)300 3944 y(lational)e(databases,)g(stored)g(\256les)e(are)g(sometimes)i(called)f FD(base)g(r)m(elations)p FP(;)i(we)c(will)h(denote)i(them)e(by)300 4114 y FH(R)i FP(or)g FH(R)563 4128 y Fs(i)591 4114 y FP(.)35 b(In)25 b(object-oriented)30 b(schemas,)c(stored)g(\256les)f (are)h FD(classes)p FP(;)i(we)c(will)h(denote)h(them)f(by)h FH(C)k FP(or)300 4283 y FH(C)365 4297 y Fs(i)393 4283 y FP(.)h(Henceforth,)26 b(whenever)g(we)d(refer)i(to)f(a)f(stored)i (\256le,)f(we)f(mean)h(a)f(relation)j(or)e(a)g(class;)h(when)f(the)300 4452 y(distinction)j(is)d(unimportant,)i(we)d(will)h(use)g FH(F)36 b FP(or)24 b FH(F)1970 4466 y Fs(i)1998 4452 y FP(.)32 b(A)22 b FD(str)m(eam)i FP(is)g(a)g(sequence)i(of)e(tuples)h (and)f(is)g(the)296 4622 y(result)e(of)e(a)g(computation)j(on)d(one)h (or)f(more)h(streams)g(or)f(stored)i(\256les;)f(tuples)h(of)e(streams)h (are)g(returned)300 4791 y(one)j(at)f(a)g(time,)h(typically)h(on)f (demand.)32 b(Streams)24 b(can)f(be)h FD(named)p FP(,)g(denoted)h(by)f FH(S)2949 4805 y Fs(i)2977 4791 y FP(,)e(or)i FD(unnamed)p FP(.)1905 5349 y(27)p eop %%Page: 28 40 28 39 bop 300 391 a FI(Database)28 b(Operations.)92 b FP(An)26 b FD(operation)j FP(is)e(a)g(computation)i(on)e(one)h(or)e (more)h(streams)h(or)f(stored)300 561 y(\256les.)49 b(There)30 b(are)f(two)h(types)g(of)g(database)i(operations)g(in)e(Prairie:)44 b(abstract)31 b(\(or)f(implementation-)300 730 y(unspeci\256ed\))c (operators)g(and)e(concrete)i(algorithms.)33 b(Each)23 b(is)g(detailed)j(below)-6 b(.)527 999 y FI(Operators.)47 b FP(Abstract)30 b(\(or)e(conceptual\))j FD(operators)g FP(specify)e(computations)i(on)d(streams)h(or)727 1168 y(stored)f(\256les;)g(they)f(are)f(denoted)i(by)f(all)f(capital)i (letters)g(\(e.g.,)e(JOIN\).)f(Operators)j(have)727 1338 y(two)c(types)g(of)g(parameters:)34 b(essential)26 b(and)e(additional.) 34 b FD(Essential)25 b(parameters)h FP(are)e(the)727 1507 y(stream)h(or)f(\256le)g(inputs)i(to)e(an)h(operator;)i(these)e (are)g(the)f(primary)i(inputs)g(of)e(an)g(operator)-5 b(.)727 1677 y FD(Additional)29 b(parameters)g FP(are)e (\252\256ne-grain\272)i(quali\256cations)g(of)e(an)f(operator;)31 b(their)c(pur)n(-)727 1846 y(pose)e(is)g(to)f(describe)i(an)f(operator) h(in)e(more)h(detail)g(than)g(essential)i(parameters.)35 b(As)24 b(ex-)727 2015 y(amples,)30 b(some)e(operators)i(are)e(given)h (below;)i(for)d(each,)i(we)d(explicitly)j(indicate)g(their)727 2185 y(essential)c(parameters)g(and)e(parenthetically)k(note)c(their)g (additional)j(parameters.)806 2387 y FC(\017)46 b FP(SOR)-5 b(T\()p FH(S)1212 2401 y Fv(1)1250 2387 y FP(\))21 b(sorts)h(stream)h FH(S)1813 2401 y Fv(1)1852 2387 y FP(.)29 b(The)21 b(sorting)j (attribute)g(is)d(an)h(additional)j(parameter)897 2557 y(of)f(SOR)-5 b(T)e(.)806 2743 y FC(\017)46 b FP(RET\()p FH(F)13 b FP(\))20 b(retrieves)j(tuples)f(of)f(stored)h(\256le)e FH(F)13 b FP(.)30 b(Additional)23 b(parameters)f(to)f(RET)e(in-)897 2912 y(clude)j(the)f(selection)i(predicate,)g(the)e(projected)i (attributes)g(list,)e(and)g(the)g(output)h(tu-)897 3081 y(ple)i(order)-5 b(.)806 3267 y FC(\017)46 b FP(JOIN\()p FH(S)1180 3281 y Fv(1)1220 3267 y FP(,)19 b FH(S)1318 3281 y Fv(2)1357 3267 y FP(\))g(joins)i(streams)g FH(S)1955 3281 y Fv(1)2013 3267 y FP(and)f FH(S)2219 3281 y Fv(2)2258 3267 y FP(.)29 b(\()p FH(S)2396 3281 y Fv(1)2454 3267 y FP(denotes)22 b(the)e FD(outer)h(str)m(eam)f FP(and)g FH(S)3561 3281 y Fv(2)897 3437 y FP(denotes)27 b(the)e FD(inner)h(str)m(eam)p FP(.\))35 b(Additional)27 b(parameters)f(to)f (JOIN)f(include)j(the)e(join)897 3606 y(predicate)h(and)e(output)h (stream)f(tuple)h(order)-5 b(.)727 3809 y(Other)24 b(operators)i(are)e (de\256ned)g(as)g(they)g(are)g(needed.)527 4011 y FI(Algorithms.)47 b FD(Algorithms)23 b FP(are)f(concrete)h(implementations)i(of)d (conceptual)i(operators;)h(they)727 4180 y(are)19 b(represented)i(in)e (lower)f(case)h(with)g(the)f(\256rst)g(letter)i(capitalized)h(\(e.g.,)e (Nested)p 3321 4180 28 4 v 34 w(loops\).)727 4350 y(Algorithms)g(have)g (at)e(least)i(the)e(same)h(essential)i(and)e(additional)i(parameters)g (as)e(the)f(con-)727 4519 y(ceptual)26 b(operators)g(that)f(they)g (implement.)2124 4486 y Fv(1)2196 4519 y FP(Furthermore,)h(there)f(can) f(be,)g(and)g(usually)727 4689 y(are,)f(several)h(algorithms)h(for)d(a) g(particular)j(operator)-5 b(.)33 b(For)22 b(example,)i(File)p 3130 4689 V 33 w(scan)f(and)g(In-)727 4858 y(dex)p 862 4858 V 34 w(scan)e(are)g(valid)g(algorithms)h(that)f(implement)g(the)f (RET)f(operator)l(,)k(and)d(Mer)n(ge)p 3429 4858 V 35 w(join)p 300 4939 1320 4 v 400 4993 a Fu(1)434 5024 y Fy(Algorithms)g(may)f(have)h Fr(tuning)f(parameters)h Fy(which)g(are)f(not)g(parameters)g(in)g(the)g(operators)h(they)f (implement.)1905 5349 y FP(28)p eop %%Page: 29 41 29 40 bop 554 412 2793 13 v 554 503 4 92 v 607 476 a Fz(Operator)p 1069 503 V 217 w(Description)p 1762 503 V 323 w(Additional)17 b(Parameters)p 2594 503 V 105 w(Algorithm)p 3343 503 V 554 516 2793 13 v 554 607 4 92 v 607 626 a Fy(JOIN\()p Fq(S)841 634 y Fu(1)875 626 y Fy(,)h Fq(S)959 634 y Fu(2)994 626 y Fy(\))p 1069 607 V 1122 627 a(Join)h(streams)g Fq(S)1559 635 y Fu(1)1593 627 y Fy(,)g Fq(S)1678 635 y Fu(2)p 1762 607 V 1815 580 a Fy(tuple)p 1968 580 23 4 v 28 w(order)p 2594 607 4 92 v 498 w(Nested)p 2858 580 23 4 v 27 w(loops\()p Fq(S)3114 588 y Fu(1)3149 580 y Fy(,)g Fq(S)3234 588 y Fu(2)3268 580 y Fy(\))p 3343 607 4 92 v 2597 611 750 4 v 554 699 4 92 v 1069 699 V 1762 699 V 1815 671 a(join)p 1935 671 23 4 v 27 w(predicate)p 2594 699 4 92 v 416 w(Mer)o(ge)p 2844 671 23 4 v 27 w(join\()p Fq(S)3055 679 y Fu(1)3090 671 y Fy(,)f Fq(S)3174 679 y Fu(2)3209 671 y Fy(\))p 3343 699 4 92 v 554 702 2793 4 v 554 806 4 105 v 607 865 a(RET\()p Fq(F)11 b Fy(\))p 1069 806 V 1122 871 a(Retrieve)19 b(\256le)f Fq(F)p 1762 806 V 1815 773 a Fy(tuple)p 1968 773 23 4 v 28 w(order)p 2594 806 4 105 v 2647 793 a(File)p 2768 793 23 4 v 26 w(scan\()p Fq(F)11 b Fy(\))p 3343 806 4 105 v 554 898 4 92 v 1069 898 V 1762 898 V 1815 870 a(selection)p 2084 870 23 4 v 28 w(predicate)p 2594 898 4 92 v 2597 870 747 4 v 3343 898 4 92 v 554 989 V 1069 989 V 1762 989 V 1815 962 a(projected)p 2096 962 23 4 v 28 w(attributes)p 2594 989 4 92 v 2647 949 a(Index)p 2820 949 23 4 v 28 w(scan\()p Fq(F)g Fy(\))p 3343 989 4 92 v 554 993 2793 4 v 554 1084 4 92 v 607 1103 a(SOR)l(T\()p Fq(S)867 1111 y Fu(1)900 1103 y Fy(\))p 1069 1084 V 1122 1105 a(Sort)18 b(stream)h Fq(S)1530 1113 y Fu(1)p 1762 1084 V 1815 1101 a Fy(tuple)p 1968 1101 23 4 v 28 w(order)p 2594 1084 4 92 v 2647 1057 a(Mer)o(ge)p 2844 1057 23 4 v 27 w(sort\()p Fq(S)3051 1065 y Fu(1)3086 1057 y Fy(\))p 3343 1084 4 92 v 2597 1087 750 4 v 554 1175 4 92 v 1069 1175 V 1762 1175 V 2594 1175 V 2647 1148 a(Null\()p Fq(S)2852 1156 y Fu(1)2886 1148 y Fy(\))p 3343 1175 V 554 1188 2793 13 v 300 1341 a FP(T)-6 b(able)22 b(3.1:)31 b(Operators)24 b(and)f(algorithms)h(in)f(a)f(centralized)j(Prairie)e(query)h (optimizer)g(and)f(their)g(addi-)300 1454 y(tional)i(parameters)727 1813 y(and)30 b(Nested)p 1143 1813 28 4 v 34 w(loops)g(are)g (algorithms)h(that)f(implement)g(the)f(JOIN)g(operator)-5 b(.)49 b(Dif)n(ferent)727 1983 y(algorithms)26 b(of)n(fer)f(dif)n (ferent)h(execution)g(ef)n(\256ciencies.)300 2239 y(T)-6 b(able)25 b(3.1)f(lists)i(some)f(operators)i(and)f(algorithms)h (implementing)g(them)e(together)i(with)d(their)i(addi-)300 2408 y(tional)f(parameters.)300 2706 y FI(Operator)30 b(T)-7 b(r)n(ee.)92 b FP(An)30 b FD(operator)i(tr)m(ee)e FP(is)f(a)g(rooted)j(tree)e(whose)g(non-leaf,)j(or)d FD(interior)i FP(nodes)f(are)300 2875 y(database)i(operations)h (\(operators)g(or)d(algorithms\))i(and)e(whose)h(leaf)f(nodes)h(are)g (stored)g(\256les.)53 b(The)300 3045 y(children)26 b(of)e(an)g (interior)i(node)f(in)f(an)g(operator)i(tree)f(are)f(the)g(essential)j (parameters)f(\(i.e.,)d(the)i(stream)300 3214 y(or)i(\256le)g (parameters\))j(of)d(the)g(operation.)45 b(Additional)30 b(parameters)f(are)f(implicitly)h(attached)g(to)e(each)300 3383 y(node.)42 b(Algebraically)-6 b(,)30 b(operator)f(trees)f(are)f (compositions)j(of)d(database)i(operations;)i(thus,)e(we)d(will)300 3553 y(also)e(call)g(operator)i(trees)e FD(expr)m(essions)p FP(;)j(both)d(terms)g(will)f(be)h(used)g(interchangeably)-6 b(.)302 3809 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(5)t(.)159 b(A)20 b(simple)h(expression)j(and)d(its)g(operator)i(tree)e (representation)k(are)c(shown)g(in)f(Fig-)300 3978 y(ure)25 b(3.2\(a\).)37 b(Relations)26 b FH(R)1149 3992 y Fv(1)1213 3978 y FP(and)g FH(R)1438 3992 y Fv(2)1501 3978 y FP(are)g(\256rst)e (RET)m(rieved,)h(then)h(JOINed,)f(and)h(\256nally)f(SOR)-5 b(T)f(ed)23 b(re-)300 4148 y(sulting)g(in)e(a)g(stream)h(sorted)h(on)f (a)f(speci\256c)h(attribute.)32 b(The)21 b(\256gure)h(shows)g(only)g (the)g(essential)i(param-)300 4317 y(eters)g(of)g(the)g(various)h (operators,)h(not)e(the)f(additional)k(parameters.)1050 b Fw(\003)297 4674 y FI(Access)21 b(Plan.)90 b FP(An)20 b FD(access)i(plan)g FP(is)e(an)h(operator)h(tree)f(in)g(which)g(all)g (interior)h(nodes)g(are)f(algorithms.)302 4931 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(6)t(.)174 b(An)34 b(access)i(plan)g (for)f(the)g(operator)i(tree)f(in)f(Figure)g(3.2\(a\))h(is)f(shown)h (in)e(Fig-)300 5100 y(ure)c(3.2\(b\).)51 b(Relations)32 b FH(R)1179 5114 y Fv(1)1248 5100 y FP(and)e FH(R)1477 5114 y Fv(2)1546 5100 y FP(are)g(each)h(retrieved)h(using)f(the)g(File) p 2747 5100 V 33 w(scan)g(algorithm,)i(joined)1905 5349 y(29)p eop %%Page: 30 42 30 41 bop 347 403 3189 4 v 347 1486 4 1084 v 657 528 a FF(SOR)l(T)17 b(\(JOIN)f(\(RET)g(\()p Fs(R)1261 537 y Fu(1)1296 528 y FF(\),)g(RET)h(\()p Fs(R)1569 537 y Fu(2)1603 528 y FF(\)\)\))1081 675 y tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 1081 675 a FF(SOR)l(T)1092 817 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 1092 817 a FF(JOIN)1022 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1022 1078 a 959 958 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 959 958 a FF(RET)1242 958 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1242 958 a FF(RET)1022 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1022 1078 a 1022 1078 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1022 1078 a 978 1096 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 978 1096 a Fs(R)1031 1105 y Fu(1)1261 1096 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1261 1096 a Fs(R)1314 1105 y Fu(2)1022 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1022 1078 a 1022 1078 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1022 1078 a 481 1274 a Fy(\(a\))h(An)h(expression)g(and)g(its)f (corresponding)i(oper)o(-)481 1365 y(ator)f(tree)p 1951 1461 4 1034 v 2572 668 a tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2572 668 a FF(Mer)o(ge)p 2747 668 20 4 v 25 w(sort)2544 810 y tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 5.43198 1.72792 false .5 42.43158 InitRnode } NewNode end end 2544 810 a FF(Nested)p 2731 810 20 4 v 25 w(loops)2578 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodemergesort /TheNodenestedloops InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2578 1078 a 2456 958 a tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2456 958 a FF(File)p 2562 958 20 4 v 25 w(scan)2739 958 y tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2739 958 a FF(File)p 2845 958 20 4 v 25 w(scan)2578 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodenestedloops /TheNodefilescanr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2578 1078 a 2578 1078 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodenestedloops /TheNodefilescanr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2578 1078 a 2534 1096 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2534 1096 a Fs(R)2587 1105 y Fu(1)2818 1096 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2818 1096 a Fs(R)2871 1105 y Fu(2)2578 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefilescanr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2578 1078 a 2578 1078 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodefilescanr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2578 1078 a 2038 1274 a Fy(\(b\))g(A)g(possible)h(access)g (plan)g(for)f(operator)h(tree)f(in)2038 1365 y(\(a\))p 3533 1486 4 1084 v 347 1489 3189 4 v 3534 1506 19 1090 v 364 1506 3189 19 v 934 1702 a FP(Figure)24 b(3.2:)31 b(Example)24 b(of)g(an)f(operator)j(tree)e(and)g(access)h(plan)300 2079 y(using)g(Nested)p 776 2079 28 4 v 34 w(loops,)f(and)g(\256nally)g (sorted)h(using)g(Mer)n(ge)p 2160 2079 V 34 w(sort.)1182 b Fw(\003)300 2380 y FI(Descriptors.)93 b FP(A)27 b FD(pr)m(operty)j FP(of)d(a)h(node)h(is)f(a)f(\(user)n(-de\256ned\))k(variable)f(that)f (contains)h(information)297 2550 y(used)22 b(by)g(an)f(optimizer)-5 b(.)32 b(An)20 b FD(annotation)k FP(is)d(a)g FC(h)p FD(pr)m(operty)-5 b(,)26 b(value)r FC(i)20 b FP(pair)i(that)g(is)f(assigned)i(to)e(a)g (node.)31 b(A)296 2719 y FD(descriptor)23 b FP(is)c(a)h(list)g(of)g (annotations)j(that)d(describes)i(a)e(node)g(of)g(an)g(operator)i (tree;)f(every)g(node)g(has)f(its)297 2889 y(own)h(descriptor)-5 b(.)33 b(As)20 b(an)h(example,)i(T)-6 b(able)21 b(3.2)g(lists)h(some)f (typical)i(properties)h(that)d(might)h(be)f(used)h(in)298 3058 y(a)f(descriptor)-5 b(.)32 b(In)22 b(general,)h(descriptors)h(for) e(streams)g(may)f(be)h(dif)n(ferent)i(from)d(descriptors)k(for)c (stored)300 3227 y(\256les.)474 3194 y Fv(2)576 3397 y FP(The)16 b(following)i(notations)i(will)c(be)h(useful)h(in)e(our)h (subsequent)j(discussions.)32 b(If)16 b FH(X)3208 3411 y Fs(i)3253 3397 y FP(is)g(a)g(stored)294 3566 y(\256le)h(or)h(stream,) h(then)f Fp(D)1056 3581 y Fo(i)1100 3566 y FP(is)g(its)g(descriptor)-5 b(.)31 b(Annotations)21 b(of)c FH(S)2300 3580 y Fs(i)2345 3566 y FP(are)h(accessed)i(by)e(a)f(structure)j(member)300 3735 y(relationship,)31 b(e.g.,)26 b Fp(D)1039 3750 y Fo(i)1066 3735 y FH(:)p FP(cardinality)t(.)39 b(Also,)27 b(let)g FH(E)k FP(be)c(an)f(expression)k(and)d(let)g Fp(D)e FP(be)i(its)g(descriptor)-5 b(.)300 3905 y(This)23 b(is)h(written)g(as)f FH(E)31 b FA(:)26 b Fp(D)p FP(.)302 4174 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)k FP(7)t(.)162 b(The)23 b(expression,)895 4418 y(SOR)-5 b(T)n FA(\()p FP(JOIN)p FA(\()p FP(RET)o FA(\()p FH(R)1665 4432 y Fv(1)1705 4418 y FA(\))25 b(:)h Fp(D)1896 4432 y Fo(3)1941 4418 y FH(;)15 b FP(RET)o FA(\()p FH(R)2257 4432 y Fv(2)2297 4418 y FA(\))25 b(:)h Fp(D)2488 4432 y Fo(4)2533 4418 y FA(\))g(:)f Fp(D)2724 4432 y Fo(5)2769 4418 y FA(\))h(:)f Fp(D)2960 4432 y Fo(6)300 4662 y FP(corresponds)34 b(to)c(the)h(operator)i(tree)e (in)f(Figure)h(3.2\(a\),)i(and)d(represents)k(the)c(join)i(of)e(two)g (relations)300 4831 y FH(R)369 4845 y Fv(1)435 4831 y FP(and)f FH(R)663 4845 y Fv(2)702 4831 y FP(.)43 b(The)27 b(two)g(relations)j(are)e(\256rst)g(RET)m(rieved,)g(then)h(JOINed)e (and)i(\256nally)f(SOR)-5 b(T)f(ed.)41 b Fp(D)3555 4845 y Fo(1)p 300 4912 1320 4 v 400 4966 a Fu(2)434 4998 y Fy(As)19 b(an)g(example,)h(a)f(stream)g(may)g(have)h(a)f(property)g (join)p 1936 4998 23 4 v 28 w(predicate)g(which)g(is)g(absent)h(in)e(a) h(stored)g(\256le')l(s)f(descriptor)l(.)1905 5349 y FP(30)p eop %%Page: 31 43 31 42 bop 835 412 2231 13 v 835 503 4 92 v 888 476 a Fz(Pr)o(operty)p 1355 503 V 235 w(Description)p 3062 503 V 835 516 2231 13 v 835 607 4 92 v 888 580 a Fy(join)p 1008 580 23 4 v 27 w(predicate)p 1355 607 4 92 v 104 w(join)19 b(predicate)g(for)g(JOIN)g(operator)p 3062 607 V 835 611 2231 4 v 835 702 4 92 v 888 674 a(tuple)p 1041 674 23 4 v 27 w(order)p 1355 702 4 92 v 187 w(tuple)g(order)g(of)g (resulting)h(stream,)e(DONT)p 2562 674 23 4 v 26 w(CARE)g(if)h(none)p 3062 702 4 92 v 835 705 2231 4 v 835 796 4 92 v 888 769 a(cardinality)p 1355 796 V 201 w(number)h(of)f(tuples)g(of)g(resulting) g(stream)p 3062 796 V 835 800 2231 4 v 835 891 4 92 v 888 864 a(record)p 1082 864 23 4 v 28 w(width)p 1355 891 4 92 v 132 w(size)g(of)g(individual)g(tuple)h(in)e(stream)p 3062 891 V 835 894 2231 4 v 835 986 4 92 v 888 958 a(attributes)p 1355 986 V 242 w(list)g(of)h(attributes)p 3062 986 V 835 989 2231 4 v 835 1080 4 92 v 888 1053 a(cost)p 1355 1080 V 400 w(estimated)g(cost)g(of)g(algorithm)p 3062 1080 V 835 1093 2231 13 v 880 1246 a FP(T)-6 b(able)24 b(3.2:)31 b(Properties)25 b(of)f(nodes)g(in)g(an)f(operator)j(tree)e (in)f(Prairie)300 1623 y(and)k Fp(D)537 1637 y Fo(2)607 1623 y FP(are)f(the)h(descriptors)i(of)d(the)g(stored)i(\256les)e FH(R)2035 1637 y Fv(1)2100 1623 y FP(and)g FH(R)2325 1637 y Fv(2)2365 1623 y FP(,)f(respectively)-6 b(,)30 b Fp(D)2975 1637 y Fo(3)3046 1623 y FP(and)c Fp(D)3282 1637 y Fo(4)3353 1623 y FP(are)g(the)300 1792 y(stream)34 b(descriptors)i(of)e(the)f(two)g(RET)-6 b(s)31 b(respectively)-6 b(,)39 b(and)34 b Fp(D)2395 1806 y Fo(5)2473 1792 y FP(is)f(the)h (stream)g(descriptor)i(of)d(the)300 1961 y(JOIN,)e(and)i Fp(D)794 1975 y Fo(6)870 1961 y FP(is)f(the)h(stream)g(descriptor)i(of) d(the)g(SOR)-5 b(T)e(.)30 b(Assuming)j(that)g(the)f(descriptor)j (\256elds)300 2131 y(for)d(this)g(expression)i(are)e(those)h(given)g (in)e(T)-6 b(able)32 b(3.2,)h(the)f(selection)h(predicate)h(for)e(the)g (\256rst)f(RET)300 2300 y(is)24 b Fp(D)464 2314 y Fo(3)509 2300 y FH(:)p FP(selection)p 859 2300 28 4 v 36 w(predicate)s(,)f(and)h (that)g(for)g(the)g(second)i(RET)21 b(is)j(given)h(by)f Fp(D)2818 2314 y Fo(4)2863 2300 y FH(:)p FP(selection)p 3213 2300 V 36 w(predicate)s(.)300 2469 y(The)j(join)h(predicate)i(of)d (the)h(JOIN)e(node)i(is)f(given)i(by)e Fp(D)2175 2483 y Fo(5)2220 2469 y FH(:)p FP(join)p 2390 2469 V 35 w(predicate)s(,)g (and)h(the)g(attributes)i(that)300 2639 y(are)24 b(output)h(are)f (given)g(by)g Fp(D)1241 2653 y Fo(5)1286 2639 y FH(:)p FP(attributes)t(.)30 b(And)23 b(so)g(on.)1431 b Fw(\003)583 2875 y FP(Currently)-6 b(,)26 b(descriptor)i(properties)f(are)d (de\256ned)h(entirely)h(by)f(the)g(DBI;)e(however)l(,)j(we)d(envi-)300 3044 y(sion)h(providing)j(a)c(hierarchy)j(of)d(pre-de\256ned)j (descriptor)g(types)f(to)e(aid)h(this)g(process.)300 3411 y FO(3.3)119 b(Prairie)30 b(Optimization)h(Paradigm)300 3674 y FP(As)24 b(shown)h(in)f(Figure)h(3.1,)g(an)f(optimizer)i(is)f (generated)i(from)d(a)g(Prairie)h(rule)h(speci\256cation)h(by)d(con-) 300 3843 y(verting)g(them)f(to)h(a)e(V)-12 b(olcano)25 b(speci\256cation)h(and)d(then)h(compiling)h(it)e(with)g(the)g(V)-12 b(olcano)25 b(rule)e(engine.)300 4012 y(Since)30 b(the)h(V)-12 b(olcano)31 b(rule)g(engine)h(implements)f(a)f(top-down)i(optimization) h(search)e(strategy)h(\(Sec-)300 4182 y(tion)c(2.1\),)g(this)g(means)g (that,)h(currently)-6 b(,)30 b(Prairie)e(speci\256cations)i(can)e(only) g(generate)i(top-down)f(op-)300 4351 y(timizers.)52 b(Given)31 b(an)f(appropriate)k(search)e(engine,)h(Prairie)e(can)g(potentially)i (also)e(be)f(used)h(with)g(a)296 4520 y(bottom-up)22 b(optimization)h(strategy;)g(however)l(,)f(we)d(will)h(not)g(explore)i (this)e(topic)h(in)f(this)g(dissertation.)583 4690 y(In)k(query)h (optimization,)h(there)e(are)g(certain)h(annotations)i(\(such)d(as)g (additional)i(parameters\))298 4859 y(that)c(are)f(known)h(before)h (any)f(optimization)i(is)e(begun.)31 b(These)22 b(annotations)j(can)c (be)h(computed)h(at)e(the)300 5029 y(time)26 b(that)g(the)h(operator)h (tree)e(is)g(initialized,)j(and)e(will)f(not)g(change)i(with)d (application)30 b(of)c(rules.)39 b(For)1905 5349 y(31)p eop %%Page: 32 44 32 43 bop 371 403 3142 4 v 371 1124 4 722 v 425 694 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.3 true 3.8 neg 6.1651 neg 89.15826 32.61813 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -170 x FH(E)5 b(;)15 b(E)609 491 y FB(0)634 524 y FP(:)30 b(Expression)425 694 y FH(D)s(;)15 b(D)621 661 y FB(0)644 694 y FP(:)31 b(Descriptor)1517 853 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1381 884 a FH(E)171 b(D)1885 866 y Fv(=)-12 b FB(\))1517 853 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 102.42984 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 119.50148 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2220 888 a FH(E)2292 855 y FB(0)2458 888 y FH(D)2536 855 y FB(0)p 3509 1124 V 371 1127 3142 4 v 3511 1144 19 729 v 388 1144 3142 19 v 1196 1340 a FP(Figure)25 b(3.3:)31 b(General)24 b(form)g(of)f(a)g(Prairie)h(rule)293 1717 y(this)18 b(purpose,)i(the)e(DBI)e(must)h(de\256ne)g(support)j (functions)f(\(called)g(init)p 2534 1717 28 4 v 34 w(descriptor\))h (for)e(each)g(operator;)300 1886 y(these)30 b(functions)i(compute)f (the)e(descriptor)j(properties)g(for)d(an)h(operator)h(given)f(the)g (descriptors)i(of)297 2056 y(its)22 b(input.)31 b(For)20 b(instance,)k(init)p 1256 2056 V 34 w(descriptor)p 1650 2056 V 36 w(JOIN)d(computes)h(the)g(descriptor)i(properties)g (\(cardinality)-6 b(,)300 2225 y(record)p 535 2225 V 35 w(width,)27 b(attributes\))j(from)c(the)h(descriptors)j(of)c(its)h (two)f(inputs.)41 b(Our)27 b(following)h(discussions)300 2394 y(assume)c(operator)i(trees)e(are)g(initialized.)300 2761 y FO(3.4)119 b(Rules)30 b(in)h(Prairie)583 3024 y FP(Rules)23 b(in)f(Prairie)i(correspond)i(to)c(rewrites)i(between)g (pairs)g(of)e(expressions,)k(or)d(between)h(an)300 3193 y(expression)29 b(and)d(an)g(access)h(plan.)38 b(Figure)27 b(3.3)e(shows)i(the)f(general)h(format)g(of)e(a)h(Prairie)g(rule.)38 b(This)300 3363 y(general)30 b(rule)f(results)h(in)f(two)f(types)h(of)g (algebraic)h(transformations)j(\(or)28 b FD(r)m(ewrite)h(rules)p FP(\))h(in)e(Prairie:)299 3532 y(T)-8 b(-rules)23 b (\(\252transformation)j(rules\272\))e(and)f(I-rules)h (\(\252implementation)i(rules\272\).)32 b(Each)22 b(rule)h(transforms) 298 3702 y(an)e(expression)k(into)d(another)h(based)g(on)f(additional)i (conditions;)h(the)d(transformation)j(also)d(results)h(in)300 3871 y(a)j(mapping)i(of)e(descriptors)j(between)f(expressions,)i(as)c (Figure)h(3.3)f(shows.)39 b(Thus,)27 b(rules)g(in)g(Prairie)300 4040 y(represent)f(units)e(of)g FD(encapsulation)k FP(for)23 b(operator)j(tree)e(and)g(descriptor)i(transformations.)583 4210 y(T)-8 b(-rules)28 b(and)g(I-rules)h(are)e(de\256ned)h(precisely)i (in)d(Sections)h(3.5)f(and)h(3.6)f(and)h(are)f(illustrated)300 4379 y(with)k(examples.)54 b(The)31 b(examples)i(are)e(chosen)h(from)f (rules)h(that)g(would)f(be)g(used)h(in)f(a)f(centralized)300 4548 y(relational)d(query)f(optimizer;)h(the)d(operators,)j (algorithms,)g(and)e(properties)i(are)e(subsets)h(of)f(those)g(in)300 4718 y(T)-6 b(ables)24 b(3.1)f(and)h(3.2.)1905 5349 y(32)p eop %%Page: 33 45 33 44 bop 312 303 3260 4 v 312 977 4 674 v 386 383 a Fs(E)t Fv(\()p Fs(x)509 392 y Fu(1)543 383 y Fs(;)11 b(:)g(:)h(:)23 b(;)11 b(x)751 391 y Fn(n)794 383 y Fv(\))20 b(:)f Fo(D)942 392 y Fm(1)1000 383 y Fv(=)-12 b FB(\))20 b Fs(E)1190 356 y Ft(0)1211 383 y Fv(\()p Fs(x)1278 392 y Fu(1)1313 383 y Fs(;)12 b(:)f(:)g(:)23 b(;)12 b(x)1522 391 y Fn(n)1564 383 y Fv(\))20 b(:)f Fo(D)1712 392 y Fm(2)3393 383 y FF(\(3.1\))386 462 y FB(ff)601 541 y FF(pre-test)g(statements)386 620 y FB(gg)386 699 y FF(test)386 778 y FB(ff)601 857 y FF(post-test)g(statements)386 936 y FB(gg)p 3568 977 V 312 980 3260 4 v 3570 997 19 681 v 328 997 3260 19 v 1158 1193 a FP(Figure)24 b(3.4:)31 b(General)24 b(form)g(of)f(a)g(Prairie)h(T)-8 b(-rule)300 1570 y FO(3.5)119 b(T)-9 b(ransformation)29 b(Rules)583 1833 y FP(T)m(ransformation)i(rules,)g(or)d(T)-8 b(-rules)29 b(for)g(short,)h(de\256ne)f(equivalences)j(among)d(pairs)h(of)e(ex-)298 2002 y(pressions;)d(they)e(de\256ne)f(mappings)i(from)e(one)g(operator) i(tree)f(to)e(another)-5 b(.)33 b(Let)21 b FH(E)26 b FP(and)d FH(E)3183 1969 y FB(0)3227 2002 y FP(be)f(expres-)300 2171 y(sions)27 b(that)f(involve)i(only)f(abstract)h(operators.)40 b(Equation)27 b(\(3.1\))g(\(shown)f(in)g(Figure)h(3.4\))f(shows)g(the) 300 2341 y(general)k(form)e(of)h(a)f(T)-8 b(-rule.)45 b(The)28 b(actions)i(of)f(a)f(T)-8 b(-rule)28 b(de\256ne)h(the)g (equivalences)j(between)d(the)g(de-)299 2510 y(scriptors)c(of)e(nodes)h (of)e(the)h(original)i(operator)f(tree)g FH(E)j FP(with)22 b(the)h(nodes)h(of)f(the)g(output)h(tree)f FH(E)3343 2477 y FB(0)3367 2510 y FP(;)f(these)300 2679 y(actions)j(consist)h(of) d(a)g(series)i(of)e(\(C)g(or)g(C++\))h(assignment)2180 2646 y Fv(3)2245 2679 y FP(statements.)583 2849 y(The)32 b(left-hand)j(sides)e(of)f(these)h(statements)h(refer)f(to)f (descriptors)j(of)d(expressions)k(on)c(the)300 3018 y(right-hand)j (side)d(of)f(the)h(T)-8 b(-rule)32 b(\(i.e.,)h(the)f(descriptors)j (whose)d(values)h(are)f(to)f(be)h(computed\);)38 b(the)298 3188 y(right-hand)25 b(sides)e(of)f(the)g(statements)i(can)e(refer)h (to)f(any)g(descriptor)j(in)d(the)g(T)-8 b(-rule.)30 b(As)21 b(in)h(procedural)300 3357 y(languages)27 b(\(like)f(C\),)e (function)i(calls)g(can)f(also)g(appear)i(on)d(the)h(right)h(side)f(of) g(the)g(assignment)i(state-)300 3526 y(ments.)32 b(These)24 b(functions)i(are)e(called)h FD(helper)g FP(functions.)34 b(Unlike)24 b(support)i(functions)g(that)e(are)g(man-)300 3696 y(dated)31 b(by)e(the)h(language)i(\(e.g.,)f(init)p 1482 3696 28 4 v 34 w(descriptor\),)j(helper)d(functions)h(exist)e (solely)h(to)f(simplify)h(rule)300 3865 y(actions.)42 b(Thus,)28 b(descriptors)i(on)c(the)i FD(left-hand)h(side)e FP(of)g(a)f(T)-8 b(-rule)27 b(are)g FD(never)h FP(changed)h(in)e(the)g (rule')-5 b(s)300 4034 y(actions.)38 b(A)24 b FD(test)i FP(is)f(needed)i(to)e(determine)i(if)e(the)h(transformations)j(of)c (the)g(T)-8 b(-rule)26 b(are)f(in)g(fact)h(appli-)300 4204 y(cable.)583 4373 y(Purely)h(as)f(an)f(optimization,)k(it)d(is)g (usually)h(the)f(case)h(that)f(not)h(all)f(statements)h(in)f(a)g(T)-8 b(-rule')j(s)296 4542 y(actions)21 b(need)g(to)e(be)h(executed)i(prior) f(to)e(a)h(T)-8 b(-rule')j(s)20 b(test.)30 b(For)19 b(this)h(reason,)i (the)e(actions)i(of)d(a)g(T)-8 b(-rule)20 b(are)p 300 4624 1320 4 v 400 4677 a Fu(3)434 4709 y Fy(The)k(actions)f(can)h(be)f (non-assignment)i(statements)f(\(like)e(helper)i(function)g(calls\),)f (but)h(in)f(this)g(case,)h(the)f(P2V)g(pre-)300 4800 y(processor)f(\(described)g(in)f(Chapter)g(4\))g(needs)h(some)g(hints)f (about)h(the)f(properties)g(that)g(are)g(changed)i(by)f(the)f (statement)g(in)300 4892 y(order)e(to)f(correctly)h(categorize)g(each)g (property)-5 b(.)26 b(For)18 b(simplicity)-5 b(,)18 b(in)h(this)f (dissertation,)g(we)h(assume)g(all)f(actions)h(consist)g(of)300 4983 y(assignment)h(statements.)1905 5349 y FP(33)p eop %%Page: 34 46 34 45 bop 299 391 a FP(split)23 b(into)g(two)f(groups;)j(those)f(that)f (need)g(to)f(be)h(executed)i(prior)e(to)f(the)h(T)-8 b(-rule')j(s)23 b(test,)g(and)g(those)h(that)300 561 y(can)h(be)g(executed)i(after)f(a)e(successful)k(test.)35 b(These)25 b(groups)i(of)e(statements)i(comprise,)f(respectively)-6 b(,)298 730 y(the)22 b FD(pr)m(e-test)i FP(and)e FD(post-test)j FP(statements)f(of)e(the)g(T)-8 b(-rule.)2083 697 y Fv(4)2153 730 y FP(It)21 b(is)h(important)h(to)f(remember)g(that)h(the)f(pre-)300 899 y(test)k(actions)i(are)e(carried)h(out)f(prior)h(to)e(the)h(test;)i (the)e(post-test)i(actions)g(are)e(performed)h(only)g(if)e(a)h(T)-8 b(-)300 1069 y(rule')j(s)25 b(test)g(evaluates)h(to)e(TRUE,)d(and)k (all)f(post-test)i(actions)g(are)e(performed)i(immediately)-6 b(,)25 b(with)f(no)300 1238 y(intermediate)i(optimization)h(of)c(any)h (descendant)j(nodes)d(of)g(the)g(root)g(of)f FH(E)5 b FP(.)580 1408 y(W)-7 b(e)20 b(now)g(de\256ne)h(the)g(actions)h(and)f (tests)g(of)f(a)g(T)-8 b(-rule)21 b(more)f(precisely)-6 b(.)33 b(Let)19 b FH(O)3061 1422 y Fs(i)3110 1408 y FP(be)h(an)h (abstract)300 1577 y(operator)31 b(of)e FH(E)807 1544 y FB(0)831 1577 y FP(,)g(and)h(let)f Fp(O)1241 1592 y Fo(i)1296 1577 y FP(be)g(its)g(descriptor)-5 b(.)50 b(Similarly)-6 b(,)31 b(let)f FH(I)2497 1591 y Fs(i)2553 1577 y FP(be)f(an)g(abstract) i(operator)h(of)d FH(E)300 1746 y FP(and)e(let)f Fp(I)613 1761 y Fo(i)665 1746 y FP(be)h(its)f(descriptor)-5 b(.)43 b(\()p FH(I)1379 1760 y Fs(i)1433 1746 y FP(is)26 b(an)g(operator)j (that)e(is)f(input)h(to)g(the)f(rule)h(and)g FH(O)3045 1760 y Fs(i)3099 1746 y FP(is)g(an)f(operator)300 1916 y(that)h(is)g(output)h(by)f(the)g(rule.\))41 b(Let)26 b FH(M)1530 1930 y Fs(j)1592 1916 y FP(denote)i(the)f FH(j)5 b FP(th)27 b(descriptor)j(property)-6 b(.)42 b(Thus,)27 b Fp(O)3200 1931 y Fo(i)3227 1916 y FH(:M)3340 1930 y Fs(j)3402 1916 y FP(is)g(the)300 2085 y(value)e(of)f(the)g FH(j)5 b FP(th)24 b(property)i(of)e(descriptor)j Fp(O)1785 2100 y Fo(i)1811 2085 y FP(.)k(The)24 b(left-hand)i(side)f(of)e(an)h (assignment)i(refers)f(to)f(an)300 2254 y(output)29 b(descriptor)h(\()p Fp(O)1058 2269 y Fo(i)1085 2254 y FP(\))d(or)g(a)g(member)h(of)f(an)g (output)i(descriptor)i(\()p Fp(O)2609 2269 y Fo(i)2635 2254 y FH(:M)2748 2268 y Fs(j)2785 2254 y FP(\).)42 b(The)27 b(right-hand)k(side)300 2424 y(is)24 b(an)h(expression)i(or)e(a)f (helper)h(function)i(call)e(that)g(only)g(references)i(input)f (descriptors)h(and/or)f(their)300 2593 y(members.)31 b(Here)24 b(are)f(a)g(few)g(examples:)512 2814 y Fp(O)591 2829 y Fo(i)701 2814 y FA(=)83 b Fp(I)895 2829 y Fo(k)964 2814 y FA(;)726 b FH(==)24 b FP(copy)g(descriptor)j Fp(I)2455 2829 y Fo(k)2524 2814 y FP(to)d Fp(O)2697 2829 y Fo(i)363 2984 y Fp(O)442 2999 y Fo(i)468 2984 y FH(:M)581 2998 y Fs(j)701 2984 y FA(=)83 b Fp(I)895 2999 y Fo(k)941 2984 y FH(:M)1054 2998 y Fs(j)1111 2984 y FA(+)20 b(4)k(;)419 b FH(==)24 b FP(expression)i(de\256ning)f Fp(O)2640 2999 y Fo(i)2666 2984 y FH(:M)2779 2998 y Fs(j)342 3153 y Fp(O)421 3167 y Fo(3)465 3153 y FH(:M)578 3167 y Fv(5)701 3153 y FA(=)83 b FP(foo)23 b FA(\()p Fp(I)1073 3167 y Fo(1)1118 3153 y FH(:M)1231 3167 y Fv(5)1271 3153 y FH(;)15 b Fp(I)1351 3167 y Fo(2)1396 3153 y FH(:M)1509 3167 y Fv(5)1549 3153 y FA(\))23 b(;)83 b FH(==)24 b FP(helper)h(function)h (foo)d(that)i(computes)g Fp(O)3158 3167 y Fo(3)3202 3153 y FH(:M)3315 3167 y Fv(5)1715 3322 y FH(==)f FP(from)f(inputs)i Fp(I)2313 3336 y Fo(1)2358 3322 y FH(:M)2471 3336 y Fv(5)2533 3322 y FP(and)f Fp(I)2727 3336 y Fo(2)2772 3322 y FH(:M)2885 3336 y Fv(5)2925 3322 y FP(.)583 3518 y(The)k(test)g(for)g(a)f(T)-8 b(-rule')j(s)29 b(applicability)i(is)d(a)f(boolean)j(expression)g(and)f (normally)g(involves)295 3687 y(checks)20 b(on)f(the)g(values)i(of)e (output)h(descriptors)i(\(e.g.,)d Fp(O)2092 3701 y Fo(3)2137 3687 y FH(:M)2250 3701 y Fv(5)2315 3687 y FH(>)25 b FA(6)p FP(\);)20 b(occasionally)-6 b(,)24 b(helper)c(functions)300 3857 y(may)j(be)h(needed.)302 4126 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(8)t(.)166 b(The)28 b(associativity)k(of)27 b(JOINs)h(is)g (expressed)i(by)e(T)-8 b(-rule)28 b(\(3.2\))g(in)g(Figure)h(3.5\(a\).) 300 4295 y(It)d(rewrites)h(a)f(two-way)h(join)f(into)h(an)g(equivalent) i(operator)f(tree.)40 b(The)25 b(\(single\))j(pre-test)h(statement)300 4464 y(computes)i(the)e(list)h(of)f(attributes)i(of)e(the)h(new)f(JOIN) f(node)i(on)f(the)h(right)g(side.)48 b(The)28 b(test)i(of)f(the)h(T)-8 b(-)300 4634 y(rule)20 b(consists)h(of)e(a)f(call)i(to)f(the)g(helper)i (function)g(\252is)p 1958 4634 28 4 v 34 w(associative\272,)i(which)d (returns)g(TRUE)d(or)i(F)-7 b(ALSE)300 4803 y(depending)33 b(on)e(whether)h(the)e(T)-8 b(-rule)31 b(is)f(applicable.)55 b(If)30 b(it)g(is)h(not,)h(then)f(the)g(rule)g(is)f(rejected)j(\(e.g.,) p 300 4884 1320 4 v 400 4938 a Fu(4)434 4970 y Fy(It)23 b(may)g(be)g(possible)g(to)g(use)g(data-\257ow)f(analysis)h(to)g (partition)g(the)f(assignment)i(statements)f(automatically)-5 b(,)24 b(but)f(for)300 5061 y(now)-5 b(,)19 b(we)g(let)f(the)h(DBI)g (do)g(the)g(partitioning.)1905 5349 y FP(34)p eop %%Page: 35 47 35 46 bop 300 403 3287 4 v 300 2581 4 2178 v 387 478 a FF(JOIN)p Fv(\()p FF(JOIN)p Fv(\()p Fs(S)772 487 y Fu(1)807 478 y Fs(;)12 b(S)882 487 y Fu(2)916 478 y Fv(\))20 b(:)g Fo(D)1065 487 y Fm(4)1103 478 y Fs(;)12 b(S)1178 487 y Fu(3)1212 478 y Fv(\))20 b(:)g Fo(D)1361 487 y Fm(5)1419 478 y Fv(=)-12 b FB(\))19 b FF(JOIN)p Fv(\()p Fs(S)1766 487 y Fu(1)1801 478 y Fs(;)12 b FF(JOIN)p Fv(\()p Fs(S)2047 487 y Fu(2)2081 478 y Fs(;)g(S)2156 487 y Fu(3)2190 478 y Fv(\))20 b(:)g Fo(D)2339 487 y Fm(6)2378 478 y Fv(\))g(:)f Fo(D)2526 487 y Fm(7)3395 478 y FF(\(3.2\))387 557 y FB(ff)603 635 y Fo(D)665 644 y Fm(6)704 635 y Fs(:)p FF(attributes)k Fv(=)c FF(union)f Fv(\()p Fo(D)1322 644 y Fm(2)1361 635 y Fs(:)p FF(attributes)s Fs(;)11 b Fo(D)1721 644 y Fm(3)1760 635 y Fs(:)p FF(attributes)s Fv(\))17 b(;)387 714 y FB(gg)387 793 y FF(is)p 435 793 20 4 v 24 w(associative)k Fv(\()p Fo(D)853 802 y Fm(5)892 793 y Fs(:)p FF(join)p 1018 793 V 25 w(predicate)s Fs(;)12 b Fo(D)1376 802 y Fm(2)1415 793 y Fs(:)p FF(attributes)r Fv(\))387 872 y FB(ff)603 951 y Fo(D)665 960 y Fm(7)724 951 y Fv(=)19 b Fo(D)860 960 y Fm(5)916 951 y Fv(;)603 1030 y Fo(D)665 1039 y Fm(7)704 1030 y Fs(:)p FF(join)p 830 1030 V 25 w(predicate)k Fv(=)c Fo(D)1250 1039 y Fm(4)1289 1030 y Fs(:)p FF(join)p 1415 1030 V 25 w(predicate)h Fv(;)603 1109 y Fo(D)665 1118 y Fm(6)704 1109 y Fs(:)p FF(join)p 830 1109 V 25 w(predicate)j Fv(=)c Fo(D)1250 1118 y Fm(5)1289 1109 y Fs(:)p FF(join)p 1415 1109 V 25 w(predicate)h Fv(;)603 1188 y Fo(D)665 1197 y Fm(6)704 1188 y Fs(:)p FF(record)p 896 1188 V 25 w(width)h Fv(=)f Fo(D)1225 1197 y Fm(2)1264 1188 y Fs(:)p FF(record)p 1456 1188 V 25 w(width)d Fv(+)e Fo(D)1776 1197 y Fm(3)1815 1188 y Fs(:)p FF(record)p 2007 1188 V 25 w(width)j Fv(;)603 1266 y Fo(D)665 1275 y Fm(6)704 1266 y Fs(:)p FF(cardinality)23 b Fv(=)d FF(compute)p 1333 1266 V 26 w(cardinality)g Fv(\()p Fo(D)1744 1275 y Fm(2)1784 1266 y Fs(;)11 b Fo(D)1877 1275 y Fm(3)1916 1266 y Fv(\))17 b(;)387 1345 y FB(gg)1535 1496 y Fy(\(a\))i(Join)g(associativity)g(T)-7 b(-rule)p 351 1598 3185 4 v 791 1703 a tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 791 1703 a FF(JOIN)538 1700 y Fs(b)568 1709 y Fu(2)623 1700 y Fv(=)19 b Fs(c)728 1709 y Fu(1)649 1845 y tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 649 1845 a FF(JOIN)393 1841 y Fs(a)430 1850 y Fu(1)485 1841 y Fv(=)g Fs(b)589 1850 y Fu(1)517 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 517 1987 a FF(RET)800 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 800 1987 a FF(RET)942 1845 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 942 1845 a FF(RET)536 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 536 2124 a Fs(R)589 2133 y Fu(1)819 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 819 2124 a Fs(R)872 2133 y Fu(2)961 1983 y tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 961 1983 a Fs(R)1014 1992 y Fu(3)580 2106 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 580 2106 a 580 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 580 2106 a 580 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNodejoinr1r2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 580 2106 a 580 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 580 2106 a 580 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 580 2106 a 580 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 580 2106 a 580 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3 /TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 580 2106 a 1071 1907 a Fv(=)-12 b FB(\))1322 1703 y tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 1322 1703 a FF(JOIN)1491 1700 y Fs(a)1528 1709 y Fu(1)1582 1700 y Fv(=)20 b Fs(b)1687 1709 y Fu(1)1463 1845 y tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 1463 1845 a FF(JOIN)1636 1841 y Fs(b)1666 1850 y Fu(2)1720 1841 y Fv(=)g Fs(c)1826 1850 y Fu(1)1189 1845 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1189 1845 a FF(RET)1331 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1331 1987 a FF(RET)1614 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1614 1987 a FF(RET)1208 1983 y tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1208 1983 a Fs(R)1261 1992 y Fu(1)1350 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1350 2124 a Fs(R)1403 2133 y Fu(2)1633 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1633 2124 a Fs(R)1686 2133 y Fu(3)1252 2106 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1252 2106 a 1252 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNodejoinr2r3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1252 2106 a 1252 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1252 2106 a 1252 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3 /TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1252 2106 a 1252 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1252 2106 a 1252 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1252 2106 a 1252 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3 /TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1252 2106 a 425 2274 a Fy(\(b\))13 b(Example)g(of)g(the)h(associativity)f(rule)g (applied)h(to)425 2365 y(an)19 b(operator)h(tree)p 1863 2556 4 958 v 2364 1703 a tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2364 1703 a FF(JOIN)2108 1691 y Fs(a)2145 1700 y Fu(2)2199 1691 y Fv(=)g Fs(c)2305 1700 y Fu(1)2222 1845 y tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2222 1845 a FF(JOIN)1966 1841 y Fs(a)2003 1850 y Fu(1)2058 1841 y Fv(=)f Fs(b)2162 1850 y Fu(1)2090 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2090 1987 a FF(RET)2373 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2373 1987 a FF(RET)2515 1845 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2515 1845 a FF(RET)2109 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2109 2124 a Fs(R)2162 2133 y Fu(1)2392 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2392 2124 a Fs(R)2445 2133 y Fu(2)2534 1983 y tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2534 1983 a Fs(R)2587 1992 y Fu(3)2152 2106 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2152 2106 a 2152 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2152 2106 a 2152 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNodejoinr1r2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2152 2106 a 2152 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2152 2106 a 2152 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2152 2106 a 2152 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2152 2106 a 2152 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3 /TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2152 2106 a 2644 1907 a Fv(=)-12 b FB(\))2684 1910 y Fs(=)2894 1703 y tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2894 1703 a FF(JOIN)3036 1845 y tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 3036 1845 a FF(JOIN)2762 1845 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2762 1845 a FF(RET)2904 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2904 1987 a FF(RET)3187 1987 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 3187 1987 a FF(RET)2781 1983 y tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2781 1983 a Fs(R)2834 1992 y Fu(1)2922 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 2922 2124 a Fs(R)2975 2133 y Fu(2)3206 2124 y tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 3206 2124 a Fs(R)3259 2133 y Fu(3)2825 2106 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2825 2106 a 2825 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr1r2r3 /TheNodejoinr2r3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2825 2106 a 2825 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2825 2106 a 2825 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinr2r3 /TheNoderetr3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2825 2106 a 2825 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2825 2106 a 2825 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2825 2106 a 2825 2106 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr3 /TheNoder3 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2825 2106 a 2019 2274 a Fy(\(c\))20 b(Example)h(of)f(an)h(operator)g(tree)f(where)h(the)f(as-)2019 2365 y(sociativity)13 b(rule)g(does)h(not)g(apply)f(because)i(a)e (cross-)2019 2457 y(product)20 b(would)f(result)p 3583 2581 4 2178 v 300 2584 3287 4 v 3585 2601 19 2185 v 317 2601 3287 19 v 1300 2797 a FP(Figure)24 b(3.5:)31 b(Join)25 b(associativity)i(T)-8 b(-rule)300 3173 y(because)27 b(it)d(generates)k(a)c(cross-product\),)30 b(otherwise)c(the)f (post-test)i(statements)g(are)e(executed.)38 b(The)300 3343 y(post-test)26 b(statements)f(compute)g(various)g(other)f (annotations)j(of)c(the)h(new)f(nodes)h(that)g(are)g(generated)300 3512 y(by)d(applying)j(the)d(T)-8 b(-rule.)30 b(Note)21 b(the)h(use)f(of)h(helper)g(functions)i(\252compute)p 2681 3512 28 4 v 35 w(cardinality\272)h(and)c(\252union\272)300 3681 y(to)i(compute)i(descriptor)i(properties.)583 3851 y(Consider)d(three)g(relations)g FH(R)1540 3865 y Fv(1)1580 3851 y FP(,)e FH(R)1694 3865 y Fv(2)1755 3851 y FP(and)h FH(R)1977 3865 y Fv(3)2016 3851 y FP(,)f(and)g(let)h FH(a)2374 3865 y Fs(i)2402 3851 y FP(,)f FH(b)2486 3865 y Fs(i)2536 3851 y FP(and)h FH(c)2728 3865 y Fs(i)2778 3851 y FP(be)f(their)h(respective)j(sets)300 4020 y(of)20 b(attributes.)32 b(Figures)22 b(3.5\(b\))f(and)f(3.5\(c\))h(show)-6 b(,)21 b(respectively)-6 b(,)24 b(examples)e(of)e(the)h(applicability)j (and)300 4189 y(non-applicability)29 b(of)23 b(the)h(join)g (associativity)k(T)-8 b(-rule.)1470 b Fw(\003)300 4622 y FO(3.6)119 b(Implementation)30 b(Rules)294 4885 y FP(Implementation) 22 b(rules,)e(or)e(I-rules)i(for)f(short,)h(de\256ne)f(equivalences)j (between)d(expressions)j(and)d(their)300 5055 y(implementing)29 b(algorithms.)41 b(Let)25 b FH(E)31 b FP(be)26 b(an)h(expression)i(and) e FH(A)e FP(be)i(an)f(algorithm)i(that)f(implements)1905 5349 y(35)p eop %%Page: 36 48 36 47 bop 312 403 3260 4 v 312 1071 4 669 v 386 478 a Fs(E)t Fv(\()p Fs(x)509 487 y Fu(1)543 478 y Fs(;)11 b(:)g(:)h(:)23 b(;)11 b(x)751 486 y Fn(n)794 478 y Fv(\))20 b(:)f Fo(D)942 487 y Fm(1)1000 478 y Fv(=)-12 b FB(\))20 b Fs(A)p Fv(\()p Fs(x)1254 487 y Fu(1)1288 478 y Fs(;)12 b(:)f(:)g(:)24 b(;)11 b(x)1497 486 y Fn(n)1539 478 y Fv(\))20 b(:)f Fo(D)1687 487 y Fm(2)3393 478 y FF(\(3.3\))386 557 y(test)386 635 y FB(ff)601 714 y FF(pre-opt)g(statements)386 793 y FB(gg)386 872 y(ff)601 951 y FF(post-opt)g(statements)386 1030 y FB(gg)p 3568 1071 V 312 1074 3260 4 v 3570 1091 19 675 v 328 1091 3260 19 v 1166 1287 a FP(Figure)24 b(3.6:)31 b(General)25 b(form)e(of)h(a)f(Prairie)h(I-rule)300 1664 y FH(E)5 b FP(.)30 b(The)23 b(general)j(form)d(of)h(an)f(I-rule)i (is)e(given)i(by)f(Equation)h(\(3.3\))e(\(shown)i(in)e(Figure)h(3.6\).) 580 1833 y(The)19 b(actions)j(associated)h(with)d(an)g(I-rule)h(are)g (de\256ned)g(in)f(three)h(parts.)30 b(The)20 b(\256rst)g(part,)h(or)f FD(test)p FP(,)300 2002 y(is)j(a)g(boolean)j(expression)h(whose)d (value)g(determines)i(whether)e(or)g(not)g(the)g(rule)g(can)g(be)f (applied.)583 2172 y(The)h(second)i(part,)e(or)g FD(pr)m(e-opt)h (statements)p FP(,)h(is)e(a)f(set)h(of)g(descriptor)j(assignment)f (statements)300 2341 y(that)g(are)f(executed)j(only)e(if)f(the)g(test)h (is)f(true)h(and)f FD(befor)m(e)i FP(any)e(descendant)k(of)c(the)g (root)h(of)f FH(E)30 b FP(is)25 b(opti-)300 2511 y(mized.)37 b(Additional)28 b(parameters)g(of)d(nodes)i(are)f(usually)h(assigned)h (in)e(the)g(pre-opt)h(section.)39 b(This)25 b(is)300 2680 y(necessary)h(before)f(any)f(of)f(the)h(nodes)h(on)f(the)g(right)g (side)g(can)g(be)g(optimized.)583 2849 y(The)k(third)g(part,)h(or)f FD(post-opt)i(statements)p FP(,)g(is)e(a)f(set)h(of)g(descriptor)i (assignment)g(statements)300 3019 y(that)h(are)g(evaluated)i FD(after)e FP(all)g(descendants)i FH(x)1827 3033 y Fs(i)1885 3019 y FP(of)e(the)f(root)h(of)g FH(E)k FP(are)30 b(optimized.)53 b(Normally)-6 b(,)33 b(the)300 3188 y(post-opt)c(statements)f(compute)g (properties)i(that)d(can)g(only)g(be)g(determined)i(once)e(the)g (inputs)h(to)f(the)300 3357 y(algorithm)e(are)f(completely)i(optimized) f(and)f(their)g(properties)j(known.)302 3626 y(E)t Fx(X)t(A)t(M)t(P)t (L)t(E)j FP(9)t(.)169 b(I-rule)31 b(\(3.4\))f(\(shown)h(in)f(Figure)h (3.7\))f(selects)i(the)e(Nested)p 2891 3626 28 4 v 34 w(loops)h(algorithm)h(to)300 3796 y(implement)24 b(the)f(JOIN)g (operator)-5 b(.)32 b(The)23 b(test)g(for)h(this)f(rule)h(is)f(TRUE)d (since)k(Nested)p 2979 3796 V 34 w(loops)g(can)g(be)f(ap-)300 3965 y(plied)31 b(regardless)h(of)d(any)h(property)i(values.)50 b(The)29 b(pre-opt)i(section)g(consists)h(of)d(three)i(assignment)300 4134 y(statements.)k(The)24 b(\256rst)g(statement)i(sets)f(the)f (descriptor)k(of)c(Nested)p 2478 4134 V 34 w(loops)i(to)e(that)h(of)f (the)g(JOIN.)g(The)300 4304 y(next)h(two)f(statements)j(express)f(the)f (fact)g(that)g(the)g(tuple)g(order)h(of)e(Nested)p 2710 4304 V 34 w(loops)i(is)e(the)h(same)g(as)f(the)300 4473 y(tuple)e(order)f(of)g(its)g(left)g(\(outer\))h(input;)h(all)e(other)g (properties)j(remain)d(the)g(same.)30 b(The)20 b(third)i(statement)300 4643 y(in)e(the)g(pre-opt)i(section)g(ensures)g(that)f(this)f (requirement)j(is)d(met)g(by)g(setting)i(the)e(tuple)p 3059 4643 V 34 w(order)i(of)e FH(S)3451 4657 y Fv(1)3509 4643 y FP(on)300 4812 y(the)f(right)h(side.)787 4779 y Fv(5)857 4812 y FP(The)e(fourth)j(statement)g(computes)f(the)g(cost)g (of)f(using)h(the)f(Nested)p 2979 4812 V 34 w(loops)i(algorithm.)p 300 4893 1320 4 v 400 4947 a Fu(5)434 4979 y Fy(Actually)-5 b(,)18 b(it)e(is)h(not)g(enough)i(to)e(simply)h(set)f(the)g(desired)g (tuple)h(order)f(of)g Fq(S)2400 4987 y Fu(1)2435 4979 y Fy(;)g(it)g(is)f(also)i(necessary)g(to)f(ensure)h(that)f Fr(after)300 5070 y Fy(optimization,)23 b Fq(S)766 5078 y Fu(1)823 5070 y Fy(does)g(indeed)g(have)g(the)f(required)h(property) -5 b(.)35 b(One)23 b(way)f(to)g(satisfy)g(this)g(is)g(to)g(insert)g(a)g (SOR)l(T)f(node)i(in)1905 5349 y FP(36)p eop %%Page: 37 49 37 48 bop 312 403 3260 4 v 312 1308 4 905 v 386 478 a FF(JOIN)o Fv(\()p Fs(S)599 487 y Fu(1)634 478 y Fs(;)12 b(S)709 487 y Fu(2)743 478 y Fv(\))20 b(:)g Fo(D)892 487 y Fm(3)950 478 y Fv(=)-12 b FB(\))19 b FF(Nested)p 1270 478 20 4 v 26 w(loops)q Fv(\()p Fs(S)1506 487 y Fu(1)1560 478 y Fv(:)g Fo(D)1661 487 y Fm(4)1700 478 y Fs(;)12 b(S)1775 487 y Fu(2)1809 478 y Fv(\))20 b(:)g Fo(D)1958 487 y Fm(5)3393 478 y FF(\(3.4\))386 557 y(TRUE)386 635 y FB(ff)601 714 y Fo(D)663 723 y Fm(5)722 714 y Fv(=)f Fo(D)858 723 y Fm(3)914 714 y Fv(;)601 793 y Fo(D)663 802 y Fm(4)722 793 y Fv(=)g Fo(D)858 802 y Fm(1)914 793 y Fv(;)601 872 y Fo(D)663 881 y Fm(4)702 872 y Fs(:)p FF(tuple)p 857 872 V 26 w(order)h Fv(=)g Fo(D)1175 881 y Fm(3)1214 872 y Fs(:)p FF(tuple)p 1369 872 V 25 w(order)e Fv(;)601 951 y Fo(D)663 960 y Fm(5)702 951 y Fs(:)p FF(cost)j Fv(=)e Fo(D)985 960 y Fm(4)1024 951 y Fs(:)p FF(cardinality)g FB(\003)d Fo(D)1456 960 y Fm(2)1495 951 y Fs(:)p FF(cardinality)21 b Fv(;)386 1030 y FB(gg)386 1109 y(ff)601 1188 y Fo(D)663 1197 y Fm(5)702 1188 y Fs(:)p FF(tuple)p 857 1188 V 26 w(order)f Fv(=)g Fo(D)1175 1197 y Fm(4)1214 1188 y Fs(:)p FF(tuple)p 1369 1188 V 25 w(order)e Fv(;)386 1266 y FB(gg)p 3568 1308 4 905 v 312 1311 3260 4 v 3570 1328 19 912 v 328 1328 3260 19 v 1387 1524 a FP(Figure)24 b(3.7:)31 b(Nested)24 b(loops)h(I-rule)p 312 1844 3260 4 v 312 2592 4 748 v 386 1919 a FF(SOR)l(T)o Fv(\()p Fs(S)621 1928 y Fu(1)656 1919 y Fv(\))20 b(:)g Fo(D)805 1928 y Fm(2)863 1919 y Fv(=)-12 b FB(\))19 b FF(Mer)o(ge)p 1171 1919 20 4 v 25 w(sort)q Fv(\()p Fs(S)1362 1928 y Fu(1)1397 1919 y Fv(\))h(:)f Fo(D)1545 1928 y Fm(3)3393 1919 y FF(\(3.5\))386 1998 y Fv(\()p Fo(D)475 2007 y Fm(2)514 1998 y Fs(:)p FF(tuple)p 669 1998 V 25 w(order)f Fv(!)8 b(=)19 b FF(DONT)p 1138 1998 V 23 w(CARE)p Fv(\))386 2077 y FB(ff)601 2156 y Fo(D)663 2165 y Fm(3)722 2156 y Fv(=)g Fo(D)858 2165 y Fm(2)914 2156 y Fv(;)601 2235 y Fo(D)663 2244 y Fm(3)702 2235 y Fs(:)p FF(cost)i Fv(=)e Fo(D)985 2244 y Fm(3)1024 2235 y Fs(:)p FF(cardinality)g FB(\003)d Fv(log)r(\()p Fo(D)1575 2244 y Fm(3)1614 2235 y Fs(:)p FF(cardinality)t Fv(\))h(;)386 2313 y FB(gg)386 2392 y(ff)386 2550 y(gg)p 3568 2592 4 748 v 312 2595 3260 4 v 3570 2611 19 754 v 328 2611 3260 19 v 1426 2807 a FP(Figure)24 b(3.8:)31 b(Mer)n(ge)24 b(sort)g(I-rule)583 3182 y(The)19 b(post-opt)i(section)g(is)e(executed)j(after)d FH(S)1996 3196 y Fv(1)2054 3182 y FP(and)h FH(S)2260 3196 y Fv(2)2317 3182 y FP(are)f(optimized;)k(it)c(consists)i(of)e(a)g (single)300 3351 y(statement)g(that)e(assigns)i(the)e(tuple)p 1408 3351 28 4 v 35 w(order)h(of)f(the)g(Nested)p 2121 3351 V 34 w(loops)h(node.)30 b(The)16 b(Nested)p 3004 3351 V 34 w(loops)i(algorithm)300 3520 y(returns)25 b(its)f(stream)g (in)f(the)h(same)g(order)g(as)g(its)f(left)h(input.)1370 b Fw(\003)302 3853 y FP(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(1)t(0)t(.)171 b(Figure)32 b(3.8)f(shows)h(the)g(I-rule)h(that)f (implements)h(the)f(SOR)-5 b(T)28 b(operator)34 b(using)300 4022 y(Mer)n(ge)p 539 4022 V 34 w(sort.)60 b(I-rule)34 b(\(3.5\))f(rewrites)h(a)f(stream)g(such)h(that)f(it)g(is)g(sorted)h (using)g(the)f(Mer)n(ge)p 3306 4022 V 35 w(sort)g(al-)300 4192 y(gorithm.)49 b(The)29 b(test)g(for)h(this)g(I-rule)g(is)f(that)h (the)f(tuple)h(order)h(of)e(the)g(sorted)i(stream)f(must)f(not)g(be)h (a)p 300 4271 1320 4 v 300 4357 a Fy(front)20 b(of)g Fq(S)594 4365 y Fu(1)649 4357 y Fy(that)g(can)g(meet)g(the)h (sortedness)g(requirement)g(of)f Fq(S)2022 4365 y Fu(1)2056 4357 y Fy(.)28 b(Thus,)21 b(in)f(this)g(case,)g(we)g(would)h(need)g(a)f (T)-7 b(-rule)20 b(\(which)300 4448 y(introduces)g(a)f(new)g(operator)h (JOPR\),)300 4611 y(JOIN)p Fl(\()p Fq(S)539 4619 y Fu(1)573 4611 y Fq(;)13 b(S)654 4619 y Fu(2)689 4611 y Fl(\))21 b(:)h Fk(D)851 4619 y Fm(3)910 4611 y Fl(=)-13 b Fj(\))22 b Fy(JOPR)o Fl(\()p Fy(SOR)l(T)n Fl(\()p Fq(S)1523 4619 y Fu(1)1558 4611 y Fl(\))f(:)h Fk(D)1720 4619 y Fm(4)1758 4611 y Fq(;)13 b Fy(SOR)l(T)o Fl(\()p Fq(S)2056 4619 y Fu(2)2090 4611 y Fl(\))21 b(:)h Fk(D)2252 4619 y Fm(5)2290 4611 y Fl(\))f(:)h Fk(D)2452 4619 y Fm(6)2491 4611 y Fq(;)300 4774 y Fy(and)e(an)f(I-rule,)300 4937 y(JOPR)o Fl(\()p Fq(S)551 4945 y Fu(1)586 4937 y Fq(;)13 b(S)667 4945 y Fu(2)701 4937 y Fl(\))22 b(:)f Fk(D)863 4945 y Fm(3)923 4937 y Fl(=)-13 b Fj(\))21 b Fy(Nested)p 1279 4937 23 4 v 27 w(loops)q Fl(\()p Fq(S)1541 4945 y Fu(1)1597 4937 y Fl(:)h Fk(D)1708 4945 y Fm(4)1746 4937 y Fq(;)13 b(S)1827 4945 y Fu(2)1862 4937 y Fl(\))21 b(:)h Fk(D)2024 4945 y Fm(5)2062 4937 y Fq(:)300 5100 y Fy(In)d(our)g(discussions,)h (this)f(additional)g(level)g(of)g(detail)g(will)f(be)h(ignored)h(for)f (the)g(sake)g(of)g(simplicity)-5 b(.)1905 5349 y FP(37)p eop %%Page: 38 50 38 49 bop 313 303 3258 4 v 313 1446 4 1144 v 432 403 a Fs(O)r Fv(\()p Fs(S)558 412 y Fu(1)593 403 y Fv(\))20 b(:)f Fo(D)741 412 y Fm(2)800 403 y Fv(=)-12 b FB(\))19 b FF(Null)q Fv(\()p Fs(S)1121 412 y Fu(1)1176 403 y Fv(:)g Fo(D)1277 412 y Fm(3)1316 403 y Fv(\))h(:)f Fo(D)1464 412 y Fm(4)1790 403 y FF(\(3.6\))432 482 y(TRUE)432 561 y FB(ff)648 640 y Fo(D)710 649 y Fm(4)769 640 y Fv(=)g Fo(D)905 649 y Fm(2)961 640 y Fv(;)648 718 y Fo(D)710 727 y Fm(3)769 718 y Fv(=)g Fo(D)905 727 y Fm(1)961 718 y Fv(;)648 797 y Fo(D)710 806 y Fm(3)749 797 y Fs(:)p FF(property)i Fv(=)f Fo(D)1150 806 y Fm(2)1189 797 y Fs(:)p FF(property)e Fv(;)432 876 y FB(gg)432 955 y(ff)648 1034 y Fo(D)710 1043 y Fm(4)749 1034 y Fs(:)p FF(cost)i Fv(=)g Fo(D)1032 1043 y Fm(3)1071 1034 y Fs(:)p FF(cost)d Fv(;)432 1113 y FB(gg)645 1325 y Fy(\(a\))h(General)i(form)f(of)f(a)h (\252Null\272)g(I-rule)p 1963 1422 4 1094 v 2012 378 a FF(SOR)l(T)o Fv(\()p Fs(S)2247 387 y Fu(1)2282 378 y Fv(\))h(:)g Fo(D)2431 387 y Fm(2)2489 378 y Fv(=)-12 b FB(\))19 b FF(Null)q Fv(\()p Fs(S)2810 387 y Fu(1)2865 378 y Fv(:)g Fo(D)2966 387 y Fm(3)3005 378 y Fv(\))h(:)f Fo(D)3153 387 y Fm(4)3369 378 y FF(\(3.7\))2012 482 y(TRUE)2012 561 y FB(ff)2227 640 y Fo(D)2289 649 y Fm(4)2348 640 y Fv(=)g Fo(D)2484 649 y Fm(2)2540 640 y Fv(;)2227 718 y Fo(D)2289 727 y Fm(3)2348 718 y Fv(=)g Fo(D)2484 727 y Fm(1)2540 718 y Fv(;)2227 797 y Fo(D)2289 806 y Fm(3)2328 797 y Fs(:)p FF(tuple)p 2483 797 20 4 v 26 w(order)h Fv(=)g Fo(D)2801 806 y Fm(2)2840 797 y Fs(:)p FF(tuple)p 2995 797 V 25 w(order)e Fv(;)2012 876 y FB(gg)2012 955 y(ff)2227 1034 y Fo(D)2289 1043 y Fm(4)2328 1034 y Fs(:)p FF(cost)j Fv(=)e Fo(D)2611 1043 y Fm(3)2650 1034 y Fs(:)p FF(cost)e Fv(;)2012 1113 y FB(gg)2466 1325 y Fy(\(b\))h(Null)h(sort)g (I-rule)p 3567 1446 4 1144 v 313 1449 3258 4 v 3569 1466 19 1150 v 330 1466 3258 19 v 1191 1662 a FP(Figure)24 b(3.9:)32 b(The)23 b(\252Null\272)h(algorithm)h(concept)300 2039 y(DONT)p 559 2039 28 4 v 31 w(CARE)h(order)-5 b(.)47 b(The)29 b(pre-opt)h(section)g(consists)h(of)d(two)h(statements.)47 b(The)29 b(\256rst)f(copies)i(the)300 2208 y(descriptor)23 b(from)d(the)h(left)g(side)g(to)f(the)h(expression)i(on)d(the)h(right,) h(and)e(the)h(second)h(computes)g(the)f(cost)300 2378 y(of)i(using)i(Mer)n(ge)p 857 2378 V 35 w(sort.)31 b(The)23 b(post-opt)j(section)f(is)e(empty)-6 b(.)1362 b Fw(\003)300 2684 y FN(3.6.1)99 b(The)26 b(Null)e(Algorithm)579 2915 y FP(Recall)d(that,)f(in)g(Section)h(1,)f(we)f(mentioned)j(that)e (Prairie)g(allows)h(users)g(to)e(treat)i(all)f(operators)295 3084 y(and)f(algorithms)i(as)e(\256rst-class)h(objects,)i(i.e.,)c(all)h (operators)j(and)d(algorithms)i(are)e(explicit,)j(in)c(contrast)299 3254 y(to)k(enforcers)i(in)e(V)-12 b(olcano)24 b(or)e(glue)h(in)f (Starburst.)32 b(This)22 b(requires)i(that)f(Prairie)g(provide)h(a)d (mechanism)300 3423 y(where)k(users)h(can)f(also)g(\252delete\272)i (one)e(or)f(more)h(of)g(the)g(explicit)h(operators)h(from)e (expressions.)37 b(This)300 3592 y(is)29 b(done)h(by)f(having)i(a)d (special)j(class)f(of)f(I-rules)h(that)g(have)g(the)f(form)g(given)h (by)f(Equation)i(\(3.6\))e(in)300 3762 y(Figure)24 b(3.9\(a\).)31 b(The)23 b(left)h(side)g(of)f(the)h(rule)g(is)f(a)g(single)h(abstract)i (operator)f FH(O)g FP(with)f(one)f(stream)h(input)300 3931 y FH(S)356 3945 y Fv(1)395 3931 y FP(.)36 b(The)25 b(right)h(side)g(of)g(the)f(rule)h(is)g(an)f(algorithm)i(called)g (\252Null\272)f(with)f(the)h(same)f(stream)h(input)h(but)299 4100 y(with)22 b(a)f(dif)n(ferent)k(descriptor)-5 b(.)33 b(As)22 b(the)g(name)h(suggests,)h(the)f(Null)f(algorithm)i(is)e (supposed)i(to)f(pass)g(its)295 4270 y(input)c(unchanged)j(to)d (algorithms)h(above)g(it)f(in)f(an)h(operator)i(tree.)29 b(This)19 b(is)f(accomplished)k(in)d(the)f(I-rule)300 4439 y(as)23 b(follows.)581 4609 y(The)e(test)h(for)f(this)h(I-rule)h (is)e(TRUE,)e(i.e.,)i(any)h(node)g(in)f(an)h(operator)h(tree)f(with)f FH(O)j FP(as)d(its)g(oper)n(-)298 4778 y(ator)h(can)f(be)h(implemented) h(by)f(the)f(Null)g(algorithm.)32 b(The)21 b(actions)i(associated)i (with)c(this)h(rule)g(have)g(a)298 4947 y(speci\256c)i(pattern.)32 b(The)21 b(pre-opt)j(section)g(consists)g(of)e(three)i(statements.)32 b(The)22 b(\256rst)f(statement)j(copies)1905 5349 y(38)p eop %%Page: 39 51 39 50 bop 300 391 a FP(the)29 b(descriptor)j(of)c(the)h(operator)i FH(O)g FP(to)e(the)g(algorithm)i(Null.)46 b(The)29 b(second)h (statement)g(sets)g(the)f(de-)299 561 y(scriptor)c(of)e(the)g(stream)g FH(S)1150 575 y Fv(1)1211 561 y FP(on)g(the)g(right)h(side)f(to)g(the)g (descriptor)i(of)e(the)g(stream)g FH(S)2981 575 y Fv(1)3043 561 y FP(on)f(the)i(left)f(side.)300 730 y(Why)k(is)h(it)f(necessary)j (to)e(do)f(this?)45 b(The)27 b(key)h(lies)g(in)f(the)h(third)h (statement.)44 b(This)28 b(statement)h(copies)297 899 y(the)22 b(property)h(\252property\272)h(of)d(the)h(operator)h FH(O)g FP(node)f(on)f(the)h(left)f(side)h(to)f(the)g(\252property\272)j (of)d(the)h(input)299 1069 y(stream)h FH(S)619 1083 y Fv(1)680 1069 y FP(on)f(the)h(right)h(side.)31 b(Since)23 b(left-hand)h(side)g(descriptors)h(cannot)f(be)f(changed)h(in)f(an)f (I-rule,)300 1238 y(a)h(new)g(descriptor)k Fp(D)1004 1252 y Fo(3)1071 1238 y FP(is)d(necessary)i(for)d FH(S)1715 1252 y Fv(1)1777 1238 y FP(to)h(convey)h(the)f(property)i(propagation)h (information.)583 1408 y(The)d(post-opt)i(section)f(in)f(the)f(I-rule)i (has)f(only)h(a)e(cost-assignment)28 b(statement;)d(this)f(simply)300 1577 y(sets)g(the)g(cost)g(of)g(the)g(Null)f(node)i(to)f(the)f(cost)i (of)e(its)h(optimized)i(input)e(stream.)32 b(The)23 b(Null)h (algorithm,)300 1746 y(therefore,)i(serves)e(to)g(ef)n(fectively)j (transform)e(a)e(single)i(operator)h(to)d(a)g(no-op.)302 2015 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(1)q(1)t(.)159 b(Equation)22 b(\(3.7\))f(\(in)f(Figure)h(3.9\(b\)\))g(shows)g(the)f (I-rule)i(that)e(rewrites)i(the)e(SOR)-5 b(T)300 2185 y(operator)20 b(to)f(use)f(a)g(Null)g(algorithm.)31 b(The)18 b(third)h(pre-opt)h(statement)g(sets)f(the)g(tuple)g(order)h(of)e FH(S)3324 2199 y Fv(1)3380 2185 y FP(on)h(the)300 2354 y(right)26 b(side)f(to)g(be)g(the)g(tuple)h(order)g(of)f(the)g(SOR)-5 b(T)22 b(node,)k(thus)g(ensuring)h(that)e(when)g FH(S)3088 2368 y Fv(1)3152 2354 y FP(is)f(optimized)300 2523 y(on)g(the)f(right)i (side,)f(it)f(will)g(have)i(the)e(same)h(tuple)h(order)f(as)g(the)f (SOR)-5 b(T)21 b(node.)721 b Fw(\003)300 2890 y FO(3.7)119 b(Advantages)30 b(of)f(Prairie)299 3153 y FP(In)23 b(the)h(previous)h (chapter)l(,)g(we)d(described)k(V)-12 b(olcano')-5 b(s)25 b(rule)f(speci\256cation)i(language)f(and)e(some)h(of)f(its)300 3322 y(problems.)32 b(Prairie)24 b(addresses)j(these)d(problems:)436 3567 y FC(\017)46 b FP(Prairie)19 b(does)f(not)h(contain)g(any)g (implicit)g(operators,)i(algorithms,)g(or)d(rules)g(\(as)h(in)e(V)-12 b(olcano;)22 b(see)527 3736 y(Section)g(2.8.1\).)30 b(This)20 b(implies)h(that)g(extending)i(a)d(Prairie)h(speci\256cation)i(is)d (simple,)h(and)g(prop-)527 3905 y(erty)j(transformations)j(are)c(also)h (simpli\256ed)f(since)i(an)e(abstraction)j(\(e.g.,)c(algorithm\))j (directly)527 4075 y(corresponds)j(to)d(a)f(concept,)i(instead)g(of)e (an)h(implementation-level)k(detail)d(\(e.g.,)e(enforcer)i(in)527 4244 y(V)-12 b(olcano\).)436 4488 y FC(\017)46 b FP(Since)21 b(properties)j(are)d(represented)j(using)f(single)f(descriptors,)i(it)d (is)g(trivial)h(to)f(add)g(new)g(prop-)527 4657 y(erties,)k(or)e (change)i(existing)h(ones.)436 4902 y FC(\017)46 b FP(Property)20 b(transformations)i(are)c(vastly)i(simpli\256ed,)g(since,)g(instead)g (of)e(a)g(multitude)i(of)e(support)527 5071 y(functions)26 b(\(as)d(required)i(by)f(V)-12 b(olcano,)24 b(T)-6 b(able)23 b(2.3\),)g(property)i(transformations)i(in)c(Prairie)h(are)1905 5349 y(39)p eop %%Page: 40 52 40 51 bop 527 391 a FP(accomplished)29 b(on)e(a)e(per)n(-rule)j(basis.) 40 b(This)25 b(is)h(seen)h(clearly)h(from)e(the)g(forms)g(of)g(the)g (general)527 561 y(rules)21 b(for)f(V)-12 b(olcano)22 b(\(Figure)f(2.8\))f(and)g(Prairie)h(\(Figure)f(3.3\).)30 b(The)20 b(only)h(support)g(function)i(that)527 730 y(Prairie)c (requires)h(is)e(init)p 1300 730 28 4 v 34 w(descriptor)j(for)d(each)h (operator)-5 b(.)31 b(Adding)19 b(algorithms)h(in)e(Prairie)h(don')n(t) 527 899 y(require)25 b(the)f(DBI)f(to)g(de\256ne)h(additional)i (support)g(functions)g(as)d(in)h(V)-12 b(olcano.)300 1266 y FO(3.8)119 b(Summary)300 1529 y FP(In)29 b(this)g(chapter)l(,)j (we)d(presented)i(the)e(rule)h(speci\256cation)h(language)h(of)d (Prairie.)47 b(Prairie)30 b(strives)g(for)300 1699 y(high-level)k (abstractions)g(that)d(insulate)i(a)e(DBI)e(from)i (implementation-level)36 b(details)c(of)f(the)g(opti-)300 1868 y(mizer)-5 b(.)54 b(\(Not)31 b(all)g(details)i(of)e(the)g (underlying)j(implementation)g(can)e(be)f(hidden)h(from)f(a)g(DBI.)f (For)300 2037 y(example,)g(the)e(top-down)i(strategy)g(is)e(evident)i (in)e(the)g(general)i(form)e(of)g(a)f(Prairie)i(I-rule)g(\(see)f(Fig-) 300 2207 y(ure)e(3.6\).)39 b(However)l(,)27 b(other)g(details)h(such)f (as)f(enforcers)j(are)d(hidden.\))40 b(The)26 b(resulting)i (environment)300 2376 y(is)23 b(streamlined,)j(robust,)f(and)f(easily)h (extensible)h(\(as)e(described)i(in)d(Section)i(3.7\).)581 2545 y(High-level)e(abstractions)i(like)d(those)g(that)g(Prairie)g (provides)i(can)d(lead)h(to)g(inef)n(\256cient)h(imple-)298 2715 y(mentations)g(of)f(optimizers)h(if)e(one)h(is)g(not)f(careful)j (in)d(compiling)i(Prairie)f(rules.)31 b(In)22 b(the)f(next)i(chapter)l (,)296 2884 y(we)d(describe)i(the)f(P2V)e(preprocessor)24 b(that)c(automatically)k(generates)e(a)e(V)-12 b(olcano)22 b(speci\256cation)h(from)300 3053 y(a)29 b(Prairie)g(speci\256cation.) 50 b(In)29 b(this)h(way)-6 b(,)30 b(the)f(advantages)j(of)d(Prairie)h (are)f(preserved)j(while)d(making)300 3223 y(use)d(of)f(V)-12 b(olcano')-5 b(s)28 b(ability)f(to)e(generate)j(ef)n(\256cient)f (optimizers.)38 b(Since)26 b(Prairie)g(provides)h(only)g(a)e(rule)300 3392 y(speci\256cation)h(environment,)g(this)e(also)g(means)g(that)g (we)f(can)h(utilize)h(V)-12 b(olcano')-5 b(s)25 b(rule)f(engine)h(for)f (the)300 3562 y(search)h(strategy)g(of)f(a)f(Prairie)h(optimizer)-5 b(.)1905 5349 y(40)p eop %%Page: 41 53 41 52 bop 2859 1118 a FG(Chapter)44 b(4)368 1657 y FM(The)51 b(Prairie-to-V)-19 b(olcano)53 b(Pr)l(epr)l(ocessor)300 2159 y FP(In)23 b(the)h(previous)h(chapter)l(,)g(we)e(described)j(the)d (rule)h(speci\256cation)i(language)g(of)d(Prairie)h(and)g(showed)300 2328 y(how)h(it)h(overcame)h(some)e(of)h(V)-12 b(olcano')-5 b(s)27 b(drawbacks)h(concerning)h(high-level)f(abstractions)h(and)d (ex-)298 2498 y(tensibility)-6 b(.)33 b(W)-7 b(e)20 b(also)i(mentioned) i(that)e(a)f(Prairie)h(speci\256cation)i(could)f(be)e(translated)j (into)e(a)f(V)-12 b(olcano)294 2667 y(speci\256cation)22 b(to)c(make)h(use)g(of)f(V)-12 b(olcano')-5 b(s)21 b(advantages,)h(and) d(to)g(make)f(it)h(compatible)h(with)f(V)-12 b(olcano')-5 b(s)293 2836 y(rule)18 b(engine.)30 b(This)17 b(chapter)i(describes)h (the)e(Prairie-to-V)-12 b(olcano)21 b(\(or)c(P2V\))g(preprocessor)k (that)c(accom-)300 3006 y(plishes)25 b(this)f(translation.)300 3372 y FO(4.1)119 b(Overview)300 3635 y FP(There)24 b(are)f(four)i (main)e(responsibilities)28 b(of)c(the)g(P2V)e(preprocessor:)436 3880 y FC(\017)46 b FP(Establishing)34 b(the)d(correspondence)36 b(between)31 b(the)h(various)g(concepts)h(of)e(Prairie)h(to)e(similar) 527 4049 y(ones)h(in)g(V)-12 b(olcano.)53 b(Speci\256cally)-6 b(,)33 b(this)e(means)g(that)g(the)f(P2V)g(preprocessor)k(must)c (translate)527 4218 y(stored)c(\256les,)e(streams,)h(operators,)h (algorithms,)g(operator)h(trees,)e(access)g(plans,)h(and)e(descrip-)527 4388 y(tors)g(into)h(V)-12 b(olcano)25 b(format.)436 4632 y FC(\017)46 b FP(T)m(ranslating)32 b(T)-8 b(-rules)29 b(into)h(V)-12 b(olcano)31 b(transformation)i(rules.)49 b(This)29 b(includes)j(translating)g(the)527 4801 y(actions)26 b(\(tests)f(and)g(property)i(transformations\).)36 b(Note)24 b(that)h(because)h(descriptors)i(are)c(trans-)527 4970 y(lated)17 b(into)g(corresponding)j(V)-12 b(olcano)18 b(structures,)h(Prairie)e(rule)g(actions)g(that)g(reference)h(descrip-) 1905 5349 y(41)p eop %%Page: 42 54 42 53 bop 527 391 a FP(tor)25 b(properties)i(must)e(also)g(be)f (translated)j(into)e(V)-12 b(olcano)26 b(rule)f(actions)h(that)f (reference)i(the)e(ap-)527 561 y(propriate)h(V)-12 b(olcano)25 b(structures.)436 805 y FC(\017)46 b FP(T)m(ranslating)26 b(I-rules)f(into)f(V)-12 b(olcano)25 b(implementation)h(rules.)32 b(As)23 b(above,)h(this)g(includes)i(trans-)527 974 y(lating)e(an)e (I-rule')-5 b(s)23 b(actions)h(into)f(V)-12 b(olcano)23 b(format.)31 b(As)21 b(we)g(will)h(see)g(in)g(this)h(chapter)l(,)h (translat-)527 1144 y(ing)j(an)f(I-rule')-5 b(s)29 b(actions)f(is)e (complicated)j(by)d(the)h(fact)g(that)g(V)-12 b(olcano)28 b(accomplishes)h(most)d(of)527 1313 y(its)e(implementation)i(rule)e (actions)i(via)e(DBI-de\256ned)g(support)h(functions.)436 1557 y FC(\017)46 b FP(Generating)28 b(a)d(compact)i(V)-12 b(olcano)27 b(rule)f(set)g(from)g(a)f(Prairie)h(speci\256cation.)40 b(This)26 b(means)g(that)527 1726 y(the)g(P2V)f(preprocessor)k (attempts)e(to)e(remove)i(unused)g(rules,)g(and)f(to)f(consolidate)k (rules)e(that)527 1896 y(generate)g(a)e(transitive)i(closure)f(of)f (operator)i(tree)e(transformations.)39 b(This)25 b(step)g(is)g(not)g (neces-)527 2065 y(sary)k(for)g(the)f(correct)i(generation)h(of)d(V)-12 b(olcano)30 b(speci\256cations;)k(it)28 b(is,)h(however)l(,)i(a)d (means)g(of)527 2234 y(generating)f(smaller)d(rule)g(sets,)g(and)g (consequently)-6 b(,)27 b(faster)e(optimizers.)583 2478 y(The)g(following)h(sections)g(describe)h(each)e(of)g(these)g(steps)h (in)e(greater)i(detail.)35 b(The)24 b(P2V)g(pre-)300 2648 y(processor)k(is)e(about)h(6000)g(lines)g(of)f Fi(flex)d FP(and)k Fi(bison)c FP(code,)k(and)f(took)h(about)g(3)f(man-months)h (to)300 2817 y(implement.)300 3184 y FO(4.2)119 b(Corr)n(espondence)31 b(of)f(Elements)f(in)i(Prairie)f(and)h(V)-11 b(olcano)300 3452 y FN(4.2.1)99 b(Operators,)25 b(Algorithms,)f(and)i(Enfor)n(cers) 297 3682 y FP(Operators)c(and)f(algorithms)i(in)d(Prairie)i(correspond) h(directly)g(to)e(operators)i(and)e(algorithms,)i(respec-)300 3852 y(tively)-6 b(,)28 b(in)f(V)-12 b(olcano.)41 b(That)27 b(is,)f(an)h(operator)i(in)d(Prairie)h(represents)i(the)e(same)g (operator)i(in)d(V)-12 b(olcano.)300 4021 y(Similarly)27 b(for)g(algorithms.)43 b(The)26 b(dif)n(\256culty)j(arises)e(when)g (some)g(algorithms)i(in)d(Prairie)i(are)f(identi-)296 4191 y(\256ed)19 b(by)g(the)h(P2V)e(preprocessor)23 b(as)d(implicit)g (\(as)g(de\256ned)g(in)g(Section)g(2.8.1\).)30 b(These)19 b(algorithms)j(then)300 4360 y(correspond)27 b(to)c(enforcers)j(in)d(V) -12 b(olcano.)33 b(This)23 b(process)i(is)f(described)i(in)d(greater)i (detail)g(below)-6 b(.)583 4529 y(In)25 b(Chapter)h(2,)e(we)g (mentioned)i(that)g(enforcers)h(in)d(V)-12 b(olcano)26 b(are)f(really)h(algorithms,)h(except)294 4699 y(that)19 b(they)g(do)f(not)h(implement)g(any)g(particular)h(operator)-5 b(.)31 b(This)18 b(means)h(that)g(enforcers)h(can)f(be)f(inserted)300 4868 y(anywhere)25 b(in)f(an)f(expression,)j(depending)h(on)c(needed)j (physical)f(properties.)579 5037 y(Now)19 b(consider)i(operators)h(in)e (Prairie.)30 b(Some)19 b(operators)j(have)e(the)g(\252Null\272)g (algorithm)i(as)d(one)1905 5349 y(42)p eop %%Page: 43 55 43 54 bop 323 403 3237 4 v 323 972 4 569 v 374 532 a Fs(O)r Fv(\()p Fs(S)500 541 y Fu(1)535 532 y Fv(\))20 b(:)f Fo(D)683 541 y Fm(2)805 532 y Fv(=)-12 b FB(\))83 b Fs(A)1055 541 y Fu(1)1089 532 y Fv(\()p Fs(S)1159 541 y Fu(1)1194 532 y Fv(\))20 b(:)f Fo(D)1342 541 y Fm(3)821 635 y FB(\001)11 b(\001)g(\001)374 739 y Fs(O)r Fv(\()p Fs(S)500 748 y Fu(1)535 739 y Fv(\))20 b(:)f Fo(D)683 748 y Fm(2)805 739 y Fv(=)-12 b FB(\))83 b Fs(A)1055 747 y Fn(n)1097 739 y Fv(\()p Fs(S)1167 748 y Fu(1)1202 739 y Fv(\))20 b(:)f Fo(D)1350 748 y Fm(3)374 843 y Fs(O)r Fv(\()p Fs(S)500 852 y Fu(1)535 843 y Fv(\))h(:)f Fo(D)683 852 y Fm(2)805 843 y Fv(=)-12 b FB(\))83 b FF(Null)q Fv(\()p Fs(S)1190 852 y Fu(1)1244 843 y Fv(:)19 b Fo(D)1345 852 y Fm(3)1384 843 y Fv(\))h(:)g Fo(D)1533 852 y Fm(4)p 3557 972 V 323 975 3237 4 v 3558 992 19 576 v 340 992 3237 19 v 795 1188 a FP(Figure)k(4.1:)31 b(Identifying)c(implicit)d (operators,)i(algorithms,)f(and)f(rules)294 1564 y(of)19 b(their)g(implementations)j(\(see)d(Section)g(3.6.1\).)29 b(Whenever)20 b(Null)f(is)f(used)h(as)g(an)f(implementation,)k(it)293 1734 y(has)c(the)g(same)f(ef)n(fect)i(as)f(if)f(the)h(algorithm)h(were) e(not)h(present)h(in)f(the)g(operator)h(tree)f(at)f(all.)29 b(On)17 b(the)h(other)299 1903 y(hand,)23 b(when)g(a)f(non-Null)h (algorithm)i(is)d(used)h(as)f(an)h(implementation,)i(an)d (\252actual\272)j(algorithm)f(is)e(in-)297 2072 y(troduced)h(in)e(the)g (operator)h(tree.)31 b(Also,)21 b(whenever)h(a)e(Null)h(algorithm)h(is) f(used)h(in)e(Prairie,)i(it)e(serves)i(to)297 2242 y(push)f(its)g (needed)h(properties)h(down)e(to)f(its)h(inputs.)31 b(In)21 b(other)g(words,)g(it)g(tries)g(to)f FD(enfor)m(ce)i FP(certain)g(prop-)298 2411 y(erties)h(on)f(its)g(inputs.)32 b(Thus,)21 b(Null)h(algorithms)i(in)e(Prairie)g(are)g(indications)j(of) d(enforcers)i(in)e(V)-12 b(olcano.)299 2580 y(Stated)22 b(dif)n(ferently)-6 b(,)26 b(a)c(choice)i(of)e(the)h(Null)f(algorithm)i (in)e(Prairie)h(implies)g(that)g(no)g(enforcer)h(is)e(intro-)298 2750 y(duced)g(\(in)g(an)g(operator)h(tree\))f(in)g(V)-12 b(olcano,)23 b(whereas)f(a)f(choice)i(of)e(a)g(non-Null)i(algorithm)h (introduces)300 2919 y(an)g(enforcer)-5 b(.)583 3088 y(More)27 b(formally)-6 b(,)28 b(consider)g(the)f(sequence)h(of)e (Prairie)h(I-rules)h(shown)f(in)f(Figure)h(4.1.)38 b(Each)300 3258 y(I-rule)c(speci\256es)g(an)e(implementation)k(of)d(the)g (abstract)h(operator)h FH(O)s FP(,)f(in)e(terms)h(of)g(algorithms)h FH(A)3560 3272 y Fv(1)300 3427 y FP(through)26 b FH(A)674 3441 y Fs(n)721 3427 y FP(,)d(and)i(the)f(Null)g(algorithm.)35 b(The)23 b(Null)h(algorithm)i(acts)f(as)f(a)g(conduit)i(to)e(push)h (all)f(prop-)298 3597 y(erties)e(of)f(the)h(operator)h FH(O)g FP(down)f(to)f(its)g(input)i FH(S)1842 3611 y Fv(1)1881 3597 y FP(.)29 b(The)21 b(P2V)f(preprocessor)25 b(marks)d(operator)h FH(O)g FP(as)f(an)299 3766 y(implicit)h(operator)l (,)i(algorithms)f FH(A)1425 3780 y Fv(1)1486 3766 y FP(through)g FH(A)1858 3780 y Fs(n)1927 3766 y FP(as)e(implicit)i(algorithms,)g(and) f(all)f(the)g(rules)i(in)e(Fig-)297 3935 y(ure)f(4.1)f(as)g(implicit)i (rules.)31 b(For)20 b(brevity)-6 b(,)22 b(in)f(this)g(chapter)l(,)i(we) d(will)g(call)h(the)g(operator)h FH(O)h FP(in)d(Prairie)h(an)297 4105 y FD(enfor)m(cer)n(-operator)p FP(,)26 b(and)21 b(algorithms)i FH(A)1619 4119 y Fv(1)1678 4105 y FP(through)g FH(A)2049 4119 y Fs(n)2096 4105 y FP(,)d FD(enfor)m(cer)n(-algorithms)p FP(.)35 b(Enforcer)n(-operators)300 4274 y(are)23 b(discarded)j(when)d (translating)k(to)c(V)-12 b(olcano,)24 b(enforcer)n(-algorithms)29 b(in)23 b(Prairie)h(correspond)i(to)d(en-)300 4443 y(forcers)31 b(in)f(V)-12 b(olcano,)32 b(and)e(all)g(implicit)h(rules)g(are)f (discarded)i(when)e(translating)i(to)e(V)-12 b(olcano.)51 b(\(W)-7 b(e)300 4613 y(will)23 b(discuss)i(later)f(how)f(to)h (translate)h(the)f(actions)h(associated)h(with)d(implicit)i(I-rules.\)) 32 b(The)23 b(Null)g(al-)299 4782 y(gorithm)g(does)g(not)f(appear)i(in) e(a)g(V)-12 b(olcano)23 b(speci\256cation)i(at)d(all.)31 b(Expressions)25 b(in)d(Prairie)g(which)h(con-)300 4951 y(tain)j(enforcer)n(-operators)32 b(must)25 b(be)h(modi\256ed)g(so)g (that)g(they)g(are)g(legal)h(expressions)i(in)d(V)-12 b(olcano;)28 b(we)1905 5349 y(43)p eop %%Page: 44 56 44 55 bop 300 391 a FP(will)23 b(show)h(how)f(this)h(is)g(done)g(later) -5 b(.)302 637 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)30 b FP(1)t(2)t(.)158 b(Consider)20 b(I-rules)g(3.5)e(and)h(3.7)g(from)f(Figures)h(3.8)g(and) g(3.9\(b\))g(\(repeated)i(below)-6 b(,)300 807 y(without)25 b(the)e(associated)k(tests)d(or)g(actions\):)300 1013 y(SOR)-5 b(T)n FA(\()p FH(S)618 1027 y Fv(1)657 1013 y FA(\))26 b(:)g Fp(D)849 1027 y Fo(2)977 1013 y FA(=)-15 b FC(\))82 b FP(Mer)n(ge)p 1445 1013 28 4 v 34 w(sort)r FA(\()p FH(S)1702 1027 y Fv(1)1741 1013 y FA(\))26 b(:)f Fp(D)1932 1027 y Fo(3)300 1207 y FP(SOR)-5 b(T)n FA(\()p FH(S)618 1221 y Fv(1)657 1207 y FA(\))26 b(:)g Fp(D)849 1221 y Fo(2)977 1207 y FA(=)-15 b FC(\))82 b FP(Null)q FA(\()p FH(S)1459 1221 y Fv(1)1523 1207 y FA(:)26 b Fp(D)1654 1221 y Fo(3)1699 1207 y FA(\))g(:)f Fp(D)1890 1221 y Fo(4)300 1413 y FP(These)30 b(two)f(I-rules)j(together)f(describe)h (Mer)n(ge)p 1875 1413 V 35 w(sort)e(to)g(be)f(an)h(enforcer)n (-algorithm)35 b(in)30 b(Prairie)g(\(an)300 1582 y(enforcer)c(in)d(V) -12 b(olcano\),)25 b(and)f(SOR)-5 b(T)21 b(as)i(an)h(enforcer)n (-operator)-5 b(.)1181 b Fw(\003)300 1882 y FN(4.2.2)99 b(Operator)25 b(T)-7 b(r)n(ees)26 b(and)f(Access)g(Plans)300 2112 y FP(Operator)32 b(trees)g(in)e(Prairie)i(are)f(expressed)i(in)e (a)f(functional)k(notation,)g(and)d(those)h(in)f(V)-12 b(olcano)32 b(are)298 2281 y(expressed)24 b(in)e(a)f(LISP)f(pre\256x)i (notation.)33 b(Apart)21 b(from)h(this)g(syntactic)j(dif)n(ference,)f (operator)g(trees)f(and)300 2451 y(access)i(plans)g(in)e(the)h(two)f (speci\256cations)k(bear)d(a)f(one-to-one)j(correspondence.)302 2697 y(E)t Fx(X)t(A)t(M)t(P)t(L)t(E)k FP(1)t(3)t(.)163 b(The)23 b(expression,)1144 2903 y(JOIN)p FA(\()p FP(RET)o FA(\()p FH(R)1652 2917 y Fv(1)1692 2903 y FA(\))i(:)h Fp(D)1883 2917 y Fo(3)1928 2903 y FH(;)15 b FP(RET)o FA(\()p FH(R)2244 2917 y Fv(2)2284 2903 y FA(\))25 b(:)h Fp(D)2475 2917 y Fo(4)2520 2903 y FA(\))g(:)f Fp(D)2711 2917 y Fo(5)300 3109 y FP(in)d(Prairie,)g(which)h(denotes)h(the)e(RET)m (rieval)f(of)h(relations)i FH(R)2249 3123 y Fv(1)2310 3109 y FP(and)e FH(R)2531 3123 y Fv(2)2571 3109 y FP(,)f(and)h(their)h (subsequent)i(JOIN,)300 3278 y(is)e(represented)k(in)d(V)-12 b(olcano)25 b(as)948 3484 y(\(JOIN)e(?op)p 1333 3484 V 34 w(ar)n(g5)h(\(\(RET)e(?op)p 1934 3484 V 34 w(ar)n(g3)j(\(\)\))f (\(RET)d(?op)p 2619 3484 V 34 w(ar)n(g4)k(\(\)\)\))300 3690 y(The)j(descriptors)k Fp(D)976 3704 y Fo(3)1021 3690 y FP(,)c Fp(D)1152 3704 y Fo(4)1197 3690 y FP(,)h(and)g Fp(D)1488 3704 y Fo(5)1561 3690 y FP(map)f(to)g(the)h(operator)i(ar)n (guments)g(?op)p 2853 3690 V 34 w(ar)n(g3,)f(?op)p 3228 3690 V 34 w(ar)n(g4,)h(and)300 3859 y(?op)p 435 3859 V 34 w(ar)n(g5,)24 b(respectively)-6 b(.)35 b(In)23 b(addition,)i (since)g(V)-12 b(olcano)25 b(expressions)i(represent)e(only)g(stream)f (inputs)300 4029 y(explicitly)-6 b(,)35 b(the)c(relation)i(names)e FH(R)1472 4043 y Fv(1)1542 4029 y FP(and)g FH(R)1772 4043 y Fv(2)1841 4029 y FP(are)g(also)h(incorporated)i(in)d(the)g (operator)i(ar)n(guments)300 4198 y(?op)p 435 4198 V 34 w(ar)n(g3)d(and)f(?op)p 946 4198 V 34 w(ar)n(g4,)i(respectively)-6 b(.)51 b(A)28 b(more)g(precise)j(correspondence)i(between)d(Prairie)g (de-)300 4368 y(scriptors)c(and)e(V)-12 b(olcano)25 b(properties)h(is)d (described)k(in)c(the)h(next)g(section.)895 b Fw(\003)579 4592 y FP(Access)21 b(plans)g(in)e(Prairie)i(correspond)i(to)c (physical)j(expressions)h(in)d(V)-12 b(olcano;)23 b(they)d(have)h(the) 294 4761 y(same)d(correspondence)23 b(as)18 b(do)h(operator)h(trees)f (in)f(Prairie)h(and)g(V)-12 b(olcano;)22 b(plans)d(are)f(transformed)j (from)300 4931 y(a)k(functional)i(notation)h(to)c(a)h(LISP)e(pre\256x)i (notation)i(with)e(descriptors)j(transformed)g(into)d(algorithm)300 5100 y(ar)n(guments.)1905 5349 y(44)p eop %%Page: 45 57 45 56 bop 357 403 3171 4 v 357 3042 4 2640 v 405 1539 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.2 true 3.8 neg 5.44249 neg 109.0751 133.68254 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -1016 x FH(E)5 b FP(:)31 b(Expression)405 692 y FH(D)s FP(:)g(Descriptor)405 862 y FH(P)463 876 y Fv(1)503 862 y FP(:)g(Operator)24 b(Ar)n(gument)405 1031 y FH(P)463 1045 y Fv(2)503 1031 y FP(:)31 b(Logical)24 b(Property)405 1201 y FH(P)463 1215 y Fv(3)503 1201 y FP(:)31 b(System)23 b(Property)405 1370 y FH(P)463 1384 y Fv(4)503 1370 y FP(:)31 b(Physical)24 b(Property)405 1539 y FH(P)463 1553 y Fv(5)503 1539 y FP(:)31 b(Cost)1859 794 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -68.28656 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -52.92218 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -22.19318 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 0.0 0.0 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1724 825 a FH(E)1952 819 y(P)2010 833 y Fv(1)1952 1003 y FH(P)2010 1017 y Fv(2)1952 1130 y FH(P)2010 1144 y Fv(3)1952 1258 y FH(P)2010 1272 y Fv(4)1952 1386 y FH(P)2010 1400 y Fv(5)1424 1637 y Fy(\(a\))13 b(General)h(form)g(of)g(a)g(V)-10 b(olcano)1424 1728 y(expression)2885 794 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 34.14328 17.07164 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 8.53581 -25.60745 Ellipse closepath gsave 1. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 25.60745 -25.60745 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2820 1038 a FH(E)172 b(D)2461 1637 y Fy(\(b\))17 b(General)h(form)f(of)g(a)g(Prairie)2461 1728 y(expression)p 430 1831 3046 4 v 1811 2126 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 38.41118 34.14328 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 4.2679 -18.7789 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch -8.53581 -9.38945 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch -8.53581 -28.16809 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 0.0 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -18.7789 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 13.65736 8.53581 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch 17.07164 -37.55754 Ellipse closepath gsave 2.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1904 2150 a FH(P)1962 2164 y Fv(2)1904 2306 y FH(P)1962 2320 y Fv(4)1904 2462 y FH(P)1962 2476 y Fv(5)1692 2228 y FH(P)1750 2242 y Fv(1)1692 2384 y FH(P)1750 2398 y Fv(3)1811 2126 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ -1.70726 -64.87228 -1.70726 -28.16809 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 6.82854 -64.87228 -10.24309 -64.87228 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 3.41426 -66.57928 -6.82854 -66.57928 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 0.0 -68.28656 -3.41426 -68.28656 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 68.28656 -37.55754 23.90018 -37.55754 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 68.28656 -18.7789 23.90018 -18.7789 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 68.28656 0.0 23.90018 0.0 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0 360 59.75073 42.6791 .5 CLW mul dup 3 1 roll sub 3 1 roll sub exch -11.95009 -18.7789 Ellipse closepath gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1378 2313 a FH(E)513 2827 y Fy(\(c\))f(General)f(form)h(of)g(a)f(P2V)-7 b(-generated)17 b(expression.)25 b(Single)15 b(arrows)h(represent)g (pointers)g(to)f(shared)i(struc-)513 2918 y(tures.)25 b(Note)19 b(that)g(the)g(system)g(property)h(is)e(\252grounded\272)k (\(unused\).)p 3523 3042 4 2640 v 357 3045 3171 4 v 3525 3062 19 2646 v 373 3062 3171 19 v 391 3258 a FP(Figure)i(4.2:)31 b(General)25 b(expressions)i(in)c(V)-12 b(olcano,)25 b(Prairie,)f(and)g(P2V)-8 b(-generated)25 b(speci\256cations)300 3635 y FN(4.2.3)99 b(Descriptors)25 b(and)h(Pr)n(operties)582 3865 y FP(In)d(Prairie,)f(there)i(is)e(one)h(structure)h(that)f (represents)j(all)c(the)h(properties)i(of)d(a)g(node)h(in)g(an)f(op-) 300 4035 y(erator)k(tree,)f(the)g(descriptor)-5 b(.)37 b(V)-12 b(olcano,)26 b(on)f(the)g(other)h(hand,)f(represents)j (properties)f(of)e(expressions)300 4204 y(in)g(\256ve)f(dif)n(ferent)j (structures.)37 b(Figures)25 b(4.2\(a\))h(and)f(4.2\(b\))h(show)e(the)h (general)i(form)d(of)h(expressions)300 4373 y(in)e(V)-12 b(olcano)25 b(and)f(Prairie)h(\(i.e.,)d(the)i(forms)g(visible)h(to)f (the)f(DBI\).)583 4543 y(The)i(advantage)i(of)e(having)h(separate)h (property)g(structures)g(in)e(V)-12 b(olcano)26 b(is)e(that)i(they)f (corre-)300 4712 y(spond)j(to)f(the)g(way)g(the)g(properties)i(are)e (used)h(and)f(stored)i(internally)g(by)e(the)g(V)-12 b(olcano)29 b(rule)e(engine.)299 4881 y(In)22 b(other)h(words,)g(the)g (partition)h(of)f(properties)i(has)e FD(semantic)g FP(meaning)h(for)f (the)f(internal)i(representa-)300 5051 y(tion.)36 b(For)25 b(example,)i(logical)f(properties)i(in)d(V)-12 b(olcano)27 b(are)e(computed)i(before)g(optimization)h(begins.)1905 5349 y(45)p eop %%Page: 46 58 46 57 bop 300 391 a FP(Furthermore,)27 b(the)f(logical)h(properties)h (of)e(operator)h(trees)g(in)e(the)h(same)f(equivalence)k(class)d (\(that)h(is,)298 561 y(logically)e(equivalent)f(expressions\))i(are)c (the)g(same;)h(thus,)g(it)e(makes)i(sense)g(to)f(share)h(a)e(common)h (log-)300 730 y(ical)27 b(property)i(structure)h(between)e(all)f(such)g (equivalent)j(operator)f(trees,)g(and)e(indeed,)i(this)f(is)e(what)299 899 y(the)c(V)-12 b(olcano)24 b(rule)f(engine)h(does.)31 b(This)22 b(is)g(easily)i(done)f(if)f(logical)i(properties)h(are)d (de\256ned)h(as)f(a)g(set)h(of)300 1069 y(properties)j(distinct)g(from) d(all)h(other)g(properties.)581 1238 y(On)d(the)h(other)h(hand,)f (partition)i(of)e(properties)i(has)e(its)g(drawbacks)h(in)f(the)g(area) g(of)f(high-level)300 1408 y(abstractions.)41 b(As)25 b(listed)h(in)g(Section)h(2.8.2,)e(these)i(drawbacks)h(complicate)f (the)f(task)h(of)e(specifying)300 1577 y(an)i(optimizer)h(by)e(forcing) j(the)e(DBI)e(to)h(think)i(of)f(low-level)h(\(or)e(internal\))j (details)f(of)f(property)i(rep-)300 1746 y(resentation.)37 b(Also,)24 b(as)g(mentioned)j(earlier)l(,)f(these)g(property)g (partitions)h(can)e(be)g(brittle,)h(and)f(change)300 1916 y(when)g(operators,)i(algorithms,)h(or)c(properties)k(are)d (changed.)37 b(As)24 b(mentioned)j(in)e(Chapter)h(3,)f(Prairie)300 2085 y(overcomes)h(these)e(drawbacks)i(by)d(representing)k(properties)g (in)c(a)g(single)i(structure,)h(a)d(descriptor)-5 b(.)583 2254 y(What)26 b(is)g(needed,)i(then,)e(is)g(a)f(translation)k(from)d (the)g(high-level)i(abstraction)h(of)d(Prairie)g(de-)294 2424 y(scriptors)21 b(to)d(the)g(lower)n(-level)j(representation)h(of)c (V)-12 b(olcano')-5 b(s)21 b(property)f(structures,)i(where)c(the)h (advan-)298 2593 y(tage)k(of)e(property)k(sharing)e(is)f(preserved.)33 b(The)21 b(P2V)g(preprocessor)k(accomplishes)g(this)e(by)f(retaining) 300 2762 y(a)j(single)i(property)h(structure)g(with)d(every)i (expression,)h(but)e(partitioning)j(the)d(descriptor)i FD(internally)298 2932 y FP(into)22 b(separate)i(structures)g(that)e (correspond)j(to)c(V)-12 b(olcano')-5 b(s)24 b(property)g(structures.) 33 b(This)21 b(is)h(shown)g(pic-)299 3101 y(torially)i(in)e(Figure)h (4.2\(c\).)31 b(Note)22 b(how)g(logical)i(and)f(physical)i(properties)g (are)d(translated)j(to)d(pointers)300 3271 y(to)j(property)j (structures;)h(this)d(allows)g(sharing)h(between)f(expressions)j(by)c (setting)i(pointers)h(to)d(com-)294 3440 y(mon)17 b(structures.)32 b(The)17 b(cost)h(property)i(structure)g(is)e(not)g(shared,)i(but)e(it) f(is)h(converted)i(to)e(a)f(pointer)j(since)295 3609 y(it)f(makes)h(sense)g(only)g(for)g(an)f(algorithm)i(\(and)f(thus)g (can)f(be)g(set)h(to)f(null)h(for)f(an)g(operator\).)32 b(Also,)20 b(as)f(we)297 3779 y(mentioned)j(in)f(Section)g(2.2,)g(the)f (system)i(property)g(set)f(behaves)i(identically)g(to)d(the)h(logical)h (property)300 3948 y(set,)h(so)h(the)g(P2V)e(preprocessor)27 b(\252grounds\272)g(the)d(system)g(property)i(set)d(\(and)i(doesn')n(t) g(use)f(it\).)578 4117 y(The)18 b(problem)i(now)e(is)h(deciding)i(what) d(property)j(set)e(\(operator)i(ar)n(gument,)g(logical)g(property)-6 b(,)300 4287 y(cost,)28 b(or)f(physical)i(property\))h(each)d(property) i(in)e(a)g(descriptor)j(belongs)f(to.)41 b(This)26 b(is)h(determined)i (as)300 4456 y(follows.)577 4625 y(Initially)-6 b(,)22 b(all)c(properties)j(in)d(a)f(descriptor)k(are)d(logical)i(properties,) i(by)c(default.)30 b(Consider)20 b(a)e(T)-8 b(-)296 4795 y(rule)21 b(that)f(rewrites)i(an)e(expression)j FH(E)h FP(to)c FH(E)1691 4762 y FB(0)1715 4795 y FP(.)29 b(If)20 b(property)i FH(P)32 b FP(of)20 b(the)h(root)f(of)g FH(E)2822 4762 y FB(0)2865 4795 y FP(is)g(changed)3245 4762 y Fv(1)3307 4795 y FP(in)g(either)p 300 4876 1320 4 v 400 4930 a Fu(1)434 4961 y Fy(The)14 b(problem)h(of)f(detecting)g(whether)h(a)e (property)i(is)f(changed)h(is)f(a)g(dif)o(\256cult)e(one)j(since)f (properties)h(can)f(be)g(changed)i(via)300 5053 y(assignment)k (statements,)f(helper)h(function)g(calls,)f(etc.)g(in)g(C.)f(T)-5 b(o)19 b(avoid)h(implementing)g(a)f(full-blown)h(C)f(\(or)g(C++\))g (parser)m(,)1905 5349 y FP(46)p eop %%Page: 47 59 47 58 bop 312 403 3260 4 v 312 1449 4 1046 v 386 478 a FF(JOIN)o Fv(\()p FF(JOIN)q Fv(\()p Fs(S)771 487 y Fu(1)806 478 y Fs(;)11 b(S)880 487 y Fu(2)915 478 y Fv(\))20 b(:)f Fo(D)1063 487 y Fm(4)1102 478 y Fs(;)11 b(S)1176 487 y Fu(3)1211 478 y Fv(\))20 b(:)f Fo(D)1359 487 y Fm(5)1417 478 y Fv(=)-12 b FB(\))20 b FF(JOIN)p Fv(\()p Fs(S)1765 487 y Fu(1)1800 478 y Fs(;)11 b FF(JOIN)p Fv(\()p Fs(S)2045 487 y Fu(2)2080 478 y Fs(;)g(S)2154 487 y Fu(3)2189 478 y Fv(\))20 b(:)f Fo(D)2337 487 y Fm(6)2376 478 y Fv(\))h(:)f Fo(D)2524 487 y Fm(7)3393 478 y FF(\(4.1\))386 557 y FB(ff)601 635 y Fo(D)663 644 y Fm(6)702 635 y Fs(:)p FF(attributes)k Fv(=)c FF(union)f Fv(\()p Fo(D)1320 644 y Fm(2)1360 635 y Fs(:)p FF(attributes)r Fs(;)12 b Fo(D)1720 644 y Fm(3)1759 635 y Fs(:)p FF(attributes)s Fv(\))17 b(;)386 714 y FB(gg)386 793 y FF(is)p 434 793 20 4 v 24 w(associative)j Fv(\()p Fo(D)851 802 y Fm(5)890 793 y Fs(:)p FF(join)p 1016 793 V 25 w(predicate)s Fs(;)12 b Fo(D)1374 802 y Fm(2)1413 793 y Fs(:)p FF(attributes)s Fv(\))386 872 y FB(ff)601 951 y Fo(D)663 960 y Fm(7)722 951 y Fv(=)19 b Fo(D)858 960 y Fm(5)914 951 y Fv(;)633 1052 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792 neg 137.83421 9.2889 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fo(D)695 1061 y Fm(7)734 1052 y Fs(:)p FF(join)p 860 1052 V 25 w(predicate)k Fv(=)c Fo(D)1280 1061 y Fm(4)1319 1052 y Fs(:)p FF(join)p 1445 1052 V 25 w(predicate)h Fv(;)601 1170 y Fo(D)663 1179 y Fm(6)702 1170 y Fs(:)p FF(join)p 828 1170 V 25 w(predicate)j Fv(=)d Fo(D)1249 1179 y Fm(5)1288 1170 y Fs(:)p FF(join)p 1414 1170 V 25 w(predicate)g Fv(;)601 1249 y Fo(D)663 1258 y Fm(6)702 1249 y Fs(:)p FF(record)p 894 1249 V 26 w(width)g Fv(=)g Fo(D)1223 1258 y Fm(2)1262 1249 y Fs(:)p FF(record)p 1454 1249 V 25 w(width)d Fv(+)f Fo(D)1775 1258 y Fm(3)1814 1249 y Fs(:)p FF(record)p 2006 1249 V 25 w(width)i Fv(;)601 1328 y Fo(D)663 1337 y Fm(6)702 1328 y Fs(:)p FF(cardinality)24 b Fv(=)19 b FF(compute)p 1331 1328 V 26 w(cardinality)h Fv(\()p Fo(D)1742 1337 y Fm(2)1782 1328 y Fs(;)11 b Fo(D)1875 1337 y Fm(3)1914 1328 y Fv(\))17 b(;)386 1407 y FB(gg)p 3568 1449 4 1046 v 312 1452 3260 4 v 3570 1468 19 1053 v 328 1468 3260 19 v 1171 1664 a FP(Figure)24 b(4.3:)31 b(Identifying)c(operator)e(ar)n(guments)300 2041 y(the)f(pre-test)i(or) f(post-test)h(sections)g(of)e(the)h(T)-8 b(-rule,)24 b(then)h FH(P)36 b FP(is)24 b(identi\256ed)i(as)e(an)g(operator)j(ar)n (gument.)294 2210 y(The)18 b(reason)i(is)e(that)h(T)-8 b(-rules)18 b(only)h(access)h(operator)g(ar)n(guments)h(or)d(logical)i (properties,)i(and,)d(since)h(the)298 2380 y(logical)j(properties)h(of) d FH(E)1118 2347 y FB(0)1162 2380 y FP(are)h(the)g(same)f(as)g(those)i (of)e FH(E)26 b FP(\(and)c(thus)g(cannot)h(be)f(changed)h(in)f(a)f(T)-8 b(-rule\),)300 2549 y FH(P)36 b FP(must)23 b(be)h(an)f(operator)j(ar)n (gument.)583 2718 y(T)-6 b(o)25 b(illustrate)k(this,)e(consider)h(the)e (join)h(associativity)j(T)-8 b(-rule)26 b(from)g(Chapter)h(3,)f (repeated)i(in)299 2888 y(Figure)23 b(4.3.)30 b(Note)23 b(the)f(boxed)i(statement:)33 b(it)22 b(changes)j(the)d(join)h (predicate)i(of)e Fp(D)2918 2902 y Fo(7)2963 2888 y FP(,)e(the)i (descriptor)i(of)300 3057 y(the)f(root)g(JOIN)f(on)g(the)h(right)h (side)f(of)f(the)h(T)-8 b(-rule.)31 b(Thus,)23 b(join)h(predicate)i(is) e(an)f(operator)j(ar)n(gument.)583 3227 y(Cost)h(properties)i(are)e (easy)g(to)f(detect:)39 b(like)27 b(V)-12 b(olcano,)28 b(Prairie)f(requires)i(a)d(cost)h(property)h(to)296 3396 y(have)20 b(the)g(type)g(COST)-7 b(.)17 b(Thus,)j(all)g(properties)i (in)e(the)g(descriptor)i(with)d(the)h(type)g(COST)e(are)h(cost)h(prop-) 300 3565 y(erties)25 b(\(although,)h(typically)-6 b(,)25 b(there)g(is)e(only)h(one)g(cost)h(property\).)578 3735 y(Physical)20 b(properties)i(are)c(also)i(easy)f(to)g(identify)-6 b(.)31 b(The)18 b(P2V)g(preprocessor)k(looks)e(at)f(all)f(\252Null)295 3904 y(I-rules\272)j(\(i.e.,)e(I-rules)h(where)g(Null)e(implements)j (an)e(operator\).)31 b(If)19 b(any)g(property)j(of)c(the)i(input)g (stream)300 4073 y(of)25 b(the)h(Null)f(algorithm)j(is)d(changed)i(in)f (the)f(pre-opt)j(section)f(of)e(the)h(I-rule,)h(then)f(that)g(property) h(is)f(a)297 4243 y(physical)e(property)-6 b(.)32 b(The)21 b(rationale)j(for)d(this)h(is)f(simple:)31 b(properties)24 b(that)e(are)f(copied)i(from)e(an)g(opera-)300 4412 y(tor)j(to)f(its)h (input)g(must)g(be)f(\252needed\272)j(properties)g(\(in)e(V)-12 b(olcano')-5 b(s)25 b(terminology\),)i(and)c(thus,)h(are)g(phys-)300 4581 y(ical)31 b(properties.)53 b(As)29 b(an)h(example,)j(consider)f (the)f(Null)f(sort)g(I-rule)i(from)e(Chapter)h(3,)g(repeated)h(in)p 300 4663 1320 4 v 300 4748 a Fy(P2V)18 b(imposes)g(a)h(requirement)f (on)h(Prairie)e(rules)h(that)g(all)g(changes)h(to)f(descriptor)h (properties)f(be)h(identi\256ed)f(by)h(an)f(annota-)300 4839 y(tion)g(to)h(the)f(statement.)25 b(Assignments)19 b(to)f(descriptor)h(properties)g(are)g(accomplished)h(by)f(a)f (function)h(called)g(dcopy)-5 b(.)26 b(Thus,)300 4931 y(the)19 b(boxed)h(statement)f(in)g(Figure)g(4.3)g(is)f(actually)i (written)e(as)h(dcopy)q Fl(\()p Fk(D)2234 4939 y Fm(7)2273 4931 y Fq(:)p Fy(join)p 2414 4931 23 4 v 27 w(predicate)q Fq(;)13 b Fk(D)2813 4939 y Fm(4)2852 4931 y Fq(:)p Fy(join)p 2993 4931 V 27 w(predicate)q Fl(\))p Fy(.)24 b(It)19 b(is)f(im-)300 5022 y(portant)h(to)g(note)h(that)e(this)h(requirement)h (does)f(not)g(sacri\256ce)g(the)g(full)g(power)g(of)g(C.)1905 5349 y FP(47)p eop %%Page: 48 60 48 59 bop 312 403 3260 4 v 312 1285 4 883 v 386 478 a FF(SOR)l(T)o Fv(\()p Fs(S)621 487 y Fu(1)656 478 y Fv(\))20 b(:)g Fo(D)805 487 y Fm(2)863 478 y Fv(=)-12 b FB(\))19 b FF(Null)r Fv(\()p Fs(S)1185 487 y Fu(1)1239 478 y Fv(:)g Fo(D)1340 487 y Fm(3)1379 478 y Fv(\))h(:)f Fo(D)1527 487 y Fm(4)3393 478 y FF(\(4.2\))386 557 y(TRUE)386 635 y FB(ff)601 714 y Fo(D)663 723 y Fm(4)722 714 y Fv(=)g Fo(D)858 723 y Fm(2)914 714 y Fv(;)601 793 y Fo(D)663 802 y Fm(3)722 793 y Fv(=)g Fo(D)858 802 y Fm(1)914 793 y Fv(;)633 894 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792 neg 120.05864 9.2889 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fo(D)695 903 y Fm(3)734 894 y Fs(:)p FF(tuple)p 889 894 20 4 v 25 w(order)i Fv(=)f Fo(D)1207 903 y Fm(2)1245 894 y Fs(:)p FF(tuple)p 1400 894 V 26 w(order)e Fv(;)386 1007 y FB(gg)386 1086 y(ff)601 1165 y Fo(D)663 1174 y Fm(4)702 1165 y Fs(:)p FF(cost)j Fv(=)e Fo(D)985 1174 y Fm(3)1024 1165 y Fs(:)p FF(cost)e Fv(;)386 1244 y FB(gg)p 3568 1285 4 883 v 312 1288 3260 4 v 3570 1305 19 890 v 328 1305 3260 19 v 1177 1501 a FP(Figure)24 b(4.4:)32 b(Identifying)26 b(physical)g(properties)300 1878 y(Figure)f(4.4.)34 b(The)25 b(boxed)h(statement)g(changes)h(the)e(tuple)p 2152 1878 28 4 v 34 w(order)h(property)h(of)d FH(S)2884 1892 y Fv(1)2923 1878 y FP(,)g(the)h(input)h(of)f(Null.)300 2047 y(Thus,)e(the)h(preprocessor)j(marks)d(tuple)p 1578 2047 V 35 w(order)g(as)g(a)f(physical)j(property)-6 b(.)300 2414 y FO(4.3)119 b(T)-9 b(ranslating)30 b(T)-11 b(-rules)300 2677 y FP(A)23 b(T)-8 b(-rule)25 b(in)g(Prairie)g(corresponds)j(to)d(a) f(transformation)k(rule)d(in)g(V)-12 b(olcano.)35 b(The)24 b(translation)k(from)d(a)299 2846 y(T)-8 b(-rule)24 b(to)f(a)f (transformation)27 b(rule)c(is)g(straightforward.)34 b(Figure)24 b(4.5)f(shows)g(the)h(correspondence)j(be-)295 3016 y(tween)20 b(a)f(Prairie)h(T)-8 b(-rule)19 b(and)h(a)f(V)-12 b(olcano)21 b(trans)p 1792 3016 V 34 w(rule.)30 b(Consider)21 b(the)e(general)j(form)d(of)g(a)g(Prairie)h(T)-8 b(-rule)294 3185 y(shown)18 b(in)g(Figure)g(4.5\(a\).)30 b FH(X)24 b FP(and)19 b FH(Y)37 b FP(are)18 b(sets)g(of)g(C)e(\(or)j(C++\))e (statements,)k(perhaps)e(computing)h(prop-)300 3354 y(erties)25 b(of)e(the)h(various)h(expressions)i(in)d(the)f(rule.)32 b FH(T)j FP(is)24 b(a)f(boolean)i(expression,)h(possibly)g(containing) 300 3524 y(property)g(references.)36 b(A)23 b(V)-12 b(olcano)26 b(transformation)h(rule)e(is)f(derived)i(from)e(this)h(T)-8 b(-rule)24 b(as)g(shown)h(in)300 3693 y(Figure)g(4.5\(b\).)34 b FH(X)918 3660 y FB(0)942 3693 y FP(,)23 b FH(Y)1061 3660 y FB(0)1108 3693 y FP(and)i FH(T)1329 3660 y FB(0)1375 3693 y FP(are)g(derived)h(from)e FH(X)7 b FP(,)24 b FH(Y)c FP(,)j(and)i FH(T)13 b FP(,)23 b(respectively)-6 b(,)28 b(by)c(appropriately)300 3863 y(translating)33 b(the)e(property)h (references)h(in)d(each.)51 b(This)30 b(is)g(necessary)-6 b(,)34 b(since,)f(as)d(described)i(in)e(Sec-)300 4032 y(tion)d(4.2.3,)h(a)e(Prairie)i(descriptor)h(is)e(transformed)i(into)f (a)e(structure)j(containing)h(multiple)e(property)300 4201 y(sets.)j(This)24 b(is)f(best)h(illustrated)j(with)c(an)h (example.)583 4371 y(Consider)j(the)f(join)g(associativity)j(T)-8 b(-rule)25 b(from)g(Chapter)i(3,)e(shown)h(in)f(Figure)h(4.6\(a\).)37 b(The)300 4540 y(V)-12 b(olcano)27 b(transformation)i(rule)d(generated) i(by)e(the)g(P2V)e(preprocessor)29 b(is)d(shown)g(in)g(Figure)g (4.6\(b\).)300 4709 y(The)34 b(statements)i(are)f(numbered,)j(and)d (correspond)i(to)d(the)h(same)f(numbered)i(statements)g(in)e(Fig-)299 4879 y(ure)22 b(4.6\(a\).)31 b(As)22 b(shown)h(in)f(Figure)h(4.2,)f (operator)i(ar)n(guments)h(are)d(a)g(separate)i(structure)h(in)d(the)g (trans-)294 5048 y(lated)d(descriptor)-5 b(.)32 b(Hence)18 b(the)g(reference)j(\(in)d(statement)i(4)d(in)h(the)h(application)i (code)e(of)f(the)g(trans)p 3405 5048 V 34 w(rule\))1905 5349 y(48)p eop %%Page: 49 61 49 60 bop 318 403 3247 4 v 318 2450 4 2047 v 386 483 a Fs(E)t Fv(\()p Fs(x)509 492 y Fu(1)543 483 y Fs(;)11 b(:)g(:)h(:)23 b(;)11 b(x)751 491 y Fn(n)794 483 y Fv(\))20 b(:)f Fo(D)942 492 y Fm(1)1000 483 y Fv(=)-12 b FB(\))20 b Fs(E)1190 456 y Ft(0)1211 483 y Fv(\()p Fs(x)1278 492 y Fu(1)1313 483 y Fs(;)12 b(:)f(:)g(:)23 b(;)12 b(x)1522 491 y Fn(n)1564 483 y Fv(\))20 b(:)f Fo(D)1712 492 y Fm(2)3393 483 y FF(\(4.3\))386 562 y FB(ff)601 641 y Fs(X)386 720 y FB(gg)386 799 y Fs(T)386 877 y FB(ff)601 956 y Fs(Y)386 1035 y FB(gg)1564 1186 y Fy(\(a\))g(General)g(Prairie)f (T)-7 b(-rule)p 369 1285 3146 4 v 386 1340 a Fv(\()p Fs(E)23 b FF(?op)p 587 1340 20 4 v 25 w(ar)o(g1)d Fv(\(?1)13 b Fs(:)e(:)h(:)o Fv(?)p Fs(n)p Fv(\)\))21 b FB(!)e Fv(\()p Fs(E)1258 1313 y Ft(0)1300 1340 y FF(?op)p 1399 1340 V 25 w(ar)o(g2)h Fv(\(?1)13 b Fs(:)f(:)f(:)p Fv(?)p Fs(n)p Fv(\)\))1516 b FF(\(4.4\))386 1444 y(\045cond)p 573 1444 V 25 w(code)386 1523 y FB(ff)601 1602 y Fs(X)664 1578 y Ft(0)601 1681 y FF(if)18 b(\(!\()p Fs(T)776 1657 y Ft(0)798 1681 y FF(\)\))f(REJECT)l(;)386 1760 y FB(gg)386 1839 y FF(\045appl)p 558 1839 V 25 w(code)386 1917 y FB(ff)601 1996 y Fs(Y)658 1973 y Ft(0)386 2075 y FB(gg)423 2234 y Fy(\(b\))24 b(V)-10 b(olcano)25 b(trans)p 950 2234 23 4 v 28 w(rule)e(corresponding)k(to)d(the)g(T)-7 b(-rule)23 b(in)h(\(a\).)40 b Fl(?)p Fq(i)25 b Fy(corresponds)g(to)f Fq(x)2786 2242 y Fn(i)2812 2234 y Fy(,)h(and)g Fq(X)3057 2202 y Ft(0)3079 2234 y Fy(,)g Fq(T)3179 2202 y Ft(0)3201 2234 y Fy(,)g(and)f Fq(Y)3438 2202 y Ft(0)423 2326 y Fy(correspond)d(to)e Fq(X)6 b Fy(,)18 b Fq(T)11 b Fy(,)18 b(and)i Fq(Y)c Fy(,)j(respectively)-5 b(,)19 b(with)g(property)h (references)f(suitably)g(modi\256ed.)p 3562 2450 4 2047 v 318 2453 3247 4 v 3564 2470 19 2054 v 335 2470 3247 19 v 1391 2665 a FP(Figure)25 b(4.5:)31 b(T)m(ranslating)25 b(T)-8 b(-rules)300 3042 y(to)29 b(op)p 494 3042 28 4 v 34 w(ar)n(g)g(as)g(a)g(C)f(struct.)48 b(On)28 b(the)i(other)g(hand,)h (since)f(logical)h(properties)g(are)f(pointers)h(to)e(shared)300 3211 y(structures,)d(the)e(reference)i(in)d(statement)i(2)e(to)h(log)p 1940 3211 V 34 w(prop)g(is)f(as)h(a)f(pointer)-5 b(.)583 3381 y(There)31 b(are)f(two)f(interesting)k(points)f(to)e(note)g(in)g (this)h(translation.)53 b(Note)30 b(that)g(a)g(single)h(de-)297 3550 y(scriptor)23 b(copy)f(\()p Fp(D)902 3564 y Fo(7)972 3550 y FA(=)j Fp(D)1148 3564 y Fo(5)1193 3550 y FP(\))20 b(statement)j(in)e(Figure)g(4.6\(a\))h(results)g(in)f(two)f(assignment) j(statements)g(in)297 3720 y(Figure)f(4.6\(b\),)g(one)g(for)f(copying)i (the)f(operator)h(ar)n(gument)g(\(join)f(predicate\),)i(and)d(another)i (for)f(copy-)300 3889 y(ing)27 b(a)g FD(pointer)i FP(to)d(a)h(shared)h (logical)h(property)g(structure.)43 b(Since)27 b(physical)i(properties) g(and)f(cost)f(are)300 4058 y(not)d(relevant)h(in)f(a)f(T)-8 b(-rule,)23 b(they)i(are)e(not)h(copied.)1890 4025 y Fv(2)576 4228 y FP(Second,)18 b(note)g(that)f(statements)h(1,)g(6,)f (and)g(7)g(in)f(Figure)h(4.6\(a\),)i(which)e(compute)g(logical)i(prop-) 294 4397 y(erties)f(of)g Fp(D)680 4411 y Fo(6)725 4397 y FP(,)g(are)g(reduced)h(to)f(NO)p 1423 4397 V 32 w(OP)e(statements.) 1987 4364 y Fv(3)2057 4397 y FP(Again,)j(this)g(is)e(because)j(logical) f(properties)h(are)292 4566 y(computed)f(before)e(optimization)j (begins)e(\(by)f(DBI-de\256ned)g(support)h(functions,)j(init)p 3042 4566 V 34 w(descriptor\),)f(so,)300 4736 y(these)25 b(statements)g(are)f(redundant.)p 300 4798 1320 4 v 400 4852 a Fu(2)434 4884 y Fy(They)c(are,)e(however)m(,)i(initialized)e(by) i(DBI-de\256ned)f(init)p 1934 4884 23 4 v 27 w(descriptor)g(functions.) 400 4943 y Fu(3)434 4975 y Fy(The)g(P2V)g(preprocessor)h (macro-de\256nes)g(NO)p 1675 4975 V 27 w(OP)e(as)h(an)g(empty)h (statement.)1905 5349 y FP(49)p eop %%Page: 50 62 50 61 bop 318 403 3247 4 v 318 3219 4 2816 v 386 478 a FF(JOIN)o Fv(\()p FF(JOIN)q Fv(\()p Fs(S)771 487 y Fu(1)806 478 y Fs(;)11 b(S)880 487 y Fu(2)915 478 y Fv(\))20 b(:)f Fo(D)1063 487 y Fm(4)1102 478 y Fs(;)11 b(S)1176 487 y Fu(3)1211 478 y Fv(\))20 b(:)f Fo(D)1359 487 y Fm(5)1417 478 y Fv(=)-12 b FB(\))20 b FF(JOIN)p Fv(\()p Fs(S)1765 487 y Fu(1)1800 478 y Fs(;)11 b FF(JOIN)p Fv(\()p Fs(S)2045 487 y Fu(2)2080 478 y Fs(;)g(S)2154 487 y Fu(3)2189 478 y Fv(\))20 b(:)f Fo(D)2337 487 y Fm(6)2376 478 y Fv(\))h(:)f Fo(D)2524 487 y Fm(7)3393 478 y FF(\(4.5\))386 557 y FB(ff)601 635 y FF(1.)j Fo(D)735 644 y Fm(6)774 635 y Fs(:)p FF(attributes)h Fv(=)c FF(union)f Fv(\()p Fo(D)1392 644 y Fm(2)1432 635 y Fs(:)p FF(attributes)r Fs(;)12 b Fo(D)1792 644 y Fm(3)1831 635 y Fs(:)p FF(attributes)r Fv(\))18 b(;)386 714 y FB(gg)386 793 y FF(2.)j(is)p 505 793 20 4 v 25 w(associative)f Fv(\()p Fo(D)923 802 y Fm(5)962 793 y Fs(:)p FF(join)p 1088 793 V 25 w(predicate)s Fs(;)12 b Fo(D)1446 802 y Fm(2)1485 793 y Fs(:)p FF(attributes)s Fv(\))386 872 y FB(ff)601 951 y FF(3.)22 b Fo(D)735 960 y Fm(7)794 951 y Fv(=)d Fo(D)930 960 y Fm(5)986 951 y Fv(;)601 1030 y FF(4.)j Fo(D)735 1039 y Fm(7)774 1030 y Fs(:)p FF(join)p 900 1030 V 25 w(predicate)h Fv(=)d Fo(D)1321 1039 y Fm(4)1360 1030 y Fs(:)p FF(join)p 1486 1030 V 25 w(predicate)g Fv(;)601 1109 y FF(5.)i Fo(D)735 1118 y Fm(6)774 1109 y Fs(:)p FF(join)p 900 1109 V 25 w(predicate)h Fv(=)d Fo(D)1321 1118 y Fm(5)1360 1109 y Fs(:)p FF(join)p 1486 1109 V 25 w(predicate)g Fv(;)601 1188 y FF(6.)i Fo(D)735 1197 y Fm(6)774 1188 y Fs(:)p FF(record)p 966 1188 V 25 w(width)f Fv(=)f Fo(D)1295 1197 y Fm(2)1334 1188 y Fs(:)p FF(record)p 1526 1188 V 25 w(width)d Fv(+)f Fo(D)1847 1197 y Fm(3)1885 1188 y Fs(:)p FF(record)p 2077 1188 V 26 w(width)i Fv(;)601 1266 y FF(7.)k Fo(D)735 1275 y Fm(6)774 1266 y Fs(:)p FF(cardinality)i Fv(=)19 b FF(compute)p 1403 1266 V 26 w(cardinality)h Fv(\()p Fo(D)1814 1275 y Fm(2)1854 1266 y Fs(;)11 b Fo(D)1947 1275 y Fm(3)1986 1266 y Fv(\))17 b(;)386 1345 y FB(gg)1533 1496 y Fy(\(a\))i(Join)g(associativity)g(T)-7 b(-rule)p 369 1598 3146 4 v 386 1648 a Fv(\()p FF(JOIN)19 b(?op)p 675 1648 20 4 v 25 w(ar)o(g5)i Fv(\(\()p FF(JOIN)f(?op)p 1150 1648 V 25 w(ar)o(g4)g Fv(\(?1)h(?2\)\))g(?3\)\))g FB(!)e Fv(\()p FF(JOIN)h(?op)p 2089 1648 V 25 w(ar)o(g7)g Fv(\(?1)h(\()p FF(JOIN)f(?op)p 2652 1648 V 25 w(ar)o(g6)g Fv(\(?2)h(?3\)\)\)\))292 b FF(\(4.6\))386 1752 y(\045cond)p 573 1752 V 25 w(code)386 1831 y FB(ff)601 1909 y FF(1.)22 b(NO)p 773 1909 V 24 w(OP)17 b(;)601 1988 y(2.)22 b(if)c Fv(\(!\()p FF(is)p 853 1988 V 24 w(associative)i Fv(\()p FF(?op)p 1307 1988 V 26 w(ar)o(g5)g FB(!)f FF(op)p 1625 1988 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1855 1988 V 25 w(predicate)s Fs(;)12 b Fv(?2)20 b FB(!)f FF(expr)q Fs(:)p FF(ar)o(gument)q Fs(:)p FF(log)p 2824 1988 V 25 w(prop)h FB(!)f FF(attributes)t Fv(\)\)\))736 2067 y FF(REJECT)d Fv(;)386 2146 y FB(gg)386 2225 y FF(\045appl)p 558 2225 V 25 w(code)386 2304 y FB(ff)601 2383 y FF(3.)22 b(?op)p 772 2383 V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090 2383 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2383 V 25 w(predicate)k Fv(=)c FF(?op)p 1777 2383 V 25 w(ar)o(g5)h FB(!)g FF(op)p 2095 2383 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2383 V 25 w(predicate)g Fv(;)601 2462 y FF(3.)i(?op)p 772 2462 V 25 w(ar)o(g7)f FB(!)e FF(log)p 1108 2462 V 25 w(prop)h Fv(=)f FF(?op)p 1443 2462 V 25 w(ar)o(g5)i FB(!)e FF(log)p 1779 2462 V 25 w(prop)e Fv(;)601 2540 y FF(4.)22 b(?op)p 772 2540 V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090 2540 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2540 V 25 w(predicate)k Fv(=)c FF(?op)p 1777 2540 V 25 w(ar)o(g4)h FB(!)g FF(op)p 2095 2540 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2540 V 25 w(predicate)g Fv(;)601 2619 y FF(5.)i(?op)p 772 2619 V 25 w(ar)o(g6)f FB(!)e FF(op)p 1090 2619 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2619 V 25 w(predicate)k Fv(=)c FF(?op)p 1777 2619 V 25 w(ar)o(g5)h FB(!)g FF(op)p 2095 2619 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2619 V 25 w(predicate)g Fv(;)601 2698 y FF(6.)i(NO)p 773 2698 V 24 w(OP)17 b(;)601 2777 y(7.)22 b(NO)p 773 2777 V 24 w(OP)17 b(;)386 2856 y FB(gg)423 3006 y Fy(\(b\))j(P2V)-7 b(-generated)21 b(trans)p 1140 3006 23 4 v 27 w(rule)f(corresponding)j (to)d(the)g(T)-7 b(-rule)19 b(in)h(\(a\).)28 b(Statement)20 b(numbers)h(correspond)h(to)e(the)423 3098 y(same)f(numbered)i (statements)e(in)g(\(a\).)p 3562 3219 4 2816 v 318 3222 3247 4 v 3564 3239 19 2823 v 335 3239 3247 19 v 1022 3435 a FP(Figure)24 b(4.6:)31 b(T)m(ranslating)25 b(the)f(join)g (associativity)k(T)-8 b(-rule)580 3811 y(A)19 b(\256nal)h(issue)h(in)f (translating)j(T)-8 b(-rules)20 b(is)g(that)h(of)f(enforcer)n (-operators.)35 b(Recall)21 b(that)g(enforcer)n(-)295 3981 y(operators)g(are)e(discarded)i(by)d(the)h(preprocessor)k(when)18 b(translating)k(Prairie)d(rules)h(into)f(V)-12 b(olcano.)31 b(This)300 4150 y(means)f(that)g(if)f(an)g(expression)k(in)c(a)g(T)-8 b(-rule)29 b(contains)j(an)d(enforcer)n(-operator)m(,)36 b(the)29 b(P2V)f(preproces-)297 4319 y(sor)22 b(deletes)g(the)g (enforcer)n(-operator)k(when)21 b(translating)j(the)d(expression)j(to)d (V)-12 b(olcano.)32 b(What)21 b(happens)300 4489 y(to)31 b(the)h(T)-8 b(-rule')j(s)31 b(actions)i(when)f(a)f(statement)h (references)i(the)e(descriptor)i(of)d(the)g(\(now-discarded\))299 4658 y(enforcer)n(-operator?)37 b(The)22 b(answer)h(becomes)h(obvious)h (when)e(we)f(consider)j(that)e(enforcer)n(-operators)300 4827 y(have)35 b(the)g(same)f(logical)i(properties)i(and)c(operator)j (ar)n(guments)g(as)d(their)h(input.)65 b(Thus,)37 b(when)d(an)300 4997 y(enforcer)n(-operator)e(like)c(SOR)-5 b(T)m FA(\()p FH(S)1440 5011 y Fv(1)1480 4997 y FA(\))37 b(:)f Fp(D)1693 5011 y Fo(2)1764 4997 y FP(is)27 b(deleted,)i(references)g(to)e (properties)j(of)c Fp(D)3230 5011 y Fo(2)3301 4997 y FP(are)h(con-)1905 5349 y(50)p eop %%Page: 51 63 51 62 bop 318 403 3247 4 v 318 2588 4 2185 v 386 478 a FF(JOIN)o Fv(\()p Fs(S)599 487 y Fu(1)634 478 y Fs(;)12 b(S)709 487 y Fu(2)743 478 y Fv(\))20 b(:)g Fo(D)892 487 y Fm(3)950 478 y Fv(=)-12 b FB(\))19 b FF(JOPR)p Fv(\()p FF(SOR)l(T)q Fv(\()p Fs(S)1502 487 y Fu(1)1537 478 y Fv(\))h(:)f Fo(D)1685 487 y Fm(4)1724 478 y Fs(;)11 b FF(SOR)l(T)p Fv(\()p Fs(S)1991 487 y Fu(2)2026 478 y Fv(\))20 b(:)f Fo(D)2174 487 y Fm(5)2213 478 y Fv(\))h(:)f Fo(D)2361 487 y Fm(6)3393 478 y FF(\(4.7\))386 557 y FB(ff)601 635 y FF(1.)j Fo(D)735 644 y Fm(4)794 635 y Fv(=)d Fo(D)930 644 y Fm(1)986 635 y Fv(;)601 714 y FF(2.)j Fo(D)735 723 y Fm(5)794 714 y Fv(=)d Fo(D)930 723 y Fm(2)986 714 y Fv(;)386 793 y FB(gg)386 872 y FF(3.)i Fv(\()p Fo(D)546 881 y Fm(4)586 872 y Fs(:)p FF(cardinality)i Fs(<)d Fv(10000\))386 951 y FB(ff)601 1030 y(\001)12 b(\001)f(\001)386 1109 y(gg)1353 1259 y Fy(\(a\))18 b(T)-7 b(-rule)19 b(with)f(enforcer)o(-operator)i(SOR)l(T)p 369 1361 3146 4 v 386 1411 a Fv(\()p FF(JOIN)f(?op)p 675 1411 20 4 v 25 w(ar)o(g3)i Fv(\(?1)f(?2\)\))h FB(!)f Fv(\()p FF(JOPR)g(?op)p 1483 1411 V 25 w(ar)o(g6)g Fv(\(?1)h(?2\)\)) 1515 b FF(\(4.8\))386 1515 y(\045cond)p 573 1515 V 25 w(code)386 1594 y FB(ff)601 1673 y FF(1.)22 b(NO)p 773 1673 V 24 w(OP)17 b(;)601 1752 y(2.)22 b(NO)p 773 1752 V 24 w(OP)17 b(;)601 1831 y(3.)22 b(if)c Fv(\(!\(\(?1)j FB(!)e FF(expr)q Fs(:)p FF(ar)o(gument)q Fs(:)p FF(log)p 1506 1831 V 25 w(prop)h FB(!)f FF(cardinality)24 b Fs(<)19 b Fv(10000\)\)\))k FF(REJECT)15 b Fv(;)386 1909 y FB(gg)386 1988 y FF(\045appl)p 558 1988 V 25 w(code)386 2067 y FB(ff)601 2146 y(\001)d(\001)f(\001)386 2225 y(gg)423 2375 y Fy(\(b\))20 b(P2V)-7 b(-generated)21 b(trans)p 1140 2375 23 4 v 27 w(rule)f(corresponding)j(to)d(the)g(T)-7 b(-rule)19 b(in)h(\(a\).)28 b(Statement)20 b(numbers)h(correspond)h(to) e(the)423 2467 y(same)f(numbered)i(statements)e(in)g(\(a\).)p 3562 2588 4 2185 v 318 2591 3247 4 v 3564 2608 19 2192 v 335 2608 3247 19 v 953 2804 a FP(Figure)24 b(4.7:)31 b(T)m(ranslating)26 b(T)-8 b(-rules)24 b(with)f(enforcer)n(-operators) 300 3180 y(verted)j(to)e(references)j(to)d(properties)j(of)d Fp(D)1702 3194 y Fo(1)1770 3180 y FP(\(the)h(descriptor)i(of)d FH(S)2477 3194 y Fv(1)2516 3180 y FP(\).)33 b(This)24 b(is)g(shown)g(in)h(Figure)f(4.7)300 3350 y(where)g(the)g(reference)j (to)c(the)i(cardinality)h(of)e(a)g(SOR)-5 b(T)21 b(\(in)j(the)g(test)g (of)g(the)g(T)-8 b(-rule\))25 b(is)e(translated)k(to)d(a)300 3519 y(reference)i(to)d(the)h(cardinality)j(of)c(the)h(input)h(of)e (the)h(SOR)-5 b(T)20 b(in)k(the)g(V)-12 b(olcano)25 b(trans)p 2950 3519 28 4 v 34 w(rule.)300 3886 y FO(4.4)119 b(T)-9 b(ranslating)30 b(I-rules)297 4149 y FP(I-rules)22 b(in)f(Prairie)h (correspond)i(to)d(V)-12 b(olcano')-5 b(s)23 b(implementation)g(rules.) 31 b(However)l(,)22 b(the)f(translation)j(of)298 4318 y(I-rules)f(is)f(more)f(complicated)j(than)f(the)f(translation)i(of)e (T)-8 b(-rules.)30 b(This)22 b(is)f(primarily)j(because)f(the)f(ac-)300 4487 y(tions)i(associated)i(with)e(a)f(Prairie)g(I-rule)i(are)e(all)h (expressed)i(concomitantly)h(\(pre-opt)e(and)f(post-opt\))292 4657 y(with)17 b(the)g(rule.)29 b(In)17 b(V)-12 b(olcano,)19 b(on)e(the)g(other)g(hand,)i(there)f(are)f FD(four)g FP(distinct)i(support)f(functions)i(\(as)d(listed)299 4826 y(in)22 b(T)-6 b(able)22 b(2.3\))h(that)g(are)f(responsible)k(for) c(most)h(of)f(the)h(property)h(transformations)j(associated)e(with)d(a) 300 4996 y(implementation)28 b(rule.)37 b(This)25 b(means)h(that)f (when)h(translating)i(a)d(Prairie)h(I-rule)g(to)f(V)-12 b(olcano')-5 b(s)28 b(imple-)1905 5349 y(51)p eop %%Page: 52 64 52 63 bop 318 403 3247 4 v 318 3265 4 2862 v 386 478 a Fs(E)t Fv(\()p Fs(x)509 487 y Fu(1)543 478 y Fs(;)11 b(:)g(:)h(:)23 b(;)11 b(x)751 486 y Fn(n)794 478 y Fv(\))20 b(:)f Fo(D)942 487 y Fm(1)1000 478 y Fv(=)-12 b FB(\))20 b Fs(A)p Fv(\()p Fs(x)1254 487 y Fu(1)1288 478 y Fs(;)12 b(:)f(:)g(:)24 b(;)11 b(x)1497 486 y Fn(n)1539 478 y Fv(\))20 b(:)f Fo(D)1687 487 y Fm(2)3393 478 y FF(\(4.9\))386 557 y Fs(T)386 635 y FB(ff)601 714 y Fs(X)386 793 y FB(gg)386 872 y(ff)601 951 y Fs(Y)386 1030 y FB(gg)1571 1180 y Fy(\(a\))g(General)g(Prairie)f(I-rule)p 369 1280 3146 4 v 386 1330 a Fv(\()p Fs(E)23 b FF(?op)p 587 1330 20 4 v 25 w(ar)o(g1)d Fv(\(?1)13 b Fs(:)e(:)h(:)o Fv(?)p Fs(n)p Fv(\)\))21 b FB(!)e Fv(\()p Fs(A)h FF(?al)p 1355 1330 V 26 w(ar)o(g2)g Fv(\(?1)13 b Fs(:)e(:)g(:)p Fv(?)p Fs(n)p Fv(\)\))1527 b FF(\(4.10\))386 1433 y(\045cond)p 573 1433 V 25 w(code)386 1512 y FB(ff)601 1591 y FF(if)18 b(\(!\()p Fs(T)776 1568 y Ft(0)798 1591 y FF(\)\))f(REJECT)l(;)386 1670 y FB(gg)386 1749 y FF(\045appl)p 558 1749 V 25 w(code)386 1828 y FB(ff)601 1907 y Fs(==)h FF(book-keeping)h(statements)386 1985 y FB(gg)386 2064 y FE(Support)e(function)g FF(do)p 957 2064 V 25 w(any)p 1077 2064 V 25 w(good)p 1234 2064 V 24 w Fs(A)386 2143 y FB(f)601 2222 y Fs(X)664 2199 y Ft(0)386 2301 y FB(g)386 2380 y FE(Support)g(function)g FF(derive)p 1055 2380 V 26 w Fs(A)p 1134 2380 V 24 w FF(phy)p 1257 2380 V 25 w(prop)386 2459 y FB(f)601 2537 y Fs(Y)658 2514 y Ft(0)386 2616 y FB(g)423 2775 y Fy(\(b\))h(V)-10 b(olcano)19 b(impl)p 930 2775 23 4 v 27 w(rule)f(corresponding)j(to)d (the)g(I-rule)f(in)h(\(a\).)25 b Fl(?)p Fq(i)18 b Fy(corresponds)i(to)e Fq(x)2683 2783 y Fn(i)2709 2775 y Fy(,)f(and)i Fq(X)2940 2744 y Ft(0)2963 2775 y Fy(,)e Fq(T)3055 2744 y Ft(0)3077 2775 y Fy(,)h(and)h Fq(Y)3301 2744 y Ft(0)3341 2775 y Fy(cor)o(-)423 2867 y(respond)e(to)e Fq(X)6 b Fy(,)15 b Fq(T)c Fy(,)k(and)h Fq(Y)g Fy(,)g(respectively)-5 b(,)16 b(with)f(property)h(references)g(suitably)f(modi\256ed.)24 b(Note)15 b(that)g(the)g(general)423 2958 y(I-rule)h(is)g(translated)h (to)f(an)h(implementation)h(rule)e(and)h(two)f(support)i(functions)f (corresponding)i(to)d(the)h(algorithm)423 3049 y Fq(A)p Fy(.)32 b(The)21 b(remaining)h(support)g(functions)g(\(get)p 1657 3049 V 28 w(input)p 1838 3049 V 27 w(pv)g(and)g(cost\))f(are)h (\252grounded\272)h(\(i.e.,)e(contain)h(only)g(book-)423 3141 y(keeping)e(statements\).)p 3562 3265 4 2862 v 318 3268 3247 4 v 3564 3285 19 2869 v 335 3285 3247 19 v 1400 3481 a FP(Figure)k(4.8:)31 b(T)m(ranslating)26 b(I-rules)300 3857 y(mentation)i(rule,)f(the)f(actions)i(of)e(the)g(I-rule)h(have)g (to)f(be)g(partitioned)j(into)e(the)f(appropriate)j(support)300 4027 y(functions.)k(How)23 b(this)h(is)f(accomplished)k(is)c(the)h (most)g(challenging)j(problem.)583 4196 y(Broadly)32 b(speaking,)i(the)d(P2V)e(preprocessor)35 b(partitions)e(the)e(actions) h(of)e(an)h(I-rule)g(as)g(fol-)300 4365 y(lows.)36 b(The)25 b(test)h(of)g(an)f(I-rule)h(is)g(translated)i(to)d(the)h(condition)i (code)e(of)f(a)g(V)-12 b(olcano)27 b(implementation)300 4535 y(rule.)39 b(The)26 b(pre-opt)i(section)g(of)e(an)h(I-rule)g(is)f (transformed)j(into)e(the)f(do)p 2629 4535 28 4 v 34 w(any)p 2793 4535 V 34 w(good)h(function)h(for)f(the)295 4704 y(appropriate)c(algorithm,)e(and)f(the)g(post-opt)h(section)g(is)e (translated)j(to)d(the)h(derive)p 2895 4704 V 35 w(phy)p 3065 4704 V 34 w(prop)g(function.)300 4873 y(The)j(two)g(other)i (support)g(functions,)h(get)p 1627 4873 V 34 w(input)p 1846 4873 V 34 w(pv)e(and)g(cost,)g(are)g(translated)i(to)d(dummy)h (functions.)298 5043 y(That)e(is,)g(the)h(statements)h(in)e(these)h (two)f(functions)i(are)f(meant)f(for)g(book-keeping)27 b(purposes,)d(and)f(are)1905 5349 y(52)p eop %%Page: 53 65 53 64 bop 310 403 3264 4 v 310 3774 4 3371 v 386 478 a FF(JOIN)o Fv(\()p Fs(S)599 487 y Fu(1)634 478 y Fs(;)12 b(S)709 487 y Fu(2)743 478 y Fv(\))20 b(:)g Fo(D)892 487 y Fm(3)950 478 y Fv(=)-12 b FB(\))19 b FF(Nested)p 1270 478 20 4 v 26 w(loops)q Fv(\()p Fs(S)1506 487 y Fu(1)1560 478 y Fv(:)g Fo(D)1661 487 y Fm(4)1700 478 y Fs(;)12 b(S)1775 487 y Fu(2)1809 478 y Fv(\))20 b(:)g Fo(D)1958 487 y Fm(5)3363 478 y FF(\(4.1)n(1\))386 557 y(1.)h(TRUE)386 635 y FB(ff)601 714 y FF(2.)h Fo(D)735 723 y Fm(5)794 714 y Fv(=)d Fo(D)930 723 y Fm(3)986 714 y Fv(;)601 793 y FF(3.)j Fo(D)735 802 y Fm(4)794 793 y Fv(=)d Fo(D)930 802 y Fm(1)986 793 y Fv(;)601 872 y FF(4.)j Fo(D)735 881 y Fm(4)774 872 y Fs(:)p FF(tuple)p 929 872 V 26 w(order)e Fv(=)g Fo(D)1247 881 y Fm(3)1286 872 y Fs(:)p FF(tuple)p 1441 872 V 25 w(order)e Fv(;)601 951 y FF(5.)k Fo(D)735 960 y Fm(5)774 951 y Fs(:)p FF(cost)f Fv(=)e Fo(D)1057 960 y Fm(4)1096 951 y Fs(:)p FF(cardinality)g FB(\003)d Fo(D)1528 960 y Fm(2)1567 951 y Fs(:)p FF(cardinality)21 b Fv(;)386 1030 y FB(gg)386 1109 y(ff)601 1188 y FF(6.)h Fo(D)735 1197 y Fm(5)774 1188 y Fs(:)p FF(tuple)p 929 1188 V 26 w(order)e Fv(=)g Fo(D)1247 1197 y Fm(4)1286 1188 y Fs(:)p FF(tuple)p 1441 1188 V 25 w(order)e Fv(;)386 1266 y FB(gg)1605 1417 y Fy(\(a\))g(Nested)h(loops)h(I-rule)p 361 1519 3162 4 v 377 1569 a Fv(\()p FF(JOIN)g(?op)p 667 1569 20 4 v 25 w(ar)o(g1)g Fv(\(?1)h(?2\)\))g FB(!)e Fv(\()p FF(Nested)p 1387 1569 V 26 w(loops)i(?al)p 1653 1569 V 25 w(ar)o(g2)f Fv(\(?1)h(?2\)\))1304 b FF(\(4.12\))377 1673 y(\045cond)p 564 1673 V 26 w(code)377 1752 y FB(ff)593 1831 y FF(1.)22 b(if)17 b Fv(\(!\()p FF(TRUE)p Fv(\)\))h FF(REJECT)d Fv(;)377 1909 y FB(gg)377 1988 y FF(\045appl)p 549 1988 V 26 w(code)377 2067 y FB(ff)593 2146 y Fs(==)i FF(book-keeping)j(statements)377 2225 y FB(gg)377 2304 y FE(Support)d(function)h FF(do)p 949 2304 V 24 w(any)p 1068 2304 V 25 w(good)p 1225 2304 V 25 w(Nested)p 1433 2304 V 25 w(loops)377 2383 y FB(f)593 2462 y Fs(==)f FF(book-keeping)j(statements)593 2540 y(2.)i(ret)p 738 2540 V 25 w(value)f FB(!)f FF(algorithm)p 1273 2540 V 26 w(ar)o(gument)q Fs(:)p FF(log)p 1652 2540 V 25 w(prop)g Fv(=)g FF(operator)p 2112 2540 V 26 w(ar)o(gument)h FB(!)e FF(log)p 2581 2540 V 25 w(prop)e Fv(;)593 2619 y FF(3.)22 b(NO)p 765 2619 V 24 w(OP)16 b(;)593 2698 y(4.)22 b(ret)p 738 2698 V 25 w(value)f FB(!)f FF(algorithm)p 1273 2698 V 26 w(ar)o(gument)q Fs(:)p FF(al)p 1615 2698 V 25 w(ar)o(g)g FB(!)f FF(required[0])k FB(!)c FF(tuple)p 2373 2698 V 26 w(order)h Fv(=)g FF(needed)p 2819 2698 V 26 w(phy)p 2944 2698 V 24 w(prop)h FB(!)e FF(tuple)p 3331 2698 V 26 w(order)e Fv(;)593 2777 y FF(5.)22 b(ret)p 738 2777 V 25 w(value)f FB(!)f FF(algorithm)p 1273 2777 V 26 w(ar)o(gument)q Fs(:)p FF(al)p 1615 2777 V 25 w(ar)o(g)g FB(!)f FF(cost)i Fv(=)728 2856 y FF(ret)p 801 2856 V 25 w(value)g FB(!)e FF(algorithm)p 1335 2856 V 27 w(ar)o(gument)q Fs(:)p FF(al)p 1678 2856 V 25 w(ar)o(g)h FB(!)f FF(desc[0])i FB(!)e FF(log)p 2285 2856 V 25 w(prop)h FB(!)g FF(cardinality)743 2935 y FB(\003)c FF(ret)p 867 2935 V 25 w(value)22 b FB(!)d FF(algorithm)p 1402 2935 V 26 w(ar)o(gument)r Fs(:)p FF(al)p 1745 2935 V 24 w(ar)o(g)i FB(!)e FF(desc[1])i FB(!)e FF(log)p 2352 2935 V 25 w(prop)h FB(!)f FF(cardinality)i Fv(;)377 3014 y FB(g)377 3092 y FE(Support)c(function)h FF(derive)p 1047 3092 V 26 w(Nested)p 1256 3092 V 25 w(loops)p 1424 3092 V 25 w(phy)p 1548 3092 V 25 w(prop)377 3171 y FB(f)593 3250 y Fs(==)f FF(book-keeping)j(statements)593 3329 y(6.)i(algorithm)p 925 3329 V 26 w(ar)o(gument)f FB(!)f FF(phy)p 1410 3329 V 24 w(prop)g FB(!)g FF(tuple)p 1797 3329 V 25 w(order)h Fv(=)f FF(input)p 2192 3329 V 25 w(phy)p 2316 3329 V 25 w(prop[0])g FB(!)g FF(tuple)p 2781 3329 V 25 w(order)e Fv(;)377 3408 y FB(g)415 3558 y Fy(\(b\))13 b(P2V)-7 b(-generated)14 b(impl)p 1110 3558 23 4 v 27 w(rule)f(and)g(support)h(functions)g(corresponding)h(to) e(the)g(I-rule)g(in)g(\(a\).)23 b(Statement)12 b(numbers)415 3650 y(correspond)20 b(to)f(the)g(same)g(numbered)i(statements)e(in)g (\(a\).)p 3570 3774 4 3371 v 310 3777 3264 4 v 3572 3794 19 3378 v 326 3794 3264 19 v 1113 3990 a FP(Figure)24 b(4.9:)32 b(T)m(ranslating)25 b(the)f(nested)h(loops)g(I-rule)300 4366 y(not)j(taken)g(from)f(the)h(actions)h(of)e(any)h(I-rule.)43 b(These)27 b(book-keeping)32 b(statements)d(are)e(primarily)i(re-)297 4536 y(sponsible)23 b(for)e(pointer)i(manipulations)h(and)d(copying)i (of)d(shared)j(property)f(structures.)33 b(This)20 b(process)299 4705 y(is)j(shown)g(in)g(Figure)g(4.8)g(which)g(shows)g(a)f(general)j (Prairie)e(I-rule)h(\(Figure)g(4.8\(a\)\))f(and)h(the)f(V)-12 b(olcano)300 4874 y(implementation)26 b(rule)f(and)f(support)h (functions)h(that)e(it)f(is)h(translated)i(to)d(\(Figure)i(4.8\(b\)\).) 579 5044 y(Most)19 b(of)h(the)f(dif)n(\256culty)j(in)d(an)g(I-rule)i (translation)h(involves)g(translating)g(property)g(references)1905 5349 y(53)p eop %%Page: 54 66 54 65 bop 300 391 a FP(in)27 b(Prairie)g(to)f(those)i(in)f(V)-12 b(olcano.)41 b(Since)27 b(the)g(property)i(translation)h(process)e (involves)h(pointers)g(\(as)298 561 y(shown)23 b(in)e(Figure)i(4.2\),)f (the)g(generated)i(code)f(for)f(the)g(V)-12 b(olcano)23 b(support)h(functions)h(contains)f(a)d(lot)h(of)296 730 y(pointer)f(manipulation)i(operations.)32 b(It)19 b(is)h(illuminating)i (to)e(consider)h(an)f(example)h(that)f(illustrates)i(the)300 899 y(translation)27 b(process.)583 1069 y(Consider)40 b(the)f(nested)g(loops)h(I-rule)f(from)f(Chapter)h(3,)i(shown)e(in)f (Figure)h(4.9\(a\).)76 b(The)300 1238 y(V)-12 b(olcano)38 b(implementation)i(rule)d(and)g(support)i(functions)g(\(do)p 2391 1238 28 4 v 34 w(any)p 2555 1238 V 34 w(good)p 2769 1238 V 35 w(Nested)p 3055 1238 V 34 w(loops)f(and)f(de-)294 1408 y(rive)p 439 1408 V 34 w(Nested)p 724 1408 V 35 w(loops)p 954 1408 V 34 w(phy)p 1123 1408 V 34 w(prop\))20 b(generated)h(by)d(the)h(P2V)e(preprocessor)22 b(are)d(shown)g(in)f (Figure)h(4.9\(b\).)300 1577 y(The)34 b(statements)i(are)f(numbered,)j (and)d(correspond)i(to)d(the)h(same)f(numbered)i(statements)g(in)e (Fig-)300 1746 y(ure)24 b(4.9\(a\).)583 1916 y(The)35 b(interesting)j(points)f(to)e(note)h(are)f(the)h(translation)i(of)d (the)g(pre-opt)i(and)f(the)f(post-opt)300 2085 y(sections)g(of)e(the)g (I-rule.)61 b(As)32 b(shown)h(in)g(Figure)h(4.8,)h(these)f(are)f (translated)j(to)d(support)i(functions)300 2254 y(do)p 395 2254 V 34 w(any)p 559 2254 V 34 w(good)p 773 2254 V 34 w(Nested)p 1058 2254 V 34 w(loops)g(and)g(derive)p 1712 2254 V 35 w(Nested)p 1998 2254 V 34 w(loops)p 2227 2254 V 35 w(phy)p 2397 2254 V 34 w(prop,)i(respectively)-6 b(.)65 b(Notice)34 b(how)297 2424 y(the)21 b(third)h(statement)h(in)e (the)g(I-rule)h(is)f(translated)i(to)e(a)g(NO)p 2176 2424 V 32 w(OP)e(statement.)32 b(This)20 b(is)h(because)i(the)e(only) 300 2593 y(properties)26 b(of)e FH(D)860 2607 y Fv(4)922 2593 y FP(that)h(can)f(be)f(changed)j(in)e(the)g(pre-opt)h(section)g (are)f(the)g(physical)i(properties)g(\(this)295 2762 y(corresponds)c(to)c(V)-12 b(olcano')-5 b(s)21 b(concept)g(of)d (\252needed)j(physical)g(properties\272;)j(see)19 b(Section)g(2.2\),)h (which)f(is)296 2932 y(accomplished)k(by)d(the)g(fourth)h(statement.)31 b(The)20 b(physical)i(properties)g(of)e(the)g(inputs)h(of)f(Nested)p 3378 2932 V 34 w(loops)300 3101 y(are)27 b(represented)j(as)d(pointers) i(to)e(physical)i(property)g(structures,)h(as)d(evidenced)i(by)e(the)g (translation)300 3271 y(of)c(the)h(fourth)h(statement.)579 3440 y(In)19 b(general,)j(the)e(translation)j(of)c(I-rule)i(actions)g (involves)h(a)d(lot)h(of)f(book-keeping)24 b(statements)300 3609 y(and,)33 b(as)d(Figure)h(4.9\(b\))h(shows,)g(a)e(lot)h(of)g (pointer)h(traversals.)55 b(This)30 b(is)h(necessary)i(because)f(of)f (the)300 3779 y(way)26 b(the)g(P2V)f(preprocessor)30 b(transforms)e(Prairie)f(descriptors)i(into)e(V)-12 b(olcano)28 b(properties,)h(and)e(also)300 3948 y(because)h(of)f(the)f(rigid)h (structure)i(of)d(V)-12 b(olcano)28 b(support)g(functions)h(\(not)e (all)g(of)f(them)g(have)i(access)f(to)300 4117 y(all)d(property)h (structures)i(because)e(the)f(parameter)h(list)f(of)f(support)j (functions)g(is)d(pre-de\256ned\).)300 4424 y FN(4.4.1)99 b(T)-7 b(ranslating)25 b(Enfor)n(cers)300 4655 y FP(Figure)33 b(4.1)g(shows)h(how)e(the)i(P2V)d(preprocessor)37 b(identi\256es)d (enforcers)i(\(implicit)e(algorithms\))h(in)300 4824 y(Prairie.)i(As)24 b(described)k(in)e(Section)g(4.2.1,)g(rules)g (containing)i(enforcers)g(are)e(discarded)h(by)f(the)g(pre-)300 4993 y(processor)-5 b(.)33 b(What)24 b(becomes)h(of)e(the)h(actions)h (in)f(such)g(rules?)1905 5349 y(54)p eop %%Page: 55 67 55 66 bop 318 403 3247 4 v 318 2796 4 2393 v 386 478 a FF(SOR)l(T)o Fv(\()p Fs(S)621 487 y Fu(1)656 478 y Fv(\))20 b(:)g Fo(D)805 487 y Fm(2)863 478 y Fv(=)-12 b FB(\))19 b FF(Mer)o(ge)p 1171 478 20 4 v 25 w(sort)q Fv(\()p Fs(S)1362 487 y Fu(1)1397 478 y Fv(\))h(:)f Fo(D)1545 487 y Fm(3)3360 478 y FF(\(4.13\))386 557 y(1.)i Fv(\()p Fo(D)546 566 y Fm(2)586 557 y Fs(:)p FF(tuple)p 741 557 V 25 w(order)d Fv(!)8 b(=)19 b FF(DONT)p 1210 557 V 23 w(CARE)p Fv(\))386 635 y FB(ff)601 714 y FF(2.)j Fo(D)735 723 y Fm(3)794 714 y Fv(=)d Fo(D)930 723 y Fm(2)986 714 y Fv(;)601 793 y FF(3.)j Fo(D)735 802 y Fm(3)774 793 y Fs(:)p FF(cost)f Fv(=)e Fo(D)1057 802 y Fm(3)1096 793 y Fs(:)p FF(cardinality)g FB(\003)d Fv(log)q(\()p Fo(D)1646 802 y Fm(3)1686 793 y Fs(:)p FF(cardinality)t Fv(\))h(;)386 872 y FB(gg)386 951 y(ff)386 1109 y(gg)1636 1259 y Fy(\(a\))i(Mer)o(ge) g(sort)g(I-rule)p 369 1361 3146 4 v 386 1407 a FE(Support)e(function)g FF(do)p 957 1407 20 4 v 25 w(any)p 1077 1407 V 25 w(good)p 1234 1407 V 24 w(Mer)o(ge)p 1429 1407 V 25 w(sort)386 1486 y FB(f)601 1565 y Fs(==)h FF(book-keeping)h(statements)601 1644 y(1.)j(if)c Fv(\()p FF(needed)p 948 1644 V 26 w(phy)p 1073 1644 V 25 w(prop)i FB(!)f FF(tuple)p 1460 1644 V 26 w(order)f Fv(!)8 b(=)18 b FF(DONT)p 1929 1644 V 24 w(CARE)p Fv(\))f FB(f)601 1723 y FF(2.)163 b(ret)p 887 1723 V 25 w(value)21 b FB(!)e FF(algorithm)p 1421 1723 V 26 w(ar)o(gument)r Fs(:)p FF(log)p 1801 1723 V 24 w(prop)i Fv(=)e FF(operator)p 2260 1723 V 27 w(ar)o(gument)i FB(!)e FF(log)p 2730 1723 V 25 w(prop)e Fv(;)601 1802 y FF(3.)163 b(ret)p 887 1802 V 25 w(value)21 b FB(!)e FF(algorithm)p 1421 1802 V 26 w(ar)o(gument)r Fs(:)p FF(al)p 1764 1802 V 25 w(ar)o(g)h FB(!)f FF(cost)i Fv(=)854 1881 y FF(ret)p 927 1881 V 25 w(value)h FB(!)d FF(algorithm)p 1462 1881 V 26 w(ar)o(gument)r Fs(:)p FF(log)p 1842 1881 V 24 w(prop)h FB(!)g FF(cardinality)870 1960 y FB(\003)c Fv(log)q(\()p FF(ret)p 1112 1960 V 25 w(value)22 b FB(!)d FF(algorithm)p 1647 1960 V 26 w(ar)o(gument)r Fs(:)p FF(log)p 2027 1960 V 24 w(prop)i FB(!)e FF(cardinality)t Fv(\))e(;)601 2038 y FB(g)386 2117 y(g)386 2196 y FE(Support)g(function)g FF(derive)p 1055 2196 V 26 w(Mer)o(ge)p 1252 2196 V 25 w(sort)p 1376 2196 V 25 w(phy)p 1500 2196 V 25 w(prop)386 2275 y FB(f)601 2354 y Fs(==)h FF(book-keeping)h(statements)386 2433 y FB(g)423 2583 y Fy(\(b\))f(P2V)-7 b(-generated)18 b(support)h(functions)f(corresponding)i(to)e(the)f(I-rule)h(in)f (\(a\).)24 b(Statement)18 b(numbers)g(correspond)423 2674 y(to)h(the)g(same)g(numbered)i(statements)e(in)g(\(a\).)p 3562 2796 4 2393 v 318 2799 3247 4 v 3564 2816 19 2400 v 335 2816 3247 19 v 914 3011 a FP(Figure)24 b(4.10:)31 b(T)m(ranslating)26 b(I-rules)f(with)e(enforcer)n(-algorithms)583 3388 y(The)j(answer)i(is)e(obvious)i(when)f(one)g(considers)i(that)e (implicit)g(rules)h(are)e(basically)j(I-rules.)300 3557 y(Thus,)e(enforcers)i(have)e(support)h(functions)h(\(just)e(like)g (explicit)h(algorithms\).)42 b(This)26 b(means)h(that)g(ac-)298 3727 y(tions)22 b(of)f(an)h(implicit)g(rule)g(can)g(be)f(translated)j (as)d(statements)j(in)d(the)h(appropriate)i(support)f(functions.)298 3896 y(The)f(general)i(mechanism)f(for)f(translating)j(I-rules)f (\(Figure)f(4.8\))f(holds)h(for)g(enforcers)h(with)e(one)g(dif-)296 4066 y(ference:)31 b(the)20 b(test)h FH(T)32 b FP(of)20 b(an)f(implicit)j(rule)e(is)g(translated)i(to)e FH(T)2248 4033 y FB(0)2271 4066 y FP(,)g(and)g(is)g(used)h(as)f(a)f(condition)k (to)c(bracket)296 4235 y(the)i(set)g(of)f(actions)i FH(Y)993 4202 y FB(0)1036 4235 y FP(\(as)e(depicted)j(in)d(Figure)h(4.8\(b\)\))g (in)f(the)h(do)p 2421 4235 28 4 v 34 w(any)p 2585 4235 V 34 w(good)g(support)h(function.)32 b(The)300 4404 y(rest)24 b(of)f(the)h(translation)j(works)d(exactly)h(as)e(for)h(other)h (I-rules.)582 4574 y(Figure)e(4.10)g(illustrates)i(the)e(translation)i (of)e(the)f(mer)n(ge)h(sort)g(I-rule)h(into)f(two)f(support)i(func-)300 4743 y(tions)h(\(and)f(no)f(impl)p 968 4743 V 34 w(rules\).)1905 5349 y(55)p eop %%Page: 56 68 56 67 bop 323 403 3237 4 v 323 3729 4 3327 v 374 859 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.2 true 3.8 neg 6.1651 neg 140.3733 52.0825 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -338 x FH(O)443 535 y Fv(1)483 521 y FH(;)15 b(O)592 535 y Fv(2)632 521 y FH(;)g(O)741 535 y Fv(3)781 521 y FP(:)31 b(Operator)374 690 y FH(X)449 704 y Fv(1)489 690 y FH(;)15 b(X)604 704 y Fv(2)644 690 y FP(:)27 b(Operator)19 b(or)f(Algorithm)374 859 y FH(E)441 873 y Fv(1)480 859 y FH(;)d(E)587 873 y Fv(2)627 859 y FH(;)g(E)734 873 y Fv(3)774 859 y FP(:)31 b(Expression)1376 1207 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 0.0 -17.07164 17.07164 95.60129 17.07164 95.60129 0.0 -17.07164 0.0 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1280 1159 a FH(O)1349 1173 y Fv(1)1414 1159 y FA(=)-15 b FC(\))25 b FH(O)1655 1173 y Fv(2)1695 1159 y FA(;)15 b FH(O)1804 1173 y Fv(2)1869 1159 y FA(=)-15 b FC(\))25 b FH(X)2116 1173 y Fv(1)2297 1207 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -921 w @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 0.0 157.05902 17.07164 215.10277 17.07164 215.10277 0.0 157.05902 0.0 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2723 1161 a FH(O)2792 1175 y Fv(1)2857 1161 y FA(=)-15 b FC(\))24 b FH(X)3103 1175 y Fv(1)2318 1341 y Fy(\(a\))p 374 1441 3139 4 v 1376 1722 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 -11.95009 -17.07164 29.02173 95.60129 29.02173 95.60129 -11.95009 -17.07164 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1294 1674 a FH(O)1363 1688 y Fv(1)1428 1674 y FA(=)-15 b FC(\))25 b FH(O)1669 1688 y Fv(2)1709 1674 y FA(;)15 b FH(O)1818 1688 y Fv(2)1915 1637 y tx@Dict begin 30. Rot end 1915 1637 a FA(=)-15 b FC(\))1915 1637 y tx@Dict begin 30. neg Rot end 1915 1637 a 2027 1576 a FH(X)2102 1590 y Fv(1)1901 1680 y tx@Dict begin -30. Rot end 1901 1680 a FA(=)g FC(\))1901 1680 y tx@Dict begin -30. neg Rot end 1901 1680 a 2027 1761 a FH(X)2102 1775 y Fv(2)2297 1722 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -921 w @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 -11.95009 157.05902 29.02173 215.10277 29.02173 215.10277 -11.95009 157.05902 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2737 1676 a FH(O)2806 1690 y Fv(1)2850 1637 y tx@Dict begin 30. Rot end 2850 1637 a FA(=)g FC(\))2850 1637 y tx@Dict begin 30. neg Rot end 2850 1637 a 2962 1576 a FH(X)3037 1590 y Fv(1)2836 1680 y tx@Dict begin -30. Rot end 2836 1680 a FA(=)g FC(\))2836 1680 y tx@Dict begin -30. neg Rot end 2836 1680 a 2962 1761 a FH(X)3037 1775 y Fv(2)2315 1955 y Fy(\(b\))p 374 2055 3139 4 v 1376 2336 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 -11.95009 -17.07164 29.02173 95.60129 29.02173 95.60129 -11.95009 -17.07164 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1277 2190 a FH(O)1346 2204 y Fv(1)1376 2180 y tx@Dict begin -30. Rot end 1376 2180 a FA(=)g FC(\))1376 2180 y tx@Dict begin -30. neg Rot end 1376 2180 a 1277 2375 a FH(O)1346 2389 y Fv(2)1390 2350 y tx@Dict begin 30. Rot end 1390 2350 a FA(=)g FC(\))1390 2350 y tx@Dict begin 30. neg Rot end 1390 2350 a 1544 2287 a FH(O)1613 2301 y Fv(3)1652 2287 y FA(;)15 b FH(O)1761 2301 y Fv(3)1827 2287 y FA(=)-15 b FC(\))24 b FH(X)2073 2301 y Fv(1)2297 2336 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -921 w @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 -11.95009 157.05902 29.02173 215.10277 29.02173 215.10277 -11.95009 157.05902 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2737 2190 a FH(O)2806 2204 y Fv(1)2836 2180 y tx@Dict begin -30. Rot end 2836 2180 a FA(=)-15 b FC(\))2836 2180 y tx@Dict begin -30. neg Rot end 2836 2180 a 2737 2375 a FH(O)2806 2389 y Fv(2)2850 2350 y tx@Dict begin 30. Rot end 2850 2350 a FA(=)g FC(\))2850 2350 y tx@Dict begin 30. neg Rot end 2850 2350 a 2991 2290 a FH(X)3066 2304 y Fv(1)2318 2569 y Fy(\(c\))p 374 2669 3139 4 v 1376 2851 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 0.0 -17.07164 17.07164 95.60129 17.07164 95.60129 0.0 -17.07164 0.0 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1287 2802 a FH(E)1354 2816 y Fv(1)1419 2802 y FA(=)g FC(\))25 b FH(E)1658 2816 y Fv(2)1697 2802 y FA(;)15 b FH(E)1804 2816 y Fv(3)1869 2802 y FA(=)-15 b FC(\))25 b FH(X)2116 2816 y Fv(1)1702 2879 y tx@Dict begin -90. Rot end 1702 2879 a 1797 2950 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1702 2879 a tx@Dict begin -90. neg Rot end 1702 2879 a 1376 2851 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -17.07164 -75.1151 -17.07164 -58.04346 95.60129 -58.04346 95.60129 -75.1151 -17.07164 -75.1151 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1280 3426 a FH(O)1349 3440 y Fv(1)1414 3426 y FA(=)-15 b FC(\))25 b FH(O)1655 3440 y Fv(2)1695 3426 y FA(;)15 b FH(O)1804 3440 y Fv(2)1869 3426 y FA(=)-15 b FC(\))25 b FH(X)2116 3440 y Fv(1)2297 3475 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1376 2851 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 157.05902 -75.1151 157.05902 -58.04346 215.10277 -58.04346 215.10277 -75.1151 157.05902 -75.1151 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2723 3428 a FH(O)2792 3442 y Fv(1)2857 3428 y FA(=)-15 b FC(\))24 b FH(X)3103 3442 y Fv(1)2315 3608 y Fy(\(d\))p 3557 3729 4 3327 v 323 3732 3237 4 v 3558 3749 19 3334 v 340 3749 3237 19 v 1405 3945 a FP(Figure)g(4.1)m(1:)31 b(Rule)24 b(compaction)300 4322 y FO(4.5)119 b(Rule)31 b(Compaction)583 4585 y FP(Rule)23 b(compaction)i(is)e(a)f(technique)k (by)d(which)g(the)h(P2V)d(preprocessor)27 b(generates)e(a)e(smaller)300 4754 y(set)31 b(of)f(rules)i(from)e(a)h(typically)i(lar)n(ge)f(rule)f (set.)52 b(This)31 b(has)g(a)f(direct)i(bearing)g(on)f(the)g(ef)n (\256ciency)h(of)300 4924 y(the)e(generated)i(optimizer)l(,)h(since)d (a)g(smaller)g(rule)g(set)g(results)h(in)f(a)f(more)g(ef)n(\256cient)i (optimizer)h(\(see)300 5093 y(Appendix)25 b(B)e(for)g(a)g(more)h (formal)g(ar)n(gument)i(for)d(rule)h(compaction\).)1905 5349 y(56)p eop %%Page: 57 69 57 68 bop 582 391 a FP(The)22 b(basic)i(idea)f(in)f(rule)i(compaction)g (by)f(the)g(P2V)e(preprocessor)26 b(is)d(that)g(transitive)i(rewrite) 300 561 y(rules)f(can)g(be)f(replaced)i(with)e(a)g(single)i(rule.)31 b(In)23 b(other)h(words,)g(if)f(a)g(rule)g(transforms)j(one)d (expression)299 730 y(into)g(another)h(which)f(is,)f(in)g(turn,)h (transformed)i(into)e(a)f(third)h(expression)j(by)c(a)g(second)i(rule,) f(then)g(the)300 899 y(two)g(rules)i(can)f(be)g(replaced)i(with)d(a)g (single)j(rule)e(that)g(directly)i(transforms)f(the)f(original)i (expression)297 1069 y(into)c(the)g(\256nal)f(one.)30 b(This)21 b(general)i(principle)h(of)d(rule)h(compaction)h(results)g (in)e(four)h(speci\256c)g(cases,)h(as)298 1238 y(shown)g(in)f(Figure)h (4.1)m(1.)30 b(The)22 b(compaction)i(algorithm)g(is)e(not)h(as)f (simple)g(as)g(it)g(seems)h(at)f(\256rst)g(glance,)300 1408 y(since)j(rules)f(have)g(actions)i(which)e(have)g(to)f(meet)h (certain)h(criteria)g(to)f(be)f(compacted.)583 1577 y(Rule)j (compaction)i(works)e(by)f(progressively)30 b(reducing)d(pairs)g(of)e (rules)i(to)e(single)i(rules.)37 b(In)300 1746 y(general,)28 b(the)f(\256rst)e(rule)i(in)f(the)g(pair)h(consists)h(of)e(a)g(T)-8 b(-rule)26 b(transforming)j(an)d(operator)i(into)f(another)-5 b(.)300 1916 y(The)26 b(second)h(rule)g(in)f(the)h(pair)f(can)h(either) g(be)f(a)g(T)-8 b(-rule)26 b(or)g(an)g(I-rule.)40 b(The)26 b(actions)h(of)g(a)e(compacted)296 2085 y(rule)20 b(set)g(are)g (derived)i(from)d(the)h(actions)i(of)d(the)h(last)h(of)e(the)h (sequence)i(of)e(the)g(rules)h(being)g(compacted.)580 2254 y(Consider)i(Figure)e(4.1)m(1\(b\))h(as)e(an)h(example.)31 b(The)21 b(Prairie)g(rule)g(set)g(being)h(compacted)h(can)e(be)300 2424 y(viewed)j(as)g(consisting)i(of)e(two)f(pairs)h(of)g(rules,)396 2668 y FH(O)465 2682 y Fv(1)530 2668 y FA(=)-15 b FC(\))24 b FH(O)770 2682 y Fv(2)810 2668 y FA(;)15 b FH(O)919 2682 y Fv(2)985 2668 y FA(=)-15 b FC(\))24 b FH(X)1231 2682 y Fv(1)383 2862 y FH(O)452 2876 y Fv(1)517 2862 y FA(=)-15 b FC(\))25 b FH(O)758 2876 y Fv(2)798 2862 y FA(;)15 b FH(O)907 2876 y Fv(2)972 2862 y FA(=)-15 b FC(\))25 b FH(X)1219 2876 y Fv(2)1258 2862 y FH(;)292 3106 y FP(where)17 b(the)g(second)h(rule)f(in)f(each)h(pair)g(is)f (either)i(a)e(T)-8 b(-rule)16 b(or)h(an)f(I-rule)i(\(depending)h(on)e (whether)g FH(X)3421 3120 y Fv(1)3477 3106 y FP(and)299 3276 y FH(X)374 3290 y Fv(2)436 3276 y FP(are)22 b(operators)k(or)c (algorithms\).)33 b(It)22 b(is)h(clear)g(from)g(the)g(above)h(that)f (each)g(pair)g(of)g(rules)g(represents)300 3445 y(a)28 b(transitive)i(mapping:)42 b(the)28 b(\256rst,)h(from)f FH(O)1720 3459 y Fv(1)1787 3445 y FP(to)g FH(X)1960 3459 y Fv(1)1999 3445 y FP(,)g(and)h(the)f(second,)j(from)d FH(O)2924 3459 y Fv(1)2991 3445 y FP(to)g FH(X)3164 3459 y Fv(2)3203 3445 y FP(.)44 b(The)27 b(P2V)300 3614 y(preprocessor)l(,) 36 b(thus,)d(reduces)g(the)e(three)h(Prairie)f(rules)h(shown)f(above,)j (to)c(two)h(V)-12 b(olcano)32 b(rules,)h(as)300 3784 y(Figure)24 b(4.1)m(1\(b\))h(shows.)31 b(Figures)24 b(4.1)m(1\(a\))h (and)f(4.1)m(1\(c\))2109 3751 y Fv(4)2172 3784 y FP(depict)h(similar)g (compactions.)583 3953 y(An)f(interesting)j(case)d(of)g(rule)g (compaction)j(is)c(shown)i(in)f(Figure)g(4.1)m(1\(d\).)33 b(The)23 b(Prairie)i(rule)298 4122 y(set)e(being)g(compacted)h (consists)g(of)e(a)g(T)-8 b(-rule)22 b(transforming)j FH(E)2325 4136 y Fv(1)2385 4122 y FP(to)d FH(E)2544 4136 y Fv(2)2584 4122 y FP(,)f(and)i(another)g(rule)g(that)g(trans-)300 4292 y(forms)28 b FH(E)606 4306 y Fv(3)672 4292 y FP(to)f FH(X)844 4306 y Fv(1)884 4292 y FP(.)42 b(Expressions)30 b FH(E)1482 4306 y Fv(1)1521 4292 y FP(,)d FH(E)1638 4306 y Fv(2)1678 4292 y FP(,)g FH(E)1795 4306 y Fv(3)1862 4292 y FP(may)g(consist)i(of)e(enforcer)n(-operators)q(.)47 b(Now)-6 b(,)28 b(as)f(de-)300 4461 y(scribed)32 b(in)d(Section)i (4.2.1,)g(enforcer)n(-operators)36 b(are)30 b(discarded)i(when)e (expressions)j(and)d(rules)h(are)300 4630 y(translated)c(from)e (Prairie)h(to)e(V)-12 b(olcano)27 b(by)e(the)g(P2V)e(preprocessor)-5 b(.)39 b(It)24 b(is,)h(thus,)h(possible,)h(that)e(when)297 4800 y(enforcer)n(-operators)h(are)21 b(deleted)h(from)f FH(E)1663 4814 y Fv(1)1702 4800 y FP(,)g FH(E)1813 4814 y Fv(2)1852 4800 y FP(,)f(and)h FH(E)2113 4814 y Fv(3)2153 4800 y FP(,)f(that)h(expression)j FH(E)2828 4814 y Fv(1)2887 4800 y FP(is)d(transformed)i(to)d(an)p 300 4881 1320 4 v 400 4935 a Fu(4)434 4966 y Fy(This)14 b(compaction)h(is)e (currently)h(not)g(implemented)g(in)g(the)f(P2V)h(preprocessor)h (because,)g(in)f(our)g(experience,)h(it)e(usually)300 5058 y(does)20 b(not)f(occur)l(.)25 b(However)m(,)19 b(there)g(is)g(no)g(technical)h(dif)o(\256culty)e(in)h(implementing)h (it.)1905 5349 y FP(57)p eop %%Page: 58 70 58 69 bop 323 403 3237 4 v 323 3246 4 2843 v 943 624 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -5.12154 -68.28656 22.19318 78.52965 22.19318 78.52965 -5.12154 -68.28656 -5.12154 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 414 522 a Fh(LEFT)p 535 522 15 4 v 19 w(OUTER)p 719 522 V 19 w(JOIN)o Fu(\()p Fn(S)904 532 y Fg(1)937 522 y Fn(;)10 b(S)1004 532 y Fg(2)1036 522 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p Fn(S)1362 532 y Fg(1)1394 522 y Fn(;)11 b(S)1462 532 y Fg(2)1494 522 y Fu(\))414 609 y Fh(JOIN)p Fu(\()p Fn(S)584 619 y Fg(1)616 609 y Fn(;)f(S)683 619 y Fg(2)715 609 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Nested)p 1012 609 V 19 w(loops)p Fu(\()p Fn(S)1198 619 y Fg(1)1230 609 y Fn(;)10 b(S)1297 619 y Fg(2)1329 609 y Fu(\))1673 624 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -730 w @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -5.12154 131.45157 22.19318 307.28952 22.19318 307.28952 -5.12154 131.45157 -5.12154 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2077 565 a(\()p Fh(LEFT)p 2222 565 V 19 w(OUTER)p 2406 565 V 19 w(JOIN)17 b Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p 3017 565 V 18 w(loops)f Fu(\(?1)h(?2\)\)) 1884 772 y Fy(\(a\))p 374 872 3122 4 v 943 1153 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -11.95009 -68.28656 29.02173 78.52965 29.02173 78.52965 -11.95009 -68.28656 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 414 1008 a Fh(LEFT)p 535 1008 15 4 v 19 w(OUTER)p 719 1008 V 19 w(JOIN)o Fu(\()p Fn(S)904 1018 y Fg(1)937 1008 y Fn(;)10 b(S)1004 1018 y Fg(2)1036 1008 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p Fn(S)1362 1018 y Fg(1)1394 1008 y Fn(;)11 b(S)1462 1018 y Fg(2)1494 1008 y Fu(\))414 1095 y Fh(JOIN)p Fu(\()p Fn(S)584 1105 y Fg(1)616 1095 y Fn(;)f(S)683 1105 y Fg(2)715 1095 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Nested)p 1012 1095 V 19 w(loops)p Fu(\()p Fn(S)1198 1105 y Fg(1)1230 1095 y Fn(;)10 b(S)1297 1105 y Fg(2)1329 1095 y Fu(\))414 1182 y Fh(JOIN)p Fu(\()p Fn(S)584 1192 y Fg(1)616 1182 y Fn(;)g(S)683 1192 y Fg(2)715 1182 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1003 1182 V 19 w(join)o Fu(\()p Fn(S)1158 1192 y Fg(1)1190 1182 y Fn(;)11 b(S)1258 1192 y Fg(2)1290 1182 y Fu(\))1673 1153 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -730 w @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -11.95009 131.45157 29.02173 307.28952 29.02173 307.28952 -11.95009 131.45157 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2077 1051 a(\()p Fh(LEFT)p 2222 1051 V 19 w(OUTER)p 2406 1051 V 19 w(JOIN)17 b Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p 3017 1051 V 18 w(loops)f Fu(\(?1)h(?2\)\))2077 1138 y(\()p Fh(LEFT)p 2222 1138 V 19 w(OUTER)p 2406 1138 V 19 w(JOIN)f Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Mer)o(ge)p 3008 1138 V 18 w(join)f Fu(\(?1)h(?2\)\))1882 1358 y Fy(\(b\))p 374 1457 3122 4 v 943 1739 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -11.95009 -68.28656 29.02173 78.52965 29.02173 78.52965 -11.95009 -68.28656 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 414 1593 a Fh(LEFT)p 535 1593 15 4 v 19 w(OUTER)p 719 1593 V 19 w(JOIN)o Fu(\()p Fn(S)904 1603 y Fg(1)937 1593 y Fn(;)10 b(S)1004 1603 y Fg(2)1036 1593 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p Fn(S)1362 1603 y Fg(1)1394 1593 y Fn(;)11 b(S)1462 1603 y Fg(2)1494 1593 y Fu(\))414 1680 y Fh(RIGHT)p 569 1680 V 18 w(OUTER)p 752 1680 V 19 w(JOIN)p Fu(\()p Fn(S)938 1690 y Fg(1)970 1680 y Fn(;)f(S)1037 1690 y Fg(2)1069 1680 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)o Fu(\()p Fn(S)1395 1690 y Fg(1)1428 1680 y Fn(;)10 b(S)1495 1690 y Fg(2)1527 1680 y Fu(\))414 1768 y Fh(JOIN)p Fu(\()p Fn(S)584 1778 y Fg(1)616 1768 y Fn(;)g(S)683 1778 y Fg(2)715 1768 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Nested)p 1012 1768 V 19 w(loops)p Fu(\()p Fn(S)1198 1778 y Fg(1)1230 1768 y Fn(;)10 b(S)1297 1778 y Fg(2)1329 1768 y Fu(\))1673 1739 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -730 w @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -11.95009 131.45157 29.02173 307.28952 29.02173 307.28952 -11.95009 131.45157 -11.95009 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2077 1637 a(\()p Fh(LEFT)p 2222 1637 V 19 w(OUTER)p 2406 1637 V 19 w(JOIN)17 b Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p 3017 1637 V 18 w(loops)f Fu(\(?1)h(?2\)\))2077 1724 y(\()p Fh(RIGHT)p 2256 1724 V 18 w(OUTER)p 2439 1724 V 19 w(JOIN)f Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p 3050 1724 V 18 w(loops)g Fu(\(?1)g(?2\)\))1884 1943 y Fy(\(c\))p 374 2043 3122 4 v 943 2268 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -5.12154 -68.28656 22.19318 78.52965 22.19318 78.52965 -5.12154 -68.28656 -5.12154 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 414 2166 a Fh(JOIN)p Fu(\()p Fn(S)584 2176 y Fg(1)616 2166 y Fn(;)10 b(S)683 2176 y Fg(2)715 2166 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOPR)q Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1198 2176 y Fg(1)1230 2166 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1470 2176 y Fg(2)1502 2166 y Fu(\)\))414 2253 y Fh(JOPR)p Fu(\()p Fn(S)592 2263 y Fg(1)624 2253 y Fn(;)g(S)692 2263 y Fg(2)724 2253 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Nested)p 1021 2253 15 4 v 18 w(loops)p Fu(\()p Fn(S)1206 2263 y Fg(1)1238 2253 y Fn(;)11 b(S)1306 2263 y Fg(2)1338 2253 y Fu(\))985 2339 y tx@Dict begin -90. Rot end 985 2339 a 1080 2410 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 985 2339 a tx@Dict begin -90. neg Rot end 985 2339 a 943 2268 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ -68.28656 -90.47974 -68.28656 -63.16501 78.52965 -63.16501 78.52965 -90.47974 -68.28656 -90.47974 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 414 2874 a Fh(JOIN)p Fu(\()p Fn(S)584 2884 y Fg(1)616 2874 y Fn(;)f(S)683 2884 y Fg(2)715 2874 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOPR)q Fu(\()p Fn(S)1050 2884 y Fg(1)1082 2874 y Fn(;)10 b(S)1149 2884 y Fg(2)1181 2874 y Fu(\))414 2962 y Fh(JOPR)p Fu(\()p Fn(S)592 2972 y Fg(1)624 2962 y Fn(;)h(S)692 2972 y Fg(2)724 2962 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Nested)p 1021 2962 15 4 v 18 w(loops)p Fu(\()p Fn(S)1206 2972 y Fg(1)1238 2962 y Fn(;)11 b(S)1306 2972 y Fg(2)1338 2962 y Fu(\))1673 2976 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 943 2268 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 131.45157 -90.47974 131.45157 -63.16501 307.28952 -63.16501 307.28952 -90.47974 131.45157 -90.47974 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2077 2918 a(\()p Fh(JOIN)17 b Fu(\(?1)h(?2\)\))g Ft(!)g Fu(\()p Fh(Nested)p 2696 2918 V 18 w(loops)g Fu(\(?1)f(?2\)\))1882 3124 y Fy(\(d\))p 3557 3246 4 2843 v 323 3249 3237 4 v 3558 3265 19 2850 v 340 3265 3237 19 v 300 3461 a FP(Figure)j(4.12:)29 b(Examples)20 b(of)f(rule)h(compaction)i(\(cf.)29 b(Figure)20 b(4.1)m(1\).)30 b(The)19 b(left)g(sides)h(show)g(Prairie)g(rule)300 3574 y(sets,)30 b(the)f(right)h(sides)f(are)g(V)-12 b(olcano)30 b(rule)g(sets.)46 b(For)28 b(clarity)-6 b(,)32 b(descriptors)f(in)e (the)g(Prairie)g(rules,)i(and)300 3687 y(operator)26 b(and)e(algorithm)h(ar)n(guments)h(in)d(the)h(V)-12 b(olcano)25 b(rules,)f(are)g(omitted,)g(as)g(are)f(all)h(rule)g(actions.)299 4064 y(operator)g FH(O)692 4078 y Fv(1)732 4064 y FP(,)e(and)h (expressions)j FH(E)1443 4078 y Fv(2)1504 4064 y FP(and)d FH(E)1724 4078 y Fv(3)1785 4064 y FP(are)g(transformed)h(into)g (operator)g FH(O)2935 4078 y Fv(2)2975 4064 y FP(.)30 b(This)22 b(means)h(that)300 4233 y FH(E)367 4247 y Fv(2)430 4233 y FP(and)h FH(E)651 4247 y Fv(3)714 4233 y FD(unify)894 4200 y Fv(5)958 4233 y FP(to)g(the)g(operator)i FH(O)1581 4247 y Fv(2)1620 4233 y FP(.)31 b(As)24 b(shown)g(in)g(Figure)g(4.1)m (1\(d\),)h(this)f(compaction)i(reduces)300 4403 y(to)d(the)h(one)g(in)g (Figure)g(4.1)m(1\(a\).)578 4572 y(As)18 b(mentioned)j(earlier)l(,)g (there)e(are)g(certain)i(restrictions)g(on)e(the)g(form)g(and)g (actions)h(of)f(the)g(\256rst)296 4741 y(T)-8 b(-rule)19 b(in)h(each)g(pair)g(that)g(is)g(compacted.)31 b(First,)20 b(the)g(arity)g(\(i.e.,)g(the)g(number)g(of)g(inputs\))h(of)e(the)h (opera-)p 300 4822 1320 4 v 400 4876 a Fu(5)434 4908 y Fy(This)g(process)h(is)f(called)g(uni\256cation)h(because)g(it)f(is)f (similar)h(to)g(the)g(technique)h(used)g(in)f(automatic)h(theorem)g (proving)300 4999 y(by)e(resolution)h(in)f(\256rst-order)f(logic)h (\(see,)g(e.g.,)f([18]\).)1905 5349 y FP(58)p eop %%Page: 59 71 59 70 bop 297 391 a FP(tors)21 b(on)g(each)h(side)f(of)g(the)g(rule)h (must)f(be)f(the)i(same.)30 b(Second,)21 b(the)h(test)f(for)g(the)g(T) -8 b(-rule)21 b(must)g(be)g(TRUE)298 561 y(\(i.e.,)h(the)g(rule)g(must) g(be)g(unconditionally)k(applicable\).)34 b(Third,)22 b(the)g(actions)h(\(pre-test)h(and)f(post-test\))293 730 y(in)16 b(the)h(T)-8 b(-rule)17 b(must)g(consist)h(either)g(of)f (\(1\))g(descriptor)i(assignment)g(statements)g(that)e(copy)h(the)f (descrip-)296 899 y(tors)k(of)f(the)g(corresponding)k(expressions)g(on) c(either)h(side)g(of)f(the)g(rule,)h(or)f(\(2\))h(assignment)h (statements)300 1069 y(that)j(are)f(translated)j(to)d(NO)p 1202 1069 28 4 v 32 w(OP)f(by)h(the)h(preprocessor)j(\(an)c(example)i (is)e(the)h(statement)h(numbered)g(6)300 1238 y(in)i(Figure)h (4.6\(a\)\).)47 b(The)28 b(reason)i(for)e(these)i(restrictions)i(is)c (simple.)46 b(Since)29 b(rule)g(compaction)h(gen-)300 1408 y(erates)e(a)d(smaller)j(rule)e(set)h(in)f(the)h FD(most)f(general)i(case)p FP(,)g(it)e(must)g(always)h(be)f(the)h(case) g(that)g(applying)299 1577 y(the)c(uncompacted)j(rule)d(set)g(to)g FD(any)g FP(expression)j(must)d(have)g(the)g(same)g(ef)n(fect)h(as)f (applying)i(the)e(com-)300 1746 y(pacted)h(rule)g(set)f(to)h(the)f (same)g(expression)j(\(i.e.,)d(the)g(two)g(rule)h(sets)g(must)f(be)g FD(equivalent)q FP(\).)34 b(Since)23 b(the)300 1916 y(P2V)f (preprocessor)28 b(does)c(not)g(know)g(the)f(semantics)j(of)d(rule)h (actions,)h(it)e(checks)j(for)d(syntactic)j(hints)295 2085 y(\(a)18 b(TRUE)e(test,)k(descriptor)h(assignment)g(statements,)g (NO)p 2176 2085 V 32 w(OP)c(statements\))k(that)e(indicates)i(that)f (com-)298 2254 y(paction)k(yields)g(an)e(equivalent)j(rule)e(set.)30 b(It)22 b(may)g(be)g(possible)j(to)d(incorporate)j(semantic)f (knowledge)300 2424 y(of)h(rules)g(in)g(the)g(P2V)f(preprocessor)k(to)d (produce)i(even)f(greater)g(rule)f(compaction;)k(however)l(,)d(this)f (is)300 2593 y(beyond)g(the)f(scope)h(of)e(this)h(dissertation.)581 2762 y(Figure)e(4.12)g(shows)f(an)h(example)g(of)g(rule)f(compaction)j (corresponding)i(to)21 b(each)h(of)f(the)h(four)300 2932 y(general)32 b(cases)f(in)e(Figure)i(4.1)m(1.)50 b(Apart)30 b(from)g(the)g(familiar)h(relational)h(operators)h(and)d(algorithms)300 3101 y(we)f(have)i(already)g(encountered,)k(Figure)30 b(4.12)g(introduces)j(some)c(new)h(operators.)52 b(An)29 b(outer)i(join)297 3271 y([41])22 b(is)f(a)g(generalization)k(of)c(the) g(traditional)j(join)e(operator)h(\(or)f(natural)g(join\).)31 b(It)21 b(produces)j(a)c(stream)300 3440 y(that)33 b(contains)i(tuples) f(whose)g(join)f(attributes)j(are)d(unmatched)h(according)i(to)d(the)g (join)g(predicate.)300 3609 y(The)g(outer)i(join)g(operation)h(has)e (two)g(special)h(cases)g(depending)i(on)d(whether)g(the)h(outer)f(or)g (inner)300 3779 y(streams)24 b(contribute)j(unmatched)f(tuples.)32 b(These)24 b(two)f(operators)j(are)e(called)g(LEFT)p 3041 3779 V 31 w(OUTER)p 3377 3779 V 31 w(JOIN)298 3948 y(and)e(RIGHT)p 734 3948 V 32 w(OUTER)p 1071 3948 V 30 w(JOIN,)f(respectively)-6 b(.)34 b(As)21 b(shown)h(on)g(the)g(left)g (side)g(of)g(Figure)g(4.12\(c\),)h(these)300 4117 y(two)k(outer)i(join) g(operators)h(can)e(be)g(transformed)i(into)f(the)f(JOIN)f(operator)l (,)k(if)c(it)h(is)f(known)i(that)f(no)300 4287 y(unmatched)e(tuples)f (result.)579 4456 y(The)19 b(operator)j(JOPR)c(is)i(exactly)h(like)f (JOIN,)f(except)i(that)f(it)g(expects)h(its)f(inputs)h(to)f(be)f (sorted.)300 4625 y(The)29 b(JOPR)g(operator)i(is)f(needed)i(in)d (Prairie)i(in)e(order)i(to)f(introduce)i(the)e(explicit)i(operator)g (SOR)-5 b(T)e(.)300 4795 y(However)l(,)33 b(the)e(P2V)e(preprocessor)34 b(identi\256es)f(SOR)-5 b(T)27 b(as)k(an)f(enforcer)n(-operator)36 b(\(as)31 b(described)i(in)300 4964 y(Section)24 b(4.2.1\),)g(and)g (deletes)h(it,)e(resulting)j(in)e(the)f(rule)h(compaction)i(shown)e(in) g(Figure)g(4.12\(d\).)1905 5349 y(59)p eop %%Page: 60 72 60 71 bop 300 391 a FO(4.6)119 b(Summary)300 654 y FP(In)27 b(this)h(chapter)l(,)i(we)c(described)j(the)f(Prairie-to-V)-12 b(olcano)31 b(preprocessor)g(that)c(generates)j(a)d(V)-12 b(olcano)300 824 y(rule)26 b(speci\256cation)i(from)e(a)f(Prairie)h (speci\256cation.)39 b(The)26 b(obvious)h(advantage)h(of)e(using)h(the) e(prepro-)298 993 y(cessor)f(is)d(that)i(a)e(DBI)g(can)h(specify)i (rules)f(in)f(a)f(high-level)k(abstract)f(framework)f(\(Prairie\),)g (while)f(the)300 1162 y(preprocessor)28 b(can)d(generate)h(a)e(lower)n (-level)j(speci\256cation)g(\(V)-12 b(olcano\))26 b(that)f(takes)g (into)g(account)i(im-)300 1332 y(plementation)i(details.)40 b(This)26 b(generator)n(-based)k(approach)f(means)d(that)h(the)f(DBI)f (is)h(insulated)i(from)293 1501 y(the)18 b(actual)h(implementation)h (and)e(internal)i(representation)h(of)d(the)f(features)j(of)d(the)h (optimizer)-5 b(.)30 b(In)18 b(fact,)300 1671 y(it)24 b(is)f(possible)k(to)c(imagine)i(a)f(scenario)i(where)e(the)g (preprocessor)k(translates)e(a)e(Prairie)g(speci\256cation)300 1840 y(suitable)30 b(for)e(another)h(\(non-V)-12 b(olcano\))31 b(rule)e(engine,)h(if)d(it)g(turns)i(out)f(that)g(the)g(V)-12 b(olcano)29 b(rule)g(engine)300 2009 y(is)23 b(not)h(appropriate)j(for) d(the)g(DBI.)e(Another)j(advantage)h(of)e(the)g(P2V)e(preprocessor)l(,) 28 b(as)23 b(described)j(in)300 2179 y(Section)i(4.5,)f(is)f(that)h(it) g(is)f(possible)j(to)e(\252optimize\272)i(the)e(rule)g(set)g(itself,)h (i.e.,)e(to)h(add)g(\252intelligence\272)298 2348 y(in)21 b(the)h(preprocessor)j(to)c(generate)i(small)f(rule)g(sets.)31 b(This)21 b(approach)j(carries)e(great)h(potential,)h(and,)e(in)300 2517 y(particular)l(,)30 b(as)c(we)g(will)g(see)g(in)g(Chapter)i(6,)e (can)h(be)f(used)i(to)e(generate)i(compact)g(rule)f(sets)g(from)f(the) 300 2687 y(building-blocks)i(used)d(in)e(recon\256gurable)k (optimizers.)583 2856 y(High-level)k(abstractions,)i(like)d(Prairie,)g (can)f(result)h(in)e(inef)n(\256cient)j(optimizers)g(unless)f(the)300 3025 y(P2V)25 b(preprocessor)30 b(translates)f(Prairie)e(rules)g(into)g (the)g(appropriate)i(implementation-level)j(details)300 3195 y(of)d(V)-12 b(olcano.)48 b(In)29 b(this)g(chapter)l(,)j(we)c (described)j(the)e(translation)j(process.)49 b(In)28 b(the)h(next)h(chapter)l(,)i(we)300 3364 y(evaluate)e(the)e(ef)n (\256ciency)i(of)e(the)g(resulting)j(V)-12 b(olcano)29 b(optimizer)h(by)e(optimizing)i(some)e(benchmark)300 3534 y(queries.)1905 5349 y(60)p eop %%Page: 61 73 61 72 bop 2859 1118 a FG(Chapter)44 b(5)1759 1657 y FM(Performance)50 b(Results)297 2159 y FP(In)20 b(the)g(last)h(chapter)l(,)i(we)d (described)j(the)d(P2V)f(preprocessor)24 b(that)d(translates)i(a)d (Prairie)h(rule)g(set)f(speci-)294 2328 y(\256cation)e(into)h(a)e(V)-12 b(olcano)19 b(speci\256cation.)31 b(One)18 b(important)h(aspect)g(of)f (this)g(translation)j(is)c(performance.)295 2498 y(Namely)-6 b(,)20 b(how)g(does)g(an)f(optimizer)i(generated)h(from)e(a)f(Prairie)g (speci\256cation)k(compare)d(with)f(an)h(opti-)294 2667 y(mizer)e(generated)j(from)d(a)g(hand-written)i(V)-12 b(olcano)20 b(speci\256cation?)32 b(In)18 b(this)h(chapter)l(,)i(we)c (present)j(some)300 2836 y(experimental)26 b(evidence)g(that)e (performance)i(is)e(not)g(sacri\256ced)h(by)e(specifying)k(rules)d(in)g (Prairie.)300 3203 y FO(5.1)119 b(Overview)300 3466 y FP(Performance)31 b(of)e(rule-based)j(optimizers)f(is)e(one)g(of)h(the) f(four)h(goals)g(that)g(we)e(identi\256ed)j(in)e(Chap-)300 3635 y(ter)g(1.)46 b(This)29 b(becomes)h(clear)f(when)g(we)f(consider)j (that)e(Prairie')-5 b(s)30 b(programming)h(environment)h(has)294 3805 y(limited)19 b(impact)f(if)g(it)g(sacri\256ces)h(performance)i(in) d(its)g(quest)h(for)f(abstractions)k(and)c(extensibility)-6 b(.)33 b(Con-)299 3974 y(sequently)-6 b(,)25 b(some)d(evidence)j(is)d (required)i(that)f(ef)n(\256cient)h(optimizers)g(can)f(be)f(generated)j (from)d(Prairie)300 4144 y(speci\256cations.)583 4313 y(In)k(this)h(chapter)l(,)h(we)d(present)j(experimental)h(results)e (using)h(two)d(dif)n(ferent)k(optimizers)f(that)300 4482 y(are)j(each)h(speci\256ed)g(using)g(Prairie)g(and)f(V)-12 b(olcano.)55 b(T)-6 b(o)29 b(avoid)j(claims)g(of)f(\252doctored)i (up\272)f(V)-12 b(olcano)300 4652 y(speci\256cations)33 b(\(to)e(give)g(Prairie)g(an)f(unfair)i(advantage\),)j(we)29 b(use)i(two)f(V)-12 b(olcano)32 b(rule)f(sets)f(written)300 4821 y(by)24 b(other)h(researchers)i(as)c(points)j(of)d(comparison.)35 b(The)23 b(\256rst)g(rule)i(speci\256cation)h(is)e(that)g(of)g(a)g (simple)300 4990 y(centralized)31 b(optimizer)e(that)f(contains)i(a)d (subset)i(of)e(the)h(relational)i(database)g(operators,)h(and)d(has)g (a)1905 5349 y(61)p eop %%Page: 62 74 62 73 bop 297 391 a FP(fairly)23 b(simple)f(cost)f(model.)31 b(The)21 b(second)i(rule)e(set)h(speci\256es)g(an)g(optimizer)g(for)g (a)f(lar)n(ge-scale)j(object-)300 561 y(oriented)32 b(database.)51 b(Both)29 b(of)h(these)h(rule)f(sets)g(were)f(re-engineered)34 b(\(i.e.,)c(rewritten\))h(into)g(Prairie)300 730 y(speci\256cations,)e (from)d(which)g(V)-12 b(olcano)27 b(speci\256cations)i(were)c(obtained) j(by)e(using)h(the)f(P2V)e(prepro-)298 899 y(cessor)f(described)i(in)d (the)g(last)g(chapter)-5 b(.)1570 866 y Fv(1)1642 899 y FP(The)21 b(two)h(optimizers)h(\(P2V)-8 b(-generated)25 b(and)d(hand-written\))300 1069 y(were)h(then)i(compared)g(for)f(ef)n (\256ciency)h(by)f(optimizing)h(a)f(random)g(set)g(of)f(operator)j (trees.)581 1238 y(The)20 b(problem)i(of)f(developing)j(a)c(set)h(of)g (representative)k(benchmark)e(queries)f(to)f(test)h(a)e(query)296 1408 y(processing)j(system)e(is)f(a)f(well-researched)24 b(topic)d([13,)16 b(14,)g(32,)g(42].)30 b(However)l(,)21 b(standard)h(benchmark)300 1577 y(queries)30 b(were)d(not)h(very)h (useful)g(in)f(our)g(case)h(for)f(various)h(reasons.)46 b(For)27 b(example,)j(the)e(W)l(isconsin)300 1746 y(benchmark)j([13])f (consists)h(of)e(no)g(queries)i(with)e(more)g(than)h(3)f(joins;)k (moreover)l(,)f(this)e(benchmark)298 1916 y(was)21 b(designed)j(to)d (test)h(the)g(performance)i(of)e(query)g(processors)j(on)c(queries)j (consisting)g(of)d(the)h(entire)300 2085 y(set)i(of)g(relational)i (operators)g(\(select,)f(project,)g(retrieve,)h(join,)e(update,)h (insert,)g(delete,)g(aggregation\))300 2254 y(and)30 b(with)f(a)g(variety)i(of)e(algorithms)i(implementing)h(the)d(various)i (operators.)51 b(Since)29 b(we)g(are)g(using)299 2424 y(pre-written)24 b(V)-12 b(olcano)24 b(rule)f(sets)g(that)f(only)i (contain)g(a)d(subset)j(of)e(these)i(operators,)h(we)c(had)i(to)f (design)300 2593 y(our)i(own)f(benchmark)j(queries.)582 2762 y(In)c(the)g(following)i(sections,)g(we)d(describe)j(our)f (experiments)h(using)g(the)e(two)g(rule)g(speci\256ca-)300 2932 y(tions,)i(the)g(generation)j(of)c(random)h(queries,)h(and)f(the)g (productivity)j(gains)e(in)f(using)g(Prairie.)300 3299 y FO(5.2)119 b(A)30 b(Centralized)i(Relational)e(Query)h(Optimizer)300 3562 y FP(A)23 b(simple)h(centralized)j(relational)g(optimizer)e(is)f (bundled)i(\(as)e(an)g(example)h(of)f(a)g(rule)g(speci\256cation\))300 3731 y(with)g(the)h(V)-12 b(olcano)26 b(optimizer)g(generator;)h(it)e (was)f(written)h(by)f(Graefe)h(and)g(his)g(co-workers.)35 b(It)24 b(con-)294 3900 y(sists)18 b(of)g(2)g(operators)i(\(RET)c(and)i (JOIN\),)f(2)h(algorithms)h(\(File)p 2256 3900 28 4 v 34 w(scan)f(and)h(Mer)n(ge)p 2851 3900 V 34 w(join\),)h(and)e(1)f (enforcer)300 4070 y(\(Mer)n(ge)p 569 4070 V 35 w(sort\).)33 b(The)23 b(semantics)j(of)e(these)h(operators)h(and)f(algorithms)h(are) e(as)g(de\256ned)h(in)f(Chapter)h(2.)294 4239 y(There)18 b(are)f(2)h(transformation)j(rules,)f(and)e(2)f(implementation)k (rules.)29 b(All)18 b(support)h(functions)h(\(as)e(listed)300 4408 y(in)25 b(T)-6 b(able)25 b(2.3\))g(required)i(for)f(the)f (operators,)j(algorithms,)f(and)f(enforcers,)h(and)f(data)g(structures) i(rep-)298 4578 y(resenting)c(the)e(properties)i(are)e(de\256ned)h(in)e (separate)j(\256les)d(\(the)h(host)h(language)h(is)d(C\).)g(The)g (entire)i(rule)300 4747 y(speci\256cation)j(package)g(consists)f(of)f (approximately)j FA(1)p FH(;)15 b FA(400)25 b FP(lines.)p 300 4828 1320 4 v 400 4882 a Fu(1)434 4914 y Fy(Because)20 b(of)e(the)g(way)h(the)f(P2V)g(preprocessor)i(represented)f (properties,)g(the)f(P2V)-7 b(-generated)20 b(V)-10 b(olcano)19 b(speci\256cation)300 5005 y(was)g(quite)g(dif)o(ferent)g(from)g(the)f (hand-written)i(V)-10 b(olcano)20 b(speci\256cation.)1905 5349 y FP(62)p eop %%Page: 63 75 63 74 bop 583 391 a FP(Re-engineering)36 b(the)d(V)-12 b(olcano)34 b(rule)f(speci\256cation)i(into)e(Prairie)g(involved)h (several)g(steps.)300 561 y(First,)25 b(we)g(had)g(to)g(\256x)g(a)g (few)f(bugs)i(in)f(the)h(original)h(V)-12 b(olcano)27 b(rule)e(speci\256cation)j(that)e(precluded)i(the)300 730 y(optimizer)i(from)f(optimizing)h(certain)h(legal)e(queries)h(and)f (that)h(also)f(produced)i(non-optimal)g(plans)297 899 y(for)20 b(some)h(queries.)32 b(Second,)21 b(we)f(transformed)j(the)e (multiple)h(property)g(sets)g(into)f(a)f(single)i(descriptor)300 1069 y(structure)j(for)e(the)h(Prairie)f(speci\256cation.)34 b(This,)23 b(in)g(turn,)g(required)j(modifying)f(property)g(references) 299 1238 y(in)e(rule)h(actions.)32 b(Third,)24 b(actions)g(in)f (support)i(functions)h(had)e(to)e(be)i(speci\256ed)g(as)f(rule)h (actions)g(\(since)299 1408 y(a)e(Prairie)i(rule)f(contains)i FD(all)e FP(its)g(actions\).)32 b(In)23 b(the)g(whole)g(process)h(of)f (reconstituting)k(the)c(centralized)300 1577 y(optimizer)32 b(speci\256cation,)j(the)c(behavior)i(of)e(the)g(optimizer)h(had)f(to)g (be)f(kept)i(unchanged)h(\(i.e.,)f(the)297 1746 y(Prairie)22 b(optimizer)h(had)e(to)g(generate)i(the)e(same)g(optimal)i(access)f (plan)g(as)f(the)g(V)-12 b(olcano)22 b(optimizer)l(,)i(for)300 1916 y(the)g(same)f(operator)j(tree\).)300 2220 y FN(5.2.1)99 b(Pr)n(ogrammer)25 b(Pr)n(oductivity)292 2450 y FP(Programmer)16 b(productivity)k(can)c(be)g(measured)i(in)e(dif)n(ferent)i(ways.)29 b(An)15 b(admittedly)j(simplistic)g(metric)295 2619 y(is)h(the)h (number)g(of)g(lines)g(of)f(code)h(that)g(must)f(be)h(written.)30 b(But)19 b(there)h(are)f(also)h(less)g(tangible)i(measures,)295 2789 y(such)e(as)e(the)h(amount)h(of)f(conceptual)j(ef)n(fort)e(needed) h(to)d(understand)k(a)d(particular)i(programming)g(task.)296 2958 y(Our)e(experience)k(suggests)f(that)e(Prairie)g(excels)h(on)f (the)g(latter)l(,)h(while)f(of)n(fering)i(modest)f(reductions)i(in)300 3128 y(the)j(volume)g(of)g(code)g(that)h(needs)f(to)g(be)f(written.)38 b(The)25 b(re-engineered)30 b(Prairie)c(speci\256cation)i(of)e(the)294 3297 y(simple)19 b(centralized)i(optimizer)f(consisted)g(of)e (approximately)k FA(1)p FH(;)15 b FA(000)k FP(lines,)h(a)e(savings)i (of)e(about)h(30\045)300 3466 y(over)24 b(the)f(V)-12 b(olcano)25 b(speci\256cation.)1415 3433 y Fv(2)1488 3466 y FP(As)d(mentioned)k(above,)e(however)l(,)h(savings)g(in)e(lines) h(of)f(code)h(do)296 3636 y(not)c(fully)h(re\257ect)f(increases)i(in)e (programmer)h(productivity)-6 b(.)33 b(W)-7 b(e)19 b(found)i(the)f (encapsulated)k(speci\256ca-)296 3805 y(tions)d(of)f(Prairie)g(\320)f (namely)-6 b(,)21 b(the)f(use)h(of)e(a)h(single)h(descriptor)i(and)d (fewer)g(explicit)i(support)g(functions)300 3974 y(\320)h(made)g(rule)h (programming)i FD(much)e FP(easier)-5 b(.)300 4278 y FN(5.2.2)99 b(Generating)25 b(Benchmark)i(Queries)583 4509 y FP(Our)e(experiments)j(using)e(the)g(centralized)i(optimizer)e (consisted)i(of)d(optimizing)j(randomly)297 4678 y(generated)23 b(queries)f(using)g(the)e(two)g(optimizers)j(generated,)g(respectively) -6 b(,)25 b(using)c(the)g(Prairie)g(and)g(the)298 4848 y(hand-written)j(V)-12 b(olcano)22 b(speci\256cations.)33 b(\(In)22 b(the)g(remainder)h(of)e(this)h(chapter)l(,)h(we)e(will)g (use)g(\252Prairie\272)p 300 4923 1320 4 v 400 4977 a Fu(2)434 5009 y Fy(As)f(reported)h(in)f([21],)h(the)f(savings)h(are)f (even)h(greater)g(if)e(the)i(V)-10 b(olcano)21 b(rule)f(engine)h(is)f (modi\256ed)h(slightly)f(to)g(remove)300 5100 y(calls)f(to)f(support)i (functions)g(that)f(are)g(grounded)i(by)e(the)g(P2V)g(preprocessor)l(.) 1905 5349 y FP(63)p eop %%Page: 64 76 64 75 bop 306 403 3272 4 v 306 3076 4 2674 v 1626 1096 a tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1626 1096 a Fs(R)1679 1105 y Fu(1)1607 958 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1607 958 a FF(RET)1670 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 1909 1096 a tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1909 1096 a Fs(R)1962 1105 y Fu(2)1890 958 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1890 958 a FF(RET)1670 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 1739 817 a tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 1739 817 a FF(JOIN)1670 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 1670 1078 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 1953 653 a tx@Dict begin 45. Rot end 1953 653 a 1906 657 a tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 0.0 false .5 11.3335 InitRnode } NewNode end end 1906 657 a Fs(:)11 b(:)h(:)1953 653 y tx@Dict begin 45. neg Rot end 1953 653 a 1670 1078 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 2174 675 a tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2174 675 a FF(RET)2189 813 y tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0 false .5 11.51984 InitRnode } NewNode end end 2189 813 a Fs(R)2242 821 y Fn(n)1670 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 2023 533 a tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2023 533 a FF(JOIN)1670 1078 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 1670 1078 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 1670 1078 a 1456 1212 a Fy(\(a\))18 b Fq(N)8 b Fy(-way)20 b(join)f(benchmark)h(query)p 379 1314 3148 4 v 427 2730 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_non_layered_vs_volcano.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 84 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 621 362 m 621 372 l 822 362 m 822 372 l 1023 362 m 1023 372 l 1225 362 m 1225 372 l 1426 362 m 1426 372 l 1627 362 m 1627 372 l 1828 362 m 1828 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 621 1704 m 621 1694 l 822 1704 m 822 1694 l 1023 1704 m 1023 1694 l 1225 1704 m 1225 1694 l 1426 1704 m 1426 1694 l 1627 1704 m 1627 1694 l 1828 1704 m 1828 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 586 m 430 586 l 420 809 m 430 809 l 420 1033 m 430 1033 l 420 1257 m 430 1257 l 420 1480 m 430 1480 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 586 m 2020 586 l 2030 809 m 2020 809 l 2030 1033 m 2020 1033 l 2030 1257 m 2020 1257 l 2030 1480 m 2020 1480 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 809 m 440 809 l 420 1257 m 440 1257 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 809 m 2010 809 l 2030 1257 m 2010 1257 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0) RJ (0) show grestore newpath 366 809 m gsave 366 809 translate 0 rotate 0 -30 m (200) RJ (200) show grestore newpath 366 1257 m gsave 366 1257 translate 0 rotate 0 -30 m (400) RJ (400) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (600) RJ (600) show grestore newpath /Times-Roman findfont 90 scalefont setfont 164 1033 m gsave 164 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time) CS (Average CPU Time) show grestore newpath 420 374 m 621 378 l 822 389 l 1023 408 l 1225 442 l 1426 513 l 1627 653 l 1828 918 l 2030 1500 l /Times-Roman findfont 90 scalefont setfont stroke 420 374 30 0 360 arc gsave fill grestore stroke 621 378 30 0 360 arc gsave fill grestore stroke 822 389 30 0 360 arc gsave fill grestore stroke 1023 408 30 0 360 arc gsave fill grestore stroke 1225 442 30 0 360 arc gsave fill grestore stroke 1426 513 30 0 360 arc gsave fill grestore stroke 1627 653 30 0 360 arc gsave fill grestore stroke 1828 918 30 0 360 arc gsave fill grestore stroke 2030 1500 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 374 m 621 377 l 822 387 l 1023 405 l 1225 438 l 1426 505 l 1627 642 l 1828 900 l 2030 1474 l /Times-Roman findfont 90 scalefont setfont stroke 420 404 m 390 374 l 420 344 l 450 374 l closepath gsave eofill grestore stroke 621 407 m 591 377 l 621 347 l 651 377 l closepath gsave eofill grestore stroke 822 417 m 792 387 l 822 357 l 852 387 l closepath gsave eofill grestore stroke 1023 435 m 993 405 l 1023 375 l 1053 405 l closepath gsave eofill grestore stroke 1225 468 m 1195 438 l 1225 408 l 1255 438 l closepath gsave eofill grestore stroke 1426 535 m 1396 505 l 1426 475 l 1456 505 l closepath gsave eofill grestore stroke 1627 672 m 1597 642 l 1627 612 l 1657 642 l closepath gsave eofill grestore stroke 1828 930 m 1798 900 l 1828 870 l 1858 900 l closepath gsave eofill grestore stroke 2030 1504 m 2000 1474 l 2030 1444 l 2060 1474 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 745 2864 a(\(b\))f(Query)g(optimization)h(time)p 1951 3051 4 1737 v 2003 2730 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: eqlogexp_non_layered.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 621 362 m 621 372 l 822 362 m 822 372 l 1023 362 m 1023 372 l 1225 362 m 1225 372 l 1426 362 m 1426 372 l 1627 362 m 1627 372 l 1828 362 m 1828 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 621 1704 m 621 1694 l 822 1704 m 822 1694 l 1023 1704 m 1023 1694 l 1225 1704 m 1225 1694 l 1426 1704 m 1426 1694 l 1627 1704 m 1627 1694 l 1828 1704 m 1828 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 440 362 l 420 698 m 440 698 l 420 1033 m 440 1033 l 420 1368 m 440 1368 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 698 m 2010 698 l 2030 1033 m 2010 1033 l 2030 1368 m 2010 1368 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (100) RJ (10) show /Times-Roman findfont 53 scalefont setfont 0 53 rmoveto (0) show /Times-Roman findfont 90 scalefont setfont 0 -53 rmoveto () show grestore newpath 366 698 m gsave 366 698 translate 0 rotate 0 -30 m (102) RJ (10) show /Times-Roman findfont 53 scalefont setfont 0 53 rmoveto (2) show /Times-Roman findfont 90 scalefont setfont 0 -53 rmoveto () show grestore newpath 366 1033 m gsave 366 1033 translate 0 rotate 0 -30 m (104) RJ (10) show /Times-Roman findfont 53 scalefont setfont 0 53 rmoveto (4) show /Times-Roman findfont 90 scalefont setfont 0 -53 rmoveto () show grestore newpath 366 1368 m gsave 366 1368 translate 0 rotate 0 -30 m (106) RJ (10) show /Times-Roman findfont 53 scalefont setfont 0 53 rmoveto (6) show /Times-Roman findfont 90 scalefont setfont 0 -53 rmoveto () show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (108) RJ (10) show /Times-Roman findfont 53 scalefont setfont 0 53 rmoveto (8) show /Times-Roman findfont 90 scalefont setfont 0 -53 rmoveto () show grestore newpath /Times-Roman findfont 90 scalefont setfont 188 1033 m gsave 188 1033 translate 90 rotate 0 0 m (Equivalent expressions) CS (Equivalent expressions) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Number of Equivalent Expressions) CS (Number of Equivalent Expressions) show grestore newpath 420 362 m 621 413 l 822 514 l 1023 635 l 1225 770 l 1426 914 l 1627 994 l 1828 1234 l 2030 1399 l /Times-Roman findfont 90 scalefont setfont stroke 420 362 30 0 360 arc gsave fill grestore stroke 621 413 30 0 360 arc gsave fill grestore stroke 822 514 30 0 360 arc gsave fill grestore stroke 1023 635 30 0 360 arc gsave fill grestore stroke 1225 770 30 0 360 arc gsave fill grestore stroke 1426 914 30 0 360 arc gsave fill grestore stroke 1627 994 30 0 360 arc gsave fill grestore stroke 1828 1234 30 0 360 arc gsave fill grestore stroke 2030 1399 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont showpage %%EndDocument @endspecial 2058 2864 a(\(c\))13 b(Number)h(of)f(expressions)i (equivalent)f(to)f(\(a\))g(\(in)2058 2955 y(either)19 b(Prairie)f(or)h(V)-10 b(olcano\))p 3574 3076 4 2674 v 306 3079 3272 4 v 3576 3096 19 2680 v 322 3096 3272 19 v 907 3292 a FP(Figure)24 b(5.1:)32 b(Benchmarking)26 b(a)d(simple)h(centralized)i(optimizer)300 3669 y(and)g(\252V)-12 b(olcano\272)28 b(to)d(denote)i(these)g(two)e(approaches.\))40 b(The)25 b(queries)i(represented)i(left-deep)e FH(N)10 b FP(-way)300 3838 y(join)26 b(operator)i(trees,)f(for)e(varying)j (values)f(of)e FH(N)10 b FP(,)25 b(as)h(shown)g(in)g(Figure)g (5.1\(a\).)38 b(Each)25 b(operator)j(tree)300 4007 y(also)e(required)h (its)e(output)i(to)e(be)g(returned)j(sorted,)e(but)g(since)g(V)-12 b(olcano)27 b(considered)h(SOR)-5 b(T)22 b(to)j(be)g(an)300 4177 y(implicit)g(operator)l(,)g(it)f(is)f(not)h(shown)g(in)f(Figure)i (5.1\(a\).)583 4346 y(Random)j(queries)h(were)e(generated)j(for)d (optimization)j(using)f(a)e(uniform)h(random)g(number)300 4516 y(generator)k(as)e(follows.)51 b(The)29 b(set)h(of)g(stored)h (\256les)f(\(relations\))i(was)e(\256xed,)h(as)f(were)f(the)i(number)f (of)300 4685 y(attributes)c(in)d(each)h(\256le,)e(their)j (cardinalities,)h(and)e(record)h(widths.)31 b(Each)23 b(query)i(contained)h(all)d(oper)n(-)299 4854 y(ators)g(in)f(the)g(V) -12 b(olcano)24 b(speci\256cation.)33 b(The)22 b(queries)i(generated)g (varied)g(in)e(the)h(order)g(of)f(the)g(relations)298 5024 y(in)f(the)g(\(left-deep\))k(operator)e(tree.)30 b(Each)22 b(join)g(in)f(the)g(tree)h(had)g(an)f(equijoin)j(predicate.) 32 b(The)21 b(two)g(join)1905 5349 y(64)p eop %%Page: 65 77 65 76 bop 300 391 a FP(attributes)27 b(were)d(chosen,)i(at)e(random,)h (from)g(the)f(set)h(of)f(attributes)j(in)d(the)h(outer)g(and)g(inner)h (streams,)300 561 y(respectively)-6 b(.)36 b(The)24 b(\(single\))i (tuple)f(order)g(for)f(the)g(\(implicit\))i(sort)f(operator)h(at)e(the) g(root)h(was)f(chosen)300 730 y(as)f(an)h(attribute)i(of)d(one)h(of)g (the)f(relations)j(in)e(the)g(operator)h(tree.)300 1037 y FN(5.2.3)99 b(Performance)26 b(Results)f(Using)f(the)i(Centralized)g (Optimizer)300 1267 y FP(For)i(each)h(value)g FH(N)38 b FP(of)28 b(the)h(number)g(of)f(joins,)j(we)c(generated)k(10)e FD(differ)m(ent)i FP(queries)f(\(as)f(described)300 1437 y(above\),)e(and)e(submitted)i(it)e(to)g(both)h(the)g(Prairie)f(and)h (V)-12 b(olcano)26 b(optimizers)h(for)f(optimization.)38 b(Both)298 1606 y(optimizers)24 b(produced)g(the)e(same)g(optimal)h (plan)g(for)f(each)g(query)-6 b(.)32 b(The)21 b(run)h(times)g(of)g (each)g(optimizer)300 1775 y(were)h(measured)845 1742 y Fv(3)909 1775 y FP(using)h(the)g(GNU)d Fi(time)g FP(command,)j(and)f (averaged)j(over)e(the)f(10)h(queries)h(to)e(gen-)297 1945 y(erate)e(the)g(per)n(-query)j(optimization)f(time.)30 b(Thus,)21 b(each)g(point)h(in)f(our)g(graphs)h(represents)i(the)c (average)299 2114 y(CPU)h(time)h(for)h(optimizing)i(10)d(dif)n(ferent)j (queries.)33 b(All)22 b(experiments)j(were)d(performed)j(on)d(a)h (lightly)300 2283 y(loaded)i(DECstation)f(5000/200)i(running)g(Ultrix)e (4.2.)583 2453 y(The)g(optimization)j(time)c(for)h(both)h(approaches)i (\(Prairie)d(and)h(V)-12 b(olcano\))25 b(are)f(shown)h(in)e(Fig-)300 2622 y(ure)i(5.1\(b\).)36 b(The)24 b(number)i FH(N)34 b FP(of)25 b(joins)h(was)e(varied)i(from)f(0)g(through)i(8.)34 b(The)24 b(results,)j(as)e(seen)g(from)300 2792 y(the)k(graph,)i(are)e (virtually)i(identical)g(for)d(both)i(Prairie)f(and)g(V)-12 b(olcano.)48 b(That)29 b(is,)g(there)h(is)e(no)h(loss)g(of)300 2961 y(performance)d(of)e(the)f(optimizer)j(if)d(it)g(is)g(speci\256ed) i(using)g(Prairie)f(instead)h(of)f(V)-12 b(olcano.)580 3130 y(It)20 b(is)g(interesting)j(to)d(note)h(the)f(number)h(of)g (equivalent)i(expressions)g(that)e(are)f(generated)j(from)293 3300 y(the)18 b(original)h FH(N)10 b FP(-way)17 b(join)h(query)h(in)e (Figure)h(5.1\(a\).)30 b(This)17 b(is)g(shown)h(in)f(Figure)h (5.1\(c\).)29 b(Both)18 b(optimiz-)298 3469 y(ers)k(\(Prairie)h(and)f (V)-12 b(olcano\))24 b(result)f(in)e(the)h(same)g(number)h(of)f (equivalent)i(expressions,)i(which)c(grows)297 3638 y(exponentially)j (with)c FH(N)10 b FP(,)20 b(the)h(number)h(of)e(joins)i(in)f(the)g (query)-6 b(.)31 b(This)21 b(corresponds)j(to)d(the)g(exponential)300 3808 y(rise)j(in)f(optimization)k(time)c(as)h(seen)g(in)f(Figure)h (5.1\(b\).)583 3977 y(From)h(these)h(experiments)i(with)e(the)f(simple) h(centralized)j(optimizer)l(,)e(it)f(was)f(evident)i(to)e(us)300 4146 y(that)f(Prairie)h(of)n(fers)g(a)e(modest)i(reduction)h(in)e(code) g(size,)g(better)h(programmability)i(and)d(clarity)-6 b(,)25 b(with)299 4316 y(no)e(performance)i(degradation.)34 b(It)22 b(is)h(important)h(to)f(show)-6 b(,)23 b(however)l(,)h(that)f (Prairie)g(can)g(also)h(be)e(used)300 4485 y(to)h(specify)j(rule)e (sets)g(for)g(lar)n(ge-scale)i(optimizers.)33 b(This)24 b(is)f(described)j(in)e(the)f(next)i(section.)p 300 4566 1320 4 v 400 4620 a Fu(3)434 4652 y Fy(T)-5 b(o)21 b(reduce)h (measurement)g(errors,)g(the)f Fr(same)g Fy(query)h(was)f(optimized)h (10)f(times)g(\(in)g(a)g(loop\))h(and)f(the)g(total)g(time)g(was)300 4743 y(divided)f(by)f(10)h(to)e(obtain)i(the)f(optimization)g(time)g (for)g(any)g(query)-5 b(.)1905 5349 y FP(65)p eop %%Page: 66 78 66 77 bop 300 391 a FO(5.3)119 b(The)30 b(T)-11 b(exas)29 b(Instruments)g(Open)i(OODB)f(Query)g(Optimizer)292 654 y FP(The)16 b(T)-6 b(exas)17 b(Instruments)i(Open)e(Object-Oriented)i (Database)f(Management)h(System)d([50])h(is)g(an)f(open,)293 824 y(extensible,)k(object-oriented)i(database)d(system)f(which)f (provides)i(users)f(an)f(architectural)j(framework)297 993 y(that)h(is)f(con\256gurable)j(in)e(an)g(incremental)i(manner)-5 b(.)30 b(It)20 b(consists)j(of)e(three)g(sets)g(of)g(modules:)31 b(a)20 b(core)h(set)300 1162 y(providing)28 b(low-level)f(primitives)h (for)e(creating)h(new)e(environments,)k(a)c(set)h(of)g(functional)i (modules)300 1332 y(that)d(facilitates)j(extensibility)h(using)d (functional)h(requirements,)h(and)e(a)e(meta-architecture)29 b(module)300 1501 y(housing)i(the)e(extensibility)j(concepts)g(of)c (Open)h(OODB.)d(Examples)k(of)f(the)g(core)g(set)g(are)g(commu-)300 1671 y(nication)e(and)e(address)h(space)g(management,)h(while)d (examples)j(of)d(functional)k(modules)e(are)f(persis-)299 1840 y(tence,)f(distribution,)i(and)d(query)h(processing.)33 b(The)22 b(meta-architecture)27 b(module)d(consists)g(of)f(events,)300 2009 y(sentries,)i(and)f(policy)h(manager)g(interfaces.)583 2179 y(The)31 b(query)h(processing)h(module)f(provides)h(users)e(with)g (a)f(query)i(language)h(\(OQL[C++]\))300 2348 y(based)d(on)e(SQL)f(and) i(C++.)45 b(A)27 b(query)j(expressed)h(in)d(this)h(high-level)j(format) d(is)f(parsed)i(and)f(trans-)300 2517 y(formed)h(into)g(an)f(operator)j (tree)e(suitable)h(for)f(optimization.)51 b(From)28 b(this)i(operator)h (tree,)g(the)f(query)300 2687 y(optimizer)c(generates)g(an)e(optimal)h (access)g(plan,)g(which)f(is)g(then)h(transformed)h(into)f(a)f(C++)f (program)300 2856 y(ready)i(for)e(execution.)578 3025 y(The)18 b(query)i(optimizer)g(in)f(Open)f(OODB)f([15])i(is)f (generated)j(using)f(V)-12 b(olcano.)31 b(It)18 b(consists)j(of)d(6)297 3195 y(operators)23 b(\(SELECT)-7 b(,)17 b(PROJECT)-7 b(,)18 b(JOIN,)h(RET)-7 b(,)19 b(UNNEST)e(\(for)k(set-valued)j (attributes\),)f(and)e(MA)-10 b(T)300 3364 y(\(MA)g(T)k(erialize;)24 b(it)g(is)f(used)h(for)g(representing)j(path)d(expressions)j(in)d(a)f (query\)\),)i(8)e(algorithms)j(\(Filter)l(,)300 3534 y(Project,)e(Hash)p 794 3534 28 4 v 33 w(join,)g(Ptr)p 1120 3534 V 33 w(hash)p 1318 3534 V 34 w(join,)g(File)p 1680 3534 V 33 w(scan,)g(Index)p 2125 3534 V 35 w(scan,)f(Unnest,)h (and)g(Alg)p 2959 3534 V 33 w(assembly\),)h(and)f(1)299 3703 y(enforcer)h(\(Enf)p 790 3703 V 33 w(assembly\).)33 b(Currently)-6 b(,)24 b(the)f(Open)g(OODB)e(rule)i(set)g(consists)i(of) e(17)g(transformation)297 3872 y(rules)g(and)e(9)g(implementation)j (rules)e(together)i(with)d(about)h FA(13)p FH(;)15 b FA(000)23 b FP(lines)f(of)f(code)h(for)g(support)h(func-)300 4042 y(tions;)i(this,)e(of)h(course,)g(can)g(be)f(changed)j(by)d(an)h (Open)f(OODB)f(DBI)g(for)h(speci\256c)i(needs.)32 b(There)23 b(are)300 4211 y(also)k FD(catalogs)h FP(which)e(contain)i(information) h(about)e(base)g(classes)h(that)e(are)g(used)h(by)f(the)h(optimizer)-5 b(.)300 4380 y(The)23 b(complete)i(rule)f(set)g(for)g(the)f(Open)h (OODB)d(optimizer)26 b(is)d(shown)h(in)f(Appendix)j(C.)300 4687 y FN(5.3.1)99 b(Pr)n(ogrammer)25 b(Pr)n(oductivity)300 4918 y FP(As)e(in)i(the)f(case)h(of)f(the)h(centralized)i(optimizer)l (,)g(we)c(re-engineered)28 b(the)d(Open)f(OODB)e(rule)j(set)g(into)300 5087 y(Prairie,)k(and)f(then)g(generated)i(a)d(V)-12 b(olcano)29 b(speci\256cation)i(by)c(using)i(the)f(P2V)e(preprocessor) -5 b(.)47 b(Using)1905 5349 y(66)p eop %%Page: 67 79 67 78 bop 300 391 a FP(lines)29 b(of)f(code)g(as)g(a)f(crude)i(metric)g (of)f(programmer)h(productivity)-6 b(,)32 b(there)d(was)f(about)h (10\045)e(savings)294 561 y(realized)21 b(in)d(Prairie)h(over)g(V)-12 b(olcano.)1444 528 y Fv(4)1514 561 y FP(However)l(,)20 b(an)e(even)h(more)g(important)h(increase)g(in)e(programmer)297 730 y(productivity)24 b(resulted)e(in)f(using)g(the)g(abstractions)j (and)d(encapsulations)k(in)20 b(Prairie;)i(it)f(took)g(almost)g(4)295 899 y(man-months)g(to)f(reconstitute)i(the)e(Prairie)g (speci\256cations)i(for)e(the)f(Open)h(OODB)d(optimizer)k(because)300 1069 y(of)31 b(the)g(widespread)j(use)d(of)g(implementation-level)36 b(details)c(in)f(the)h(V)-12 b(olcano)32 b(speci\256cation)i(of)d(the) 300 1238 y(optimizer)l(,)25 b(a)e(speci\256cation)k(that)d(ought)h(to)e (be)h(programmed)h(at)e(the)h FD(conceptual)j FP(level.)583 1408 y(As)h(a)g(sidenote,)k(the)c(Prairie)h(speci\256cation)i(of)e(the) g(Open)f(OODB)e(optimizer)k(consisted)h(of)300 1577 y(22)25 b(T)-8 b(-rules)25 b(and)g(1)m(1)g(I-rules)h(\(the)g(increased)h (number)f(of)e(rules)i(is)f(because,)i(as)d(mentioned)j(in)e(Chap-)300 1746 y(ter)g(3,)g(Prairie)g(does)h(not)g(allow)f(implicit)h(rules\).)37 b(The)24 b(P2V)-8 b(-generated)27 b(V)-12 b(olcano)27 b(rule)e(set)h(contained)300 1916 y(17)h(transformation)k(rules)d(and)g (9)f(implementation)j(rules,)f(the)e(same)h(as)f(the)g(original)i (hand-written)300 2085 y(V)-12 b(olcano)25 b(speci\256cation.)300 2392 y FN(5.3.2)99 b(Generating)25 b(Benchmark)i(Queries)583 2622 y FP(Our)22 b(experiments)j(using)g(the)e(Open)g(OODB)d(consisted) 26 b(of)c(optimizing)j(8)e(dif)n(ferent)i(queries)294 2792 y(using)19 b(the)f(Prairie)h(and)f(V)-12 b(olcano)20 b(optimizers.)31 b(There)18 b(were)g(4)f(distinct)j(expressions)h(that) e(were)f(used)g(to)295 2961 y(generate)i(the)f(queries)h(used)g(in)e (the)h(experiments;)k(these)d(are)e(shown)i(in)e(Figure)h(5.2.)29 b(Each)19 b(expression)300 3130 y(represents)26 b(an)e FH(N)10 b FP(-way)23 b(join)h(query)-6 b(,)25 b(for)f(varying)h(values) g(of)f FH(N)10 b FP(.)582 3300 y(The)22 b(\256rst)g(expression,)j(E1,)c (is)i(a)e(simple)i(retrieval)i(and)d(join)h(of)f(stored)i(\256les;)f (these)g(\256les)f(rep-)299 3469 y(resent)i(base)g(classes.)32 b(The)23 b(second,)h(E2,)e(is)h(also)g(a)g(join)g(of)g(base)h(classes;) h(however)l(,)f(after)f(each)h(class)300 3638 y(retrieval,)i(an)e (attribute)i(has)f(to)e(be)h(materialized)j(\(i.e.,)c(brought)j(into)f (scope\))h(before)f(the)f(join.)33 b(\(This)300 3808 y(is)26 b(an)g(abstract)j(representation)h(of)c(path)h(expressions)j (in)c(object-oriented)31 b(queries.\))41 b(The)26 b(third)h(and)300 3977 y(fourth)k(expressions)i(\(E3)c(and)h(E4\))e(are)i(the)g(same)f (as)h(the)f(\256rst)h(and)f(second)j(\(E1)c(and)i(E2\),)h(respec-)300 4146 y(tively)-6 b(,)27 b(except)h(that)e(there)h(is)e(a)h(selection)i (of)d(attributes)k(\(the)d(SELECT)c(operator)28 b(is)e(the)g(root)g(of) g(the)300 4316 y(expressions\).)773 4283 y Fv(5)p 300 4397 1320 4 v 400 4451 a Fu(4)434 4482 y Fy(The)f(original)f(V)-10 b(olcano)26 b(speci\256cation)f(had)g Fl(13)p Fq(;)14 b Fl(400)25 b Fy(lines,)g(the)g(Prairie)e(speci\256cation)i(had)g Fl(12)p Fq(;)14 b Fl(100)25 b Fy(lines,)h(and)f(the)300 4574 y(P2V)-7 b(-generated)20 b(V)-10 b(olcano)20 b(speci\256cation)g (had)f Fl(15)p Fq(;)14 b Fl(800)20 b Fy(lines.)400 4633 y Fu(5)434 4665 y Fy(The)d(most)f(complex)h(expression,)h(E4,)e (consists)h(of)f(all)g(operators)g(in)h(the)f(algebra,)h(except)g (PROJECT)d(and)j(UNNEST)-6 b(.)300 4756 y(PROJECT)14 b(was)h(not)h(considered)h(because)g(it)e(appeared)i(in)f(only)g(one)g (implementation)h(rule)e(and)i(no)f(transformation)g(rules,)300 4848 y(and)23 b(thus,)g(would)g(not)f(af)o(fect)g(the)g(size)h(of)f (the)g(search)h(space)g(of)f(abstract)h(expressions.)36 b(UNNEST)21 b(was)h(not)g(considered)300 4939 y(because)e(it)e (appeared)i(in)f(exactly)g(one)g(transformation)h(rule)e(and)i(one)f (implementation)g(rule;)g(including)h(it)e(in)g(our)h(queries)300 5030 y(would)f(have)h(increased)g(the)e(number)i(of)f(parameters)g (that)g(could)h(af)o(fect)e(our)h(run)g(times.)24 b(W)-6 b(e)17 b(preferred)i(to)e(concentrate)i(on)1905 5349 y FP(67)p eop %%Page: 68 80 68 79 bop 323 403 3237 4 v 323 2641 4 2239 v 814 1238 a tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 814 1238 a Fs(C)864 1247 y Fu(1)793 1100 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 793 1100 a FF(RET)856 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 1097 1238 a tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 1097 1238 a Fs(C)1147 1247 y Fu(2)1077 1100 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1077 1100 a FF(RET)856 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 926 958 a tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 926 958 a FF(JOIN)856 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 856 1220 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 1139 794 a tx@Dict begin 45. Rot end 1139 794 a 1092 798 a tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 0.0 false .5 11.3335 InitRnode } NewNode end end 1092 798 a Fs(:)12 b(:)f(:)1139 794 y tx@Dict begin 45. neg Rot end 1139 794 a 856 1220 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 1360 817 a tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1360 817 a FF(RET)1376 955 y tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0 false .5 11.17616 InitRnode } NewNode end end 1376 955 a Fs(C)1426 963 y Fn(n)856 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 1209 675 a tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 1209 675 a FF(JOIN)856 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 856 1220 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 1220 a 1047 1353 a Fy(\(a\))19 b(E1)p 1905 1450 4 1022 v 2347 1238 a tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 2347 1238 a Fs(C)2397 1247 y Fu(1)2327 1100 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2327 1100 a FF(RET)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2631 1238 a tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 2631 1238 a Fs(C)2681 1247 y Fu(2)2610 1100 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2610 1100 a FF(RET)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2320 959 a tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.43198 0.0 false .5 16.88788 InitRnode } NewNode end end 2320 959 a FF(MA)-7 b(T)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl1 /TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2603 959 a tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.43198 0.0 false .5 16.88788 InitRnode } NewNode end end 2603 959 a FF(MA)g(T)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl2 /TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2460 817 a tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2460 817 a FF(JOIN)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2 /TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2390 1220 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2 /TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2673 653 a tx@Dict begin 45. Rot end 2673 653 a 2626 657 a tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 0.0 false .5 11.3335 InitRnode } NewNode end end 2626 657 a Fs(:)12 b(:)f(:)2673 653 y tx@Dict begin 45. neg Rot end 2673 653 a 2390 1220 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2 /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2894 817 a tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2894 817 a FF(RET)2910 955 y tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0 false .5 11.17616 InitRnode } NewNode end end 2910 955 a Fs(C)2960 963 y Fn(n)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2887 675 a tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.43198 0.0 false .5 16.88788 InitRnode } NewNode end end 2887 675 a FF(MA)-7 b(T)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodematgetcln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2743 533 a tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2743 533 a FF(JOIN)2390 1220 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2390 1220 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 1220 a 2579 1353 a Fy(\(b\))19 b(E2)p 374 1453 3065 4 v 814 2404 a tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 814 2404 a Fs(C)864 2413 y Fu(1)793 2267 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 793 2267 a FF(RET)856 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 1097 2404 a tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 1097 2404 a Fs(C)1147 2413 y Fu(2)1077 2267 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1077 2267 a FF(RET)856 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 926 2125 a tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 926 2125 a FF(JOIN)856 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 856 2386 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 1139 1961 a tx@Dict begin 45. Rot end 1139 1961 a 1092 1965 a tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 0.0 false .5 11.3335 InitRnode } NewNode end end 1092 1965 a Fs(:)12 b(:)f(:)1139 1961 y tx@Dict begin 45. neg Rot end 1139 1961 a 856 2386 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 1360 1983 a tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1360 1983 a FF(RET)1376 2121 y tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0 false .5 11.17616 InitRnode } NewNode end end 1376 2121 a Fs(C)1426 2129 y Fn(n)856 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 1209 1842 a tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 1209 1842 a FF(JOIN)856 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 856 2386 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 1159 1700 a tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.43198 0.08394 false .5 29.33583 InitRnode } NewNode end end 1159 1700 a FF(SELECT)856 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodeselect /TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 856 2386 a 1047 2520 a Fy(\(c\))19 b(E3)p 1905 2616 4 1164 v 2347 2404 a tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 2347 2404 a Fs(C)2397 2413 y Fu(1)2327 2267 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2327 2267 a FF(RET)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2631 2404 a tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111 false .5 10.22475 InitRnode } NewNode end end 2631 2404 a Fs(C)2681 2413 y Fu(2)2610 2267 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2610 2267 a FF(RET)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2320 2125 a tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.43198 0.0 false .5 16.88788 InitRnode } NewNode end end 2320 2125 a FF(MA)-7 b(T)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl1 /TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2603 2125 a tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.43198 0.0 false .5 16.88788 InitRnode } NewNode end end 2603 2125 a FF(MA)g(T)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodegetcl2 /TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2460 1983 a tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2460 1983 a FF(JOIN)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2 /TheNodematgetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2390 2386 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2 /TheNodematgetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2673 1819 a tx@Dict begin 45. Rot end 2673 1819 a 2626 1823 a tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 0.0 false .5 11.3335 InitRnode } NewNode end end 2626 1823 a Fs(:)12 b(:)f(:)2673 1819 y tx@Dict begin 45. neg Rot end 2673 1819 a 2390 2386 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoinmatgetcl1matgetcl2 /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2894 1983 a tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2894 1983 a FF(RET)2910 2121 y tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0 false .5 11.17616 InitRnode } NewNode end end 2910 2121 a Fs(C)2960 2129 y Fn(n)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2887 1842 a tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.43198 0.0 false .5 16.88788 InitRnode } NewNode end end 2887 1842 a FF(MA)-7 b(T)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodematgetcln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2743 1700 a tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2743 1700 a FF(JOIN)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2390 2386 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodematgetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2693 1558 a tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.43198 0.08394 false .5 29.33583 InitRnode } NewNode end end 2693 1558 a FF(SELECT)2390 2386 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodeselect /TheNoderoot InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2390 2386 a 2579 2520 a Fy(\(d\))19 b(E4)p 3557 2641 4 2239 v 323 2644 3237 4 v 3558 2661 19 2245 v 340 2661 3237 19 v 501 2857 a FP(Figure)24 b(5.2:)31 b(Expressions)26 b(used)f(in)e(generating)j(benchmark)g(queries)f(for)f(Open)g(OODB)p 610 3188 2680 13 v 610 3279 4 92 v 663 3297 a Fz(Query)p 917 3279 V 970 3305 a(Indices?)p 1285 3279 V 1338 3297 a(Expr)o(ession)p 1740 3279 V 2279 3252 a(Rules)18 b(matched)p 3286 3279 V 1743 3283 1547 4 v 610 3371 4 92 v 917 3371 V 1285 3371 V 1740 3371 V 1793 3343 a(transformation)h(rules)p 2505 3371 V 103 w(implementation)f(rules)p 3286 3371 V 610 3383 2680 13 v 610 3474 4 92 v 706 3447 a Fy(E1)m(1)p 917 3474 V 234 w(No)p 1285 3474 V 1473 3500 a(E1)p 1740 3474 V 2105 3499 a(3)p 2505 3474 V 737 w(3)p 3286 3474 V 610 3478 679 4 v 610 3566 4 92 v 705 3538 a(E12)p 917 3566 V 223 w(Y)-7 b(es)p 1285 3566 V 1740 3566 V 2505 3566 V 3286 3566 V 610 3569 2680 4 v 610 3660 4 92 v 705 3633 a(E21)p 917 3660 V 232 w(No)p 1285 3660 V 1473 3686 a(E2)p 1740 3660 V 2105 3685 a(8)p 2505 3660 V 2879 3686 a(4)p 3286 3660 V 610 3664 679 4 v 610 3752 4 92 v 705 3724 a(E22)p 917 3752 V 223 w(Y)g(es)p 1285 3752 V 1740 3752 V 2505 3752 V 3286 3752 V 610 3755 2680 4 v 610 3846 4 92 v 705 3819 a(E31)p 917 3846 V 232 w(No)p 1285 3846 V 1473 3871 a(E3)p 1740 3846 V 549 w(9)p 2505 3846 V 2879 3872 a(5)p 3286 3846 V 610 3850 679 4 v 610 3938 4 92 v 705 3910 a(E32)p 917 3938 V 223 w(Y)g(es)p 1285 3938 V 1740 3938 V 2505 3938 V 3286 3938 V 610 3941 2680 4 v 610 4032 4 92 v 705 4005 a(E41)p 917 4032 V 232 w(No)p 1285 4032 V 1473 4058 a(E4)p 1740 4032 V 2087 4057 a(16)p 2505 4032 V 718 w(7)p 3286 4032 V 610 4036 679 4 v 610 4124 4 92 v 705 4096 a(E42)p 917 4124 V 223 w(Y)g(es)p 1285 4124 V 1740 4124 V 2505 4124 V 3286 4124 V 610 4136 2680 13 v 697 4290 a FP(T)h(able)23 b(5.1:)32 b(Queries)24 b(used)g(in)g(benchmarking)j(the)d(Open)f(OODB)e (optimizer)577 4667 y(As)16 b(in)i(the)g(case)g(of)f(the)h(centralized) i(optimizer)l(,)h(there)d(are)g(many)f(parameters)j(that)e(can)g(be)f (var)n(-)297 4836 y(ied)k(when)g(benchmarking)j(a)c(query)i(optimizer) -5 b(.)32 b(Since)21 b(our)g(objective)i(was)e(to)f(verify)i(that)g (the)f(Prairie)p 300 4917 1320 4 v 300 5022 a Fy(simple)e(join)g (expressions.)1905 5349 y FP(68)p eop %%Page: 69 81 69 80 bop 297 391 a FP(approach)23 b(did)e(not)g(sacri\256ce)g(ef)n (\256ciency)-6 b(,)23 b(our)e(criteria)h(for)f(the)g(queries)h(was)f (that)g(they)g(test)g(a)f(majority)300 561 y(of)27 b(the)g(rules,)i (with)e(varying)i(properties)g(of)e(the)h(base)f(classes.)43 b(T)-6 b(o)26 b(this)i(end,)g(we)e(tested)i(the)g(Prairie)293 730 y(\(and)18 b(V)-12 b(olcano\))18 b(optimizer)h(with)e(8)f(dif)n (ferent)k(queries)f(\(shown)e(in)g(T)-6 b(able)17 b(5.1\).)29 b(The)16 b(eight)i(queries,)i(E1)m(1)297 899 y(through)j(E42,)e(are)g (derived)h(from)f(the)g(4)g(expressions)j(in)d(Figure)g(5.2.)30 b(Each)21 b(expression,)j(E1)c(through)300 1069 y(E4,)i(is)h(used)i(to) e(obtain)i(two)e(queries)i(for)f(a)f(\256xed)g(number)h FH(N)33 b FP(of)23 b(joins)i(in)e(the)h(expression.)34 b(The)22 b(only)298 1238 y(dif)n(ference)i(between)e(the)g(two)f (queries)i(obtained)g(from)f(an)f(expression)j(was)d(in)g(the)h (properties)i(of)d(the)300 1408 y(base)k(classes:)33 b(the)24 b(\256rst)g(query)h(did)f(not)g(contain)i(any)e(indices)i(on)e (any)g(classes,)i(whereas)e(the)h(second)300 1577 y(one)f(contained)i (a)d(single)i(index)g(on)f(each)g(base)g(class)h(occurring)h(in)d(the)h (expression.)582 1746 y(In)e(expressions)j(where)d(a)g(SELECT)c(is)k (present)i(\(E3)d(and)i(E4\),)e(the)i(selection)h(predicate)g(was)300 1916 y(a)g(conjunction)k(of)c(equality)j(predicates)g FD(bc)1711 1930 y Fs(i)1768 1916 y FA(==)g FD(const)2129 1930 y Fs(i)2157 1916 y FP(,)d(where)h FD(bc)2536 1930 y Fs(i)2587 1916 y FP(was)g(an)f(attribute)j(of)d(class)h FD(C)3549 1930 y Fs(i)3577 1916 y FP(,)300 2085 y(and)30 b FD(const)651 2099 y Fs(i)708 2085 y FP(was)f(a)f(constant)k(\(we)c (arbitrarily)k(set)d(this)h(to)f FH(i)p FP(,)h(because)h(its)e(value)h (doesn')n(t)h(af)n(fect)g(the)300 2254 y(correctness)d(or)c (performance)k(of)c(the)h(optimizer\).)36 b(In)25 b(addition,)i(for)d (queries)j(with)d(a)h(SELECT)-7 b(,)21 b(and)300 2424 y(whose)k(base)g(classes)h(have)f(indices)h(\(E32)e(and)h(E42,)f(in)g (T)-6 b(able)24 b(5.1\),)h(the)f(\(single\))j(indexed)f(attribute)300 2593 y(of)g(each)g(base)g(class)h(was)e(chosen)i(to)f(be)g(the)g (attribute)h(referenced)i(in)c(the)h(selection)i(predicate.)40 b(For)300 2762 y(example,)24 b(class)h FD(C)914 2776 y Fs(i)964 2762 y FP(was)f(chosen)h(to)e(have)i(an)e(index)i(on)e (attribute)j FD(bc)2550 2776 y Fs(i)2578 2762 y FP(.)580 2932 y(The)19 b(join)i(predicates)h(for)f(each)f(JOIN)f(were)h(chosen)i (at)e(random,)h(and)f(were)g(always)h(equijoin)300 3101 y(predicates.)45 b(The)27 b(choice)h(of)f(join)h(predicates)i(was)d (such)h(that)g(the)g(queries)h(corresponded)i(to)c(linear)300 3271 y(query)g(graphs;)h(furthermore,)g(each)e(join)g(predicate)i (corresponded)i(to)25 b(an)h(implementation)i(using)f(a)300 3440 y(one-way)f(pointer)g(between)g(the)e(join)i(attributes)h(of)d (the)h(base)g(classes.)36 b(For)24 b(example,)i(if)e FH(e)g FP(is)g(an)h(ob-)299 3609 y(ject)e(of)g(the)f(Employee)i(class,) f(and)g FH(p)f FP(an)g(object)i(of)f(the)g(Person)g(class,)g(and)g(the) g(spouse)h(method)g(\(i.e.,)298 3779 y(attribute\))g(of)d(Employee)i (returns)g(an)f(instance)h(of)f(Person,)g(then)g(the)g(join)h (predicate)g FH(e:)p FP(spouse)29 b FA(==)24 b FH(p)300 3948 y FP(was)f(implemented)j(as)d(a)g(pointer)i(from)f(the)g(spouse)h (method)f(of)g(Employee)g(to)g(the)f(Person)i(class.)575 4117 y(T)-6 b(able)17 b(5.1)f(also)g(shows)h(the)g(number)g(of)f(V)-12 b(olcano)18 b(transformation)h(and)e(implementation)i(rules)300 4287 y(that)32 b(are)g(matched)h(by)e(each)i(query)-6 b(.)56 b(These)32 b(are)g(the)g(rules)g(whose)g(left)g(hand)h(sides)f (match)g(a)f(sub-)300 4456 y(expression.)55 b(However)l(,)33 b(not)e(all)g(the)g(rules)g(were)g(necessarily)j(applicable.)55 b(For)30 b(instance,)k(an)d(im-)300 4625 y(plementation)i(rule)d(with)f (an)h(index)h(scan)f(would)g(not)g(apply)h(to)f(E21,)g(although)i(it)d (might)h(apply)h(to)300 4795 y(E22.)582 4964 y(Random)23 b(queries)h(were)f(generated)i(for)d(optimization)j(using)f(a)e(random) i(number)f(generator)1905 5349 y(69)p eop %%Page: 70 82 70 81 bop 306 303 3272 4 v 306 2021 4 1718 v 423 1763 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1785 @rwi @setspecial %%BeginDocument: runtime_Q1_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap 0.000000 0.000000 0.000000 setrgbcolor 1 setlinewidth /Times-Italic findfont 60 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 621 362 m 621 372 l 822 362 m 822 372 l 1023 362 m 1023 372 l 1225 362 m 1225 372 l 1426 362 m 1426 372 l 1627 362 m 1627 372 l 1828 362 m 1828 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 621 1704 m 621 1694 l 822 1704 m 822 1694 l 1023 1704 m 1023 1694 l 1225 1704 m 1225 1694 l 1426 1704 m 1426 1694 l 1627 1704 m 1627 1694 l 1828 1704 m 1828 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 586 m 430 586 l 420 809 m 430 809 l 420 1033 m 430 1033 l 420 1257 m 430 1257 l 420 1480 m 430 1480 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 586 m 2020 586 l 2030 809 m 2020 809 l 2030 1033 m 2020 1033 l 2030 1257 m 2020 1257 l 2030 1480 m 2020 1480 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 586 m 440 586 l 420 809 m 440 809 l 420 1033 m 440 1033 l 420 1257 m 440 1257 l 420 1480 m 440 1480 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 586 m 2010 586 l 2030 809 m 2010 809 l 2030 1033 m 2010 1033 l 2030 1257 m 2010 1257 l 2030 1480 m 2010 1480 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 586 m gsave 366 586 translate 0 rotate 0 -30 m (0.5) RJ (0.5) show grestore newpath 366 809 m gsave 366 809 translate 0 rotate 0 -30 m (1.0) RJ (1.0) show grestore newpath 366 1033 m gsave 366 1033 translate 0 rotate 0 -30 m (1.5) RJ (1.5) show grestore newpath 366 1257 m gsave 366 1257 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 1480 m gsave 366 1480 translate 0 rotate 0 -30 m (2.5) RJ (2.5) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (3.0) RJ (3.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 194 1033 m gsave 194 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E11) CS (Average CPU Time for Query E11) show grestore newpath 420 402 m 621 516 l 822 633 l 1023 755 l 1225 869 l 1426 1000 l 1627 1130 l 1828 1262 l 2030 1384 l /Times-Roman findfont 90 scalefont setfont stroke 420 402 30 0 360 arc gsave fill grestore stroke 621 516 30 0 360 arc gsave fill grestore stroke 822 633 30 0 360 arc gsave fill grestore stroke 1023 755 30 0 360 arc gsave fill grestore stroke 1225 869 30 0 360 arc gsave fill grestore stroke 1426 1000 30 0 360 arc gsave fill grestore stroke 1627 1130 30 0 360 arc gsave fill grestore stroke 1828 1262 30 0 360 arc gsave fill grestore stroke 2030 1384 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 404 m 621 519 l 822 642 l 1023 767 l 1225 895 l 1426 1020 l 1627 1175 l 1828 1295 l 2030 1436 l /Times-Roman findfont 90 scalefont setfont stroke 420 434 m 390 404 l 420 374 l 450 404 l closepath gsave eofill grestore stroke 621 549 m 591 519 l 621 489 l 651 519 l closepath gsave eofill grestore stroke 822 672 m 792 642 l 822 612 l 852 642 l closepath gsave eofill grestore stroke 1023 797 m 993 767 l 1023 737 l 1053 767 l closepath gsave eofill grestore stroke 1225 925 m 1195 895 l 1225 865 l 1255 895 l closepath gsave eofill grestore stroke 1426 1050 m 1396 1020 l 1426 990 l 1456 1020 l closepath gsave eofill grestore stroke 1627 1205 m 1597 1175 l 1627 1145 l 1657 1175 l closepath gsave eofill grestore stroke 1828 1325 m 1798 1295 l 1828 1265 l 1858 1295 l closepath gsave eofill grestore stroke 2030 1466 m 2000 1436 l 2030 1406 l 2060 1436 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 953 1897 a Fy(\(a\))19 b(Query)g(E1)m(1)p 1951 1996 4 1668 v 1998 1763 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1785 @rwi @setspecial %%BeginDocument: runtime_Q2_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 586 m 430 586 l 420 809 m 430 809 l 420 1033 m 430 1033 l 420 1257 m 430 1257 l 420 1480 m 430 1480 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 586 m 2020 586 l 2030 809 m 2020 809 l 2030 1033 m 2020 1033 l 2030 1257 m 2020 1257 l 2030 1480 m 2020 1480 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 586 m 440 586 l 420 809 m 440 809 l 420 1033 m 440 1033 l 420 1257 m 440 1257 l 420 1480 m 440 1480 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 586 m 2010 586 l 2030 809 m 2010 809 l 2030 1033 m 2010 1033 l 2030 1257 m 2010 1257 l 2030 1480 m 2010 1480 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 586 m gsave 366 586 translate 0 rotate 0 -30 m (0.5) RJ (0.5) show grestore newpath 366 809 m gsave 366 809 translate 0 rotate 0 -30 m (1.0) RJ (1.0) show grestore newpath 366 1033 m gsave 366 1033 translate 0 rotate 0 -30 m (1.5) RJ (1.5) show grestore newpath 366 1257 m gsave 366 1257 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 1480 m gsave 366 1480 translate 0 rotate 0 -30 m (2.5) RJ (2.5) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (3.0) RJ (3.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 194 1033 m gsave 194 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E12) CS (Average CPU Time for Query E12) show grestore newpath 420 401 m 621 517 l 822 636 l 1023 750 l 1225 867 l 1426 992 l 1627 1124 l 1828 1246 l 2030 1386 l /Times-Roman findfont 90 scalefont setfont stroke 420 401 30 0 360 arc gsave fill grestore stroke 621 517 30 0 360 arc gsave fill grestore stroke 822 636 30 0 360 arc gsave fill grestore stroke 1023 750 30 0 360 arc gsave fill grestore stroke 1225 867 30 0 360 arc gsave fill grestore stroke 1426 992 30 0 360 arc gsave fill grestore stroke 1627 1124 30 0 360 arc gsave fill grestore stroke 1828 1246 30 0 360 arc gsave fill grestore stroke 2030 1386 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 396 m 621 511 l 822 633 l 1023 762 l 1225 885 l 1426 1017 l 1627 1159 l 1828 1295 l 2030 1437 l /Times-Roman findfont 90 scalefont setfont stroke 420 426 m 390 396 l 420 366 l 450 396 l closepath gsave eofill grestore stroke 621 541 m 591 511 l 621 481 l 651 511 l closepath gsave eofill grestore stroke 822 663 m 792 633 l 822 603 l 852 633 l closepath gsave eofill grestore stroke 1023 792 m 993 762 l 1023 732 l 1053 762 l closepath gsave eofill grestore stroke 1225 915 m 1195 885 l 1225 855 l 1255 885 l closepath gsave eofill grestore stroke 1426 1047 m 1396 1017 l 1426 987 l 1456 1017 l closepath gsave eofill grestore stroke 1627 1189 m 1597 1159 l 1627 1129 l 1657 1159 l closepath gsave eofill grestore stroke 1828 1325 m 1798 1295 l 1828 1265 l 1858 1295 l closepath gsave eofill grestore stroke 2030 1467 m 2000 1437 l 2030 1407 l 2060 1437 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 2525 1897 a(\(b\))g(Query)g(E12)p 3574 2021 4 1718 v 306 2024 3272 4 v 3576 2041 19 1724 v 322 2041 3272 19 v 521 2236 a FP(Figure)24 b(5.3:)32 b(Benchmarking)26 b(the)d(Open)h(OODB)d(optimizer)k(\320)e(queries)i(E1)m(1)e(and)h(E12) 298 2613 y(as)d(follows.)32 b(The)21 b(set)h(of)f(stored)i(\256les)f (\(classes\))h(was)f(\256xed.)30 b(Each)21 b(query)i(contained)h(a)e (random)g(order)300 2782 y(of)k(classes)i(in)f(the)g(\(left-deep\))i (operator)f(trees.)41 b(For)26 b(each)h(query)-6 b(,)28 b(the)f(catalog)h(information)h(\(cardi-)300 2952 y(nality)e(of)f (classes,)h(record)g(widths,)g(etc.\))f(was)f(varied.)38 b(The)26 b(join)g(and)g(selection)i(predicates)h(\(where)300 3121 y(applicable\))e(were)c(generated)j(subject)f(to)f(the)g (constraints)i(described)g(above.)300 3428 y FN(5.3.3)99 b(Performance)26 b(Results)f(Using)f(the)i(Open)f(OODB)g(Optimizer)583 3658 y FP(Queries)32 b(E1)m(1)e(through)j(E42)d(were)g(optimized)j(for) d(increasing)k(number)d FH(N)40 b FP(of)31 b(joins.)53 b(For)295 3828 y(each)21 b(query)f(and)g(a)f(\256xed)g(value)i(of)e FH(N)10 b FP(,)19 b(we)g(varied)h(the)g(cardinalities,)j(record)e (widths,)g(etc.)e(of)g(the)h(base)293 3997 y(classes)f(5)d(times,)j (each)f(time)f(generating)j(a)c(query)j(with)d(dif)n(ferent)k(class)e (properties,)j(and)d(averaged)h(the)295 4166 y(run-times)h(over)g(the)f (5)g(query)h(instances)h(to)e(generate)i(the)e(per)n(-query)j (optimization)g(time.)29 b(Thus,)20 b(each)295 4336 y(point)h(in)e(our) g(graphs)i(represents)h(the)e(average)h(of)e(5)g(queries.)31 b(The)19 b(run-times)h(were)g(measured)3348 4303 y Fv(6)3408 4336 y FP(using)297 4505 y(the)h(GNU)e Fi(time)f FP(command.)30 b(All)20 b(experiments)j(were)e(performed)h(on)f(a)f(lightly)j(loaded)f (DECstation)300 4675 y(5000/200)k(running)g(Ultrix)e(4.2.)p 300 4756 1320 4 v 400 4809 a Fu(6)434 4841 y Fy(Since)f(the)f (run-times)h(were)f(too)h(small)f(to)h(be)g(measured)g(accurately)g (with)g Ff(time)p Fy(,)f(each)h(query)g(instance)g(was)g(opti-)300 4932 y(mized)h(3000)g(times)f(\(in)g(a)g(loop\))h(and)g(the)f(total)g (time)g(was)g(divided)i(by)e(3000)i(to)e(obtain)h(optimization)g(time)f (for)g(a)g(given)300 5024 y(query)-5 b(.)1905 5349 y FP(70)p eop %%Page: 71 83 71 82 bop 306 403 3272 4 v 306 2101 4 1699 v 427 1843 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_Q3_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 621 362 m 621 372 l 822 362 m 822 372 l 1023 362 m 1023 372 l 1225 362 m 1225 372 l 1426 362 m 1426 372 l 1627 362 m 1627 372 l 1828 362 m 1828 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 621 1704 m 621 1694 l 822 1704 m 822 1694 l 1023 1704 m 1023 1694 l 1225 1704 m 1225 1694 l 1426 1704 m 1426 1694 l 1627 1704 m 1627 1694 l 1828 1704 m 1828 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 496 m 430 496 l 420 630 m 430 630 l 420 765 m 430 765 l 420 899 m 430 899 l 420 1033 m 430 1033 l 420 1167 m 430 1167 l 420 1301 m 430 1301 l 420 1436 m 430 1436 l 420 1570 m 430 1570 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 496 m 2020 496 l 2030 630 m 2020 630 l 2030 765 m 2020 765 l 2030 899 m 2020 899 l 2030 1033 m 2020 1033 l 2030 1167 m 2020 1167 l 2030 1301 m 2020 1301 l 2030 1436 m 2020 1436 l 2030 1570 m 2020 1570 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 630 m 440 630 l 420 899 m 440 899 l 420 1167 m 440 1167 l 420 1436 m 440 1436 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 630 m 2010 630 l 2030 899 m 2010 899 l 2030 1167 m 2010 1167 l 2030 1436 m 2010 1436 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 630 m gsave 366 630 translate 0 rotate 0 -30 m (1.0) RJ (1.0) show grestore newpath 366 899 m gsave 366 899 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 1167 m gsave 366 1167 translate 0 rotate 0 -30 m (3.0) RJ (3.0) show grestore newpath 366 1436 m gsave 366 1436 translate 0 rotate 0 -30 m (4.0) RJ (4.0) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (5.0) RJ (5.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 194 1033 m gsave 194 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E21) CS (Average CPU Time for Query E21) show grestore newpath 420 386 m 621 470 l 822 554 l 1023 643 l 1225 729 l 1426 827 l 1627 927 l 1828 1029 l 2030 1503 l /Times-Roman findfont 90 scalefont setfont stroke 420 386 30 0 360 arc gsave fill grestore stroke 621 470 30 0 360 arc gsave fill grestore stroke 822 554 30 0 360 arc gsave fill grestore stroke 1023 643 30 0 360 arc gsave fill grestore stroke 1225 729 30 0 360 arc gsave fill grestore stroke 1426 827 30 0 360 arc gsave fill grestore stroke 1627 927 30 0 360 arc gsave fill grestore stroke 1828 1029 30 0 360 arc gsave fill grestore stroke 2030 1503 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 386 m 621 465 l 822 545 l 1023 617 l 1225 705 l 1426 786 l 1627 878 l 1828 974 l 2030 1443 l /Times-Roman findfont 90 scalefont setfont stroke 420 416 m 390 386 l 420 356 l 450 386 l closepath gsave eofill grestore stroke 621 495 m 591 465 l 621 435 l 651 465 l closepath gsave eofill grestore stroke 822 575 m 792 545 l 822 515 l 852 545 l closepath gsave eofill grestore stroke 1023 647 m 993 617 l 1023 587 l 1053 617 l closepath gsave eofill grestore stroke 1225 735 m 1195 705 l 1225 675 l 1255 705 l closepath gsave eofill grestore stroke 1426 816 m 1396 786 l 1426 756 l 1456 786 l closepath gsave eofill grestore stroke 1627 908 m 1597 878 l 1627 848 l 1657 878 l closepath gsave eofill grestore stroke 1828 1004 m 1798 974 l 1828 944 l 1858 974 l closepath gsave eofill grestore stroke 2030 1473 m 2000 1443 l 2030 1413 l 2060 1443 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 952 1977 a Fy(\(a\))18 b(Query)i(E21)p 1951 2076 4 1649 v 2003 1843 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_Q4_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 496 m 430 496 l 420 630 m 430 630 l 420 765 m 430 765 l 420 899 m 430 899 l 420 1033 m 430 1033 l 420 1167 m 430 1167 l 420 1301 m 430 1301 l 420 1436 m 430 1436 l 420 1570 m 430 1570 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 496 m 2020 496 l 2030 630 m 2020 630 l 2030 765 m 2020 765 l 2030 899 m 2020 899 l 2030 1033 m 2020 1033 l 2030 1167 m 2020 1167 l 2030 1301 m 2020 1301 l 2030 1436 m 2020 1436 l 2030 1570 m 2020 1570 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 630 m 440 630 l 420 899 m 440 899 l 420 1167 m 440 1167 l 420 1436 m 440 1436 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 630 m 2010 630 l 2030 899 m 2010 899 l 2030 1167 m 2010 1167 l 2030 1436 m 2010 1436 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 630 m gsave 366 630 translate 0 rotate 0 -30 m (1.0) RJ (1.0) show grestore newpath 366 899 m gsave 366 899 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 1167 m gsave 366 1167 translate 0 rotate 0 -30 m (3.0) RJ (3.0) show grestore newpath 366 1436 m gsave 366 1436 translate 0 rotate 0 -30 m (4.0) RJ (4.0) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (5.0) RJ (5.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 194 1033 m gsave 194 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E22) CS (Average CPU Time for Query E22) show grestore newpath 420 385 m 621 472 l 822 551 l 1023 641 l 1225 727 l 1426 829 l 1627 920 l 1828 1022 l 2030 1507 l /Times-Roman findfont 90 scalefont setfont stroke 420 385 30 0 360 arc gsave fill grestore stroke 621 472 30 0 360 arc gsave fill grestore stroke 822 551 30 0 360 arc gsave fill grestore stroke 1023 641 30 0 360 arc gsave fill grestore stroke 1225 727 30 0 360 arc gsave fill grestore stroke 1426 829 30 0 360 arc gsave fill grestore stroke 1627 920 30 0 360 arc gsave fill grestore stroke 1828 1022 30 0 360 arc gsave fill grestore stroke 2030 1507 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 385 m 621 464 l 822 544 l 1023 618 l 1225 703 l 1426 787 l 1627 876 l 1828 979 l 2030 1449 l /Times-Roman findfont 90 scalefont setfont stroke 420 415 m 390 385 l 420 355 l 450 385 l closepath gsave eofill grestore stroke 621 494 m 591 464 l 621 434 l 651 464 l closepath gsave eofill grestore stroke 822 574 m 792 544 l 822 514 l 852 544 l closepath gsave eofill grestore stroke 1023 648 m 993 618 l 1023 588 l 1053 618 l closepath gsave eofill grestore stroke 1225 733 m 1195 703 l 1225 673 l 1255 703 l closepath gsave eofill grestore stroke 1426 817 m 1396 787 l 1426 757 l 1456 787 l closepath gsave eofill grestore stroke 1627 906 m 1597 876 l 1627 846 l 1657 876 l closepath gsave eofill grestore stroke 1828 1009 m 1798 979 l 1828 949 l 1858 979 l closepath gsave eofill grestore stroke 2030 1479 m 2000 1449 l 2030 1419 l 2060 1449 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 2525 1977 a(\(b\))f(Query)g(E22)p 3574 2101 4 1699 v 306 2104 3272 4 v 3576 2121 19 1706 v 322 2121 3272 19 v 520 2317 a FP(Figure)24 b(5.4:)31 b(Benchmarking)26 b(the)e(Open)f(OODB)f(optimizer)j(\320)d(queries)k(E21)d(and)h(E22)579 2694 y(The)c(optimization)j(times)d(for)g(each)g(query)i(for)e(both)g (approaches)j(\(Prairie)e(and)f(V)-12 b(olcano\))22 b(are)300 2863 y(shown)j(in)f(Figures)h(5.3)f(through)i(5.6.)33 b(The)24 b(number)h(of)f(joins)h FH(N)34 b FP(in)24 b(each)h(set)f(of)g (graphs)i(was)e(varied)300 3033 y(to)f(a)h(maximum)f(of)g(8,)g(or)h (until)g(virtual)h(memory)f(was)f(exhausted.)579 3202 y(The)d(\256rst)g(set)g(of)f(graphs)j(\(Figures)f(5.3\(a\))g(and)f (5.3\(b\)\))h(shows)g(the)f(performance)i(of)e(a)g(simple)299 3371 y(relational-type)28 b(query)-6 b(.)32 b(The)22 b(optimization)k(times)d(are)g(almost)h(identical)h(between)f(Prairie)f (and)h(V)-12 b(ol-)299 3541 y(cano,)24 b(and)g(the)f(notable)i(point)f (is)f(that)h(the)f(presence)i(of)e(an)g(index)i(does)f(not)f(change)i (the)e(optimizer)s(')-5 b(s)296 3710 y(behavior)l(,)23 b(i.e.,)d(the)g(two)g(graphs)i(are)e(identical.)32 b(This)20 b(arises)h(because)h(the)e(rule)h(set)f(had)h(only)g(two)e(join)300 3879 y(algorithms)26 b(\(Ptr)p 853 3879 28 4 v 33 w(hash)p 1051 3879 V 34 w(join)e(and)g(Hash)p 1589 3879 V 34 w(join\),)g (neither)h(of)f(which)g(makes)g(use)f(of)h(any)g(indices.)583 4049 y(The)j(second)i(set)f(of)f(graphs)i(\(Figures)g(5.4\(a\))f(and)g (5.4\(b\)\))g(shows)g(the)g(results)h(of)e(optimiz-)298 4218 y(ing)c(E21)e(and)i(E22.)29 b(Here,)22 b(as)g(in)g(Figures)h (5.3\(a\))g(and)f(5.3\(b\),)h(the)f(presence)i(\(or)e(absence\))i(of)e (indices)300 4387 y(makes)h(no)h(dif)n(ference.)33 b(Both)24 b(the)f(Prairie)h(and)g(V)-12 b(olcano)24 b(approaches)j(have)d (comparable)h(run-times.)300 4557 y(The)e(sharp)h(jump)f(in)h(the)f (graphs)i(from)e(7-way)h(to)f(8-way)h(joins)g(is)f(due)h(to)f(the)h (fact)g(that)f(since)i(all)e(op-)299 4726 y(timization)h(is)e(done)h (in)f(main)g(memory)-6 b(,)23 b(dynamic)g(memory)g(allocation)i (\(caused)f(by)e Fi(malloc)d FP(calls\))300 4896 y(for)28 b(storing)h(the)e(search)i(space)g(results)f(in)g(a)f(lot)g(of)h (thrashing)h(at)f(this)g(point.)43 b(W)-7 b(e)27 b(speculate)i(that)f (in)300 5065 y(systems)d(with)e(more)h(virtual)h(memory)-6 b(,)23 b(the)h(graphs)h(will)e(be)h(smoother)-5 b(.)1905 5349 y(71)p eop %%Page: 72 84 72 83 bop 306 403 3272 4 v 306 2101 4 1699 v 427 1843 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_Q5_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 688 362 m 688 372 l 956 362 m 956 372 l 1225 362 m 1225 372 l 1493 362 m 1493 372 l 1761 362 m 1761 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 688 1704 m 688 1694 l 956 1704 m 956 1694 l 1225 1704 m 1225 1694 l 1493 1704 m 1493 1694 l 1761 1704 m 1761 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 956 362 m 956 382 l 1493 362 m 1493 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 956 1704 m 956 1684 l 1493 1704 m 1493 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 956 287 m gsave 956 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 1493 287 m gsave 1493 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 530 m 430 530 l 420 698 m 430 698 l 420 865 m 430 865 l 420 1033 m 430 1033 l 420 1201 m 430 1201 l 420 1368 m 430 1368 l 420 1536 m 430 1536 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 530 m 2020 530 l 2030 698 m 2020 698 l 2030 865 m 2020 865 l 2030 1033 m 2020 1033 l 2030 1201 m 2020 1201 l 2030 1368 m 2020 1368 l 2030 1536 m 2020 1536 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 698 m 440 698 l 420 1033 m 440 1033 l 420 1368 m 440 1368 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 698 m 2010 698 l 2030 1033 m 2010 1033 l 2030 1368 m 2010 1368 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 698 m gsave 366 698 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 1033 m gsave 366 1033 translate 0 rotate 0 -30 m (4.0) RJ (4.0) show grestore newpath 366 1368 m gsave 366 1368 translate 0 rotate 0 -30 m (6.0) RJ (6.0) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (8.0) RJ (8.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 194 1033 m gsave 194 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E31) CS (Average CPU Time for Query E31) show grestore newpath 420 408 m 956 490 l 1493 643 l 2030 1698 l /Times-Roman findfont 90 scalefont setfont stroke 420 408 30 0 360 arc gsave fill grestore stroke 956 490 30 0 360 arc gsave fill grestore stroke 1493 643 30 0 360 arc gsave fill grestore stroke 2030 1698 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 409 m 956 501 l 1493 659 l 2030 1659 l /Times-Roman findfont 90 scalefont setfont stroke 420 439 m 390 409 l 420 379 l 450 409 l closepath gsave eofill grestore stroke 956 531 m 926 501 l 956 471 l 986 501 l closepath gsave eofill grestore stroke 1493 689 m 1463 659 l 1493 629 l 1523 659 l closepath gsave eofill grestore stroke 2030 1689 m 2000 1659 l 2030 1629 l 2060 1659 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 952 1977 a Fy(\(a\))18 b(Query)i(E31)p 1951 2076 4 1649 v 2003 1843 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_Q6_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 688 362 m 688 372 l 956 362 m 956 372 l 1225 362 m 1225 372 l 1493 362 m 1493 372 l 1761 362 m 1761 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 688 1704 m 688 1694 l 956 1704 m 956 1694 l 1225 1704 m 1225 1694 l 1493 1704 m 1493 1694 l 1761 1704 m 1761 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 956 362 m 956 382 l 1493 362 m 1493 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 956 1704 m 956 1684 l 1493 1704 m 1493 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 956 287 m gsave 956 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 1493 287 m gsave 1493 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 496 m 430 496 l 420 630 m 430 630 l 420 765 m 430 765 l 420 899 m 430 899 l 420 1033 m 430 1033 l 420 1167 m 430 1167 l 420 1301 m 430 1301 l 420 1436 m 430 1436 l 420 1570 m 430 1570 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 496 m 2020 496 l 2030 630 m 2020 630 l 2030 765 m 2020 765 l 2030 899 m 2020 899 l 2030 1033 m 2020 1033 l 2030 1167 m 2020 1167 l 2030 1301 m 2020 1301 l 2030 1436 m 2020 1436 l 2030 1570 m 2020 1570 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 630 m 440 630 l 420 899 m 440 899 l 420 1167 m 440 1167 l 420 1436 m 440 1436 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 630 m 2010 630 l 2030 899 m 2010 899 l 2030 1167 m 2010 1167 l 2030 1436 m 2010 1436 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 630 m gsave 366 630 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 899 m gsave 366 899 translate 0 rotate 0 -30 m (4.0) RJ (4.0) show grestore newpath 366 1167 m gsave 366 1167 translate 0 rotate 0 -30 m (6.0) RJ (6.0) show grestore newpath 366 1436 m gsave 366 1436 translate 0 rotate 0 -30 m (8.0) RJ (8.0) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (10.0) RJ (10.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 133 1033 m gsave 133 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E32) CS (Average CPU Time for Query E32) show grestore newpath 420 399 m 956 470 l 1493 607 l 2030 1576 l /Times-Roman findfont 90 scalefont setfont stroke 420 399 30 0 360 arc gsave fill grestore stroke 956 470 30 0 360 arc gsave fill grestore stroke 1493 607 30 0 360 arc gsave fill grestore stroke 2030 1576 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 400 m 956 473 l 1493 604 l 2030 1397 l /Times-Roman findfont 90 scalefont setfont stroke 420 430 m 390 400 l 420 370 l 450 400 l closepath gsave eofill grestore stroke 956 503 m 926 473 l 956 443 l 986 473 l closepath gsave eofill grestore stroke 1493 634 m 1463 604 l 1493 574 l 1523 604 l closepath gsave eofill grestore stroke 2030 1427 m 2000 1397 l 2030 1367 l 2060 1397 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 2525 1977 a(\(b\))f(Query)g(E32)p 3574 2101 4 1699 v 306 2104 3272 4 v 3576 2121 19 1706 v 322 2121 3272 19 v 520 2317 a FP(Figure)24 b(5.5:)31 b(Benchmarking)26 b(the)e(Open)f(OODB)f(optimizer)j(\320)d(queries)k(E31)d(and)h(E32)578 2694 y(The)17 b(third)i(and)g(fourth)h(sets)f(of)f(graphs)h(in)g (Figures)g(5.5)f(and)g(5.6)g(are)h(optimizations)i(of)d(queries)300 2863 y(with)29 b(a)h(selection)i(predicate.)51 b(In)30 b(these)h(cases,)h(the)d(presence)j(of)e(an)g(index)g(makes)h(a)e(dif)n (ference)j(if)298 3033 y(the)23 b(index)g(is)f(referenced)j(in)d(the)g (selection)i(predicate)h(\(as)d(in)g(our)h(synthetically)i(generated)g (queries\).)300 3202 y(Also,)g(in)g(these)i(two)d(\256gures,)i(the)g (performance)i(of)d(both)h(Prairie)g(and)f(V)-12 b(olcano)27 b(was)e(almost)h(identi-)300 3371 y(cal,)i(except)g(that)f(Prairie)h (does)f(slightly)i(worse)e(due)h(to)f(the)g(lar)n(ger)h(number)g(of)f Fi(malloc)c FP(calls)28 b(that)300 3541 y(the)d(P2V)e(preprocessor)28 b(introduces)f(\(because)g(of)d(shared)i(property)h(structures)g(using) f(pointers;)h(see)300 3710 y(Figure)d(4.2\).)31 b(Also,)23 b(note)h(that)g(we)e(could)j(only)f(go)g(up)f(to)g(3-way)h(joins)h (before)f(virtual)h(memory)f(was)300 3879 y(exhausted.)46 b(As)27 b(the)h(available)j(memory)d(decreases,)j(there)d(is)g (increased)i(thrashing)h(\(as)d(shown)g(by)300 4049 y(the)c(sharp)g (changes)i(in)d(slope)i(in)f(the)f(plots\))i(resulting)h(in)e(a)f(much) g(slower)h(optimization)j(process.)582 4218 y(It)21 b(is)h(instructive) j(to)d(compare)h(the)f(memory)g(requirements)j(in)d(the)g(optimization) j(of)d(the)g(var)n(-)300 4387 y(ious)j(queries.)36 b(As)24 b(mentioned)i(earlier)l(,)h(the)e(V)-12 b(olcano)26 b(rule)f(engine)h (implements)g(its)f(optimization)i(in)300 4557 y(main)g(memory)-6 b(,)27 b(i.e.,)g(it)f(stores)j(the)e(search)h(space)g(of)e(a)h(query)h (in)e(main)h(memory)-6 b(.)41 b(This)26 b(means)i(that)300 4726 y(memory)g(can)g(become)h(a)e(bottleneck)k(in)d(the)g(size)h(of)e (queries)j(that)e(can)h(be)e(optimized.)46 b(Figure)28 b(5.7)300 4896 y(compares)j(the)f(number)h(of)e(equivalent)k (expressions)g(generated)f(for)e(each)g(of)g(the)g(expressions)j(E1)300 5065 y(through)c(E4.)42 b(It)27 b(is)g(important)i(to)f(note)g(that)g (not)g(all)f(equivalent)j(expressions)h(lead)d(to)f(valid)i(access)1905 5349 y(72)p eop %%Page: 73 85 73 84 bop 306 403 3272 4 v 306 2101 4 1699 v 427 1843 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_Q7_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 688 362 m 688 372 l 956 362 m 956 372 l 1225 362 m 1225 372 l 1493 362 m 1493 372 l 1761 362 m 1761 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 688 1704 m 688 1694 l 956 1704 m 956 1694 l 1225 1704 m 1225 1694 l 1493 1704 m 1493 1694 l 1761 1704 m 1761 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 956 362 m 956 382 l 1493 362 m 1493 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 956 1704 m 956 1684 l 1493 1704 m 1493 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 956 287 m gsave 956 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 1493 287 m gsave 1493 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 496 m 430 496 l 420 630 m 430 630 l 420 765 m 430 765 l 420 899 m 430 899 l 420 1033 m 430 1033 l 420 1167 m 430 1167 l 420 1301 m 430 1301 l 420 1436 m 430 1436 l 420 1570 m 430 1570 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 496 m 2020 496 l 2030 630 m 2020 630 l 2030 765 m 2020 765 l 2030 899 m 2020 899 l 2030 1033 m 2020 1033 l 2030 1167 m 2020 1167 l 2030 1301 m 2020 1301 l 2030 1436 m 2020 1436 l 2030 1570 m 2020 1570 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 630 m 440 630 l 420 899 m 440 899 l 420 1167 m 440 1167 l 420 1436 m 440 1436 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 630 m 2010 630 l 2030 899 m 2010 899 l 2030 1167 m 2010 1167 l 2030 1436 m 2010 1436 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 630 m gsave 366 630 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 899 m gsave 366 899 translate 0 rotate 0 -30 m (4.0) RJ (4.0) show grestore newpath 366 1167 m gsave 366 1167 translate 0 rotate 0 -30 m (6.0) RJ (6.0) show grestore newpath 366 1436 m gsave 366 1436 translate 0 rotate 0 -30 m (8.0) RJ (8.0) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (10.0) RJ (10.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 133 1033 m gsave 133 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E41) CS (Average CPU Time for Query E41) show grestore newpath 420 409 m 956 489 l 1493 642 l 2030 1563 l /Times-Roman findfont 90 scalefont setfont stroke 420 409 30 0 360 arc gsave fill grestore stroke 956 489 30 0 360 arc gsave fill grestore stroke 1493 642 30 0 360 arc gsave fill grestore stroke 2030 1563 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 404 m 956 481 l 1493 621 l 2030 1404 l /Times-Roman findfont 90 scalefont setfont stroke 420 434 m 390 404 l 420 374 l 450 404 l closepath gsave eofill grestore stroke 956 511 m 926 481 l 956 451 l 986 481 l closepath gsave eofill grestore stroke 1493 651 m 1463 621 l 1493 591 l 1523 621 l closepath gsave eofill grestore stroke 2030 1434 m 2000 1404 l 2030 1374 l 2060 1404 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 952 1977 a Fy(\(a\))18 b(Query)i(E41)p 1951 2076 4 1649 v 2003 1843 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_Q8_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 382 l 956 362 m 956 382 l 1493 362 m 1493 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 956 1704 m 956 1684 l 1493 1704 m 1493 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 956 287 m gsave 956 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 1493 287 m gsave 1493 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 496 m 430 496 l 420 630 m 430 630 l 420 765 m 430 765 l 420 899 m 430 899 l 420 1033 m 430 1033 l 420 1167 m 430 1167 l 420 1301 m 430 1301 l 420 1436 m 430 1436 l 420 1570 m 430 1570 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 496 m 2020 496 l 2030 630 m 2020 630 l 2030 765 m 2020 765 l 2030 899 m 2020 899 l 2030 1033 m 2020 1033 l 2030 1167 m 2020 1167 l 2030 1301 m 2020 1301 l 2030 1436 m 2020 1436 l 2030 1570 m 2020 1570 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 630 m 440 630 l 420 899 m 440 899 l 420 1167 m 440 1167 l 420 1436 m 440 1436 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 630 m 2010 630 l 2030 899 m 2010 899 l 2030 1167 m 2010 1167 l 2030 1436 m 2010 1436 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0.0) RJ (0.0) show grestore newpath 366 630 m gsave 366 630 translate 0 rotate 0 -30 m (2.0) RJ (2.0) show grestore newpath 366 899 m gsave 366 899 translate 0 rotate 0 -30 m (4.0) RJ (4.0) show grestore newpath 366 1167 m gsave 366 1167 translate 0 rotate 0 -30 m (6.0) RJ (6.0) show grestore newpath 366 1436 m gsave 366 1436 translate 0 rotate 0 -30 m (8.0) RJ (8.0) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (10.0) RJ (10.0) show grestore newpath /Times-Roman findfont 90 scalefont setfont 133 1033 m gsave 133 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time for Query E42) CS (Average CPU Time for Query E42) show grestore newpath 420 405 m 956 483 l 1493 622 l 2030 1479 l /Times-Roman findfont 90 scalefont setfont stroke 420 405 30 0 360 arc gsave fill grestore stroke 956 483 30 0 360 arc gsave fill grestore stroke 1493 622 30 0 360 arc gsave fill grestore stroke 2030 1479 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 404 m 956 482 l 1493 620 l 2030 1409 l /Times-Roman findfont 90 scalefont setfont stroke 420 434 m 390 404 l 420 374 l 450 404 l closepath gsave eofill grestore stroke 956 512 m 926 482 l 956 452 l 986 482 l closepath gsave eofill grestore stroke 1493 650 m 1463 620 l 1493 590 l 1523 620 l closepath gsave eofill grestore stroke 2030 1439 m 2000 1409 l 2030 1379 l 2060 1409 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 946 1440 m 946 1664 l 1574 1664 l 1574 1440 l 946 1440 l stroke /Times-Roman findfont 90 scalefont setfont 995 1608 m 1191 1608 l stroke 995 1608 30 0 360 arc gsave fill grestore stroke 1191 1608 30 0 360 arc gsave fill grestore stroke 1240 1608 m gsave 1240 1608 translate 0 rotate 0 -30 m (Prairie) show grestore newpath /Times-Roman findfont 90 scalefont setfont 995 1496 m 1191 1496 l stroke 995 1526 m 965 1496 l 995 1466 l 1025 1496 l closepath gsave eofill grestore stroke 1191 1526 m 1161 1496 l 1191 1466 l 1221 1496 l closepath gsave eofill grestore stroke 1240 1496 m gsave 1240 1496 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 2525 1977 a(\(b\))f(Query)g(E42)p 3574 2101 4 1699 v 306 2104 3272 4 v 3576 2121 19 1706 v 322 2121 3272 19 v 520 2317 a FP(Figure)24 b(5.6:)31 b(Benchmarking)26 b(the)e(Open)f(OODB)f(optimizer)j(\320)d(queries)k(E41)d(and)h(E42)298 2694 y(plans,)g(but)e(an)g(exhaustive)k(search)d(strategy)h(\(like)f(V) -12 b(olcano\))24 b(requires)g(the)f(expressions)i(to)d(be)g(stored)300 2863 y(because)j(they)g(might)f(be)f(reused)i(in)f(other)g (expressions.)581 3033 y(W)-7 b(e)20 b(can)i(see)g(from)f(Figure)h(5.7) f(that)g(the)h(search)h(space)f(size)g(increases)h(by)f(lar)n(ge)g (magnitudes)300 3202 y(from)k(E1)f(through)j(E4.)38 b(For)25 b(instance,)k(the)d(number)h(of)f(equivalent)j(expressions)g(for)d(E4)g (is)f(about)j(a)296 3371 y(million,)21 b(for)f(3-way)h(joins.)30 b(This)20 b(is)g(the)g(reason)i(why)-6 b(,)20 b(for)g(example,)i(we)d (could)i(not)f(optimize)h(expres-)299 3541 y(sions)j(containing)i(more) d(than)g(3)f(joins)i(in)f(E4)f(\(Figure)h(5.6\).)31 b(The)22 b(main)h(reason)h(for)f(this)h(tremendous)295 3710 y(use)c(of)g(memory) f(is)h(the)f(presence)j(of)d(the)h(SELECT)c(and)k(MA)-10 b(T)17 b(operators)22 b(which)e(increases)i(the)e(num-)300 3879 y(ber)27 b(of)g(rules)h(that)g(an)f(expression)j(matches)f(\(see)e (T)-6 b(able)27 b(5.1\).)42 b(These)27 b(rules)h(basically)i(permute)e (the)298 4049 y(SELECT)18 b(and)k(MA)-10 b(T)19 b(operators)24 b(with)d(the)h(others)h(\(JOIN)e(and)h(RET\),)d(thus)j(creating)i(a)d (lar)n(ge)i(number)300 4218 y(of)g(equivalent)k(expressions.)583 4387 y(It)j(is)g(also)h(interesting)i(to)d(compare)h(the)g(memory)f (usage)h(in)f(the)h(Open)f(OODB)e(optimizer)298 4557 y(with)22 b(the)g(simple)g(centralized)j(optimizer)e(in)f(Section)h (5.2.)30 b(Expression)24 b(E1)d(in)h(Figure)g(5.2\(a\))g(\(which)296 4726 y(only)f(contains)h(the)e(relational)j(operators)f(JOIN)e(and)g (RET\))e(is)i(similar)h(to)f(the)g(expression)j(used)e(in)f(the)294 4896 y(centralized)g(optimizer)g(\(Figure)e(5.1\(a\)\).)30 b(However)l(,)19 b(the)f(memory)g(usage,)i(as)e(measured)h(by)f(the)g (num-)299 5065 y(ber)24 b(of)f(equivalent)j(expressions)g(\(Figures)e (5.7)f(and)g(Figures)h(5.1\(c\)\),)g(is)f(vastly)h(dif)n(ferent)i(in)d (the)g(two)1905 5349 y(73)p eop %%Page: 74 86 74 85 bop 323 403 3237 4 v 323 2585 4 2182 v 761 2560 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 501.875000 @ury 2834 @rwi @setspecial %%BeginDocument: eqlogexp_Q1-8_oodb.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 91 scalefont setfont /Times-Roman findfont 91 scalefont setfont stroke 420 286 m gsave 420 286 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 286 m gsave 621 286 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 286 m gsave 822 286 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 286 m gsave 1023 286 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 286 m gsave 1225 286 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 286 m gsave 1426 286 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 286 m gsave 1627 286 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 286 m gsave 1828 286 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 286 m gsave 2030 286 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 134 m gsave 1225 134 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 440 362 l 420 698 m 440 698 l 420 1033 m 440 1033 l 420 1368 m 440 1368 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 698 m 2010 698 l 2030 1033 m 2010 1033 l 2030 1368 m 2010 1368 l 2030 1704 m 2010 1704 l /Times-Roman findfont 91 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (100) RJ (10) show /Times-Roman findfont 54 scalefont setfont 0 54 rmoveto (0) show /Times-Roman findfont 91 scalefont setfont 0 -54 rmoveto () show grestore newpath 366 698 m gsave 366 698 translate 0 rotate 0 -30 m (102) RJ (10) show /Times-Roman findfont 54 scalefont setfont 0 54 rmoveto (2) show /Times-Roman findfont 91 scalefont setfont 0 -54 rmoveto () show grestore newpath 366 1033 m gsave 366 1033 translate 0 rotate 0 -30 m (104) RJ (10) show /Times-Roman findfont 54 scalefont setfont 0 54 rmoveto (4) show /Times-Roman findfont 91 scalefont setfont 0 -54 rmoveto () show grestore newpath 366 1368 m gsave 366 1368 translate 0 rotate 0 -30 m (106) RJ (10) show /Times-Roman findfont 54 scalefont setfont 0 54 rmoveto (6) show /Times-Roman findfont 91 scalefont setfont 0 -54 rmoveto () show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (108) RJ (10) show /Times-Roman findfont 54 scalefont setfont 0 54 rmoveto (8) show /Times-Roman findfont 91 scalefont setfont 0 -54 rmoveto () show grestore newpath /Times-Roman findfont 90 scalefont setfont 187 1033 m gsave 187 1033 translate 90 rotate 0 0 m (Equivalent expressions) CS (Equivalent expressions) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Number of Equivalent Expressions) CS (Number of Equivalent Expressions) show grestore newpath 420 362 m 621 413 l 822 463 l 1023 514 l 1225 564 l 1426 615 l 1627 665 l 1828 716 l 2030 766 l /Times-Roman findfont 90 scalefont setfont stroke 420 362 30 0 360 arc gsave fill grestore stroke 621 413 30 0 360 arc gsave fill grestore stroke 822 463 30 0 360 arc gsave fill grestore stroke 1023 514 30 0 360 arc gsave fill grestore stroke 1225 564 30 0 360 arc gsave fill grestore stroke 1426 615 30 0 360 arc gsave fill grestore stroke 1627 665 30 0 360 arc gsave fill grestore stroke 1828 716 30 0 360 arc gsave fill grestore stroke 2030 766 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 362 m 621 573 l 822 703 l 1023 834 l 1225 964 l 1426 1095 l 1627 1225 l 1828 1356 l 2030 1486 l /Times-Roman findfont 90 scalefont setfont stroke 420 392 m 390 362 l 420 332 l 450 362 l closepath gsave eofill grestore stroke 621 603 m 591 573 l 621 543 l 651 573 l closepath gsave eofill grestore stroke 822 733 m 792 703 l 822 673 l 852 703 l closepath gsave eofill grestore stroke 1023 864 m 993 834 l 1023 804 l 1053 834 l closepath gsave eofill grestore stroke 1225 994 m 1195 964 l 1225 934 l 1255 964 l closepath gsave eofill grestore stroke 1426 1125 m 1396 1095 l 1426 1065 l 1456 1095 l closepath gsave eofill grestore stroke 1627 1255 m 1597 1225 l 1627 1195 l 1657 1225 l closepath gsave eofill grestore stroke 1828 1386 m 1798 1356 l 1828 1326 l 1858 1356 l closepath gsave eofill grestore stroke 2030 1516 m 2000 1486 l 2030 1456 l 2060 1486 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 362 m 621 554 l 822 770 l 1023 1012 l /Times-Roman findfont 90 scalefont setfont stroke 420 392 m 390 332 l 450 332 l closepath gsave eofill grestore stroke 621 584 m 591 524 l 651 524 l closepath gsave eofill grestore stroke 822 800 m 792 740 l 852 740 l closepath gsave eofill grestore stroke 1023 1042 m 993 982 l 1053 982 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 493 m 621 754 l 822 1046 l 1023 1364 l /Times-Roman findfont 90 scalefont setfont stroke 390 523 m 420 463 l 450 523 l closepath gsave eofill grestore stroke 591 784 m 621 724 l 651 784 l closepath gsave eofill grestore stroke 792 1076 m 822 1016 l 852 1076 l closepath gsave eofill grestore stroke 993 1394 m 1023 1334 l 1053 1394 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 72 scalefont setfont 1070 1293 m 1070 1653 l 1421 1653 l 1421 1293 l 1070 1293 l stroke /Times-Roman findfont 72 scalefont setfont 1110 1608 m 1270 1608 l stroke 1110 1608 30 0 360 arc gsave fill grestore stroke 1270 1608 30 0 360 arc gsave fill grestore stroke 1310 1608 m gsave 1310 1608 translate 0 rotate 0 -24 m (E1) show grestore newpath /Times-Roman findfont 72 scalefont setfont 1110 1518 m 1270 1518 l stroke 1110 1548 m 1080 1518 l 1110 1488 l 1140 1518 l closepath gsave eofill grestore stroke 1270 1548 m 1240 1518 l 1270 1488 l 1300 1518 l closepath gsave eofill grestore stroke 1310 1518 m gsave 1310 1518 translate 0 rotate 0 -24 m (E2) show grestore newpath /Times-Roman findfont 72 scalefont setfont 1110 1428 m 1270 1428 l stroke 1110 1458 m 1080 1398 l 1140 1398 l closepath gsave eofill grestore stroke 1270 1458 m 1240 1398 l 1300 1398 l closepath gsave eofill grestore stroke 1310 1428 m gsave 1310 1428 translate 0 rotate 0 -24 m (E3) show grestore newpath /Times-Roman findfont 72 scalefont setfont 1110 1338 m 1270 1338 l stroke 1080 1368 m 1110 1308 l 1140 1368 l closepath gsave eofill grestore stroke 1240 1368 m 1270 1308 l 1300 1368 l closepath gsave eofill grestore stroke 1310 1338 m gsave 1310 1338 translate 0 rotate 0 -24 m (E4) show grestore newpath showpage %%EndDocument @endspecial 3557 2585 V 323 2588 3237 4 v 3558 2605 19 2189 v 340 2605 3237 19 v 766 2801 a FP(Figure)24 b(5.7:)31 b(Equivalent)26 b(expressions)h(in)c(the)h(Open)f(OODB)f (optimizer)295 3177 y(cases)e(\(256)f(for)g(E1)f(versus)j(1.5)d (million)i(for)f(the)g(centralized)j(optimizer)l(,)g(for)d(8-way)g (joins\).)30 b(What)19 b(ac-)296 3347 y(counts)i(for)f(this)g(huge)h (dif)n(ference?)33 b(The)19 b(key)h(lies)g(in)g(the)g(implementation)i (of)e(the)g(join)g(predicates.)33 b(In)298 3516 y(the)22 b(case)h(of)f(Open)g(OODB)d(optimizer)l(,)24 b(we)d(designed)k(the)d (database)i(such)f(that)f(join)h(predicates)h(were)297 3685 y(implemented)f(by)e(one-way)h(pointers)1526 3652 y Fv(7)1588 3685 y FP(\(links\),)h(thus,)e(the)h(join)f(commutativity)i (transformation)i(rule)300 3855 y(did)31 b(not)g(apply;)36 b(this)31 b(cuts)h(down)f(on)g(the)g(number)g(of)g(equivalent)j (expressions)g(tremendously)-6 b(.)55 b(In)300 4024 y(the)24 b(simple)g(centralized)i(optimizer)l(,)f(attributes)h(in)e(a)f(join)h (predicate)i(were)d(implemented)i(as)f(normal)300 4194 y(columns;)i(thus,)e(the)g(join)h(commutativity)h(rule)f(could)g (permute)g(join)g(streams)f(and)h(generate)h(equiv-)300 4363 y(alent)e(expressions.)p 300 4444 1320 4 v 400 4498 a Fu(7)434 4530 y Fy(The)d(reason)g(for)g(this)f(choice)h(was)g(that)f (if)g(join)g(predicates)i(were)e(implemented)h(as)g(set-valued)g (attributes,)g(then)g(join)300 4621 y(commutativity)16 b(would)f(increase)h(the)f(number)h(of)f(equivalent)h(expressions)g(to) f(an)h(even)g(lar)o(ger)e(explosion)j(than)e(that)g(shown)300 4712 y(in)k(Figure)g(5.7.)25 b(This)18 b(would)i(mean,)f(for)g (example,)g(that)g(it)f(might)h(not)g(have)h(been)g(possible)g(to)e (optimize)i(queries)f(E31)g(and)300 4803 y(E32)g(\(generated)h(from)f (E3\))g(even)g(for)g(3-way)h(joins.)1905 5349 y FP(74)p eop %%Page: 75 87 75 86 bop 300 391 a FO(5.4)119 b(Summary)292 654 y FP(In)16 b(this)h(chapter)l(,)i(we)d(presented)j(experimental)g(evidence)f(that) f(Prairie)g(speci\256cations)i(do)e(not)f(sacri\256ce)300 824 y(performance)32 b(compared)f(to)e(V)-12 b(olcano.)50 b(T)-6 b(wo)28 b(sets)i(of)g(experiments)i(were)d(performed,)j(one)e (with)g(a)299 993 y(simple)24 b(centralized)i(optimizer)f(and)e (another)i(with)e(a)g(lar)n(ge-scale)j(object-oriented)i(optimizer;)d (each)298 1162 y(demonstrated)f(comparable)g(performances)g(between)e (the)g(Prairie)g(and)g(V)-12 b(olcano)22 b(optimizers.)32 b(There)292 1332 y(were)16 b(also)h(gains)h(in)e(lines)h(of)f(code,)j (and,)f(most)e(importantly)-6 b(,)20 b(gains)e(in)e(abstractions)k(and) d(extensibility)-6 b(.)295 1501 y(This)18 b(was)g(made)h(possible)h(by) f(using)h(the)f(P2V)e(preprocessor)22 b(to)d(bridge)h(the)e(gap)h (between)h(Prairie)f(and)300 1671 y(V)-12 b(olcano.)576 1840 y(In)17 b(the)h(next)f(chapter)l(,)j(we)d(describe)i(how)d(to)h (use)h(Prairie)f(to)g(build)h(recon\256gurable)j(optimizers.)300 2009 y(This)k(is)g(done)h(by)g(using)g(rule)g(sets)g(that)f(are)h (constructed)i(using)f(reusable,)g(recombinable)i(building-)300 2179 y(blocks.)44 b(W)-7 b(e)27 b(will)g(also)h(show)g(how)f(the)h(P2V) e(preprocessor)31 b(can)d(generate)i(monolithic)f(optimizers)297 2348 y(from)21 b(these)i(recon\256gurable)h(speci\256cations,)g (optimizers)g(that)d(are)h(as)f(ef)n(\256cient)h(as)f(any)h (hand-written)300 2517 y(rule)i(set.)1905 5349 y(75)p eop %%Page: 76 88 76 87 bop 2859 1118 a FG(Chapter)44 b(6)1219 1657 y FM (Recon\256gurable)51 b(Optimizers)300 2159 y FP(In)28 b(the)g(previous)i(chapter)l(,)h(we)d(presented)i(experimental)h (results)e(to)f(evaluate)i(the)f(performance)h(of)300 2328 y(Prairie)24 b(optimizers.)32 b(In)24 b(this)f(chapter)l(,)j(we)c (describe)j(how)e(the)h(Prairie)g(framework)g(can)g(be)f(extended)295 2498 y(to)c(construct)i(optimizers)g(that)e(satisfy)h(the)g(fourth)g (goal)f(listed)h(in)f(Chapter)h(1,)f(recon\256gurability)-6 b(.)34 b(That)300 2667 y(is,)c(how)f(can)h(optimizers)h(be)f(changed)h (quickly)h(and)d(seamlessly)j(for)d(use)h(in)f(a)g(dif)n(ferent)j (database)296 2836 y(system?)f(One)20 b(technique)j(to)d(do)g(this)h (is)f(presented)j(in)d(this)g(chapter)-5 b(.)32 b(The)19 b(extensions)24 b(described)e(here)300 3006 y(were)h(made)h(easier)h (by)e(the)h(clean)h(design)g(and)f(abstractions)j(embodied)e(in)f (Prairie.)300 3372 y FO(6.1)119 b(Overview)300 3635 y FP(Lar)n(ge-scale)26 b(software)e(development)i(is)d(an)h(expensive)i (undertaking.)34 b(An)22 b(approach)k(that)e(has)g(been)300 3805 y(proposed)i(is)d(that)i(of)e(using)i(software)g(components)h([9,) 15 b(1)m(1,)h(26,)g(27].)31 b(These)24 b(components,)i(typically)297 3974 y(used)c(as)f(building-blocks)26 b(to)21 b(construct)j(lar)n(ger)f (systems,)f(have)g(well-de\256ned)h(and)f(standardized)i(im-)300 4144 y(ported)30 b(\(input\))f(and)g(exported)h(\(output\))g (interfaces.)47 b(A)27 b(system)i(is)f(developed)i(by)f(\256tting)f (together)298 4313 y(components)d(whose)d(interfaces)i(match)f(one)f (another)-5 b(.)32 b(This)22 b(approach)i(not)e(only)h(has)f(the)g (advantage)300 4482 y(of)j(being)h(able)g(to)f(assemble)i(modular)f (systems)g(from)f(parts,)h(it)f(also)h(allows)f(the)h(reuse)g(of)f(the) g(same)300 4652 y(components)h(in)e(other)g(software)h(systems.)583 4821 y(Database)h(management)g(systems)f(\(DBMSs\))e(are)i(lar)n (ge-scale)i(software)f(systems)f(that)g(can)296 4990 y(also)c(bene\256t)f(from)g(a)g(component-based)k(approach.)32 b(The)20 b(\256rst)g(system)g(to)g(demonstrate)j(the)d(feasibil-)1905 5349 y(76)p eop %%Page: 77 89 77 88 bop 293 391 a FP(ity)17 b(of)g(this)g(idea)g(was)g(Genesis)h([2,) d(3,)h(5,)f(6,)g(12].)29 b(A)16 b(DBI)g(created)i(a)f(customized)i (DBMS)14 b(by)j(composing)300 561 y(several)25 b(pre-de\256ned)h (components)h(with)c(standard)j(interfaces.)34 b(The)23 b(result)i(was)f(a)f(DBMS)e(that)k(was)300 730 y(tailored)g(to)f(the)g (needs)g(of)g(a)f(particular)j(application.)582 899 y(The)c(ideas)i (incorporated)i(in)c(Genesis)h(are)g(not)g(unique)h(to)e(databases;)k (in)c(fact,)h(the)g(GenV)-12 b(oca)298 1069 y(paradigm)24 b([7\2619,)16 b(1)m(1])22 b(has)h(shown)f(that)h(the)f(same)g (component-based)27 b(approach)d(also)f(applies)g(to)f(net-)300 1238 y(works,)27 b(avionics,)j(\256le)25 b(systems,)k(and)e(data)g (structures.)42 b(The)26 b(P2)g(generator)j([10,)16 b(1)m(1],)27 b(in)g(particular)l(,)298 1408 y(has)c(demonstrated)i(that)d(very)h(ef) n(\256cient)g(container)i(data)e(structures)h(can)f(be)f(generated)i (from)e(a)g(small)300 1577 y(family)i(of)g(plug-compatible)j (components.)579 1746 y(Query)19 b(optimizers)i(are)e(integral)i(to)e (most)h(DBMSs.)27 b(They)19 b(also)h(tend)g(to)f(be)g(a)g (signi\256cant)i(and)295 1916 y(complex)g(part)f(of)f(a)g(DBMS.)e(The)i (earliest)i(query)g(optimizer)g(proposed,)h(System)d(R)g([46],)h(was)f (mono-)300 2085 y(lithic)27 b(in)e(nature.)38 b(That)25 b(is,)h(the)g(three)g(features)h(of)f(a)f(query)i(optimizer)l(,)g (namely)-6 b(,)27 b(search)g(space,)g(cost)296 2254 y(model,)20 b(and)g(search)h(strategy)-6 b(,)23 b(were)c(all)h(hard-wired)h(into)g (a)e(single)i(module)f(that)g(represented)j(the)d(op-)297 2424 y(timizer)-5 b(.)31 b(Many)21 b(contemporary)j(optimizers)f(still) f(follow)g(this)f(model.)31 b(However)l(,)22 b(database)h(systems)297 2593 y(are)f(increasingly)j(being)d(used)g(to)f(store)h(traditional)i (relational)g(data)e(as)f(well)g(as)g(non-traditional)26 b(data)300 2762 y(\(e.g.,)k(a)e(database)j(could)f(contain)h (relational)h(as)c(well)h(as)g(object-oriented)k(and)d(multimedia)g (data\);)300 2932 y(this)24 b(requires)i(a)d(query)i(optimizer)g(that)f (can)g(be)g(quickly)i(and)e(ef)n(\256ciently)h(modi\256ed)g(to)e(deal)h (with)g(the)299 3101 y(changing)h(properties)h(of)d(the)g(underlying)i (data.)32 b(For)22 b(example,)i(in)e(a)h(cost)g(model)g(that)h(is)e(a)h (weighted)296 3271 y(sum)d(of)h(the)f(CPU)e(and)j(I/O)f(costs,)h(it)f (might)h(be)f(realistic)j(to)d(weight)h(the)f(I/O)g(cost)h(more)f(than) h(the)g(CPU)300 3440 y(cost)31 b(when)f(optimizing)i(multimedia)f (queries)h(\(since)f(multimedia)g(objects)h(tend)f(to)f(be)f(extremely) 300 3609 y(lar)n(ge,)f(I/O)e(costs)h(might)g(dominate)h(CPU)d(cost\))i (than)g(when)g(dealing)h(with)e(relational)j(data.)40 b(As)26 b(an-)300 3779 y(other)j(example,)g(stored)g(\256les)f(with)f (pointers)j(between)f(them)e(would)h(suggest)i(speci\256c)f(join)f (orders)300 3948 y(than)f(when)f(no)g(pointers)i(are)e(present.)40 b(Thus,)27 b(it)f(might)g(make)g(sense)h(to)f(modify)h(or)f(change)i (certain)300 4117 y(rules)c(depending)j(on)d(the)f(speci\256c)i (application)i(at)c(hand.)583 4287 y(In)i(this)h(chapter)l(,)h(we)d (describe)k(a)c(building-blocks)30 b(approach)d(to)e(the)h (construction)i(of)d(rule-)300 4456 y(based)k(optimizers)h(using)f (Prairie.)45 b(The)27 b(goal)i(is)e(to)h(generate)i(families)f(of)f (rule)h(sets)f(automatically)300 4625 y(where)g(each)h(rule)f(set)g (corresponds)j(to)d(some)g(classical)i(relational)g(optimizer)g (\(centralized,)i(distri-)300 4795 y(bution,)27 b(replication,)i (etc.\).)36 b(W)-7 b(e)25 b(discuss)i(the)f(model,)g(together)h(with)f (a)f(few)g(simple)h(examples,)h(and)300 4964 y(show)i(how)f(the)h(P2V)e (preprocessor)l(,)33 b(described)e(in)e(Chapter)g(4,)h(can)e(be)h(used) g(to)g(quickly)h(generate)1905 5349 y(77)p eop %%Page: 78 90 78 89 bop 296 391 a FP(ef)n(\256cient)22 b(rule)f(sets)g(from)f (component-based)25 b(speci\256cations.)33 b(Currently)-6 b(,)22 b(the)e(P2)g(generator)j([10,)16 b(1)m(1])300 561 y(does)23 b(not)h(have)g(a)f(framework)h(for)f(quickly)i (generating)h(ef)n(\256cient)f(full-\257edged)g(optimizers.)33 b(The)22 b(ul-)300 730 y(timate)k(goal)g(of)g(the)g(research)h (described)h(in)e(this)g(chapter)h(is)e(to)h(integrate)i(the)d(Prairie) h(speci\256cation)298 899 y(language)e(into)e(P2)f(to)g(enable)i (automatic)h(generation)g(of)e(rule-based)i(optimizers.)32 b(Thus,)22 b(the)g(goal)g(of)297 1069 y(this)f(chapter)h(is)f(to)f(lay) h(a)f(foundation)k(for)d(using)g(Prairie)h(to)e(build)i(optimizers)g (for)f(novel)h(applications)300 1238 y(\(e.g.,)h(container)j(data)e (structures)i(using)f(P2\).)300 1605 y FO(6.2)119 b(Layer)n(ed)30 b(Rule-Based)g(Optimizers)300 1873 y FN(6.2.1)99 b(Layers)295 2103 y FP(In)18 b(the)h(Prairie)g(framework)h(described)h(in)d(Chapter) i(3,)f(optimizers)h(are)f(speci\256ed)h(using)g(rules)f(\(T)-8 b(-rules)300 2273 y(and)30 b(I-rules\).)52 b(The)30 b(rule)g(engine)i (treats)f(all)f(rules)h(as)f(belonging)j(to)c(a)h(single)h(set,)h(so)e (at)g(any)g(given)300 2442 y(stage,)e(the)e(rule)h(engine)h(transforms) h(an)d(expression)j(using)f(all)e(applicable)k(rules.)40 b(Rule)26 b(conditions)300 2611 y(determine)33 b(the)e(search)h(space)h (to)d(be)h(generated.)56 b(A)30 b(shortcoming)k(of)d(this)g(model)h(is) f(that,)i(except)300 2781 y(for)27 b(tests)h(in)f(a)g(rule,)h(the)f (search)i(space)f(is)f(determined)i(entirely)g(by)e(the)g(particular)j (search)e(strategy)300 2950 y(implemented)d(by)f(the)g(rule)g(engine.) 576 3120 y(Prairie)17 b(allows)g(a)f(DBI)g(to)g(specify)j(rules)e(in)g (encapsulated)j(components.)31 b(These)17 b(components)300 3289 y(are)26 b(called)i FD(layers)f FP(and)g(can)f(either)h(be)f (de\256ned)h(by)f(a)g(DBI,)f(or)h(exist)h(in)f(pre-de\256ned)i (component)g(li-)300 3458 y(braries.)52 b(Each)29 b(layer)i(is)f(a)f (collection)k(of)d(T)-8 b(-rules)30 b(and)h(I-rules)g(and)f(has)h (well-de\256ned)g(import)g(and)300 3628 y(export)c(interfaces)h(that)d (consist)i(of)f(database)h(operations.)39 b(The)25 b(general)i(form)e (of)g(a)g(layer)i(is)e(shown)300 3797 y(in)i(Figure)g(6.1\(a\).)41 b(A)26 b(layer)h(translates)j(an)c(abstract)j(expression)h(consisting)f (of)e FD(abstract)j FP(operators)298 3966 y FC(f)p FH(O)412 3980 y Fv(1)452 3966 y FH(;)15 b(:)g(:)g(:)32 b(;)15 b(O)738 3980 y Fs(n)786 3966 y FC(g)21 b FP(to)h(a)f(set)h(of)f (concrete)j(expressions,)h(each)e(consisting)h(of)e(one)g(or)g(more)f FD(concr)m(ete)j FP(op-)300 4136 y(erators)i FC(f)p FH(C)681 4150 y Fv(1)721 4136 y FH(;)15 b(:)g(:)g(:)32 b(;)15 b(C)1003 4150 y Fs(m)1070 4136 y FC(g)24 b FP(or)h(algorithms.)36 b(This)25 b(represents)i(a)e(one-to-many)i(mapping)f(between)g(ex-)300 4305 y(pressions,)34 b(and)c(is)f(typically)j(the)e(method)h(used)g(by) e(an)h(optimizer)i(to)d(construct)j(its)e(search)h(space.)296 4474 y(The)20 b(term)f(concrete)k(refers)e(to)e(the)i(fact)f(that)h (they)f(are)h(obtained)h(by)e(transforming)j(abstract)f(operators)298 4644 y(through)h(the)f(use)g(of)f(rules;)i(concrete)h(operators)g(of)d (a)g(layer)h(can)g(also)g(be)g(viewed)g(as)f(calls)h(to)g(abstract)300 4813 y(operators)k(of)d(lower)h(layers.)583 4983 y(Layers)i(in)e (Prairie)i(follow)f(the)g(GenV)-12 b(oca)26 b(paradigm)g([9].)35 b(Thus,)25 b(layers)h(with)e(the)h(same)g(in-)1905 5349 y(78)p eop %%Page: 79 91 79 90 bop 300 403 3283 4 v 300 2174 4 1771 v 347 676 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0.2 true 3.8 neg 6.1651 neg 103.38464 31.6825 .5 Frame gsave 3.0 -45. PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial -170 x FH(O)416 520 y Fs(i)444 506 y FP(:)31 b(Abstract)25 b(operators)347 676 y FH(C)412 690 y Fs(i)440 676 y FP(:)i(Concrete)17 b(operators)650 1048 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8 neg 37.87982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(LA)-8 b(YER)989 849 y FH(O)1058 863 y Fv(1)1481 849 y FH(O)1550 863 y Fs(n)618 1576 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 51.21492 85.3582 51.21492 59.75073 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 87.91884 72.55446 81.09029 72.55446 74.26173 72.55446 false NArray /DS 0.5 2.5 CLW mul add 2 div def /Dot { 0 0 DS SD } def newpath n { gsave T Dot grestore } repeat end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 110.96565 85.3582 110.96565 59.75073 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1055 1358 a FP(Prairie)24 b(Rules)618 1576 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 27.31473 -25.60745 27.31473 0.0 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 87.91884 -12.80373 81.09029 -12.80373 74.26173 -12.80373 false NArray /DS 0.5 2.5 CLW mul add 2 div def /Dot { 0 0 DS SD } def newpath n { gsave T Dot grestore } repeat end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 134.86584 -25.60745 134.86584 0.0 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 793 1869 a FH(C)858 1883 y Fv(1)1672 1869 y FH(C)1737 1883 y Fs(m)890 2050 y Fy(\(a\))19 b(General)g(form)g(of)g(a)f(layer)p 2037 2149 4 1722 v 2145 1047 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MERGE)2448 852 y Fd(JOIN)55 b(SOR)-5 b(T)66 b(RET)2113 1576 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 51.21492 85.3582 51.21492 59.75073 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 85.3582 81.09029 59.75073 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 110.96565 85.3582 110.96565 59.75073 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2141 1186 a Fh(JOIN)p Fu(\()p Fn(S)2311 1196 y Fg(1)2343 1186 y Fn(;)11 b(S)2411 1196 y Fg(2)2443 1186 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)q Fu(\()p Fn(S)2926 1196 y Fg(1)2958 1186 y Fu(\))p Fn(;)10 b Fh(SOR)m(T)q Fu(\()p Fn(S)3198 1196 y Fg(2)3230 1186 y Fu(\)\))2141 1274 y Fh(JOPR)q Fu(\()p Fn(S)2320 1284 y Fg(1)2352 1274 y Fn(;)g(S)2419 1284 y Fg(2)2451 1274 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 2739 1274 15 4 v 19 w(join)o Fu(\()p Fn(S)2894 1284 y Fg(1)2926 1274 y Fn(;)11 b(S)2994 1284 y Fg(2)3026 1274 y Fu(\))2141 1361 y Fh(JOIN)p Fu(\()p Fn(S)2311 1371 y Fg(1)2343 1361 y Fn(;)g(S)2411 1371 y Fg(2)2443 1361 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p 2710 1361 V 18 w(CONC)p Fu(\()p Fn(S)2925 1371 y Fg(1)2957 1361 y Fn(;)11 b(S)3025 1371 y Fg(2)3057 1361 y Fu(\))2141 1448 y Fh(SOR)m(T)q Fu(\()p Fn(S)2328 1458 y Fg(1)2360 1448 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(SOR)m(T)p 2643 1448 V 18 w(CONC)q Fu(\()p Fn(S)2859 1458 y Fg(1)2891 1448 y Fu(\))2141 1535 y Fh(RET)q Fu(\()p Fn(F)2298 1545 y Fg(1)2330 1535 y Fu(\))g(=)-11 b Ft(\))18 b Fh(RET)p 2583 1535 V 19 w(CONC)p Fu(\()p Fn(F)2800 1545 y Fg(1)2832 1535 y Fu(\))2113 1576 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 51.21492 -25.60745 51.21492 0.0 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 -25.60745 81.09029 0.0 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 110.96565 -25.60745 110.96565 0.0 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2448 1873 a Fd(JOIN)55 b(SOR)-5 b(T)66 b(RET)2468 2050 y Fy(\(b\))18 b(An)h(example)h(layer)p 3580 2174 4 1771 v 300 2177 3283 4 v 3581 2194 19 1778 v 317 2194 3283 19 v 880 2390 a FP(Figure)k(6.1:)31 b(General)24 b(form)g(of)f(a)g(Prairie)h(layer)h(and)f(an)f(example)296 2766 y(terfaces)e(constitute)h(a)e FD(r)m(ealm)p FP(;)h(each)f(layer)h (is)e(plug-compatible)24 b(and)c(interchangeable)k(with)c(the)g(other) 292 2936 y(layers)d(in)f(its)h(realm.)28 b(Layers)17 b(in)f(Prairie)h(are)f(usually)i FD(symmetric)p FP(;)h(that)e(is,)g (they)g(have)g(export)h(interfaces)300 3105 y(that)24 b(are)f(the)h(same)f(as)h(their)g(import)g(interfaces)i([9].)31 b(T)-6 b(ypically)g(,)24 b(these)h(interfaces)h(are)d(comprised)i(of) 300 3274 y(all)h(the)f(abstract)j(operators)f(in)f(the)f(particular)j (database)g(schema)e(at)f(hand.)38 b(Symmetric)25 b(layers)i(can,)298 3444 y(thus,)22 b(be)f(composed)i(in)e(arbitrary)j(ways;)e(this)g (provides)i(DBIs)c(many)h(ways)h(to)f(construct)j(optimizers)297 3613 y(using)e(the)e(same)h(layers.)31 b(However)l(,)22 b(not)f(all)f(the)h(compositions)j(are)d(necessarily)i(meaningful)g(or) e(cor)n(-)300 3783 y(rect.)43 b(Batory)28 b(and)g(Geraci)f([8])h (describe)h(methods)g(for)e(validating)k(the)c(correctness)k(of)c (component)300 3952 y(compositions.)37 b(W)-7 b(e)24 b(will)h(assume)g(that)g(compositions)j(of)d(our)g(layers)h(are)f (always)g(correct.)36 b(W)-7 b(e)24 b(will)300 4121 y(not)g(address)h (the)f(problem)h(of)e(validating)k(layer)d(compositions;)j(we)c(are)h (aware)f(these)i(problems)g(are)300 4291 y(present.)579 4460 y(T)-6 b(o)19 b(allow)h(optimizer)h(speci\256cations)i(using)e (layers,)h(the)e(Prairie)g(speci\256cation)j(language)f(de-)293 4629 y(\256ned)17 b(in)g(Chapter)h(3)f(was)f(extended)k(in)d(two)f (ways.)29 b(First,)18 b(rules)g(can)f(now)g(be)g(declared)j(as)c (belonging)k(to)300 4799 y(a)j(speci\256c)i(layer)f(\(a)f(layer)i (declaration)i(demarcates)e(rule)f(de\256nitions\).)34 b(Second,)24 b(the)g(optimizer)h(can)300 4968 y(be)f(de\256ned)h(as)f (a)g(composition)j(of)d(layers.)34 b(This)24 b(composition)i(is)e (de\256ned)h(as)f(a)g(type)h(expression)i([9])1905 5349 y(79)p eop %%Page: 80 92 80 91 bop 297 391 a FP(expressed)23 b(as)e(a)f(linear)i(sequence)h(of)d (layers.)32 b(This)20 b(is)h(described)i(in)d(more)h(detail)h(in)f(the) f(next)i(section.)582 561 y(An)f(example)i(layer)g(is)e(shown)i(in)f (Figure)g(6.1\(b\).)31 b(This)22 b(layer)l(,)h(called)g(MERGE,)c (transforms)300 730 y(three)27 b(abstract)g(operators,)i(JOIN,)24 b(SOR)-5 b(T)e(,)23 b(and)j(RET)e(into)i(one)g(algorithm)i(\(Mer)n(ge)p 3036 730 28 4 v 34 w(join\))f(and)f(three)299 899 y(concrete)f (operators)g(\(JOIN,)c(SOR)-5 b(T)e(,)20 b(and)j(RET\).)d(Note)j(that)g (the)g(concrete)h(operators)h(bear)e(the)g(same)297 1069 y(name)f(as)f(the)h(abstract)h(operators,)h(implying)e(that)g(the)g (MERGE)c(layer)k(is)f(symmetric.)32 b(The)20 b(MERGE)300 1238 y(layer)25 b(consists)g(of)f(four)g(T)-8 b(-rules)24 b(and)g(one)g(I-rule.)32 b(The)23 b(purpose)j(of)d(the)h(layer)h(is)e (to)h(either)h(transform)297 1408 y(the)c(JOIN)f(operator)i(into)g(the) f(Mer)n(ge)p 1499 1408 V 34 w(join)g(algorithm,)i(or)e(to)f(a)g (concrete)j(JOIN)d(operator)j(that)e(will)f(be)300 1577 y(transformed)27 b(into)e(an)g(algorithm)h(by)f(another)h(lower)f (layer)-5 b(.)35 b(Since)24 b(the)h(MERGE)d(layer)j(is)g(symmet-)300 1746 y(ric)i(\(i.e.,)f(has)h(the)g(same)f(exported)j(and)e(imported)h (interfaces\),)i(we)25 b(need)j(a)e(way)g(to)g(distinguish)k(the)299 1916 y(abstract)24 b(and)e(concrete)j(operators)f(in)e(the)h(rules.)31 b(Prairie)23 b(allows)g(a)e(DBI)g(to)h(append)i(\252)p 3081 1916 V 33 w(CONC\272)d(to)h(an)296 2085 y(operator)g(to)d(refer)i (to)e(a)h(concrete)h(operator)-5 b(.)32 b(Thus,)20 b(\252JOIN\272)g (refers)h(to)e(the)h(abstract)i(join)e(operator)i(and)300 2254 y(\252JOIN)p 542 2254 V 33 w(CONC\272)g(refers)i(to)g(the)g (concrete)h(join)f(operator)-5 b(.)300 2561 y FN(6.2.2)99 b(Composing)24 b(Layers)581 2792 y FP(In)d(a)g(layered)h(Prairie)g (optimizer)h(speci\256cation,)h(a)d(DBI)e(can)j(de\256ne)f(layers,)i (each)f(consisting)300 2961 y(of)k(T)-8 b(-rules)26 b(and)g(I-rules.)39 b(An)25 b(optimizer)j(can)e(then)h(be)e(constructed)30 b(by)c(composing)i(layers)f(in)e(a)h(lin-)298 3130 y(ear)d(order)-5 b(.)31 b(That)22 b(is,)g(the)h(speci\256cation)h(of)f(an)f(optimizer)h (now)f(consists)j(of)d(layers)h(stacked)h(upon)f(one)300 3300 y(another)l(,)30 b(instead)f(of)f(a)f(set)g(of)h(rules)g (speci\256ed)h(in)e(a)g(single)i(component.)44 b(This)28 b(is)f(shown)h(schemat-)300 3469 y(ically)g(in)e(Figure)h(6.2\(a\).)40 b(The)26 b(Prairie)h(syntax)h(for)e(specifying)k(rules)d(in)f (individual)j(layers)f(and)f(the)297 3638 y(layer)22 b(composition)h(are)e(shown)g(in)g(Figure)g(6.2\(b\).)31 b(The)20 b(composition)k(shown)d(in)g(this)g(\256gure,)g(for)g(ex-)300 3808 y(ample,)28 b(represents)h(an)e(optimizer)i(with)d(the)i (SEQUENTIAL,)22 b(MERGE,)i(SOR)-5 b(T)e(,)24 b(and)j(RET)e(layers)300 3977 y(arranged)g(in)e(that)h(order)-5 b(.)32 b(This)23 b(can)h(be)f(viewed)h(as)f(composing)i FD(parameterized)k FP(layers,)24 b(where)g(each)297 4146 y(layer)e(\(except)h(the)f (terminal)g(layer)l(,)h(RET\))c(has)j(a)e(single)j(parameter)g(that)e (is)g(another)i(layer)-5 b(.)31 b(Note)21 b(that)299 4316 y(not)i(all)g(layers)h(de\256ned)f(by)g(the)g(DBI)e(are)i(used)g (in)g(the)g(composition;)j(the)d(P2V)e(preprocessor)27 b(deletes)300 4485 y(unused)i(layers.)45 b(A)26 b(more)i(general)h (framework)f(of)g(layer)g(composition)j(in)c(the)h(future)h(will)e (involve)300 4655 y(hierarchical)g(compositions)f(of)e(layers)h(\(not)f (just)g(linear)h(compositions\).)583 4824 y(The)h(semantics)i(of)e (layer)g(composition)j(is)d(as)g(follows.)39 b(For)25 b FD(each)i(new)f FP(expression)j(gener)n(-)297 4993 y(ated)21 b(by)f(the)h(optimizer)l(,)i(the)e(rule)g(engine)h(applies)g (rules)g(to)e(the)h(expression)i(in)e(the)g(order)g(of)g(layering.)1905 5349 y(80)p eop %%Page: 81 93 81 92 bop 371 403 3142 4 v 371 3695 4 3292 v 679 904 a FP(Operator)25 b(T)m(ree)579 3200 y @beginspecial @setspecial tx@Dict begin STP newpath 2.6 SLW 0. setgray [ -17.07164 262.04977 153.64476 262.04977 153.64476 42.6791 -17.07164 42.6791 /Lineto /lineto load def false Polygon gsave 0.5 setgray fill grestore gsave 2.6 SLW 0. setgray 0 setlinecap stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 42.6791 67.43292 42.6791 273.99986 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 42.6791 67.43292 42.6791 273.99986 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray [ 49.50764 155.35202 49.50764 251.80669 134.86584 251.80669 134.86584 155.35202 49.50764 155.35202 /Lineto /lineto load def false Polygon gsave 1. setgray fill grestore end @endspecial 1072 1258 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 6.1651 neg 69.47731 11.23502 .5 Frame gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial(Prairie)f(Layer)g FA(1)579 3200 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 212.54185 92.18674 228.58925 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 92.18674 199.73813 92.18674 204.00604 92.18674 208.27394 false NArray /DS 0.5 2.5 CLW mul add 2 div def /Dot { 0 0 DS SD } def newpath n { gsave T Dot grestore } repeat end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 178.56946 92.18674 195.47021 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 1067 1804 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 6.1651 neg 70.57487 11.23502 .5 Frame gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial FP(Prairie)g(Layer)g FH(n)579 3200 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 135.71948 92.18674 155.35202 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 135.71948 92.18674 155.35202 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1018 2158 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651 neg 81.76248 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial FP(P2V)e (Preprocessor)579 3200 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 100.72256 92.18674 120.0136 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 100.72256 92.18674 120.0136 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 1081 2451 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.11488 neg 66.36697 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(V)-12 b(olcano)25 b(Rules)579 3200 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { /ArrowAc [ 6 2 roll ] cvx def ArrowAc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 92.18674 67.43292 92.18674 87.06546 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowAc ArrowA pop pop ArrowBc ArrowB pop pop pop pop grestore end @endspecial 761 2725 a @beginspecial @setspecial tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3651 neg 95.86615 10.43501 .5 Frame gsave 1. setgray fill grestore end @endspecial(V)-12 b(olcano)25 b(Rule)e(Engine)579 3200 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 1.4 2.0 3. Arrow EndArrow } def [ 68.28656 33.28964 68.28656 52.06854 /Lineto /lineto load def false Line gsave 2.0 2 mul CLW add SLW 1. setgray stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore gsave ArrowBc ArrowB pop pop pop pop grestore end @endspecial 925 2987 a(Access)h(Plan)505 3479 y Fy(\(a\))13 b(Schematic)g(representation)h(\(cf.)23 b(Figure)12 b(3.1\))p 1895 3670 4 3242 v 1921 576 a Fc(\045optimizer)g Fh(SEQUENTIAL)h([)f(MERGE)i([)e(SOR)m(T)h([)f(RET)h(])f(])g(])1921 687 y Fc(\045layer)g Fh(SEQUENTIAL)1957 774 y Fc(\045trule)g Fh(JOIN)o Fu(\()p Fn(S)2291 784 y Fg(1)2324 774 y Fn(;)e(S)2391 784 y Fg(2)2423 774 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)2767 784 y Fg(2)2799 774 y Fn(;)10 b(S)2866 784 y Fg(1)2898 774 y Fu(\))1957 861 y Fc(\045trule)i Fh(JOIN)o Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)2423 871 y Fg(1)2455 861 y Fn(;)f(S)2523 871 y Fg(2)2555 861 y Fu(\))p Fn(;)f(S)2646 871 y Fg(3)2679 861 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)3005 871 y Fg(1)3037 861 y Fn(;)10 b Fh(JOIN)p Fu(\()p Fn(S)3236 871 y Fg(2)3268 861 y Fn(;)h(S)3336 871 y Fg(3)3368 861 y Fu(\)\))1957 948 y Fc(\045trule)h Fh(JOIN)o Fu(\()p Fn(S)2291 958 y Fg(1)2324 948 y Fn(;)e(S)2391 958 y Fg(2)2423 948 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p 2690 948 15 4 v 18 w(CONC)q Fu(\()p Fn(S)2906 958 y Fg(1)2938 948 y Fn(;)10 b(S)3005 958 y Fg(2)3037 948 y Fu(\))1957 1036 y Fc(\045trule)i Fh(SOR)m(T)p Fu(\()p Fn(S)2308 1046 y Fg(1)2340 1036 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 2623 1036 V 18 w(CONC)q Fu(\()p Fn(S)2839 1046 y Fg(1)2871 1036 y Fu(\))1957 1123 y Fc(\045trule)12 b Fh(RET)q Fu(\()p Fn(F)2279 1133 y Fg(1)2311 1123 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 1123 V 19 w(CONC)p Fu(\()p Fn(F)2780 1133 y Fg(1)2812 1123 y Fu(\))1921 1234 y Fc(\045layer)12 b Fh(SOR)m(T)1957 1321 y Fc(\045irule)g Fh(SOR)m(T)p Fu(\()p Fn(S)2305 1331 y Fg(1)2337 1321 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 2625 1321 V 18 w(sort)p Fu(\()p Fn(S)2777 1331 y Fg(1)2809 1321 y Fu(\))1957 1408 y Fc(\045irule)12 b Fh(SOR)m(T)p Fu(\()p Fn(S)2305 1418 y Fg(1)2337 1408 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)2644 1418 y Fg(1)2676 1408 y Fu(\))1957 1495 y Fc(\045trule)12 b Fh(JOIN)o Fu(\()p Fn(S)2291 1505 y Fg(1)2324 1495 y Fn(;)e(S)2391 1505 y Fg(2)2423 1495 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p 2690 1495 V 18 w(CONC)q Fu(\()p Fn(S)2906 1505 y Fg(1)2938 1495 y Fn(;)10 b(S)3005 1505 y Fg(2)3037 1495 y Fu(\))1957 1582 y Fc(\045trule)i Fh(SOR)m(T)p Fu(\()p Fn(S)2308 1592 y Fg(1)2340 1582 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 2623 1582 V 18 w(CONC)q Fu(\()p Fn(S)2839 1592 y Fg(1)2871 1582 y Fu(\))1957 1669 y Fc(\045trule)12 b Fh(RET)q Fu(\()p Fn(F)2279 1679 y Fg(1)2311 1669 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 1669 V 19 w(CONC)p Fu(\()p Fn(F)2780 1679 y Fg(1)2812 1669 y Fu(\))1921 1780 y Fc(\045layer)12 b Fh(MERGE)1957 1867 y Fc(\045trule)g Fh(JOIN)o Fu(\()p Fn(S)2291 1877 y Fg(1)2324 1867 y Fn(;)e(S)2391 1877 y Fg(2)2423 1867 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOPR)q Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)2906 1877 y Fg(1)2938 1867 y Fu(\))p Fn(;)10 b Fh(SOR)m(T)q Fu(\()p Fn(S)3178 1877 y Fg(2)3210 1867 y Fu(\)\))1957 1955 y Fc(\045irule)i Fh(JOPR)p Fu(\()p Fn(S)2297 1965 y Fg(1)2329 1955 y Fn(;)f(S)2397 1965 y Fg(2)2429 1955 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 2717 1955 V 18 w(join)p Fu(\()p Fn(S)2872 1965 y Fg(1)2904 1955 y Fn(;)10 b(S)2971 1965 y Fg(2)3003 1955 y Fu(\))1957 2042 y Fc(\045trule)i Fh(JOIN)o Fu(\()p Fn(S)2291 2052 y Fg(1)2324 2042 y Fn(;)e(S)2391 2052 y Fg(2)2423 2042 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p 2690 2042 V 18 w(CONC)q Fu(\()p Fn(S)2906 2052 y Fg(1)2938 2042 y Fn(;)10 b(S)3005 2052 y Fg(2)3037 2042 y Fu(\))1957 2129 y Fc(\045trule)i Fh(SOR)m(T)p Fu(\()p Fn(S)2308 2139 y Fg(1)2340 2129 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 2623 2129 V 18 w(CONC)q Fu(\()p Fn(S)2839 2139 y Fg(1)2871 2129 y Fu(\))1957 2216 y Fc(\045trule)12 b Fh(RET)q Fu(\()p Fn(F)2279 2226 y Fg(1)2311 2216 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 2216 V 19 w(CONC)p Fu(\()p Fn(F)2780 2226 y Fg(1)2812 2216 y Fu(\))1921 2327 y Fc(\045layer)12 b Fh(DISTRIBUTION)1957 2414 y Fc(\045trule)g Fh(JOIN)o Fu(\()p Fn(S)2291 2424 y Fg(1)2324 2414 y Fn(;)e(S)2391 2424 y Fg(2)2423 2414 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p 2690 2414 V 18 w(CONC)q Fu(\()p Fh(XFER)p Fu(\()p Fn(S)3057 2424 y Fg(1)3089 2414 y Fu(\))p Fn(;)10 b Fh(XFER)q Fu(\()p Fn(S)3332 2424 y Fg(2)3364 2414 y Fu(\)\))1957 2501 y Fc(\045irule)i Fh(XFER)p Fu(\()p Fn(S)2308 2511 y Fg(1)2340 2501 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Ship)p Fu(\()p Fn(S)2650 2511 y Fg(1)2682 2501 y Fu(\))1957 2588 y Fc(\045irule)12 b Fh(XFER)p Fu(\()p Fn(S)2308 2598 y Fg(1)2340 2588 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)2647 2598 y Fg(1)2679 2588 y Fu(\))1957 2676 y Fc(\045trule)12 b Fh(JOIN)o Fu(\()p Fn(S)2291 2686 y Fg(1)2324 2676 y Fn(;)e(S)2391 2686 y Fg(2)2423 2676 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p 2690 2676 V 18 w(CONC)q Fu(\()p Fn(S)2906 2686 y Fg(1)2938 2676 y Fn(;)10 b(S)3005 2686 y Fg(2)3037 2676 y Fu(\))1957 2763 y Fc(\045trule)i Fh(SOR)m(T)p Fu(\()p Fn(S)2308 2773 y Fg(1)2340 2763 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 2623 2763 V 18 w(CONC)q Fu(\()p Fn(S)2839 2773 y Fg(1)2871 2763 y Fu(\))1957 2850 y Fc(\045trule)12 b Fh(RET)q Fu(\()p Fn(F)2279 2860 y Fg(1)2311 2850 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 2850 V 19 w(CONC)p Fu(\()p Fn(F)2780 2860 y Fg(1)2812 2850 y Fu(\))1921 2961 y Fc(\045layer)12 b Fh(REPLICA)-6 b(TION)1957 3048 y Fc(\045trule)12 b Fh(RET)q Fu(\()p Fn(F)2279 3058 y Fg(1)2311 3048 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 3048 V 19 w(CONC)p Fu(\()p Fn(F)2780 3058 y Fg(11)2840 3048 y Fu(\))1957 3135 y Fc(\045trule)12 b Fh(RET)q Fu(\()p Fn(F)2279 3145 y Fg(1)2311 3135 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(RET)p 2563 3135 V 19 w(CONC)p Fu(\()p Fn(F)2780 3145 y Fg(12)2840 3135 y Fu(\))1921 3246 y Fc(\045layer)12 b Fh(RET)1957 3333 y Fc(\045irule)g Fh(RET)q Fu(\()p Fn(F)2276 3343 y Fg(1)2308 3333 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(File)p 2545 3333 V 18 w(scan)p Fu(\()p Fn(F)2711 3343 y Fg(1)2743 3333 y Fu(\))1981 3479 y Fy(\(b\))32 b(Syntactic)g(speci\256cation.)65 b(Rule)32 b(actions)g(are)1981 3571 y(omitted)19 b(for)g(clarity)-5 b(.)p 3509 3695 4 3292 v 371 3698 3142 4 v 3511 3715 19 3299 v 387 3715 3142 19 v 1018 3911 a FP(Figure)24 b(6.2:)32 b(The)23 b(Prairie)h(layered)h(optimizer)g(paradigm)300 4287 y(Thus,)g(rules)h (in)e(a)h(layer)g(are)g(applied)i(to)e(an)f(expression)k(until)e(no)f (more)g(applicable)i(rules)f(remain)f(in)300 4457 y(that)k(layer;)i (the)d(rule)h(engine)h(then)e(applies)i(rules)f(in)f(the)g(next)h (layer)l(,)h(and)f(so)f(on.)44 b(Layer)29 b(composi-)300 4626 y(tion,)c(thus,)h(de\256nes)f(a)f(hierarchy)k(of)c(rules)i(that)f (determines)i(the)e(order)g(in)g(which)g(rules)h(are)f(applied.)298 4795 y(This)d(hierarchy)i(provides)g(the)e(DBI)f(with)g(another)j (degree)f(of)f(control)h(over)g(the)f(search)h(space)g(of)f(the)300 4965 y(optimizer)-5 b(.)1905 5349 y(81)p eop %%Page: 82 94 82 93 bop 575 391 a FP(One)16 b(question)j(that)e(might)f(arise)h(is)f (whether)h(compacted)i(layered)f(optimizers)g(have)f(the)f(same)295 561 y(search)k(space)g(as)f(a)g(monolithic)i(hand-coded)h(optimizer)-5 b(.)31 b(While)20 b(it)e(is)h(dif)n(\256cult)i(to)d(prove)j(this)e(in)g (a)g(for)n(-)300 730 y(mal)k(sense)i(\(since)g(the)f(rule)g(actions)h (for)f(layered)i(optimizers)f(are)f(dif)n(ferent)i(from)e(those)h(in)e (a)h(mono-)300 899 y(lithic)30 b(optimizer\),)i(all)d(the)h(layered)h (optimizers)g(that)e(we)g(constructed)j(\(and)e(that)f(are)h(described) h(in)296 1069 y(this)21 b(chapter\))h(resulted)g(in)e(exactly)i(the)e (same)g(rule)h(set)f(as)g(the)g(corresponding)k(monolithic)f(optimizer) -5 b(.)300 1238 y(Moreover)l(,)25 b(although)h(the)e(corresponding)k (rule)c(actions)i(are)e(not)g(exactly)h(the)f(same)g(\(since)g(the)g (P2V)298 1408 y(preprocessor)h(adds)d(some)f(extra)i(statements\))g(in) f(the)f(two)g(approaches,)k(the)d(number)g(of)f(expressions)300 1577 y(in)27 b(the)h(search)h(spaces)g(were)e(exactly)j(the)d(same)h (for)g(all)f(the)h(queries)h(that)f(we)f(optimized)i(using)g(the)298 1746 y(layered)24 b(optimizers)g(and)e(their)h(monolithic)h (counterparts.)34 b(This)22 b(lends)h(credence)h(to)e(the)g(hypothesis) 300 1916 y(that)i(a)g(properly)i(speci\256ed)f(layered)g(optimizer)h (is)d(semantically)k(equivalent)f(to)e(a)f(monolithic)j(\(non-)300 2085 y(layered\))g(speci\256cation.)300 2449 y FO(6.3)119 b(Examples)29 b(of)h(Layer)n(ed)f(Optimizers)299 2712 y FP(This)23 b(section)i(describes)g(several)g(variations)g(of)e (traditional)j(relational)f(optimizers)g(constructed)i(us-)300 2881 y(ing)d(layers.)300 3185 y FN(6.3.1)99 b(Example)25 b(Layers)583 3415 y FP(Some)f(examples)h(of)f(layers)i(in)e(a)f (Prairie)i(speci\256cation)i(are)d(shown)h(in)f(Figure)g(6.3.)3311 3382 y Fv(1)3383 3415 y FP(These)300 3585 y(layers)h(specify)h (transformations)h(typically)f(found)f(in)f(traditional)j(relational)f (databases.)34 b(There)24 b(are)300 3754 y(six)29 b(dif)n(ferent)j (layers)e(shown,)h(SEQUENTIAL,)24 b(SOR)-5 b(T)e(,)26 b(MERGE,)h(RET)-7 b(,)27 b(DISTRIBUTION,)e(and)300 3923 y(REPLICA)-10 b(TION.)583 4093 y(The)29 b(SEQUENTIAL)24 b(layer)29 b(encapsulates)j(transformations)h(that)c(are)g(typically)h (found)g(in)300 4262 y(centralized)36 b(optimizers.)61 b(Join)33 b(commutativity)j(and)d(associativity)j(T)-8 b(-rules)34 b(are)f(included)i(in)e(this)298 4431 y(layer)-5 b(.)31 b(The)22 b(remaining)h(rules)g(simply)g(transform)g(the)g (abstract)g(operators)i(into)d(their)h(concrete)h(coun-)300 4601 y(terparts,)h(to)f(be)f(transformed)j(by)e(lower)f(layers.)580 4770 y(The)d(SOR)-5 b(T)17 b(layer)k(encapsulates)j(implementations)g (of)c(the)h(SOR)-5 b(T)17 b(operator)-5 b(.)32 b(In)20 b(Figure)h(6.3,)298 4940 y(the)h(SOR)-5 b(T)19 b(operator)24 b(is)d(transformed)j(to)e(either)h(the)f(Mer)n(ge)p 2234 4940 28 4 v 34 w(sort)h(or)e(the)h(Null)g(algorithm.)32 b(Other)22 b(sort)p 300 5014 1320 4 v 400 5068 a Fu(1)434 5100 y Fy(For)d(clarity)-5 b(,)18 b(we)h(omit)g(all)f(rule)h(actions)h (in)e(the)h(descriptions)h(of)f(these)g(layers.)1905 5349 y FP(82)p eop %%Page: 83 95 83 94 bop 323 303 3237 4 v 323 2581 4 2278 v 577 423 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494 neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SEQUENTIAL)545 966 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 574 577 a Fh(JOIN)p Fu(\()p Fn(S)744 587 y Fg(1)776 577 y Fn(;)10 b(S)843 587 y Fg(2)875 577 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)1219 587 y Fg(2)1251 577 y Fn(;)11 b(S)1319 587 y Fg(1)1351 577 y Fu(\))574 664 y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)876 674 y Fg(1)908 664 y Fn(;)f(S)975 674 y Fg(2)1007 664 y Fu(\))p Fn(;)h(S)1099 674 y Fg(3)1131 664 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p Fn(S)1457 674 y Fg(1)1489 664 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1688 674 y Fg(2)1721 664 y Fn(;)f(S)1788 674 y Fg(3)1820 664 y Fu(\)\))574 751 y Fh(JOIN)p Fu(\()p Fn(S)744 761 y Fg(1)776 751 y Fn(;)g(S)843 761 y Fg(2)875 751 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1143 751 15 4 v 17 w(CONC)q Fu(\()p Fn(S)1358 761 y Fg(1)1390 751 y Fn(;)10 b(S)1457 761 y Fg(2)1489 751 y Fu(\))574 838 y Fh(SOR)m(T)p Fu(\()p Fn(S)760 848 y Fg(1)792 838 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1075 838 V 19 w(CONC)p Fu(\()p Fn(S)1291 848 y Fg(1)1323 838 y Fu(\))574 925 y Fh(RET)q Fu(\()p Fn(F)731 935 y Fg(1)763 925 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1015 925 V 19 w(CONC)p Fu(\()p Fn(F)1232 935 y Fg(1)1264 925 y Fu(\))2023 437 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SOR)m(T)1992 966 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2020 577 a Fh(SOR)m(T)p Fu(\()p Fn(S)2206 587 y Fg(1)2238 577 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 2526 577 V 19 w(sort)o Fu(\()p Fn(S)2678 587 y Fg(1)2710 577 y Fu(\))2020 664 y Fh(SOR)m(T)p Fu(\()p Fn(S)2206 674 y Fg(1)2238 664 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)2545 674 y Fg(1)2577 664 y Fu(\))2020 751 y Fh(JOIN)p Fu(\()p Fn(S)2190 761 y Fg(1)2222 751 y Fn(;)10 b(S)2289 761 y Fg(2)2321 751 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 2589 751 V 17 w(CONC)q Fu(\()p Fn(S)2804 761 y Fg(1)2836 751 y Fn(;)10 b(S)2903 761 y Fg(2)2936 751 y Fu(\))2020 838 y Fh(SOR)m(T)p Fu(\()p Fn(S)2206 848 y Fg(1)2238 838 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 2521 838 V 19 w(CONC)p Fu(\()p Fn(S)2737 848 y Fg(1)2769 838 y Fu(\))2020 925 y Fh(RET)q Fu(\()p Fn(F)2177 935 y Fg(1)2209 925 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 2461 925 V 19 w(CONC)q Fu(\()p Fn(F)2679 935 y Fg(1)2711 925 y Fu(\))577 1321 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MERGE)545 1850 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 574 1461 a Fh(JOIN)p Fu(\()p Fn(S)744 1471 y Fg(1)776 1461 y Fn(;)10 b(S)843 1471 y Fg(2)875 1461 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1358 1471 y Fg(1)1390 1461 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1630 1471 y Fg(2)1662 1461 y Fu(\)\))574 1548 y Fh(JOPR)p Fu(\()p Fn(S)752 1558 y Fg(1)784 1548 y Fn(;)g(S)852 1558 y Fg(2)884 1548 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 1172 1548 V 18 w(join)o Fu(\()p Fn(S)1326 1558 y Fg(1)1359 1548 y Fn(;)10 b(S)1426 1558 y Fg(2)1458 1548 y Fu(\))574 1635 y Fh(JOIN)p Fu(\()p Fn(S)744 1645 y Fg(1)776 1635 y Fn(;)g(S)843 1645 y Fg(2)875 1635 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1143 1635 V 17 w(CONC)q Fu(\()p Fn(S)1358 1645 y Fg(1)1390 1635 y Fn(;)10 b(S)1457 1645 y Fg(2)1489 1635 y Fu(\))574 1722 y Fh(SOR)m(T)p Fu(\()p Fn(S)760 1732 y Fg(1)792 1722 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1075 1722 V 19 w(CONC)p Fu(\()p Fn(S)1291 1732 y Fg(1)1323 1722 y Fu(\))574 1809 y Fh(RET)q Fu(\()p Fn(F)731 1819 y Fg(1)763 1809 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1015 1809 V 19 w(CONC)p Fu(\()p Fn(F)1232 1819 y Fg(1)1264 1809 y Fu(\))2023 1250 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 77.69916 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(DISTRIBUTION)1992 1850 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 68.28656 162.18057 68.28656 162.18057 0.0 0.0 0.0 0.0 68.28656 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2020 1374 a Fh(JOIN)p Fu(\()p Fn(S)2190 1384 y Fg(1)2222 1374 y Fn(;)10 b(S)2289 1384 y Fg(2)2321 1374 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 2589 1374 V 17 w(CONC)q Fu(\()p Fh(XFER)p Fu(\()p Fn(S)2955 1384 y Fg(1)2987 1374 y Fu(\))p Fn(;)11 b Fh(XFER)p Fu(\()p Fn(S)3230 1384 y Fg(2)3262 1374 y Fu(\)\))2020 1461 y Fh(XFER)p Fu(\()p Fn(S)2209 1471 y Fg(1)2241 1461 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Ship)p Fu(\()p Fn(S)2551 1471 y Fg(1)2583 1461 y Fu(\))2020 1548 y Fh(XFER)p Fu(\()p Fn(S)2209 1558 y Fg(1)2241 1548 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)2548 1558 y Fg(1)2580 1548 y Fu(\))2020 1635 y Fh(JOIN)p Fu(\()p Fn(S)2190 1645 y Fg(1)2222 1635 y Fn(;)10 b(S)2289 1645 y Fg(2)2321 1635 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 2589 1635 V 17 w(CONC)q Fu(\()p Fn(S)2804 1645 y Fg(1)2836 1635 y Fn(;)10 b(S)2903 1645 y Fg(2)2936 1635 y Fu(\))2020 1722 y Fh(SOR)m(T)p Fu(\()p Fn(S)2206 1732 y Fg(1)2238 1722 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 2521 1722 V 19 w(CONC)p Fu(\()p Fn(S)2737 1732 y Fg(1)2769 1722 y Fu(\))2020 1809 y Fh(RET)q Fu(\()p Fn(F)2177 1819 y Fg(1)2209 1809 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 2461 1809 V 19 w(CONC)q Fu(\()p Fn(F)2679 1819 y Fg(1)2711 1809 y Fu(\))577 2135 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 73.61931 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(REPLICA)-6 b(TION)545 2380 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 25.60745 162.18057 25.60745 162.18057 0.0 0.0 0.0 0.0 25.60745 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 574 2252 a Fh(RET)q Fu(\()p Fn(F)731 2262 y Fg(1)763 2252 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(RET)p 1015 2252 V 19 w(CONC)p Fu(\()p Fn(F)1232 2262 y Fg(11)1293 2252 y Fu(\))574 2339 y Fh(RET)q Fu(\()p Fn(F)731 2349 y Fg(1)763 2339 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1015 2339 V 19 w(CONC)p Fu(\()p Fn(F)1232 2349 y Fg(12)1293 2339 y Fu(\))2023 2207 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8 neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(RET)1992 2380 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057 17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2020 2340 a Fh(RET)q Fu(\()p Fn(F)2177 2350 y Fg(1)2209 2340 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p 2446 2340 V 18 w(scan)p Fu(\()p Fn(F)2612 2350 y Fg(1)2644 2340 y Fu(\))p 3557 2581 4 2278 v 323 2584 3237 4 v 3558 2601 19 2285 v 340 2601 3237 19 v 721 2797 a FP(Figure)24 b(6.3:)31 b(Example)24 b(layers.)32 b(For)23 b(clarity)-6 b(,)25 b(all)f(rule)g(actions)h(are)f(omitted.)294 3173 y(algorithms)c(can)e(either)h(be)f(introduced)j(in)d(this)h(or)e(other) i(SOR)-5 b(T)15 b(layers.)2591 3140 y Fv(2)2661 3173 y FP(The)j(remaining)h(rules)g(trans-)300 3343 y(form)k(abstract)j (operators)g(into)e(concrete)i(operators.)583 3512 y(The)31 b(MERGE)d(layer)j(transforms)i(the)d(JOIN)g(operator)j(into)e(the)g (Mer)n(ge)p 2984 3512 28 4 v 34 w(join)g(algorithm.)3558 3479 y Fv(3)297 3681 y FP(Other)20 b(join)h(algorithms)i(can)e(either)h (be)e(encapsulated)k(in)d(the)g(MERGE)c(layer)l(,)23 b(or)d(in)g(a)g(separate)j(layer)-5 b(.)577 3851 y(The)18 b(DISTRIBUTION)c(layer)19 b(encapsulates)i(the)e(distribution)i(of)d (stored)h(\256les)f(in)f(distributed)295 4020 y(databases.)32 b(It)18 b(transforms)j(the)e(JOIN)g(operator)i(such)e(that)h(if)e(its)h (inputs)i(are)e(located)i(at)d(dif)n(ferent)k(sites,)300 4189 y(they)30 b(are)f(\256rst)g(transfered)j(to)d(the)g(home)h(site)f (\(i.e.,)h(the)g(site)f(where)h(the)f(JOIN)f(was)h(issued\))i(before) 300 4359 y(the)d(join)h(is)f(performed.)46 b(As)28 b(in)g(the)g(MERGE)e (layer)l(,)k(the)e(XFER)e(operator)k(\(denoting)h(the)d(transfer)300 4528 y(of)i(streams)h(between)h(sites\))f(is)f(an)g(enforcer)n (-operator)m(,)36 b(explicitly)d(introduced)g(via)e(a)f(T)-8 b(-rule.)51 b(One)p 300 4609 1320 4 v 400 4663 a Fu(2)434 4695 y Fy(In)19 b(fact,)g(we)g(can)g(use)g(any)h(sort)f(algorithm)g(in) g(this)f(layer)l(.)25 b(This)19 b(is)f(true)h(for)g(other)g(layers)g (as)g(well.)400 4754 y Fu(3)434 4786 y Fy(Note)j(that)g(the)g(JOPR)f (operator)i(in)e(the)h(MERGE)g(layer)g(is)f(required)i(because)g(all)e (enforcer)o(-operators)i(\(like)f(SOR)l(T\))300 4877 y(are)e(explicit)f(in)h(Prairie.)26 b(However)m(,)20 b(since)g(the)g(JOPR)f(operator)h(\(presumably\))h(does)f(not)g(occur)h (in)e(other)h(layers,)g(it)f(is)h(not)300 4969 y(an)f(exported)h (operator)g(of)f(the)g(MERGE)f(layer)m(,)h(and)g(thus,)g(is)g(not)g (transformed)h(into)f(a)g(concrete)g(operator)l(.)1905 5349 y FP(83)p eop %%Page: 84 96 84 95 bop 300 391 a FP(algorithm)24 b(that)g(implements)h(the)e(XFER)e (operator)k(is)e(Ship.)31 b(The)23 b(Ship)g(algorithm)i(here)e(is)g (assumed)299 561 y(to)f(be)h(a)f(block)i(transfer)g(of)f(streams)g (\(as)g(in)f(R)1762 528 y FB(\003)1823 561 y FP([20,)16 b(37,)g(45]\);)24 b(other)f(transfer)i(strategies)g(\(e.g.,)d(tuple-) 295 730 y(at-a-time\))f(could)f(be)f(de\256ned)h(in)f(this)h(or)f (other)h(layers)h(encapsulating)i(distribution)f(transformations.)583 899 y(The)27 b(REPLICA)-10 b(TION)23 b(layer)28 b(models)g(replicated)i (databases.)44 b(Its)27 b(imported)h(interface)i(is)d(a)297 1069 y(RET)19 b(operator)k(that)f(simulates)h(a)d(centralized,)25 b(non-replicated)g(database.)32 b(That)21 b(is,)g(it)g(gives)h(the)f (illu-)300 1238 y(sion)k(of)f(a)g(single)h(physical)h(\256le)e(for)g (each)h(stored)h(\256le)d(in)h(the)h(database.)34 b(The)24 b(REPLICA)-10 b(TION)20 b(layer)300 1408 y(translates)30 b(a)c(stored)j(\256le)d(reference)j(into)f(a)f(reference)i(to)e(one)g (of)g(the)h(physical)h(replicas)g(of)e(the)g(\256le.)300 1577 y(\(In)d(Figure)g(6.3,)f(we)g(assume)h(each)g(stored)h(\256le)e (is)g(replicated)k(twice.\))583 1746 y(The)h(RET)e(layer)i(transforms)i (a)e(RET)d(operator)30 b(into)f(the)f(File)p 2624 1746 28 4 v 33 w(scan)g(algorithm.)46 b(Note)28 b(that)300 1916 y(there)e(are)f(no)h(other)g(rules)g(transforming)i(abstract)f (operators)h(into)e(other)g(concrete)h(operators.)38 b(This)300 2085 y(means)30 b(that)g(the)g(RET)d(layer)j(is)g(not)g (symmetric,)h(i.e.,)f(it)f(imports)i(the)f(RET)d(operator)l(,)33 b(but)d(doesn')n(t)293 2254 y(export)19 b(any)f(concrete)h(operator)-5 b(.)31 b(This,)18 b(in)f(turn,)i(implies)g(that)f(the)f(RET)e(layer)l (,)20 b(as)d(de\256ned,)i(is)f(typically)300 2424 y(last)24 b(in)f(a)h(layer)g(composition.)583 2593 y(In)k(the)g(following)i (sections,)g(we)d(will)h(show)f(how)h(these)h(layers)g(can)f(be)g(used) g(to)g(construct)300 2762 y(some)f(simple)h(optimizers.)44 b(As)26 b(mentioned)j(earlier)l(,)g(symmetric)g(layers)f(admit)f(more)g (composition)300 2932 y(possibilities,)g(since)d(the)g(exported)i(and)e (imported)h(interfaces)h(are)e(the)g(same.)300 3239 y FN(6.3.2)99 b(An)25 b(Optimizer)g(for)g(a)g(Centralized)h(Database)580 3469 y FP(An)20 b(optimizer)i(for)f(a)f(centralized)k(database)f(is)d (shown)h(in)g(Figure)g(6.4.)30 b(It)20 b(is)g(formed)i(by)e(com-)297 3638 y(posing)j(the)e(SEQUENTIAL,)c(MERGE,)h(SOR)-5 b(T)e(,)18 b(and)k(RET)d(layers.)31 b(The)21 b(SEQUENTIAL)c(layer)22 b(ap-)299 3808 y(plies)i(the)f(join)h(associativity)j(and)c (commutativity)i(T)-8 b(-rules)24 b(to)e(a)h(join)h(expression.)33 b(The)23 b(joins)g(of)g(this)300 3977 y(expression)30 b(are)d(then)h(transformed)h(into)f(the)f(Mer)n(ge)p 2044 3977 V 34 w(join)h(algorithm)g(by)f(the)h(MERGE)c(layer)-5 b(.)42 b(The)300 4146 y(SOR)-5 b(T)24 b(layer)j(then)g(transforms)h (the)f(SOR)-5 b(T)24 b(operator)k(into)f(the)g(Mer)n(ge)p 2617 4146 V 34 w(sort)g(algorithm,)i(and)e(\256nally)300 4316 y(the)j(RET)e(layer)j(transforms)i(the)d(RET)e(operator)k(into)f (the)f(File)p 2401 4316 V 33 w(scan)h(algorithm.)53 b(An)29 b(example)i(of)300 4485 y(such)26 b(a)f(transformation)j(is)d(shown)h (in)f(Figure)g(6.4.)36 b(\(Horizontal)27 b(lines)f(separate)h(the)f (input)g(and)g(out-)300 4655 y(put)k(operator)i(trees)e(for)g(each)h (layer)-5 b(.\))50 b(Note)30 b(that)g(each)g(of)g(the)g(layers)h(has)f (\252dummy\272)h(T)-8 b(-rules)30 b(that)297 4824 y(transform)23 b(abstract)g(operators)h(into)d(concrete)i(operators.)33 b(Thus,)21 b(for)g(instance,)j(the)d(SEQUENTIAL)295 4993 y(layer)f(can)f(either)h(apply)g(the)g(join)f(commutativity)j(rule)d (to)g(a)f(join)i(expression,)j(or)18 b(pass)i(the)f(expression)1905 5349 y(84)p eop %%Page: 85 97 85 96 bop 323 303 3237 4 v 323 3330 4 3027 v 772 2738 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 239.00296 81.09029 3.41426 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 804 565 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494 neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SEQUENTIAL)772 1108 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 718 a Fh(JOIN)p Fu(\()p Fn(S)971 728 y Fg(1)1003 718 y Fn(;)10 b(S)1070 728 y Fg(2)1102 718 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)1446 728 y Fg(2)1478 718 y Fn(;)11 b(S)1546 728 y Fg(1)1578 718 y Fu(\))801 805 y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 815 y Fg(1)1135 805 y Fn(;)f(S)1202 815 y Fg(2)1234 805 y Fu(\))p Fn(;)h(S)1326 815 y Fg(3)1358 805 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)1684 815 y Fg(1)1716 805 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1915 815 y Fg(2)1947 805 y Fn(;)g(S)2015 815 y Fg(3)2047 805 y Fu(\)\))801 893 y Fh(JOIN)p Fu(\()p Fn(S)971 903 y Fg(1)1003 893 y Fn(;)f(S)1070 903 y Fg(2)1102 893 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 893 15 4 v 17 w(CONC)q Fu(\()p Fn(S)1585 903 y Fg(1)1617 893 y Fn(;)10 b(S)1684 903 y Fg(2)1716 893 y Fu(\))801 980 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 990 y Fg(1)1019 980 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 980 V 19 w(CONC)p Fu(\()p Fn(S)1518 990 y Fg(1)1550 980 y Fu(\))801 1067 y Fh(RET)q Fu(\()p Fn(F)958 1077 y Fg(1)990 1067 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 1067 V 19 w(CONC)p Fu(\()p Fn(F)1459 1077 y Fg(1)1491 1067 y Fu(\))804 1252 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MERGE)772 1781 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 1391 a Fh(JOIN)p Fu(\()p Fn(S)971 1401 y Fg(1)1003 1391 y Fn(;)10 b(S)1070 1401 y Fg(2)1102 1391 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1585 1401 y Fg(1)1617 1391 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1857 1401 y Fg(2)1889 1391 y Fu(\)\))801 1479 y Fh(JOPR)p Fu(\()p Fn(S)979 1489 y Fg(1)1011 1479 y Fn(;)g(S)1079 1489 y Fg(2)1111 1479 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 1399 1479 V 18 w(join)o Fu(\()p Fn(S)1553 1489 y Fg(1)1586 1479 y Fn(;)10 b(S)1653 1489 y Fg(2)1685 1479 y Fu(\))801 1566 y Fh(JOIN)p Fu(\()p Fn(S)971 1576 y Fg(1)1003 1566 y Fn(;)g(S)1070 1576 y Fg(2)1102 1566 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1566 V 17 w(CONC)q Fu(\()p Fn(S)1585 1576 y Fg(1)1617 1566 y Fn(;)10 b(S)1684 1576 y Fg(2)1716 1566 y Fu(\))801 1653 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1663 y Fg(1)1019 1653 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 1653 V 19 w(CONC)p Fu(\()p Fn(S)1518 1663 y Fg(1)1550 1653 y Fu(\))801 1740 y Fh(RET)q Fu(\()p Fn(F)958 1750 y Fg(1)990 1740 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 1740 V 19 w(CONC)p Fu(\()p Fn(F)1459 1750 y Fg(1)1491 1740 y Fu(\))804 1925 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SOR)m(T)772 2454 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 2065 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 2075 y Fg(1)1019 2065 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307 2065 V 18 w(sort)p Fu(\()p Fn(S)1459 2075 y Fg(1)1491 2065 y Fu(\))801 2152 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2162 y Fg(1)1019 2152 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)1326 2162 y Fg(1)1358 2152 y Fu(\))801 2239 y Fh(JOIN)p Fu(\()p Fn(S)971 2249 y Fg(1)1003 2239 y Fn(;)10 b(S)1070 2249 y Fg(2)1102 2239 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 2239 V 17 w(CONC)q Fu(\()p Fn(S)1585 2249 y Fg(1)1617 2239 y Fn(;)10 b(S)1684 2249 y Fg(2)1716 2239 y Fu(\))801 2326 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2336 y Fg(1)1019 2326 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 2326 V 19 w(CONC)p Fu(\()p Fn(S)1518 2336 y Fg(1)1550 2326 y Fu(\))801 2413 y Fh(RET)q Fu(\()p Fn(F)958 2423 y Fg(1)990 2413 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 2413 V 19 w(CONC)p Fu(\()p Fn(F)1459 2423 y Fg(1)1491 2413 y Fu(\))804 2607 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8 neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(RET)772 2780 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057 17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 2740 a Fh(RET)q Fu(\()p Fn(F)958 2750 y Fg(1)990 2740 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p 1227 2740 V 17 w(scan)q Fu(\()p Fn(F)1393 2750 y Fg(1)1425 2740 y Fu(\))2638 421 y tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 421 a FF(SOR)l(T)2649 563 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 563 a FF(JOIN)2579 824 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 824 a 2516 705 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 705 a FF(RET)2800 705 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 705 a FF(RET)2579 824 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 824 a 2579 824 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 824 a 2522 840 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 840 a FF(dept)2806 832 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 832 a FF(emp)2579 824 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 824 a 2579 824 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 824 a 2638 988 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 988 a FF(SOR)l(T)2649 1130 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 1130 a FF(JOIN)2579 1391 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1391 a 2516 1272 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 1272 a FF(RET)2800 1272 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 1272 a FF(RET)2579 1391 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1391 a 2579 1391 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1391 a 2522 1399 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 1399 a FF(emp)2806 1407 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 1407 a FF(dept)2579 1391 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1391 a 2579 1391 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1391 a 2638 1697 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 1697 a FF(SOR)l(T)2572 1832 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 1832 a FF(Mer)o(ge)p 2747 1832 20 4 v 25 w(join)2579 2100 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2100 a 2516 1980 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 1980 a FF(RET)2800 1980 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 1980 a FF(RET)2579 2100 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2100 a 2579 2100 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2100 a 2522 2108 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 2108 a FF(emp)2806 2115 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 2115 a FF(dept)2579 2100 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2100 a 2579 2100 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2100 a 2573 2257 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 2257 a FF(Mer)o(ge)p 2748 2257 20 4 v 25 w(sort)2572 2399 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 2399 a FF(Mer)o(ge)p 2747 2399 20 4 v 25 w(join)2579 2667 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2667 a 2516 2547 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 2547 a FF(RET)2800 2547 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 2547 a FF(RET)2579 2667 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2667 a 2579 2667 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2667 a 2522 2675 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 2675 a FF(emp)2806 2682 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 2682 a FF(dept)2579 2667 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2667 a 2579 2667 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2667 a 2573 2824 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 2824 a FF(Mer)o(ge)p 2748 2824 20 4 v 25 w(sort)2572 2966 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 2966 a FF(Mer)o(ge)p 2747 2966 20 4 v 25 w(join)2579 3234 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3234 a 2457 3114 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2457 3114 a FF(File)p 2563 3114 20 4 v 25 w(scan)2740 3114 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2740 3114 a FF(File)p 2846 3114 20 4 v 26 w(scan)2579 3234 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3234 a 2579 3234 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3234 a 2522 3242 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 3242 a FF(emp)2806 3249 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 3249 a FF(dept)2579 3234 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3234 a 2579 3234 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3234 a 808 2738 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 64.01865 179.25221 64.01865 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 3.41426 179.25221 3.41426 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 3557 3330 4 3027 v 323 3333 3237 4 v 3558 3349 19 3033 v 340 3349 3237 19 v 444 3545 a FP(Figure)24 b(6.4:)31 b(An)23 b(optimizer)i(for)f(a)f(centralized)k (database)e(and)f(an)g(example)h(transformation)300 3922 y(unchanged)i(to)c(the)h(MERGE)d(layer)-5 b(.)33 b(The)23 b(example)i(transformation)i(shown)d(in)g(Figure)g(6.4)f(is,)h(thus,) 300 4091 y FD(one)g FP(of)f(many)h(that)g(can)g(be)g(produced)i(by)d (the)h(centralized)j(layered)e(optimizer)-5 b(.)583 4261 y(Note)23 b(that)g(some)g(operators)j(\(e.g.,)c(JOIN)p 1923 4261 28 4 v 33 w(CONC)f(and)i(SOR)-5 b(T)p 2613 4261 V 31 w(CONC)20 b(in)j(the)h(SOR)-5 b(T)20 b(layer\))300 4430 y(have)29 b(no)g(implementations)j(in)d(lower)f(layers.)48 b(The)28 b(rules)h(that)g(generate)i(these)f(operators)h(are)e(dis-)300 4599 y(carded)f(by)e(the)g(P2V)f(preprocessor)30 b(for)c(reasons)i(to)f (be)f(explained)i(later;)h(this)e(is)f(described)i(in)e(Sec-)300 4769 y(tion)e(6.4.)1905 5349 y(85)p eop %%Page: 86 98 86 97 bop 323 403 3237 4 v 323 3429 4 3027 v 772 2837 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 239.00296 81.09029 3.41426 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 804 678 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MERGE)772 1207 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 818 a Fh(JOIN)p Fu(\()p Fn(S)971 828 y Fg(1)1003 818 y Fn(;)10 b(S)1070 828 y Fg(2)1102 818 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1585 828 y Fg(1)1617 818 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1857 828 y Fg(2)1889 818 y Fu(\)\))801 905 y Fh(JOPR)p Fu(\()p Fn(S)979 915 y Fg(1)1011 905 y Fn(;)g(S)1079 915 y Fg(2)1111 905 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 1399 905 15 4 v 18 w(join)o Fu(\()p Fn(S)1553 915 y Fg(1)1586 905 y Fn(;)10 b(S)1653 915 y Fg(2)1685 905 y Fu(\))801 992 y Fh(JOIN)p Fu(\()p Fn(S)971 1002 y Fg(1)1003 992 y Fn(;)g(S)1070 1002 y Fg(2)1102 992 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 992 V 17 w(CONC)q Fu(\()p Fn(S)1585 1002 y Fg(1)1617 992 y Fn(;)10 b(S)1684 1002 y Fg(2)1716 992 y Fu(\))801 1079 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1089 y Fg(1)1019 1079 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 1079 V 19 w(CONC)p Fu(\()p Fn(S)1518 1089 y Fg(1)1550 1079 y Fu(\))801 1167 y Fh(RET)q Fu(\()p Fn(F)958 1177 y Fg(1)990 1167 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 1167 V 19 w(CONC)p Fu(\()p Fn(F)1459 1177 y Fg(1)1491 1167 y Fu(\))804 1338 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494 neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SEQUENTIAL)772 1881 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 1491 a Fh(JOIN)p Fu(\()p Fn(S)971 1501 y Fg(1)1003 1491 y Fn(;)10 b(S)1070 1501 y Fg(2)1102 1491 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)1446 1501 y Fg(2)1478 1491 y Fn(;)11 b(S)1546 1501 y Fg(1)1578 1491 y Fu(\))801 1578 y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 1588 y Fg(1)1135 1578 y Fn(;)f(S)1202 1588 y Fg(2)1234 1578 y Fu(\))p Fn(;)h(S)1326 1588 y Fg(3)1358 1578 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)1684 1588 y Fg(1)1716 1578 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1915 1588 y Fg(2)1947 1578 y Fn(;)g(S)2015 1588 y Fg(3)2047 1578 y Fu(\)\))801 1665 y Fh(JOIN)p Fu(\()p Fn(S)971 1675 y Fg(1)1003 1665 y Fn(;)f(S)1070 1675 y Fg(2)1102 1665 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1665 V 17 w(CONC)q Fu(\()p Fn(S)1585 1675 y Fg(1)1617 1665 y Fn(;)10 b(S)1684 1675 y Fg(2)1716 1665 y Fu(\))801 1753 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1763 y Fg(1)1019 1753 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 1753 V 19 w(CONC)p Fu(\()p Fn(S)1518 1763 y Fg(1)1550 1753 y Fu(\))801 1840 y Fh(RET)q Fu(\()p Fn(F)958 1850 y Fg(1)990 1840 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 1840 V 19 w(CONC)p Fu(\()p Fn(F)1459 1850 y Fg(1)1491 1840 y Fu(\))804 2025 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SOR)m(T)772 2554 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 2164 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 2174 y Fg(1)1019 2164 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307 2164 V 18 w(sort)p Fu(\()p Fn(S)1459 2174 y Fg(1)1491 2164 y Fu(\))801 2252 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2262 y Fg(1)1019 2252 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)1326 2262 y Fg(1)1358 2252 y Fu(\))801 2339 y Fh(JOIN)p Fu(\()p Fn(S)971 2349 y Fg(1)1003 2339 y Fn(;)10 b(S)1070 2349 y Fg(2)1102 2339 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 2339 V 17 w(CONC)q Fu(\()p Fn(S)1585 2349 y Fg(1)1617 2339 y Fn(;)10 b(S)1684 2349 y Fg(2)1716 2339 y Fu(\))801 2426 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2436 y Fg(1)1019 2426 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 2426 V 19 w(CONC)p Fu(\()p Fn(S)1518 2436 y Fg(1)1550 2426 y Fu(\))801 2513 y Fh(RET)q Fu(\()p Fn(F)958 2523 y Fg(1)990 2513 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 2513 V 19 w(CONC)p Fu(\()p Fn(F)1459 2523 y Fg(1)1491 2513 y Fu(\))804 2707 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8 neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(RET)772 2880 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057 17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 2839 a Fh(RET)q Fu(\()p Fn(F)958 2849 y Fg(1)990 2839 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p 1227 2839 V 17 w(scan)q Fu(\()p Fn(F)1393 2849 y Fg(1)1425 2839 y Fu(\))2638 521 y tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 521 a FF(SOR)l(T)2649 663 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 663 a FF(JOIN)2579 924 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 924 a 2516 804 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 804 a FF(RET)2800 804 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 804 a FF(RET)2579 924 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 924 a 2579 924 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 924 a 2522 939 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 939 a FF(dept)2806 932 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 932 a FF(emp)2579 924 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 924 a 2579 924 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 924 a 2638 1088 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 1088 a FF(SOR)l(T)2572 1223 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 1223 a FF(Mer)o(ge)p 2747 1223 20 4 v 25 w(join)2579 1491 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1491 a 2516 1371 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 1371 a FF(RET)2800 1371 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 1371 a FF(RET)2579 1491 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1491 a 2579 1491 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1491 a 2522 1506 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 1506 a FF(dept)2806 1499 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 1499 a FF(emp)2579 1491 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1491 a 2579 1491 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1491 a 2638 1797 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 1797 a FF(SOR)l(T)2572 1931 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 1931 a FF(Mer)o(ge)p 2747 1931 20 4 v 25 w(join)2579 2200 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2200 a 2516 2080 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 2080 a FF(RET)2800 2080 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 2080 a FF(RET)2579 2200 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2200 a 2579 2200 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2200 a 2522 2215 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 2215 a FF(dept)2806 2208 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 2208 a FF(emp)2579 2200 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2200 a 2579 2200 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2200 a 2573 2356 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 2356 a FF(Mer)o(ge)p 2748 2356 20 4 v 25 w(sort)2572 2498 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 2498 a FF(Mer)o(ge)p 2747 2498 20 4 v 25 w(join)2579 2766 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2766 a 2516 2647 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 2647 a FF(RET)2800 2647 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 2647 a FF(RET)2579 2766 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2766 a 2579 2766 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2766 a 2522 2782 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 2782 a FF(dept)2806 2774 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 2774 a FF(emp)2579 2766 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2766 a 2579 2766 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2766 a 2573 2923 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 2923 a FF(Mer)o(ge)p 2748 2923 20 4 v 25 w(sort)2572 3065 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 3065 a FF(Mer)o(ge)p 2747 3065 20 4 v 25 w(join)2579 3333 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3333 a 2457 3214 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2457 3214 a FF(File)p 2563 3214 20 4 v 25 w(scan)2740 3214 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2740 3214 a FF(File)p 2846 3214 20 4 v 26 w(scan)2579 3333 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3333 a 2579 3333 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3333 a 2522 3349 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 3349 a FF(dept)2806 3341 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 3341 a FF(emp)2579 3333 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3333 a 2579 3333 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3333 a 808 2837 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 64.01865 179.25221 64.01865 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 3.41426 179.25221 3.41426 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 3557 3429 4 3027 v 323 3432 3237 4 v 3558 3449 19 3033 v 340 3449 3237 19 v 300 3645 a FP(Figure)23 b(6.5:)31 b(An)23 b(alternative)i(optimizer)g(for)e(a)f (centralized)k(database)g(and)d(an)g(example)h(transforma-)300 3758 y(tion)300 4116 y FN(6.3.3)99 b(Another)26 b(Optimizer)f(for)g(a)g (Centralized)h(Database)581 4346 y FP(An)21 b(alternative)k(optimizer)e (for)e(a)h(centralized)i(database)g(is)d(shown)h(in)g(Figure)g(6.5.)30 b(It)21 b(is)h(sim-)300 4516 y(ilar)31 b(to)g(the)g(optimizer)i(in)e (Figure)g(6.4)g(with)g(the)g(SEQUENTIAL)c(and)k(MERGE)d(layers)k (reversed.)297 4685 y(Again,)21 b(an)f(example)i(transformation)i(of)c (a)g(two-way)h(join)g(expression)i(is)d(shown)h(in)g(Figure)f(6.5.)30 b(The)300 4854 y(important)c(point)g(to)e(note)i(here)f(is)f(that)h (the)g(MERGE)d(layer)j(\256rst)g(transforms)h(a)e(JOIN)g(operator)j (into)300 5024 y(the)h(Mer)n(ge)p 677 5024 28 4 v 34 w(join)g(algorithm,)h(then)g(the)e(SEQUENTIAL)c(layer)28 b(applies)h(the)f(join)g(associativity)j(and)1905 5349 y(86)p eop %%Page: 87 99 87 98 bop 300 391 a FP(commutativity)28 b(rules.)39 b(However)l(,)27 b(any)g(remaining)g(JOIN)e(operators)k(beyond)e(the)f(SEQUENTIAL)300 561 y(layer)j(are)f(not)g(transformed)i(into)f(any)f(join)g(algorithms) i(\(since)f(the)g(two)e(lower)h(layers,)i(SOR)-5 b(T)25 b(and)298 730 y(RET)19 b(only)j(transform)i(the)d(SOR)-5 b(T)19 b(and)j(RET)d(operators,)24 b(respectively\).)34 b(Thus,)22 b(the)g(transformations)296 899 y(in)f(the)f(SEQUENTIAL)c (layer)22 b(are)e(never)h(applied)i(to)d(generate)i(valid)g(access)f (plans.)31 b(In)20 b(other)i(words,)300 1069 y(the)j(layered)h (optimizer)g(speci\256cation)h(shown)e(in)g(Figure)g(6.5)f(would)h (remain)g(unchanged)j(in)c(its)h(be-)300 1238 y(havior)g(if)e(the)h (SEQUENTIAL)19 b(layer)25 b(were)e(removed.)2098 1205 y Fv(4)583 1408 y FP(Comparison)38 b(of)d(the)h(two)e(alternative)39 b(centralized)f(optimizers)g(in)d(Figures)h(6.4)f(and)h(6.5)298 1577 y(shows)22 b(that)g(the)g(one)g(in)f(Figure)i(6.4)e(is)g(more)h (general)h(since)g(its)f(search)g(space)h(is)f(lar)n(ger)-5 b(.)31 b(This)22 b(simple)295 1746 y(example)f(shows)e(that)h(the)f (order)h(of)g(layer)g(stacking)h(can)e(alter)h(the)g(search)g(space)h (without)f(any)f(change)294 1916 y(in)g(the)f(search)i(strategy)-6 b(.)31 b(This,)19 b(in)g(turn,)h(implies)f(that)g(the)g(optimal)g (access)h(plan)f(depends)i(on)d(the)h(order)300 2085 y(of)k(layers.)300 2392 y FN(6.3.4)99 b(An)25 b(Optimizer)g(for)g(a)g (Distributed)h(Database)300 2622 y FP(An)f(optimizer)i(for)e(a)g (distributed)k(database)f(is)d(shown)h(in)f(Figure)h(6.6.)37 b(It)25 b(is)g(formed)h(by)g(composing)300 2792 y(the)e(SEQUENTIAL,)19 b(DISTRIBUTION,)g(MERGE,)i(SOR)-5 b(T)e(,)21 b(and)j(RET)d(layers.)32 b(In)23 b(other)i(words,)f(it)299 2961 y(is)f(obtained)i(by)e(adding)i (the)e(DISTRIBUTION)c(layer)24 b(to)f(the)g(centralized)j(optimizer)e (in)f(Figure)g(6.4.)300 3130 y(The)h(SEQUENTIAL)19 b(layer)25 b(applies)h(the)e(join)h(associativity)j(and)c(commutativity)j(T)-8 b(-rules)24 b(to)g(a)g(join)294 3300 y(expression.)32 b(The)18 b(DISTRIBUTION)d(layer)k(then)g(ensures)h(that)f(join)g (streams)h(are)e(shipped)i(to)f(the)f(join)296 3469 y(site)j(by)f (using)h(the)f(Ship)g(algorithm.)32 b(The)19 b(JOIN)h(operator)i(is)e (then)g(transformed)j(into)e(the)f(Mer)n(ge)p 3433 3469 28 4 v 34 w(join)300 3638 y(algorithm)28 b(by)f(the)g(MERGE)d(layer)-5 b(.)41 b(The)26 b(SOR)-5 b(T)24 b(layer)j(then)h(transforms)g(the)f (SOR)-5 b(T)24 b(operator)29 b(into)300 3808 y(the)f(Mer)n(ge)p 677 3808 V 34 w(sort)h(algorithm,)h(and)f(\256nally)f(the)g(RET)e (layer)j(transforms)h(the)e(RET)d(operator)30 b(into)f(the)300 3977 y(File)p 446 3977 V 33 w(scan)24 b(algorithm.)33 b(An)23 b(example)i(transformation)i(is)c(shown)h(in)f(Figure)i(6.6.) 300 4284 y FN(6.3.5)99 b(An)25 b(Optimizer)g(for)g(a)g(Replicated)h (Database)299 4514 y FP(An)21 b(optimizer)j(for)e(a)g(replicated)j (database)f(is)e(obtained)j(from)d(a)g(centralized)j(optimizer)f(by)e (inserting)300 4684 y(the)j(REPLICA)-10 b(TION)21 b(layer)-5 b(.)36 b(This)25 b(is)g(shown)g(in)g(Figure)h(6.7.)35 b(It)25 b(is)f(formed)i(by)f(composing)i(the)f(SE-)p 300 4765 1320 4 v 400 4818 a Fu(4)434 4850 y Fy(The)20 b(layer)g(ordering)h(of)f(Figure)g(6.5)g(is)f(actually)h(an)g(example)h (of)f(a)g(composition)h(error)m(,)f(in)g(that)f(the)h(SEQUENTIAL)300 4941 y(layer)15 b(should)h(lie)f(above)h(all)e(join)h(layers)g(for)g (it)f(to)h(be)g(useful.)24 b(Errors)15 b(like)g(this)f(can)i(be)f (detected)h(using)f(Batory)g(and)h(Geraci')l(s)300 5033 y(algorithms)j([8].)1905 5349 y FP(87)p eop %%Page: 88 100 88 99 bop 323 639 3237 4 v 323 4529 4 3891 v 772 3774 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 324.36116 81.09029 -3.41426 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 804 858 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494 neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SEQUENTIAL)772 1400 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 1011 a Fh(JOIN)p Fu(\()p Fn(S)971 1021 y Fg(1)1003 1011 y Fn(;)10 b(S)1070 1021 y Fg(2)1102 1011 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)1446 1021 y Fg(2)1478 1011 y Fn(;)11 b(S)1546 1021 y Fg(1)1578 1011 y Fu(\))801 1098 y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 1108 y Fg(1)1135 1098 y Fn(;)f(S)1202 1108 y Fg(2)1234 1098 y Fu(\))p Fn(;)h(S)1326 1108 y Fg(3)1358 1098 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)1684 1108 y Fg(1)1716 1098 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1915 1108 y Fg(2)1947 1098 y Fn(;)g(S)2015 1108 y Fg(3)2047 1098 y Fu(\)\))801 1185 y Fh(JOIN)p Fu(\()p Fn(S)971 1195 y Fg(1)1003 1185 y Fn(;)f(S)1070 1195 y Fg(2)1102 1185 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1185 15 4 v 17 w(CONC)q Fu(\()p Fn(S)1585 1195 y Fg(1)1617 1185 y Fn(;)10 b(S)1684 1195 y Fg(2)1716 1185 y Fu(\))801 1272 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1282 y Fg(1)1019 1272 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 1272 V 19 w(CONC)p Fu(\()p Fn(S)1518 1282 y Fg(1)1550 1272 y Fu(\))801 1360 y Fh(RET)q Fu(\()p Fn(F)958 1370 y Fg(1)990 1360 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 1360 V 19 w(CONC)p Fu(\()p Fn(F)1459 1370 y Fg(1)1491 1360 y Fu(\))804 1545 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 77.69916 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(DISTRIBUTION)772 2145 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 68.28656 162.18057 68.28656 162.18057 0.0 0.0 0.0 0.0 68.28656 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 1668 a Fh(JOIN)p Fu(\()p Fn(S)971 1678 y Fg(1)1003 1668 y Fn(;)10 b(S)1070 1678 y Fg(2)1102 1668 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1668 V 17 w(CONC)q Fu(\()p Fh(XFER)p Fu(\()p Fn(S)1736 1678 y Fg(1)1768 1668 y Fu(\))p Fn(;)11 b Fh(XFER)p Fu(\()p Fn(S)2011 1678 y Fg(2)2043 1668 y Fu(\)\))801 1755 y Fh(XFER)p Fu(\()p Fn(S)990 1765 y Fg(1)1022 1755 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Ship)p Fu(\()p Fn(S)1332 1765 y Fg(1)1364 1755 y Fu(\))801 1842 y Fh(XFER)p Fu(\()p Fn(S)990 1852 y Fg(1)1022 1842 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)1329 1852 y Fg(1)1361 1842 y Fu(\))801 1929 y Fh(JOIN)p Fu(\()p Fn(S)971 1939 y Fg(1)1003 1929 y Fn(;)10 b(S)1070 1939 y Fg(2)1102 1929 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1929 V 17 w(CONC)q Fu(\()p Fn(S)1585 1939 y Fg(1)1617 1929 y Fn(;)10 b(S)1684 1939 y Fg(2)1716 1929 y Fu(\))801 2017 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2027 y Fg(1)1019 2017 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 2017 V 19 w(CONC)p Fu(\()p Fn(S)1518 2027 y Fg(1)1550 2017 y Fu(\))801 2104 y Fh(RET)q Fu(\()p Fn(F)958 2114 y Fg(1)990 2104 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 2104 V 19 w(CONC)p Fu(\()p Fn(F)1459 2114 y Fg(1)1491 2104 y Fu(\))804 2289 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MERGE)772 2818 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 2428 a Fh(JOIN)p Fu(\()p Fn(S)971 2438 y Fg(1)1003 2428 y Fn(;)10 b(S)1070 2438 y Fg(2)1102 2428 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1585 2438 y Fg(1)1617 2428 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1857 2438 y Fg(2)1889 2428 y Fu(\)\))801 2515 y Fh(JOPR)p Fu(\()p Fn(S)979 2525 y Fg(1)1011 2515 y Fn(;)g(S)1079 2525 y Fg(2)1111 2515 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 1399 2515 V 18 w(join)o Fu(\()p Fn(S)1553 2525 y Fg(1)1586 2515 y Fn(;)10 b(S)1653 2525 y Fg(2)1685 2515 y Fu(\))801 2603 y Fh(JOIN)p Fu(\()p Fn(S)971 2613 y Fg(1)1003 2603 y Fn(;)g(S)1070 2613 y Fg(2)1102 2603 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 2603 V 17 w(CONC)q Fu(\()p Fn(S)1585 2613 y Fg(1)1617 2603 y Fn(;)10 b(S)1684 2613 y Fg(2)1716 2603 y Fu(\))801 2690 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2700 y Fg(1)1019 2690 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 2690 V 19 w(CONC)p Fu(\()p Fn(S)1518 2700 y Fg(1)1550 2690 y Fu(\))801 2777 y Fh(RET)q Fu(\()p Fn(F)958 2787 y Fg(1)990 2777 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 2777 V 19 w(CONC)p Fu(\()p Fn(F)1459 2787 y Fg(1)1491 2777 y Fu(\))804 2962 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SOR)m(T)772 3491 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 3102 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 3112 y Fg(1)1019 3102 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307 3102 V 18 w(sort)p Fu(\()p Fn(S)1459 3112 y Fg(1)1491 3102 y Fu(\))801 3189 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 3199 y Fg(1)1019 3189 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)1326 3199 y Fg(1)1358 3189 y Fu(\))801 3276 y Fh(JOIN)p Fu(\()p Fn(S)971 3286 y Fg(1)1003 3276 y Fn(;)10 b(S)1070 3286 y Fg(2)1102 3276 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 3276 V 17 w(CONC)q Fu(\()p Fn(S)1585 3286 y Fg(1)1617 3276 y Fn(;)10 b(S)1684 3286 y Fg(2)1716 3276 y Fu(\))801 3363 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 3373 y Fg(1)1019 3363 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 3363 V 19 w(CONC)p Fu(\()p Fn(S)1518 3373 y Fg(1)1550 3363 y Fu(\))801 3450 y Fh(RET)q Fu(\()p Fn(F)958 3460 y Fg(1)990 3450 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 3450 V 19 w(CONC)p Fu(\()p Fn(F)1459 3460 y Fg(1)1491 3450 y Fu(\))804 3771 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8 neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(RET)772 3945 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057 17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 3904 a Fh(RET)q Fu(\()p Fn(F)958 3914 y Fg(1)990 3904 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p 1227 3904 V 17 w(scan)q Fu(\()p Fn(F)1393 3914 y Fg(1)1425 3904 y Fu(\))2638 757 y tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 757 a FF(SOR)l(T)2649 898 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 898 a FF(JOIN)2579 1160 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1160 a 2516 1040 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 1040 a FF(RET)2800 1040 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 1040 a FF(RET)2579 1160 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1160 a 2579 1160 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1160 a 2522 1175 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 1175 a FF(dept)2806 1168 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 1168 a FF(emp)2579 1160 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1160 a 2579 1160 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1160 a 2638 1323 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 1323 a FF(SOR)l(T)2649 1465 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 1465 a FF(JOIN)2579 1726 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1726 a 2516 1607 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 1607 a FF(RET)2800 1607 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 1607 a FF(RET)2579 1726 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1726 a 2579 1726 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1726 a 2522 1734 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 1734 a FF(emp)2806 1742 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 1742 a FF(dept)2579 1726 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1726 a 2579 1726 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1726 a 2638 1961 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 1961 a FF(SOR)l(T)2649 2103 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 2103 a FF(JOIN)2579 2506 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2506 a 2518 2238 a tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2518 2238 a FF(Ship)2802 2238 y tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2802 2238 a FF(Ship)2579 2506 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2506 a 2579 2506 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2506 a 2516 2386 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 2386 a FF(RET)2800 2386 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 2386 a FF(RET)2579 2506 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2506 a 2579 2506 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2506 a 2522 2514 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 2514 a FF(emp)2806 2521 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 2521 a FF(dept)2579 2506 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2506 a 2579 2506 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2506 a 2638 2670 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 2670 a FF(SOR)l(T)2572 2805 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 2805 a FF(Mer)o(ge)p 2747 2805 20 4 v 25 w(join)2579 3215 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3215 a 2518 2947 a tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2518 2947 a FF(Ship)2802 2947 y tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2802 2947 a FF(Ship)2579 3215 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3215 a 2579 3215 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3215 a 2516 3095 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 3095 a FF(RET)2800 3095 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 3095 a FF(RET)2579 3215 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3215 a 2579 3215 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3215 a 2522 3223 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 3223 a FF(emp)2806 3230 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 3230 a FF(dept)2579 3215 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3215 a 2579 3215 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3215 a 2573 3300 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 3300 a FF(Mer)o(ge)p 2748 3300 20 4 v 25 w(sort)2572 3443 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 3443 a FF(Mer)o(ge)p 2747 3443 20 4 v 25 w(join)2579 3852 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3852 a 2518 3584 a tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2518 3584 a FF(Ship)2802 3584 y tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2802 3584 a FF(Ship)2579 3852 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3852 a 2579 3852 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3852 a 2516 3733 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 3733 a FF(RET)2800 3733 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 3733 a FF(RET)2579 3852 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3852 a 2579 3852 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3852 a 2522 3860 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 3860 a FF(emp)2806 3868 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 3868 a FF(dept)2579 3852 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3852 a 2579 3852 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3852 a 2573 3938 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 3938 a FF(Mer)o(ge)p 2748 3938 20 4 v 25 w(sort)2572 4080 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 4080 a FF(Mer)o(ge)p 2747 4080 20 4 v 25 w(join)2579 4490 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4490 a 2518 4222 a tx@Dict begin tx@NodeDict begin { } /TheNodexfer1 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2518 4222 a FF(Ship)2802 4222 y tx@Dict begin tx@NodeDict begin { } /TheNodexfer2 16 { .5 5.43198 1.72792 false .5 14.67188 InitRnode } NewNode end end 2802 4222 a FF(Ship)2579 4490 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4490 a 2579 4490 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNodexfer2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4490 a 2457 4371 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2457 4371 a FF(File)p 2563 4371 20 4 v 25 w(scan)2740 4371 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2740 4371 a FF(File)p 2846 4371 20 4 v 26 w(scan)2579 4490 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer1 /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4490 a 2579 4490 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodexfer2 /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4490 a 2522 4498 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 4498 a FF(emp)2806 4506 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 4506 a FF(dept)2579 4490 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4490 a 2579 4490 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4490 a 808 3073 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 59.75073 179.25221 59.75073 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 -21.33954 179.25221 -21.33954 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 -97.30829 179.25221 -97.30829 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 3557 4529 4 3891 v 323 4532 3237 4 v 3558 4549 19 3898 v 340 4549 3237 19 v 449 4745 a FP(Figure)24 b(6.6:)31 b(An)23 b(optimizer)i(for)f(a)f(distributed)k (database)e(and)f(an)g(example)h(transformation)1905 5349 y(88)p eop %%Page: 89 101 89 100 bop 323 823 3237 4 v 323 4345 4 3523 v 772 3668 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 290.21788 81.09029 -8.53581 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 804 1070 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494 neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SEQUENTIAL)772 1613 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 1224 a Fh(JOIN)p Fu(\()p Fn(S)971 1234 y Fg(1)1003 1224 y Fn(;)10 b(S)1070 1234 y Fg(2)1102 1224 y Fu(\))18 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)1446 1234 y Fg(2)1478 1224 y Fn(;)11 b(S)1546 1234 y Fg(1)1578 1224 y Fu(\))801 1311 y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)1103 1321 y Fg(1)1135 1311 y Fn(;)f(S)1202 1321 y Fg(2)1234 1311 y Fu(\))p Fn(;)h(S)1326 1321 y Fg(3)1358 1311 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p Fu(\()p Fn(S)1684 1321 y Fg(1)1716 1311 y Fn(;)11 b Fh(JOIN)o Fu(\()p Fn(S)1915 1321 y Fg(2)1947 1311 y Fn(;)g(S)2015 1321 y Fg(3)2047 1311 y Fu(\)\))801 1398 y Fh(JOIN)p Fu(\()p Fn(S)971 1408 y Fg(1)1003 1398 y Fn(;)f(S)1070 1408 y Fg(2)1102 1398 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 1398 15 4 v 17 w(CONC)q Fu(\()p Fn(S)1585 1408 y Fg(1)1617 1398 y Fn(;)10 b(S)1684 1408 y Fg(2)1716 1398 y Fu(\))801 1485 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 1495 y Fg(1)1019 1485 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 1485 V 19 w(CONC)p Fu(\()p Fn(S)1518 1495 y Fg(1)1550 1485 y Fu(\))801 1572 y Fh(RET)q Fu(\()p Fn(F)958 1582 y Fg(1)990 1572 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 1572 V 19 w(CONC)p Fu(\()p Fn(F)1459 1582 y Fg(1)1491 1572 y Fu(\))804 1757 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MERGE)772 2286 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 1897 a Fh(JOIN)p Fu(\()p Fn(S)971 1907 y Fg(1)1003 1897 y Fn(;)10 b(S)1070 1907 y Fg(2)1102 1897 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1585 1907 y Fg(1)1617 1897 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1857 1907 y Fg(2)1889 1897 y Fu(\)\))801 1984 y Fh(JOPR)p Fu(\()p Fn(S)979 1994 y Fg(1)1011 1984 y Fn(;)g(S)1079 1994 y Fg(2)1111 1984 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 1399 1984 V 18 w(join)o Fu(\()p Fn(S)1553 1994 y Fg(1)1586 1984 y Fn(;)10 b(S)1653 1994 y Fg(2)1685 1984 y Fu(\))801 2071 y Fh(JOIN)p Fu(\()p Fn(S)971 2081 y Fg(1)1003 2071 y Fn(;)g(S)1070 2081 y Fg(2)1102 2071 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 2071 V 17 w(CONC)q Fu(\()p Fn(S)1585 2081 y Fg(1)1617 2071 y Fn(;)10 b(S)1684 2081 y Fg(2)1716 2071 y Fu(\))801 2158 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2168 y Fg(1)1019 2158 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 2158 V 19 w(CONC)p Fu(\()p Fn(S)1518 2168 y Fg(1)1550 2158 y Fu(\))801 2245 y Fh(RET)q Fu(\()p Fn(F)958 2255 y Fg(1)990 2245 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 2245 V 19 w(CONC)p Fu(\()p Fn(F)1459 2255 y Fg(1)1491 2245 y Fu(\))804 2431 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SOR)m(T)772 2960 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 2570 a Fh(SOR)m(T)p Fu(\()p Fn(S)987 2580 y Fg(1)1019 2570 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 1307 2570 V 18 w(sort)p Fu(\()p Fn(S)1459 2580 y Fg(1)1491 2570 y Fu(\))801 2657 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2667 y Fg(1)1019 2657 y Fu(\))h(=)-11 b Ft(\))17 b Fh(Null)p Fu(\()p Fn(S)1326 2667 y Fg(1)1358 2657 y Fu(\))801 2744 y Fh(JOIN)p Fu(\()p Fn(S)971 2754 y Fg(1)1003 2744 y Fn(;)10 b(S)1070 2754 y Fg(2)1102 2744 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(JOIN)p 1370 2744 V 17 w(CONC)q Fu(\()p Fn(S)1585 2754 y Fg(1)1617 2744 y Fn(;)10 b(S)1684 2754 y Fg(2)1716 2744 y Fu(\))801 2832 y Fh(SOR)m(T)p Fu(\()p Fn(S)987 2842 y Fg(1)1019 2832 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(SOR)m(T)p 1302 2832 V 19 w(CONC)p Fu(\()p Fn(S)1518 2842 y Fg(1)1550 2832 y Fu(\))801 2919 y Fh(RET)q Fu(\()p Fn(F)958 2929 y Fg(1)990 2919 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 2919 V 19 w(CONC)p Fu(\()p Fn(F)1459 2929 y Fg(1)1491 2919 y Fu(\))804 3139 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 73.61931 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(REPLICA)-6 b(TION)772 3385 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 25.60745 162.18057 25.60745 162.18057 0.0 0.0 0.0 0.0 25.60745 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 3257 a Fh(RET)q Fu(\()p Fn(F)958 3267 y Fg(1)990 3257 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(RET)p 1242 3257 V 19 w(CONC)p Fu(\()p Fn(F)1459 3267 y Fg(11)1520 3257 y Fu(\))801 3344 y Fh(RET)q Fu(\()p Fn(F)958 3354 y Fg(1)990 3344 y Fu(\))h(=)-11 b Ft(\))17 b Fh(RET)p 1242 3344 V 19 w(CONC)p Fu(\()p Fn(F)1459 3354 y Fg(12)1520 3344 y Fu(\))804 3679 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8 neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(RET)772 3852 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057 17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 801 3812 a Fh(RET)q Fu(\()p Fn(F)958 3822 y Fg(1)990 3812 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p 1227 3812 V 17 w(scan)q Fu(\()p Fn(F)1393 3822 y Fg(1)1425 3812 y Fu(\))2638 941 y tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 941 a FF(SOR)l(T)2649 1082 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 1082 a FF(JOIN)2579 1344 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1344 a 2516 1224 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 1224 a FF(RET)2800 1224 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 1224 a FF(RET)2579 1344 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1344 a 2579 1344 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1344 a 2522 1359 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 1359 a FF(dept)2806 1352 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 1352 a FF(emp)2579 1344 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1344 a 2579 1344 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1344 a 2638 1508 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 1508 a FF(SOR)l(T)2649 1649 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 2649 1649 a FF(JOIN)2579 1911 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1911 a 2516 1791 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 1791 a FF(RET)2800 1791 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 1791 a FF(RET)2579 1911 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1911 a 2579 1911 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1911 a 2522 1919 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 1919 a FF(emp)2806 1926 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 1926 a FF(dept)2579 1911 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1911 a 2579 1911 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 1911 a 2638 2216 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.43198 0.08394 false .5 19.96785 InitRnode } NewNode end end 2638 2216 a FF(SOR)l(T)2572 2351 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 2351 a FF(Mer)o(ge)p 2747 2351 20 4 v 25 w(join)2579 2619 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2619 a 2516 2500 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 2500 a FF(RET)2800 2500 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 2500 a FF(RET)2579 2619 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2619 a 2579 2619 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2619 a 2522 2627 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 2627 a FF(emp)2806 2635 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 2635 a FF(dept)2579 2619 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2619 a 2579 2619 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 2619 a 2573 2819 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 2819 a FF(Mer)o(ge)p 2748 2819 20 4 v 25 w(sort)2572 2961 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 2961 a FF(Mer)o(ge)p 2747 2961 20 4 v 25 w(join)2579 3229 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3229 a 2516 3109 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2516 3109 a FF(RET)2800 3109 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 2800 3109 a FF(RET)2579 3229 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3229 a 2579 3229 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3229 a 2522 3237 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 3.62798 1.72792 false .5 13.77588 InitRnode } NewNode end end 2522 3237 a FF(emp)2806 3244 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 13.77588 InitRnode } NewNode end end 2806 3244 a FF(dept)2579 3229 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3229 a 2579 3229 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3229 a 2573 3343 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 3343 a FF(Mer)o(ge)p 2748 3343 20 4 v 25 w(sort)2572 3485 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 3485 a FF(Mer)o(ge)p 2747 3485 20 4 v 25 w(join)2579 3753 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3753 a 2457 3634 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2457 3634 a FF(File)p 2563 3634 20 4 v 25 w(scan)2740 3634 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2740 3634 a FF(File)p 2846 3634 20 4 v 26 w(scan)2579 3753 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3753 a 2579 3753 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3753 a 2494 3769 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 20.65588 InitRnode } NewNode end end 2494 3769 a FF(emp)p 2612 3769 20 4 v 24 w(1)2777 3769 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 20.65588 InitRnode } NewNode end end 2777 3769 a FF(dept)p 2894 3769 20 4 v 25 w(2)2579 3753 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3753 a 2579 3753 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 3753 a 2573 3839 a tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.344 1.72792 false .5 35.61568 InitRnode } NewNode end end 2573 3839 a FF(Mer)o(ge)p 2748 3839 20 4 v 25 w(sort)2572 3981 y tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.43198 1.72792 false .5 36.0637 InitRnode } NewNode end end 2572 3981 a FF(Mer)o(ge)p 2747 3981 20 4 v 25 w(join)2579 4249 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodesort /TheNodejoin InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4249 a 2457 4130 a tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2457 4130 a FF(File)p 2563 4130 20 4 v 25 w(scan)2740 4130 y tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.43198 0.08394 false .5 29.5436 InitRnode } NewNode end end 2740 4130 a FF(File)p 2846 4130 20 4 v 26 w(scan)2579 4249 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4249 a 2579 4249 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoin /TheNoderetr2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4249 a 2494 4265 a tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.43198 1.72792 false .5 20.65588 InitRnode } NewNode end end 2494 4265 a FF(emp)p 2612 4265 20 4 v 24 w(1)2777 4265 y tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.43198 1.72792 false .5 20.65588 InitRnode } NewNode end end 2777 4265 a FF(dept)p 2894 4265 20 4 v 25 w(2)2579 4249 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr1 /TheNoder1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4249 a 2579 4249 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderetr2 /TheNoder2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 2579 4249 a 808 3257 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 226.19922 179.25221 226.19922 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 145.10893 179.25221 145.10893 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 64.01865 179.25221 64.01865 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 -4.2679 179.25221 -4.2679 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 281.68205 -63.16501 179.25221 -63.16501 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 3557 4345 4 3523 v 323 4348 3237 4 v 3558 4365 19 3529 v 340 4365 3237 19 v 464 4561 a FP(Figure)24 b(6.7:)32 b(An)22 b(optimizer)k(for)d(a)g(replicated)j(database)g(and)e(an)g (example)g(transformation)1905 5349 y(89)p eop %%Page: 90 102 90 101 bop 298 391 a FP(QUENTIAL,)18 b(MERGE,)h(SOR)-5 b(T)e(,)19 b(REPLICA)-10 b(TION,)18 b(and)k(RET)e(layers.)31 b(The)22 b(SEQUENTIAL)17 b(layer)299 561 y(applies)25 b(the)f(join)f(associativity)k(and)d(commutativity)h(T)-8 b(-rules)24 b(to)f(a)f(join)i(expression.)34 b(The)22 b(JOIN)g(op-)300 730 y(erator)k(is)f(then)h(transformed)i(into)e(the)f (Mer)n(ge)p 1806 730 28 4 v 35 w(join)g(algorithm)i(by)f(the)f(MERGE)e (layer)-5 b(.)36 b(The)25 b(SOR)-5 b(T)300 899 y(layer)31 b(then)h(transforms)g(the)f(SOR)-5 b(T)28 b(operator)k(into)f(the)g (Mer)n(ge)p 2397 899 V 34 w(sort)g(algorithm.)54 b(The)30 b(REPLICA-)298 1069 y(TION)20 b(layer)j(transforms)g(references)i(to)d (logical)h(stored)g(\256les)f(into)g(their)g(physical)i(replicas.)33 b(Finally)-6 b(,)298 1238 y(the)21 b(RET)e(layer)j(transforms)i(the)d (RET)f(operator)j(into)f(the)f(File)p 2319 1238 V 34 w(scan)h(algorithm.)31 b(An)21 b(example)h(trans-)300 1408 y(formation)27 b(is)e(shown)h(in)f(Figure)h(6.7.)35 b(Note)26 b(that)f(references)j(to)d(the)h(stored)g(\256les)f(dept)h (and)g(emp)f(are)294 1577 y(translated)c(by)d(the)h(REPLICA)-10 b(TION)14 b(layer)19 b(into)g(references)i(to)d(their)h(corresponding)j (physical)f(stored)300 1746 y(\256les.)300 2113 y FO(6.4)119 b(Compacting)30 b(Layer)n(ed)g(Optimizers)300 2376 y FP(In)c(the)g(previous)j(sections,)f(we)d(described)k(how)d(layers)h (can)f(be)g(used)h(to)f(de\256ne)h(small)f(rule)g(sets)h(for)300 2545 y(optimizers,)h(and)e(how)g(these)g(layers)h(can)g(be)e(composed)j (to)e(construct)i(an)d(optimizer)-5 b(.)40 b(However)l(,)26 b(as)300 2715 y(seen)f(from)f(the)g(example)h(layers)h(in)e(Section)h (6.3,)f(even)g(simple)h(layered)h(optimizers)g(can)e(consist)i(of)300 2884 y(a)k(lar)n(ge)i(number)f(of)g(rules.)52 b(A)29 b(naive)j(implementation)h(of)e(such)g(a)f(speci\256cation)j(can)e (result)h(in)e(an)300 3053 y(inef)n(\256cient)e(optimizer)-5 b(.)41 b(In)26 b(this)g(section,)i(we)e(discuss)i(how)e(the)g(P2V)f (preprocessor)30 b(can)c(be)g(used)h(to)300 3223 y(compact)e(layered)g (optimizers)h(to)d(obtain)i(a)e(monolithic)j(rule)e(set.)583 3392 y(Layers)30 b(have)f(two)f(primary)i(goals:)42 b(to)29 b(translate)h(abstract)h(operators)g(into)e(concrete)i(ones,)297 3562 y(and)22 b(to)e(de\256ne)i(a)e(hierarchy)k(of)c(rules)i(\(i.e.,)f (to)g(de\256ne)g(rule)h(precedence\).)33 b(Any)21 b(compaction)i(of)e (layers)300 3731 y(has)i(to)g(preserve)j(the)d(semantics)i(of)e(these)h (two)f(goals.)32 b(The)23 b(P2V)f(preprocessor)27 b(accomplishes)f (both)300 3900 y(of)f(these)g(goals.)36 b(Broadly)26 b(speaking,)h(there)e(are)g(two)f(responsibilities)30 b(of)24 b(the)h(P2V)f(preprocessor)k(in)299 4070 y(compacting)d (layers.)32 b(The)22 b(\256rst)h(is)f(to)h(compact)h(the)f(rules)h (themselves,)h(and)e(the)g(second)h(is)f(to)g(ensure)300 4239 y(that)h(the)g(compaction)j(of)c(rule)i(actions)g(generates)h(a)e (semantically)i(equivalent)h(rule)d(set.)32 b(Below)-6 b(,)23 b(we)300 4408 y(discuss)i(these)g(two)e(steps)i(in)e(greater)i (detail.)582 4578 y(The)d(translation)k(of)c(abstract)j(operators)g (into)e(concrete)h(ones)g(by)e(a)g(layer)i(implies)f(that)g(there)297 4747 y(is)d(a)g(one-to-one)k(correspondence)h(between)d(a)e(concrete)j (operator)g(of)d(one)h(layer)h(and)f(an)f(abstract)j(op-)300 4916 y(erator)28 b(of)g(the)f(layer)h(immediately)h(below)f(it.)42 b(Thus,)28 b(in)f(the)g(centralized)k(optimizer)e(of)e(Figure)h(6.4,) 300 5086 y(the)d(JOIN)p 637 5086 V 32 w(CONC)d(operator)27 b(in)d(the)h(SEQUENTIAL)20 b(layer)25 b(corresponds)j(to)d(the)f(JOIN)g (operator)i(in)1905 5349 y(90)p eop %%Page: 91 103 91 102 bop 323 403 3237 4 v 323 3038 4 2635 v 355 2766 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def [ 81.09029 239.00296 81.09029 3.41426 /Lineto /lineto load def false Line gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 386 594 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.61494 neg 69.36932 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SEQUENTIAL)355 1137 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 383 747 a Fh(JOIN)p Fu(\()p Fn(S)553 757 y Fg(1)585 747 y Fn(;)10 b(S)652 757 y Fg(2)685 747 y Fu(\))17 b(=)-11 b Ft(\))p Fu(!)17 b Fh(JOIN)p Fu(\()p Fn(S)1028 757 y Fg(2)1060 747 y Fn(;)11 b(S)1128 757 y Fg(1)1160 747 y Fu(\))383 834 y Fh(JOIN)p Fu(\()p Fh(JOIN)p Fu(\()p Fn(S)685 844 y Fg(1)717 834 y Fn(;)f(S)784 844 y Fg(2)816 834 y Fu(\))p Fn(;)h(S)908 844 y Fg(3)940 834 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(JOIN)p Fu(\()p Fn(S)1266 844 y Fg(1)1298 834 y Fn(;)11 b Fh(JOIN)p Fu(\()p Fn(S)1498 844 y Fg(2)1530 834 y Fn(;)f(S)1597 844 y Fg(3)1629 834 y Fu(\)\))383 921 y Fh(JOIN)p Fu(\()p Fn(S)553 931 y Fg(1)585 921 y Fn(;)g(S)652 931 y Fg(2)685 921 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p 952 921 15 4 v 18 w(CONC)p Fu(\()p Fn(S)1167 931 y Fg(1)1199 921 y Fn(;)11 b(S)1267 931 y Fg(2)1299 921 y Fu(\))383 1009 y Fh(SOR)m(T)p Fu(\()p Fn(S)569 1019 y Fg(1)601 1009 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(SOR)m(T)p 885 1009 V 18 w(CONC)p Fu(\()p Fn(S)1100 1019 y Fg(1)1132 1009 y Fu(\))383 1096 y Fh(RET)q Fu(\()p Fn(F)540 1106 y Fg(1)572 1096 y Fu(\))g(=)-11 b Ft(\))17 b Fh(RET)p 824 1096 V 19 w(CONC)q Fu(\()p Fn(F)1042 1106 y Fg(1)1074 1096 y Fu(\))386 1281 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 41.57965 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MERGE)355 1810 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 383 1420 a Fh(JOIN)p Fu(\()p Fn(S)553 1430 y Fg(1)585 1420 y Fn(;)10 b(S)652 1430 y Fg(2)685 1420 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOPR)p Fu(\()p Fh(SOR)m(T)p Fu(\()p Fn(S)1167 1430 y Fg(1)1199 1420 y Fu(\))p Fn(;)11 b Fh(SOR)m(T)p Fu(\()p Fn(S)1439 1430 y Fg(2)1471 1420 y Fu(\)\))383 1507 y Fh(JOPR)p Fu(\()p Fn(S)561 1517 y Fg(1)593 1507 y Fn(;)g(S)661 1517 y Fg(2)693 1507 y Fu(\))18 b(=)-11 b Ft(\))17 b Fh(Mer)o(ge)p 981 1507 V 18 w(join)p Fu(\()p Fn(S)1136 1517 y Fg(1)1168 1507 y Fn(;)10 b(S)1235 1517 y Fg(2)1267 1507 y Fu(\))383 1595 y Fh(JOIN)p Fu(\()p Fn(S)553 1605 y Fg(1)585 1595 y Fn(;)g(S)652 1605 y Fg(2)685 1595 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p 952 1595 V 18 w(CONC)p Fu(\()p Fn(S)1167 1605 y Fg(1)1199 1595 y Fn(;)11 b(S)1267 1605 y Fg(2)1299 1595 y Fu(\))383 1682 y Fh(SOR)m(T)p Fu(\()p Fn(S)569 1692 y Fg(1)601 1682 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(SOR)m(T)p 885 1682 V 18 w(CONC)p Fu(\()p Fn(S)1100 1692 y Fg(1)1132 1682 y Fu(\))383 1769 y Fh(RET)q Fu(\()p Fn(F)540 1779 y Fg(1)572 1769 y Fu(\))g(=)-11 b Ft(\))17 b Fh(RET)p 824 1769 V 19 w(CONC)q Fu(\()p Fn(F)1042 1779 y Fg(1)1074 1769 y Fu(\))386 1954 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 30.67973 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(SOR)m(T)355 2483 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 59.75073 162.18057 59.75073 162.18057 0.0 0.0 0.0 0.0 59.75073 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 383 2093 a Fh(SOR)m(T)p Fu(\()p Fn(S)569 2103 y Fg(1)601 2093 y Fu(\))h(=)-11 b Ft(\))18 b Fh(Mer)o(ge)p 890 2093 V 18 w(sort)o Fu(\()p Fn(S)1041 2103 y Fg(1)1073 2093 y Fu(\))383 2181 y Fh(SOR)m(T)p Fu(\()p Fn(S)569 2191 y Fg(1)601 2181 y Fu(\))g(=)-11 b Ft(\))18 b Fh(Null)o Fu(\()p Fn(S)908 2191 y Fg(1)940 2181 y Fu(\))383 2268 y Fh(JOIN)p Fu(\()p Fn(S)553 2278 y Fg(1)585 2268 y Fn(;)10 b(S)652 2278 y Fg(2)685 2268 y Fu(\))17 b(=)-11 b Ft(\))18 b Fh(JOIN)p 952 2268 V 18 w(CONC)p Fu(\()p Fn(S)1167 2278 y Fg(1)1199 2268 y Fn(;)11 b(S)1267 2278 y Fg(2)1299 2268 y Fu(\))383 2355 y Fh(SOR)m(T)p Fu(\()p Fn(S)569 2365 y Fg(1)601 2355 y Fu(\))18 b(=)-11 b Ft(\))18 b Fh(SOR)m(T)p 885 2355 V 18 w(CONC)p Fu(\()p Fn(S)1100 2365 y Fg(1)1132 2355 y Fu(\))383 2442 y Fh(RET)q Fu(\()p Fn(F)540 2452 y Fg(1)572 2442 y Fu(\))g(=)-11 b Ft(\))17 b Fh(RET)p 824 2442 V 19 w(CONC)q Fu(\()p Fn(F)1042 2452 y Fg(1)1074 2442 y Fu(\))386 2636 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.8 neg 24.35982 10.56996 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(RET)355 2809 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 17.07164 162.18057 17.07164 162.18057 0.0 0.0 0.0 0.0 17.07164 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 383 2769 a Fh(RET)q Fu(\()p Fn(F)540 2779 y Fg(1)572 2769 y Fu(\))h(=)-11 b Ft(\))17 b Fh(File)p 809 2769 V 18 w(scan)p Fu(\()p Fn(F)975 2779 y Fg(1)1007 2769 y Fu(\))1753 1774 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 8.53581 25.60745 4.2679 25.60745 0.0 34.14328 8.53581 25.60745 17.07164 25.60745 12.80373 0.0 8.53581 /Lineto /lineto load def false Polygon gsave 0. setgray fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2096 1458 a @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 3.96492 neg 72.13919 10.71999 .5 Frame gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial Fe(MONOLITHIC)2064 1916 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray [ 0.0 51.21492 176.69157 51.21492 176.69157 0.0 0.0 0.0 0.0 51.21492 /Lineto /lineto load def false Polygon gsave 3.0 -45. PtoC Shadow 0. setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial 2093 1614 a Fu(\()p Fh(JOIN)g Fu(\(?1)h(?2\)\))g Ft(\000)-11 b(!)p Fu(!)17 b(\()p Fh(JOIN)h Fu(\(?2)g(?1\)\))2093 1701 y(\()p Fh(JOIN)f Fu(\(\()p Fh(JOIN)h Fu(\(?1)g(?2\)\))g(?3\)\))f Ft(\000)-10 b(!)17 b Fu(\()p Fh(JOIN)h Fu(\(?1)g(\()p Fh(JOIN)f Fu(\(?2)h(?3\)\)\)\))2093 1788 y(\()p Fh(JOIN)f Fu(\(?1)h(?2\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(Mer)o(ge)p 2740 1788 V 18 w(join)f Fu(\(?1)h(?2\)\))2093 1875 y(\()p Fh(RET)g Fu(\(\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(File)p 2539 1875 V 17 w(scan)h Fu(\(\)\))p 3557 3038 4 2635 v 323 3041 3237 4 v 3558 3058 19 2642 v 340 3058 3237 19 v 569 3254 a FP(Figure)24 b(6.8:)31 b(Compacting)25 b(the)f(layered)h(centralized)i(Prairie)d(rule)g(set)g(in)f(Figure)h (6.4)300 3630 y(the)i(MERGE)c(layer)-5 b(.)37 b(Once)26 b(this)g(correspondence)k(is)25 b(established,)j(the)e(P2V)e (preprocessor)29 b(can)d(use)299 3800 y(the)c(same)h(rule)g(compaction) i(techniques)g(described)g(in)d(Section)i(4.5)e(\(and)h(depicted)i(in)d (Figure)h(4.1)m(1\))300 3969 y(to)j(combine)h(all)f(the)h(layers)g (together)h(into)f(a)e(single,)j(monolithic)g(rule)f(speci\256cation.) 41 b(For)25 b(the)i(cen-)300 4138 y(tralized)g(optimizer)g(shown)e(in)g (Figure)h(6.4,)f(this)g(process)i(results)g(in)e(the)g(compaction)i (illustrated)h(in)297 4308 y(Figure)22 b(6.8.)29 b(It)21 b(is)g(interesting)j(to)d(note)g(that)h(the)f(monolithic)i(rule)f(set)f (obtained)i(by)e(layer)h(compaction)296 4477 y(is)d(basically)k(the)d (same)1034 4444 y Fv(5)1093 4477 y FP(\(except)h(for)f(rule)h(actions)g (as)f(shown)g(in)g(Figure)g(6.9\))g(as)g(one)g(that)g(might)h(have)296 4646 y(been)g(hand-written)i(by)d(a)g(DBI;)f(the)i(layered)h (speci\256cation,)h(however)l(,)f(af)n(fords)g(more)f(degrees)h(of)e (ex-)p 300 4728 1320 4 v 400 4781 a Fu(5)434 4813 y Fy(Note,)h (especially)-5 b(,)21 b(that)f(rules)g(\(e.g.,)g(the)h(JOIN)f(to)g (JOIN)p 1959 4813 23 4 v 27 w(CONC)f(transformation)i(in)g(the)f(MERGE) g(layer\))g(that)g(sim-)300 4904 y(ply)g(transform)f(abstract)h (operators)g(to)f(concrete)i(operators)f(are)f(discarded)i(as)e(a)g (direct)h(consequence)i(of)d(the)g(compaction)300 4996 y(process.)1905 5349 y FP(91)p eop %%Page: 92 104 92 103 bop 318 403 3247 4 v 318 3744 4 3341 v 386 478 a FF(JOIN)o Fv(\()p FF(JOIN)q Fv(\()p Fs(S)771 487 y Fu(1)806 478 y Fs(;)11 b(S)880 487 y Fu(2)915 478 y Fv(\))20 b(:)f Fo(D)1063 487 y Fm(4)1102 478 y Fs(;)11 b(S)1176 487 y Fu(3)1211 478 y Fv(\))20 b(:)f Fo(D)1359 487 y Fm(5)1417 478 y Fv(=)-12 b FB(\))20 b FF(JOIN)p Fv(\()p Fs(S)1765 487 y Fu(1)1800 478 y Fs(;)11 b FF(JOIN)p Fv(\()p Fs(S)2045 487 y Fu(2)2080 478 y Fs(;)g(S)2154 487 y Fu(3)2189 478 y Fv(\))20 b(:)f Fo(D)2337 487 y Fm(6)2376 478 y Fv(\))h(:)f Fo(D)2524 487 y Fm(7)3393 478 y FF(\(6.1\))386 557 y FB(ff)601 635 y FF(1.)j Fo(D)735 644 y Fm(6)774 635 y Fs(:)p FF(attributes)h Fv(=)c FF(union)f Fv(\()p Fo(D)1392 644 y Fm(2)1432 635 y Fs(:)p FF(attributes)r Fs(;)12 b Fo(D)1792 644 y Fm(3)1831 635 y Fs(:)p FF(attributes)r Fv(\))18 b(;)386 714 y FB(gg)386 793 y FF(2.)j(is)p 505 793 20 4 v 25 w(associative)f Fv(\()p Fo(D)923 802 y Fm(5)962 793 y Fs(:)p FF(join)p 1088 793 V 25 w(predicate)s Fs(;)12 b Fo(D)1446 802 y Fm(2)1485 793 y Fs(:)p FF(attributes)s Fv(\))386 872 y FB(ff)601 951 y FF(3.)22 b Fo(D)735 960 y Fm(7)794 951 y Fv(=)d Fo(D)930 960 y Fm(5)986 951 y Fv(;)601 1030 y FF(4.)j Fo(D)735 1039 y Fm(7)774 1030 y Fs(:)p FF(join)p 900 1030 V 25 w(predicate)h Fv(=)d Fo(D)1321 1039 y Fm(4)1360 1030 y Fs(:)p FF(join)p 1486 1030 V 25 w(predicate)g Fv(;)601 1109 y FF(5.)i Fo(D)735 1118 y Fm(6)774 1109 y Fs(:)p FF(join)p 900 1109 V 25 w(predicate)h Fv(=)d Fo(D)1321 1118 y Fm(5)1360 1109 y Fs(:)p FF(join)p 1486 1109 V 25 w(predicate)g Fv(;)601 1188 y FF(6.)i Fo(D)735 1197 y Fm(6)774 1188 y Fs(:)p FF(record)p 966 1188 V 25 w(width)f Fv(=)f Fo(D)1295 1197 y Fm(2)1334 1188 y Fs(:)p FF(record)p 1526 1188 V 25 w(width)d Fv(+)f Fo(D)1847 1197 y Fm(3)1885 1188 y Fs(:)p FF(record)p 2077 1188 V 26 w(width)i Fv(;)601 1266 y FF(7.)k Fo(D)735 1275 y Fm(6)774 1266 y Fs(:)p FF(cardinality)i Fv(=)19 b FF(compute)p 1403 1266 V 26 w(cardinality)h Fv(\()p Fo(D)1814 1275 y Fm(2)1854 1266 y Fs(;)11 b Fo(D)1947 1275 y Fm(3)1986 1266 y Fv(\))17 b(;)386 1345 y FB(gg)1533 1496 y Fy(\(a\))i(Join)g(associativity)g(T)-7 b(-rule)p 369 1598 3146 4 v 386 1648 a Fv(\()p FF(JOIN)19 b(?op)p 675 1648 20 4 v 25 w(ar)o(g5)i Fv(\(\()p FF(JOIN)f(?op)p 1150 1648 V 25 w(ar)o(g4)g Fv(\(?1)h(?2\)\))g(?3\)\))g FB(!)e Fv(\()p FF(JOIN)h(?op)p 2089 1648 V 25 w(ar)o(g7)g Fv(\(?1)h(\()p FF(JOIN)f(?op)p 2652 1648 V 25 w(ar)o(g6)g Fv(\(?2)h(?3\)\)\)\))292 b FF(\(6.2\))386 1752 y(\045cond)p 573 1752 V 25 w(code)386 1831 y FB(ff)601 1909 y FF(1.)22 b(NO)p 773 1909 V 24 w(OP)17 b(;)601 1988 y(2.)22 b(if)c Fv(\(!\()p FF(is)p 853 1988 V 24 w(associative)i Fv(\()p FF(?op)p 1307 1988 V 26 w(ar)o(g5)g FB(!)f FF(op)p 1625 1988 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1855 1988 V 25 w(predicate)s Fs(;)12 b Fv(?2)20 b FB(!)f FF(expr)q Fs(:)p FF(ar)o(gument)q Fs(:)p FF(log)p 2824 1988 V 25 w(prop)h FB(!)f FF(attributes)t Fv(\)\))768 2093 y @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.8 neg 126.85966 9.8 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial(&&\()p FF(?op)p 1004 2093 V 25 w(ar)o(g5)h FB(!)f FF(op)p 1321 2093 V 25 w(ar)o(g)p Fs(:)p FF(layer)i Fs(<)p Fv(=)f(1\))66 b(\))736 2214 y FF(REJECT)16 b Fv(;)386 2293 y FB(gg)386 2372 y FF(\045appl)p 558 2372 V 25 w(code)386 2451 y FB(ff)601 2530 y FF(3.)22 b(?op)p 772 2530 V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090 2530 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2530 V 25 w(predicate)k Fv(=)c FF(?op)p 1777 2530 V 25 w(ar)o(g5)h FB(!)g FF(op)p 2095 2530 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2530 V 25 w(predicate)g Fv(;)601 2609 y FF(3.)i(?op)p 772 2609 V 25 w(ar)o(g7)f FB(!)e FF(log)p 1108 2609 V 25 w(prop)h Fv(=)f FF(?op)p 1443 2609 V 25 w(ar)o(g5)i FB(!)e FF(log)p 1779 2609 V 25 w(prop)e Fv(;)601 2710 y FF(3.)54 b @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792 neg 181.5572 9.30391 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial(?op)p 804 2710 V 25 w(ar)o(g7)20 b FB(!)f FF(op)p 1121 2710 V 25 w(ar)o(g)p Fs(:)p FF(layer)i Fv(=)f FF(?op)p 1571 2710 V 25 w(ar)o(g5)g FB(!)f FF(op)p 1888 2710 V 24 w(ar)o(g)q Fs(:)p FF(layer)f Fv(;)601 2828 y FF(4.)k(?op)p 772 2828 V 25 w(ar)o(g7)f FB(!)e FF(op)p 1090 2828 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2828 V 25 w(predicate)k Fv(=)c FF(?op)p 1777 2828 V 25 w(ar)o(g4)h FB(!)g FF(op)p 2095 2828 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2828 V 25 w(predicate)g Fv(;)601 2907 y FF(5.)i(?op)p 772 2907 V 25 w(ar)o(g6)f FB(!)e FF(op)p 1090 2907 V 24 w(ar)o(g)q Fs(:)p FF(join)p 1320 2907 V 25 w(predicate)k Fv(=)c FF(?op)p 1777 2907 V 25 w(ar)o(g5)h FB(!)g FF(op)p 2095 2907 V 24 w(ar)o(g)p Fs(:)p FF(join)p 2324 2907 V 25 w(predicate)g Fv(;)601 2986 y FF(6.)i(NO)p 773 2986 V 24 w(OP)17 b(;)601 3065 y(7.)22 b(NO)p 773 3065 V 24 w(OP)17 b(;)601 3165 y(8.)54 b @beginspecial @setspecial tx@Dict begin STP newpath 0.8 SLW 0. setgray 0. true 3.8 neg 5.52792 neg 104.77599 9.23198 .5 Frame gsave 3.0 -45 PtoC Shadow 0.5 setgray gsave fill grestore stroke grestore gsave 1. setgray gsave fill grestore stroke grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore end @endspecial(?op)p 804 3165 V 25 w(ar)o(g6)20 b FB(!)f FF(op)p 1121 3165 V 25 w(ar)o(g)p Fs(:)p FF(layer)i Fv(=)f(1)d(;)386 3287 y FB(gg)423 3437 y Fy(\(b\))j(P2V)-7 b(-generated)21 b(trans)p 1140 3437 23 4 v 27 w(rule)f(corresponding)j(to)d(the)g(T)-7 b(-rule)19 b(in)h(\(a\).)28 b(Statement)20 b(numbers)h(correspond)h(to) e(the)423 3528 y(same)f(numbered)h(statements)e(in)h(\(a\).)24 b(Boxed)19 b(clauses)g(and)g(statements)g(are)f(speci\256c)h(to)f (layered)h(optimizers)g(\(cf.)423 3620 y(Figure)g(4.6\(b\)\).)p 3562 3744 4 3341 v 318 3747 3247 4 v 3564 3764 19 3348 v 335 3764 3247 19 v 300 3960 a FP(Figure)29 b(6.9:)40 b(T)m(ranslating)30 b(the)f(join)f(associativity)k(T)-8 b(-rule)28 b(in)g(the)h(SEQUENTIAL)24 b(layer)29 b(\(from)f(the)300 4073 y(centralized)f(optimizer)e(in)e(Figure)h(6.8\))300 4449 y(tensibility)i(and)e(reusability)-6 b(.)583 4619 y(Another)25 b(aspect)f(of)g(a)e(layered)k(optimizer)f(speci\256cation) h(that)d(must)h(be)f(preserved)j(by)d(com-)300 4788 y(paction)j(is)d (that)i(of)e(the)i(hierarchical)i(nature)e(of)f(rules.)32 b(That)24 b(is,)f(the)h(semantics)i(of)e(layered)h(rule)g(sets)300 4957 y(\(rules)i(in)f(a)f(layer)i(applied)h(before)f(rules)g(in)f(a)f (lower)i(layer\))g(must)f(be)g(maintained)i(when)e(the)g(layers)1905 5349 y(92)p eop %%Page: 93 105 93 104 bop 300 391 a FP(are)26 b(compacted.)40 b(This)26 b(is)g(accomplished)j(by)d(the)g(P2V)f(preprocessor)k(as)d(follows.)39 b(The)25 b(preproces-)300 561 y(sor)i(automatically)i(introduces)h(a)c (new)g(property)-6 b(,)29 b(called)f(layer)l(,)g(that)f(records)i(the)d (layer)i(number)f(in)294 730 y(which)18 b(each)h(expression)i(was)c (generated.)1654 697 y Fv(6)1725 730 y FP(Initially)-6 b(,)21 b(all)d FD(new)f FP(expressions)22 b(have)c(a)g(layer)g (property)j(of)295 899 y(1)d(\(meaning)i(that)f(all)g(rules)h(in)e (layers)i(1)e(and)h(higher)i(can)e(be)f(applied)j(to)d(them\).)30 b(As)17 b(expressions)22 b(prop-)300 1069 y(agate)27 b(through)i(the)e(layers,)h(their)f(layer)g(property)i(values)f(are)e (assigned)j(by)e(the)f(P2V)g(preprocessor)297 1238 y(in)c(rule)f (actions.)32 b(In)21 b(other)i(words,)e(the)h(P2V)e(preprocessor)25 b(augments)e(rule)f(actions)h(with)e(statements)299 1408 y(that)i(set)f(the)h(layer)h(property)g(value)g(for)e(each)i(new)e (expression.)33 b(The)22 b(test)h(of)g(a)f(rule)h(is)f(also)h (modi\256ed)300 1577 y(to)h(ensure)i(that)f(an)g(expression)i (generated)h(in)c(a)g(lower)h(layer)g(is)f(not)h(transformed)i(in)e(a)f (layer)h(above.)300 1746 y(This)e(is)h(best)g(illustrated)i(by)e(an)f (example.)583 1916 y(Consider)37 b(the)e(join)g(associativity)k(T)-8 b(-rule)34 b(in)h(the)g(SEQUENTIAL)c(layer)k(shown)h(in)e(Fig-)300 2085 y(ure)25 b(6.9\(a\).)34 b(When)25 b(a)f(layered)j(optimizer)f (consisting)h(of)e(the)g(SEQUENTIAL)20 b(layer)25 b(\(e.g.,)g(the)g (cen-)300 2254 y(tralized)i(optimizer)g(in)f(Figure)g(6.4\))f(is)h (compacted,)h(the)f(actions)h(of)f(the)g(join)g(associativity)j(rule)d (are)300 2424 y(modi\256ed)f(to)f(assign)h(the)g(layer)g(property)h (values)g(of)e(any)g(new)g(expressions.)36 b(This)24 b(is)g(shown)g(in)g(Fig-)299 2593 y(ure)f(6.9\(b\).)32 b(The)22 b(boxed)i(statements)h(and)e(clause)h(\(in)f(the)g(test\))h (are)f(introduced)j(by)d(the)g(P2V)e(prepro-)300 2762 y(cessor)27 b(in)e(addition)i(to)e(the)h(other)g(transformations)j (described)f(in)d(Chapter)i(4.)35 b(Notice)26 b(that)g(the)g(root)300 2932 y(of)d(a)g(new)g(expression)j(obtained)g(by)d(a)g(rule)h(has)g (the)f(same)g(layer)i(number)f(as)f(the)h(root)g(of)f(the)g(old)h(ex-) 300 3101 y(pression;)29 b(this)d(is)g(because)h(they)g(belong)g(to)f (the)f(same)h(equivalence)j(class.)38 b(New)25 b(sub-expressions,)300 3271 y(however)l(,)j(have)e(their)h(layer)g(values)g(set)f(to)g(1;)h (thus,)g(all)f(rules,)h(beginning)h(from)e(the)g(\256rst)g(layer)l(,)h (are)300 3440 y(applicable)f(to)e(them.)583 3609 y(The)i(translation)j (of)c(I-rules)j(works)e(similarly)-6 b(,)27 b(i.e.,)f(the)g(test)g(of)g (an)g(I-rule)h(is)e(augmented)j(to)300 3779 y(check)d(if)e(the)h (operator)h(being)g(rewritten)g(was)e(generated)j(by)e(a)f(higher)i(or) e(lower)h(layer)-5 b(.)300 4145 y FO(6.5)119 b(Benchmarking)31 b(Layer)n(ed)f(Optimizers)300 4408 y FP(In)d(the)h(previous)i(section,) f(we)e(described)j(how)d(layered)i(optimizer)g(speci\256cations)i(are)c (compacted)298 4578 y(by)c(the)f(P2V)f(preprocessor)26 b(to)c(generate)i(monolithic)h(rule)d(sets.)31 b(The)22 b(question)i(that)f(naturally)i(arises)300 4747 y(is)k(whether)h(this)g (method)f(of)g(optimizer)i(construction)i(\(layered)e(speci\256cation)h (followed)e(by)f(com-)298 4916 y(paction\))24 b(results)f(in)e(a)h (loss)g(of)f(ef)n(\256ciency)j(of)e(the)g(generated)i(optimizer)-5 b(.)32 b(In)21 b(this)h(section,)i(we)d(present)p 300 4998 1320 4 v 400 5051 a Fu(6)434 5083 y Fy(Layers)e(are)g(numbered)i (in)e(ascending)h(order)m(,)f(beginning)i(from)e(1)g(for)g(the)g (topmost)g(layer)l(.)1905 5349 y FP(93)p eop %%Page: 94 106 94 105 bop 300 391 a FP(preliminary)28 b(experimental)f(results)g(that) f(demonstrate)i(that)d(the)h(ef)n(\256ciency)h(of)e(an)g(optimizer)i (is)e(not)300 561 y(sacri\256ced)g(by)f(using)g(a)g(layered)h (speci\256cation.)583 730 y(Consider)j(the)f(layered)h(centralized)h (optimizer)f(shown)f(in)g(Figure)g(6.4.)39 b(As)25 b(shown)i(in)f(Fig-) 300 899 y(ure)j(6.8,)g(this)g(can)g(be)g(compacted)h(to)e(a)h (monolithic)h(rule)f(set.)46 b(However)l(,)30 b(rules)g(in)e(the)h (monolithic)300 1069 y(set)g(do)g(not)g(have)h(exactly)g(the)f(same)g (rule)g(actions)i(as)e(a)f(non-layered)k(Prairie)d(speci\256cation)j (\(since)300 1238 y(the)d(P2V)e(preprocessor)33 b(adds)c(statements)i (to)d(track)i(layer)f(numbers\),)j(or)c(a)g(hand-written)k(V)-12 b(olcano)300 1408 y(speci\256cation)26 b(\(since)f(the)f(abstractions)j (in)c(Prairie)h(and)g(V)-12 b(olcano)25 b(are)f(dif)n(ferent\).)34 b(T)-6 b(o)22 b(verify)j(that)f(the)293 1577 y(ef)n(\256ciency)19 b(of)d(optimizers)j(generated)h(from)d(layered)h(speci\256cations)i(is) d(not)g(sacri\256ced,)j(we)c(conducted)300 1746 y(some)24 b(experiments)i(involving)g(optimizer)f(speci\256cations)i(for)c (centralized,)k(distributed,)f(and)e(repli-)300 1916 y(cated)32 b(DBMSs.)50 b(Each)31 b(optimizer)h(was)e(speci\256ed)i(in)f (three)g(ways:)46 b(layered)32 b(Prairie,)h(non-layered)299 2085 y(Prairie,)23 b(and)g(hand-coded)j(V)-12 b(olcano.)32 b(Each)22 b(resulting)j(optimizer)f(was)e(benchmarked)k(using)e(a)e (set)g(of)300 2254 y(randomly)j(generated)h(queries.)33 b(The)23 b(results)i(are)f(reported)h(below)-6 b(.)583 2424 y(The)28 b(benchmarking)j(of)d(the)h(layered)h(optimizers)g (consisted)g(of)e(optimizing)i(left-deep)h FH(N)10 b FP(-)292 2593 y(way)17 b(join)g(operator)i(trees,)g(for)d(varying)j (values)f(of)f FH(N)10 b FP(,)17 b(as)f(shown)h(in)g(Figure)g (6.10\(a\).)30 b(Random)17 b(queries)296 2762 y(were)i(generated)j (using)e(a)f(uniform)i(random)f(number)h(generator)l(,)i(as)c(in)g (Section)i(5.2.)29 b(The)19 b(set)h(of)f(rela-)297 2932 y(tions,)j(along)f(with)g(their)g(attributes,)i(cardinalities,)i(and)c (record)g(widths)h(was)e(\256xed.)29 b(The)21 b(order)g(of)f(re-)294 3101 y(lations)g(in)e(the)h(left-deep)i(tree)d(was)g(varied.)31 b(Each)18 b(join)h(had)g(an)f(equijoin)i(predicate,)i(with)c(the)g(two) g(join)297 3271 y(attributes)24 b(chosen)f(at)d(random)i(from)f(the)h (set)f(of)g(eligible)i(attributes)g(of)e(the)h(outer)g(and)f(inner)h (streams.)297 3440 y(For)e(the)h(distributed)i(DBMS)c(optimizers,)k(we) d(simulated)i(a)e(database)j(with)d(four)h(sites;)i(each)f(relation)300 3609 y(was)29 b(randomly)j(assigned)g(to)d(a)h(site.)50 b(For)29 b(the)h(replicated)i(DBMS)c(case,)k(there)e(were)g(two)f (replicas)300 3779 y(for)23 b(each)h(stored)h(\256le)d(referenced)k(in) d(an)h(operator)h(tree;)f(to)f(make)h(the)f(replication)j(meaningful,)g (each)300 3948 y(replica)f(of)f(a)f(given)h(stored)h(\256le)e(was)g (assumed)i(to)f(be)f(sorted)i(on)f(dif)n(ferent)i(attributes.)583 4117 y(For)i(each)h(value)g FH(N)38 b FP(of)28 b(the)h(number)g(of)f (joins,)i(we)d(generated)k(10)e(dif)n(ferent)h(queries)3375 4084 y Fv(7)3417 4117 y FP(,)f(and)300 4287 y(optimized)i(each)f(query) g(using)h(optimizers)g(generated)h(from)d(three)h(dif)n(ferent)i (speci\256cations:)46 b(lay-)300 4456 y(ered)29 b(Prairie,)g (non-layered)j(Prairie,)e(and)e(hand-coded)k(V)-12 b(olcano.)46 b(The)28 b(run)g(times)h(were)f(measured)297 4625 y(using)21 b(the)g(GNU)e Fi(time)e FP(command,)22 b(and)f(averaged)i(over)e(the)f (10)h(queries)h(to)f(generate)h(the)f(per)n(-query)300 4795 y(optimization)26 b(time.)31 b(Each)23 b(point)h(in)g(the)f (graph,)i(thus,)e(represents)k(the)c(average)i(CPU)d(time)h(for)g (opti-)p 300 4876 1320 4 v 400 4930 a Fu(7)434 4961 y Fy(W)-6 b(e)18 b(chose)h(10)f(instead)h(of)f(a)g(lar)o(ger)f(number)i (since)f(the)g(average)h(run)g(time)e(was)h(not)g(substantially)h(dif)o (ferent)f(for)f(more)300 5053 y(queries.)1905 5349 y FP(94)p eop %%Page: 95 107 95 106 bop 306 403 3272 4 v 306 3745 4 3342 v 838 1438 a tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 838 1438 a Fs(R)891 1447 y Fu(1)819 1301 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 819 1301 a FF(RET)882 1420 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl1 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 1122 1438 a tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.46666 1.1111 false .5 10.56842 InitRnode } NewNode end end 1122 1438 a Fs(R)1175 1447 y Fu(2)1103 1301 y tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1103 1301 a FF(RET)882 1420 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 952 1159 a tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 952 1159 a FF(JOIN)882 1420 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl1 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 882 1420 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodegetcl2 InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 1165 995 a tx@Dict begin 45. Rot end 1165 995 a 1118 999 a tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 0.0 false .5 11.3335 InitRnode } NewNode end end 1118 999 a Fs(:)12 b(:)f(:)1165 995 y tx@Dict begin 45. neg Rot end 1165 995 a 882 1420 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodejoingetcl1getcl2 /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 1386 1017 a tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.344 0.0 false .5 15.11191 InitRnode } NewNode end end 1386 1017 a FF(RET)1401 1155 y tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.46666 1.0 false .5 11.51984 InitRnode } NewNode end end 1401 1155 a Fs(R)1454 1163 y Fn(n)882 1420 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNodecln /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 1235 876 a tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.43198 0.08394 false .5 17.32784 InitRnode } NewNode end end 1235 876 a FF(JOIN)882 1420 y tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodedots InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 882 1420 a tx@Dict begin gsave STV newpath 0.8 SLW 0. setgray /ArrowA { moveto } def /ArrowB { } def tx@NodeDict begin 0.0 0.0 neg 3.0 3.0 /TheNoderoot /TheNodegetcln InitNC { NCLine } if end gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore grestore end 882 1420 a 668 1897 a Fy(\(a\))19 b Fq(N)8 b Fy(-way)19 b(join)g(benchmark)i(query)p 1951 2087 4 1660 v 2003 1763 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 461.724976 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_layered_cent_vs_volcano.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 621 362 m 621 372 l 822 362 m 822 372 l 1023 362 m 1023 372 l 1225 362 m 1225 372 l 1426 362 m 1426 372 l 1627 362 m 1627 372 l 1828 362 m 1828 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 621 1704 m 621 1694 l 822 1704 m 822 1694 l 1023 1704 m 1023 1694 l 1225 1704 m 1225 1694 l 1426 1704 m 1426 1694 l 1627 1704 m 1627 1694 l 1828 1704 m 1828 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 586 m 430 586 l 420 809 m 430 809 l 420 1033 m 430 1033 l 420 1257 m 430 1257 l 420 1480 m 430 1480 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 586 m 2020 586 l 2030 809 m 2020 809 l 2030 1033 m 2020 1033 l 2030 1257 m 2020 1257 l 2030 1480 m 2020 1480 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 809 m 440 809 l 420 1257 m 440 1257 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 809 m 2010 809 l 2030 1257 m 2010 1257 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0) RJ (0) show grestore newpath 366 809 m gsave 366 809 translate 0 rotate 0 -30 m (200) RJ (200) show grestore newpath 366 1257 m gsave 366 1257 translate 0 rotate 0 -30 m (400) RJ (400) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (600) RJ (600) show grestore newpath /Times-Roman findfont 90 scalefont setfont 164 1033 m gsave 164 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time) CS (Average CPU Time) show grestore newpath 420 375 m 621 379 l 822 391 l 1023 410 l 1225 445 l 1426 514 l 1627 658 l 1828 923 l 2030 1502 l /Times-Roman findfont 90 scalefont setfont stroke 420 375 30 0 360 arc gsave fill grestore stroke 621 379 30 0 360 arc gsave fill grestore stroke 822 391 30 0 360 arc gsave fill grestore stroke 1023 410 30 0 360 arc gsave fill grestore stroke 1225 445 30 0 360 arc gsave fill grestore stroke 1426 514 30 0 360 arc gsave fill grestore stroke 1627 658 30 0 360 arc gsave fill grestore stroke 1828 923 30 0 360 arc gsave fill grestore stroke 2030 1502 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 374 m 621 378 l 822 389 l 1023 408 l 1225 442 l 1426 513 l 1627 653 l 1828 918 l 2030 1500 l /Times-Roman findfont 90 scalefont setfont stroke 395 349 m 395 399 l 445 399 l 445 349 l closepath gsave eofill grestore stroke 596 353 m 596 403 l 646 403 l 646 353 l closepath gsave eofill grestore stroke 797 364 m 797 414 l 847 414 l 847 364 l closepath gsave eofill grestore stroke 998 383 m 998 433 l 1048 433 l 1048 383 l closepath gsave eofill grestore stroke 1200 417 m 1200 467 l 1250 467 l 1250 417 l closepath gsave eofill grestore stroke 1401 488 m 1401 538 l 1451 538 l 1451 488 l closepath gsave eofill grestore stroke 1602 628 m 1602 678 l 1652 678 l 1652 628 l closepath gsave eofill grestore stroke 1803 893 m 1803 943 l 1853 943 l 1853 893 l closepath gsave eofill grestore stroke 2005 1475 m 2005 1525 l 2055 1525 l 2055 1475 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 374 m 621 377 l 822 387 l 1023 405 l 1225 438 l 1426 505 l 1627 642 l 1828 900 l 2030 1474 l /Times-Roman findfont 90 scalefont setfont stroke 420 404 m 390 374 l 420 344 l 450 374 l closepath gsave eofill grestore stroke 621 407 m 591 377 l 621 347 l 651 377 l closepath gsave eofill grestore stroke 822 417 m 792 387 l 822 357 l 852 387 l closepath gsave eofill grestore stroke 1023 435 m 993 405 l 1023 375 l 1053 405 l closepath gsave eofill grestore stroke 1225 468 m 1195 438 l 1225 408 l 1255 438 l closepath gsave eofill grestore stroke 1426 535 m 1396 505 l 1426 475 l 1456 505 l closepath gsave eofill grestore stroke 1627 672 m 1597 642 l 1627 612 l 1657 642 l closepath gsave eofill grestore stroke 1828 930 m 1798 900 l 1828 870 l 1858 900 l closepath gsave eofill grestore stroke 2030 1504 m 2000 1474 l 2030 1444 l 2060 1474 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 716 1328 m 716 1664 l 1875 1664 l 1875 1328 l 716 1328 l stroke /Times-Roman findfont 90 scalefont setfont 765 1608 m 961 1608 l stroke 765 1608 30 0 360 arc gsave fill grestore stroke 961 1608 30 0 360 arc gsave fill grestore stroke 1010 1608 m gsave 1010 1608 translate 0 rotate 0 -30 m (Prairie \(Layered\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont 765 1496 m 961 1496 l stroke 740 1471 m 740 1521 l 790 1521 l 790 1471 l closepath gsave eofill grestore stroke 936 1471 m 936 1521 l 986 1521 l 986 1471 l closepath gsave eofill grestore stroke 1010 1496 m gsave 1010 1496 translate 0 rotate 0 -30 m (Prairie \(Non-layered\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont 765 1384 m 961 1384 l stroke 765 1414 m 735 1384 l 765 1354 l 795 1384 l closepath gsave eofill grestore stroke 961 1414 m 931 1384 l 961 1354 l 991 1384 l closepath gsave eofill grestore stroke 1010 1384 m gsave 1010 1384 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 2058 1897 a(\(b\))30 b(Query)f(optimization)h(time)f(for)g (the)g(central-)2058 1988 y(ized)20 b(DBMS)e(optimizer)h(\(Figure)g (6.4\))p 379 2090 3148 4 v 427 3395 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 461.724976 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_layered_dist_vs_volcano.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap 0.000000 0.000000 0.000000 setrgbcolor 1 setlinewidth /Times-Italic findfont 60 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 621 362 m 621 372 l 822 362 m 822 372 l 1023 362 m 1023 372 l 1225 362 m 1225 372 l 1426 362 m 1426 372 l 1627 362 m 1627 372 l 1828 362 m 1828 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 621 1704 m 621 1694 l 822 1704 m 822 1694 l 1023 1704 m 1023 1694 l 1225 1704 m 1225 1694 l 1426 1704 m 1426 1694 l 1627 1704 m 1627 1694 l 1828 1704 m 1828 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 586 m 430 586 l 420 809 m 430 809 l 420 1033 m 430 1033 l 420 1257 m 430 1257 l 420 1480 m 430 1480 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 586 m 2020 586 l 2030 809 m 2020 809 l 2030 1033 m 2020 1033 l 2030 1257 m 2020 1257 l 2030 1480 m 2020 1480 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 809 m 440 809 l 420 1257 m 440 1257 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 809 m 2010 809 l 2030 1257 m 2010 1257 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0) RJ (0) show grestore newpath 366 809 m gsave 366 809 translate 0 rotate 0 -30 m (2000) RJ (2000) show grestore newpath 366 1257 m gsave 366 1257 translate 0 rotate 0 -30 m (4000) RJ (4000) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (6000) RJ (6000) show grestore newpath /Times-Roman findfont 90 scalefont setfont 104 1033 m gsave 104 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time) CS (Average CPU Time) show grestore newpath 420 376 m 621 375 l 822 379 l 1023 385 l 1225 402 l 1426 442 l 1627 515 l 1828 715 l 2030 1431 l /Times-Roman findfont 90 scalefont setfont stroke 420 376 30 0 360 arc gsave fill grestore stroke 621 375 30 0 360 arc gsave fill grestore stroke 822 379 30 0 360 arc gsave fill grestore stroke 1023 385 30 0 360 arc gsave fill grestore stroke 1225 402 30 0 360 arc gsave fill grestore stroke 1426 442 30 0 360 arc gsave fill grestore stroke 1627 515 30 0 360 arc gsave fill grestore stroke 1828 715 30 0 360 arc gsave fill grestore stroke 2030 1431 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 373 m 621 374 l 822 379 l 1023 381 l 1225 401 l 1426 431 l 1627 502 l 1828 695 l 2030 1495 l /Times-Roman findfont 90 scalefont setfont stroke 395 348 m 395 398 l 445 398 l 445 348 l closepath gsave eofill grestore stroke 596 349 m 596 399 l 646 399 l 646 349 l closepath gsave eofill grestore stroke 797 354 m 797 404 l 847 404 l 847 354 l closepath gsave eofill grestore stroke 998 356 m 998 406 l 1048 406 l 1048 356 l closepath gsave eofill grestore stroke 1200 376 m 1200 426 l 1250 426 l 1250 376 l closepath gsave eofill grestore stroke 1401 406 m 1401 456 l 1451 456 l 1451 406 l closepath gsave eofill grestore stroke 1602 477 m 1602 527 l 1652 527 l 1652 477 l closepath gsave eofill grestore stroke 1803 670 m 1803 720 l 1853 720 l 1853 670 l closepath gsave eofill grestore stroke 2005 1470 m 2005 1520 l 2055 1520 l 2055 1470 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 373 m 621 374 l 822 379 l 1023 381 l 1225 400 l 1426 431 l 1627 502 l 1828 695 l 2030 1495 l /Times-Roman findfont 90 scalefont setfont stroke 420 403 m 390 373 l 420 343 l 450 373 l closepath gsave eofill grestore stroke 621 404 m 591 374 l 621 344 l 651 374 l closepath gsave eofill grestore stroke 822 409 m 792 379 l 822 349 l 852 379 l closepath gsave eofill grestore stroke 1023 411 m 993 381 l 1023 351 l 1053 381 l closepath gsave eofill grestore stroke 1225 430 m 1195 400 l 1225 370 l 1255 400 l closepath gsave eofill grestore stroke 1426 461 m 1396 431 l 1426 401 l 1456 431 l closepath gsave eofill grestore stroke 1627 532 m 1597 502 l 1627 472 l 1657 502 l closepath gsave eofill grestore stroke 1828 725 m 1798 695 l 1828 665 l 1858 695 l closepath gsave eofill grestore stroke 2030 1525 m 2000 1495 l 2030 1465 l 2060 1495 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 716 1328 m 716 1664 l 1875 1664 l 1875 1328 l 716 1328 l stroke /Times-Roman findfont 90 scalefont setfont 765 1608 m 961 1608 l stroke 765 1608 30 0 360 arc gsave fill grestore stroke 961 1608 30 0 360 arc gsave fill grestore stroke 1010 1608 m gsave 1010 1608 translate 0 rotate 0 -30 m (Prairie \(Layered\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont 765 1496 m 961 1496 l stroke 740 1471 m 740 1521 l 790 1521 l 790 1471 l closepath gsave eofill grestore stroke 936 1471 m 936 1521 l 986 1521 l 986 1471 l closepath gsave eofill grestore stroke 1010 1496 m gsave 1010 1496 translate 0 rotate 0 -30 m (Prairie \(Non-layered\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont 765 1384 m 961 1384 l stroke 765 1414 m 735 1384 l 765 1354 l 795 1384 l closepath gsave eofill grestore stroke 961 1414 m 931 1384 l 961 1354 l 991 1384 l closepath gsave eofill grestore stroke 1010 1384 m gsave 1010 1384 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 483 3529 a(\(c\))c(Query)g(optimization)g(time)f(for)g (the)h(distributed)483 3621 y(DBMS)k(optimizer)g(\(Figure)f(6.6\))p 1951 3720 4 1630 v 2003 3395 a @beginspecial 18.067490 @llx 18.067490 @lly 554.070007 @urx 461.724976 @ury 1771 @rwi @setspecial %%BeginDocument: runtime_layered_repl_vs_volcano.ps /m {moveto} bind def /l {lineto} bind def /RJ { stringwidth neg exch neg exch rmoveto } bind def /CS { stringwidth 2 div neg exch 2 div neg exch rmoveto } bind def 0.25 0.25 scale 1 setlinecap /Times-Italic findfont 90 scalefont setfont [] 0 setdash 420 362 m 420 1704 l 2030 1704 l 2030 362 l 420 362 l stroke [] 0 setdash 420 362 m 420 372 l 621 362 m 621 372 l 822 362 m 822 372 l 1023 362 m 1023 372 l 1225 362 m 1225 372 l 1426 362 m 1426 372 l 1627 362 m 1627 372 l 1828 362 m 1828 372 l 2030 362 m 2030 372 l 420 1704 m 420 1694 l 621 1704 m 621 1694 l 822 1704 m 822 1694 l 1023 1704 m 1023 1694 l 1225 1704 m 1225 1694 l 1426 1704 m 1426 1694 l 1627 1704 m 1627 1694 l 1828 1704 m 1828 1694 l 2030 1704 m 2030 1694 l stroke 420 362 m 420 382 l 621 362 m 621 382 l 822 362 m 822 382 l 1023 362 m 1023 382 l 1225 362 m 1225 382 l 1426 362 m 1426 382 l 1627 362 m 1627 382 l 1828 362 m 1828 382 l 2030 362 m 2030 382 l 420 1704 m 420 1684 l 621 1704 m 621 1684 l 822 1704 m 822 1684 l 1023 1704 m 1023 1684 l 1225 1704 m 1225 1684 l 1426 1704 m 1426 1684 l 1627 1704 m 1627 1684 l 1828 1704 m 1828 1684 l 2030 1704 m 2030 1684 l /Times-Italic findfont 90 scalefont setfont /Times-Roman findfont 90 scalefont setfont stroke 420 287 m gsave 420 287 translate 0 rotate 0 -30 m (0) CS (0) show grestore newpath 621 287 m gsave 621 287 translate 0 rotate 0 -30 m (1) CS (1) show grestore newpath 822 287 m gsave 822 287 translate 0 rotate 0 -30 m (2) CS (2) show grestore newpath 1023 287 m gsave 1023 287 translate 0 rotate 0 -30 m (3) CS (3) show grestore newpath 1225 287 m gsave 1225 287 translate 0 rotate 0 -30 m (4) CS (4) show grestore newpath 1426 287 m gsave 1426 287 translate 0 rotate 0 -30 m (5) CS (5) show grestore newpath 1627 287 m gsave 1627 287 translate 0 rotate 0 -30 m (6) CS (6) show grestore newpath 1828 287 m gsave 1828 287 translate 0 rotate 0 -30 m (7) CS (7) show grestore newpath 2030 287 m gsave 2030 287 translate 0 rotate 0 -30 m (8) CS (8) show grestore newpath /Times-Roman findfont 90 scalefont setfont 1225 137 m gsave 1225 137 translate 0 rotate 0 0 m (Number of joins) CS (Number of joins) show grestore newpath 420 362 m 430 362 l 420 586 m 430 586 l 420 809 m 430 809 l 420 1033 m 430 1033 l 420 1257 m 430 1257 l 420 1480 m 430 1480 l 420 1704 m 430 1704 l 2030 362 m 2020 362 l 2030 586 m 2020 586 l 2030 809 m 2020 809 l 2030 1033 m 2020 1033 l 2030 1257 m 2020 1257 l 2030 1480 m 2020 1480 l 2030 1704 m 2020 1704 l stroke 420 362 m 440 362 l 420 809 m 440 809 l 420 1257 m 440 1257 l 420 1704 m 440 1704 l 2030 362 m 2010 362 l 2030 809 m 2010 809 l 2030 1257 m 2010 1257 l 2030 1704 m 2010 1704 l /Times-Roman findfont 90 scalefont setfont stroke 366 362 m gsave 366 362 translate 0 rotate 0 -30 m (0) RJ (0) show grestore newpath 366 809 m gsave 366 809 translate 0 rotate 0 -30 m (500) RJ (500) show grestore newpath 366 1257 m gsave 366 1257 translate 0 rotate 0 -30 m (1000) RJ (1000) show grestore newpath 366 1704 m gsave 366 1704 translate 0 rotate 0 -30 m (1500) RJ (1500) show grestore newpath /Times-Roman findfont 90 scalefont setfont 104 1033 m gsave 104 1033 translate 90 rotate 0 0 m (CPU time \(milliseconds\)) CS (CPU time \(milliseconds\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont /Times-Bold findfont 90 scalefont setfont 1225 1872 m gsave 1225 1872 translate 0 rotate 0 0 m (N-way Join Queries) CS (N-way Join Queries) show grestore newpath /Times-Bold findfont 84 scalefont setfont /Times-Roman findfont 84 scalefont setfont 1225 1774 m gsave 1225 1774 translate 0 rotate 0 0 m (Average CPU Time) CS (Average CPU Time) show grestore newpath 420 401 m 621 405 l 822 398 l 1023 407 l 1225 428 l 1426 473 l 1627 573 l 1828 899 l 2030 1357 l /Times-Roman findfont 90 scalefont setfont stroke 420 401 30 0 360 arc gsave fill grestore stroke 621 405 30 0 360 arc gsave fill grestore stroke 822 398 30 0 360 arc gsave fill grestore stroke 1023 407 30 0 360 arc gsave fill grestore stroke 1225 428 30 0 360 arc gsave fill grestore stroke 1426 473 30 0 360 arc gsave fill grestore stroke 1627 573 30 0 360 arc gsave fill grestore stroke 1828 899 30 0 360 arc gsave fill grestore stroke 2030 1357 30 0 360 arc gsave fill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 398 m 621 414 l 822 404 l 1023 404 l 1225 433 l 1426 476 l 1627 575 l 1828 900 l 2030 1312 l /Times-Roman findfont 90 scalefont setfont stroke 395 373 m 395 423 l 445 423 l 445 373 l closepath gsave eofill grestore stroke 596 389 m 596 439 l 646 439 l 646 389 l closepath gsave eofill grestore stroke 797 379 m 797 429 l 847 429 l 847 379 l closepath gsave eofill grestore stroke 998 379 m 998 429 l 1048 429 l 1048 379 l closepath gsave eofill grestore stroke 1200 408 m 1200 458 l 1250 458 l 1250 408 l closepath gsave eofill grestore stroke 1401 451 m 1401 501 l 1451 501 l 1451 451 l closepath gsave eofill grestore stroke 1602 550 m 1602 600 l 1652 600 l 1652 550 l closepath gsave eofill grestore stroke 1803 875 m 1803 925 l 1853 925 l 1853 875 l closepath gsave eofill grestore stroke 2005 1287 m 2005 1337 l 2055 1337 l 2055 1287 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont 420 398 m 621 413 l 822 404 l 1023 403 l 1225 431 l 1426 475 l 1627 573 l 1828 899 l 2030 1306 l /Times-Roman findfont 90 scalefont setfont stroke 420 428 m 390 398 l 420 368 l 450 398 l closepath gsave eofill grestore stroke 621 443 m 591 413 l 621 383 l 651 413 l closepath gsave eofill grestore stroke 822 434 m 792 404 l 822 374 l 852 404 l closepath gsave eofill grestore stroke 1023 433 m 993 403 l 1023 373 l 1053 403 l closepath gsave eofill grestore stroke 1225 461 m 1195 431 l 1225 401 l 1255 431 l closepath gsave eofill grestore stroke 1426 505 m 1396 475 l 1426 445 l 1456 475 l closepath gsave eofill grestore stroke 1627 603 m 1597 573 l 1627 543 l 1657 573 l closepath gsave eofill grestore stroke 1828 929 m 1798 899 l 1828 869 l 1858 899 l closepath gsave eofill grestore stroke 2030 1336 m 2000 1306 l 2030 1276 l 2060 1306 l closepath gsave eofill grestore stroke /Times-Roman findfont 84 scalefont setfont /Times-Roman findfont 90 scalefont setfont 716 1328 m 716 1664 l 1875 1664 l 1875 1328 l 716 1328 l stroke /Times-Roman findfont 90 scalefont setfont 765 1608 m 961 1608 l stroke 765 1608 30 0 360 arc gsave fill grestore stroke 961 1608 30 0 360 arc gsave fill grestore stroke 1010 1608 m gsave 1010 1608 translate 0 rotate 0 -30 m (Prairie \(Layered\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont 765 1496 m 961 1496 l stroke 740 1471 m 740 1521 l 790 1521 l 790 1471 l closepath gsave eofill grestore stroke 936 1471 m 936 1521 l 986 1521 l 986 1471 l closepath gsave eofill grestore stroke 1010 1496 m gsave 1010 1496 translate 0 rotate 0 -30 m (Prairie \(Non-layered\)) show grestore newpath /Times-Roman findfont 90 scalefont setfont 765 1384 m 961 1384 l stroke 765 1414 m 735 1384 l 765 1354 l 795 1384 l closepath gsave eofill grestore stroke 961 1414 m 931 1384 l 961 1354 l 991 1384 l closepath gsave eofill grestore stroke 1010 1384 m gsave 1010 1384 translate 0 rotate 0 -30 m (Volcano) show grestore newpath showpage %%EndDocument @endspecial 2058 3529 a(\(d\))g(Query)h(optimization)g(time)e(for)h (the)g(replicated)2058 3621 y(DBMS)h(optimizer)g(\(Figure)g(6.7\))p 3574 3745 4 3342 v 306 3748 3272 4 v 3576 3765 19 3349 v 322 3765 3272 19 v 1097 3960 a FP(Figure)24 b(6.10:)31 b(Benchmarking)26 b(layered)g(optimizers)300 4337 y(mizing)e(10)g(dif)n (ferent)i(queries.)32 b(As)23 b(before,)i(all)e(experiments)j(were)e (performed)h(on)f(a)f(lightly)i(loaded)300 4506 y(DECstation)f (5000/200)i(running)g(Ultrix)e(4.2.)582 4676 y(The)e(optimization)j (times)e(for)g(the)f(layered)j(Prairie,)e(non-layered)i(Prairie,)e(and) g(hand-coded)300 4845 y(V)-12 b(olcano)28 b(optimizers)g(are)e(shown)h (in)f(Figures)h(6.10\(b\))2087 4812 y Fv(8)2129 4845 y FP(,)e(6.10\(c\),)j(and)f(6.10\(d\))g(for)g(the)f(centralized)p 300 4926 1320 4 v 400 4980 a Fu(8)434 5012 y Fy(The)18 b(optimization)f(times)g(for)g(both)h(non-layered)h(Prairie)d(and)h(V) -10 b(olcano)19 b(for)e(the)g(centralized)h(optimizer)f(are)g(the)g (same)1905 5349 y FP(95)p eop %%Page: 96 108 96 107 bop 297 391 a FP(\(Figure)21 b(6.4\),)h(distributed)h(\(Figure)f (6.6\),)f(and)g(replicated)j(\(Figure)d(6.7\))g(DBMS)e(optimizers,)k (respec-)300 561 y(tively)-6 b(.)42 b(In)26 b(each)i(case,)f(we)f(can)h (see)g(that)g(the)g(three)h(speci\256cations)i(are)d(virtually)i (equally)f(ef)n(\256cient,)296 730 y(con\256rming)21 b(the)f(hypothesis)j(that)e(layered)h(optimizers)f(need)g(not)f (sacri\256ce)i(any)e(performance.)32 b(More)293 899 y(experiments)19 b(are)e(needed,)i(however)l(,)h(to)d(verify)h(that)f(the)g(performance) j(is)c(good)i(when)f(scaled)h(to)f FD(lar)m(ge)300 1069 y FP(layered)25 b(optimizers.)577 1238 y(Another)19 b(metric)g(which)f (can)g(measure)h(the)f(usefulness)j(of)d(layered)i(optimizer)f (speci\256cations)298 1408 y(is)i(the)g(ease)h(with)f(which)h(they)g (can)g(be)f(tailored)i(to)f(dif)n(ferent)h(applications.)34 b(In)21 b(this)h(case,)g(the)g(layered)293 1577 y(approach)d(is)d (useful)i(because)h(it)e(helps)g(a)g(DBI)e(to)i(clearly)h(see)f(the)g (ef)n(fects)i(of)e(any)g(change)h(on)f(the)g(search)296 1746 y(space)k(of)f(an)g(optimizer)-5 b(.)32 b(For)19 b(instance,)k(the)d(Open)g(OODB)e(optimizer)j(results)h(in)e(an)g (extremely)i(lar)n(ge)300 1916 y(search)30 b(space)f(for)f(certain)i (queries.)47 b(If)28 b(it)g(were)g(implemented)i(using)f(layers,)i (then)e(the)f(DBI)f(could)299 2085 y(more)22 b(easily)i(experiment)h (with)d(adding)i(new)e(rules)i(and)f(layers)g(in)g(various)h(layered)g (con\256gurations.)297 2254 y(It)d(is)f(in)h(this)h(respect)g(that)g (we)e(believe)i(that)g(the)f(layered)i(approach)g(will)d(yield)i(the)g (most)e(productivity)300 2424 y(gains.)300 2790 y FO(6.6)119 b(Related)31 b(W)-7 b(ork)298 3053 y FP(Optimizer)23 b(design)g(and)f(implementation)j(using)e(pre-de\256ned)g (building-blocks)k(has)22 b(been)h(proposed)298 3223 y(by)e(other)i(researchers.)33 b(Most)22 b(of)f(these)i(proposals)h (follow)e(a)f(rule-based)k(paradigm.)31 b(In)22 b(this)g(section,)300 3392 y(we)28 b(brie\257y)h(describe)i(some)e(of)g(these)g(approaches.) 50 b(The)28 b(main)h(problem)h(with)f(these)g(ideas)h(is)f(that)294 3562 y(they)19 b(are)g(paper)g(proposals,)j(so)c(it)h(is)f(not)g (immediately)j(clear)e(how)f(well)g(they)h(might)g(work)f(in)g (practice.)297 3731 y(Moreover)l(,)24 b(as)d(we)f(have)i(seen)f(in)g (Chapter)h(4,)f(it)g(is)g(important)i(to)e(have)h(a)e(compiler)j(that)e (can)h(generate)300 3900 y(ef)n(\256cient,)27 b(compact)g(optimizers)h (from)e(a)f(speci\256cation)k(constructed)g(using)d(components.)40 b(None)26 b(of)300 4070 y(the)e(proposals)i(discussed)g(in)e(this)g (section)h(describe)h(how)d(that)h(is)f(done,)i(or)e(even)h(if)g(it)f (is)g(possible.)583 4239 y(Sciore)32 b(and)f(Sieg)g([44])g(describe)i (an)e(optimizer)i(generator)g(model)e(that)h(allows)f(a)g(DBI)e(to)296 4408 y(construct)22 b(a)d(rule-based)k(optimizer)e(using)g FD(modules)p FP(.)31 b(Each)19 b(module)i(consists)g(of)f FD(term)g(r)m(ewrite)g(rules)p FP(,)298 4578 y(where)i(rewrite)g(rules) g(transform)h(terms)f(in)f(a)g(relational)j(algebra.)32 b(These)22 b(rules)g(can)g(have)g FD(conditions)300 4747 y FP(associated)28 b(with)d(them.)36 b(Each)25 b(module)h(has)f (exported)j(and)d(imported)i(interfaces)h(which)d(consist)i(of)300 4916 y(terms.)p 300 4979 1320 4 v 300 5064 a Fy(as)19 b(those)g(shown)h(in)f(Figure)g(5.1\(b\).)1905 5349 y FP(96)p eop %%Page: 97 109 97 108 bop 583 391 a FP(Each)24 b(module)h(in)f(Sciore)h(and)f(Sieg')-5 b(s)25 b(framework)g(is)f(allowed)h(to)f(have)h(rewrite)f(rules)h(in)f (its)300 561 y(own)h(relational)j(algebra.)37 b(A)24 b(module)i(can)g(also)g(specify)g(its)g(search)g(space,)h(cost)f (model,)f(individual)300 730 y(search)32 b(strategy)g(\(e.g.,)f (heuristic,)j(exhaustive,)h(simulated)d(annealing,)i(etc.\),)e (termination)h(policy)-6 b(,)300 899 y(and)30 b(rule)g(properties)i (\(e.g.,)e(rule)g(priorities)i(that)e(de\256ne)f(the)h(order)g(in)g (which)f(rules)i(are)e(applied)i(in)300 1069 y(each)f(module\).)50 b(There)30 b(are)g(also)g FD(knobs)h FP(that)f(a)f(DBI)g(can)h(set)f (before)i(optimization)i(starts.)50 b(These)300 1238 y(knobs)25 b(are)f(essentially)i(initialization)i(steps)c(that)g(set)g (various)h(parameters)h(of)d(a)g(module.)576 1408 y(An)16 b(optimizer)j(is)e(constructed)j(by)d(stacking)i(various)g(modules)f (together)-5 b(.)31 b(The)16 b(order)i(of)f(mod-)299 1577 y(ules)23 b(de\256nes)g(the)g(order)g(of)g(term)f(rewrite)h(rules) g(that)h(are)e(applied)i(to)f(a)f(term.)30 b(A)21 b(module)j(can)f (request)299 1746 y(another)i(to)e(optimize)i(a)d(term)h(and)g(return)i (its)e(results.)32 b(Thus,)23 b(communication)j(between)e(modules)g(is) 300 1916 y(bi-directional.)583 2085 y(In)i(theory)-6 b(,)27 b(Sciore)f(and)g(Sieg)f(propose)i(a)e(very)i(general)g (framework)f(for)g(optimizer)h(design.)297 2254 y(However)l(,)22 b(since)f(this)h(model)f(is)f(not)h(implemented)i(\(to)e(our)g (knowledge\),)j(it)c(is)h(unclear)h(whether)g(this)297 2424 y(approach)h(is)d(used)i(as)f(an)f(interpreter)k(\(thus)e (degrading)h(performance\),)h(or)c(to)h(generate)i(a)d(monolithic)300 2593 y(optimizer)-5 b(.)33 b(The)24 b(algorithm)h(for)f(the)h(latter)f (is)g(not)g(described,)j(so)c(the)i(performance)h(of)e(the)g(resulting) 300 2762 y(optimizer)h(is)e(hard)h(to)f(predict.)32 b(Also,)23 b(it)g(is)g(not)h(evident)h(whether)f(the)g(general)h(nature)f(of)g (the)f(frame-)300 2932 y(work)i(makes)h(it)f(hard)h(and)g(unwieldy)g (to)g(use.)36 b(If)25 b(so,)g(then)h(it)f(defeats)i(the)f(purpose)h(of) e(an)g(extensible)300 3101 y(optimizer)g(generator)h(paradigm.)579 3271 y(Mitchell,)c(Dayal,)f(and)f(Zdonik)h([39,)16 b(40])k(propose)i(a) d(framework)i(called)g(Epoq)f(in)g(which)g(op-)298 3440 y(timizers)k(are)e(constructed)j(using)f(extensible)h FD(r)m(egions)p FP(.)32 b(A)21 b(region)i(is)f(de\256ned)h(by)f(a)g (stated)h FD(goal)g FP(\(e.g.,)297 3609 y(lower)f(cost,)g(join)f (reorder)l(,)j(etc.\).)30 b(Each)21 b(region)i(de\256nes)e(a)g(control) i(strategy)g(that)f(transforms)h(a)e(query)300 3779 y(into)30 b(alternative)j(forms)d(based)h(on)f(its)f(internal)j(transformation)h (rules.)50 b(A)29 b(region)i(can)f(also)g(call)h(a)298 3948 y(child)23 b(region)g(to)f(transform)h(a)e(subquery)-6 b(.)33 b(In)22 b(this)g(approach,)i(an)e(optimizer)h(is)f(speci\256ed)h (as)f(a)f(rooted,)300 4117 y(directed,)k(acyclic)g(graph)g(of)f (regions.)582 4287 y(The)e(root)i(region)g(is)e(responsible)k(for)c (optimizing)j(a)d(user)h(query)-6 b(.)32 b(A)21 b(parent)j(region)g (controls)300 4456 y(which)i(of)g(its)h(child)g(regions)h(transforms)g (a)d(query)-6 b(.)40 b(Thus,)27 b(the)f(expansion)j(of)d(the)g(search)i (space)f(de-)294 4625 y(pends)19 b(on)f(two)g(factors:)30 b(the)18 b(internal)i(transformations)i(of)c(a)f(region,)j(and)f(the)f (parent')-5 b(s)20 b(determination)300 4795 y(of)j(the)h(most)g (appropriate)j(region)e(\(based)g(on)e(its)h(stated)h(goal\))f(to)g(ef) n(fect)h(a)e(transformation.)579 4964 y(The)c(transformation)k(rules)e (in)f(a)f(region)i(consist)g(of)f(applicability)j(conditions)g (together)f(with)1905 5349 y(97)p eop %%Page: 98 110 98 109 bop 296 391 a FP(a)19 b(test)g(to)h(check)h(whether)f(a)f (transformed)j(query)f(meets)e(the)h(region')-5 b(s)22 b(stated)e(goal.)31 b(If)19 b(not,)h(then)g(trans-)295 561 y(formation)g(rules)f(are)g(applied)h(repeatedly)i(\(perhaps)f (based)e(on)g(some)g(heuristic\))i(until)e(either)h(the)f(goal)300 730 y(is)k(satis\256ed,)i(or)e(the)h(region)h(fails)f(and)g(returns)i (to)d(its)h(parent.)583 899 y(As)30 b(in)g(the)h(Sciore)f(and)h(Sieg)f (approach,)k(the)d(model)g(proposed)h(by)f(Mitchell,)i(Dayal,)f(and)300 1069 y(Zdonik)26 b(has)g(not)g(been)g(implemented.)38 b(Thus,)26 b(it)f(is)g(not)h(clear)g(whether)h(such)f(a)f(general)i (framework)300 1238 y(can)e(generate)i(optimizers)g(that)f(are)f(ef)n (\256cient)i(and)e(that)g(encompass)j(a)c(lar)n(ge)i(domain)g(of)f (commonly)299 1408 y(available)h(optimizers.)33 b(It)22 b(is)h(also)h(not)f(clear)h(whether)g(the)g(interaction)i(between)e (regions)h(can)e(be)g(ex-)300 1577 y(pressed)j(in)f(a)f(compact)h (framework)h(so)e(that)h(regions)i(can)d(be)h(reused)h(in)e(various)i (optimizer)g(con\256g-)300 1746 y(urations.)300 2113 y FO(6.7)119 b(Summary)300 2376 y FP(In)25 b(this)h(chapter)l(,)i(we)c (described)k(how)d(layered)i(optimizers)h(can)d(be)h(constructed)i (using)f(Prairie,)f(and)298 2545 y(how)c(the)g(P2V)e(preprocessor)26 b(can)c(generate)i(monolithic)g(optimizers)g(from)e(a)f(layered)j (speci\256cation.)300 2715 y(W)-7 b(e)26 b(also)h(presented)i (preliminary)g(experimental)g(evidence)g(from)e(simple)g(layered)h (optimizers)h(that)293 2884 y(demonstrate)19 b(that)f(optimizer)g (performance)i(is)d(not)g(sacri\256ced)h(by)f(using)i(reusable,)h (extensible)f(layers.)296 3053 y(More)h(experiments)i(are)f(necessary)h (to)e(conclusively)j(validate)f(that)f(a)e(layered)j(optimizer)f(can)g (be)f(just)300 3223 y(as)27 b(ef)n(\256cient)i(as)e(\(and)h(more)g (extensible)i(than\))e(monolithic)i(optimizers.)44 b(Our)27 b(primary)h(goal)g(in)g(this)300 3392 y(chapter)d(was)e(to)g(quickly)i (design)g(and)f(implement)h(a)e FD(practical)i FP(framework)g(for)e (specifying)k(layered)300 3562 y(optimizers.)36 b(Future)25 b(work)f(can)h(add)g(more)g(generality)i(to)d(this)i(approach.)36 b(An)23 b(important)k(goal)e(is)f(to)300 3731 y(use)g(Prairie)g(to)f (automatically)k(generate)f(ef)n(\256cient)f(optimizers)g(in)f(P2)e ([10,)16 b(1)m(1].)1905 5349 y(98)p eop %%Page: 99 111 99 110 bop 2859 1118 a FG(Chapter)44 b(7)2613 1657 y FM(Conclusion)300 2159 y FP(This)28 b(dissertation)j(described)g (Prairie,)e(an)f(algebraic)j(framework)e(for)f(rule-speci\256cation)k (in)c(query)293 2328 y(optimizers.)j(This)18 b(chapter)h(summarizes)g (the)f(contributions)k(of)17 b(our)h(research,)j(and)d(suggests)i (avenues)300 2498 y(of)j(future)i(work.)300 2864 y FO(7.1)119 b(Contributions)31 b(of)f(Dissertation)300 3127 y FP(T)-6 b(o)24 b(design)i(open)g(DBMSs)d(that)j(are)f(easily)h(tailorable)i (and)d(retar)n(getable)k(to)c(dif)n(ferent)j(architectures)300 3297 y(and)d(applications,)k(the)c(major)g(components)i(of)e(a)f(DBMS)e (should)27 b(be)e(speci\256ed)h(using)g(abstractions)300 3466 y(that)j(are)g(independent)k(of)28 b(the)h(underlying)j (implementation)g(details.)48 b(T)-6 b(o)27 b(that)j(end,)g(we)e(have)i (pro-)300 3635 y(posed,)j(designed,)i(and)c(implemented)h(Prairie,)h (an)e(algebraic)i(speci\256cation)g(framework)f(for)e(con-)300 3805 y(structing)i(rule-based)g(query)f(optimizers.)50 b(In)30 b(Chapter)g(1,)h(we)d(enumerated)k(four)e(critical)h(require-) 300 3974 y(ments)e(in)g(such)h(a)e(framework.)48 b(Below)-6 b(,)30 b(we)e(summarize)i(and)f(describe)i(how)e(Prairie)g(meets)g(all) g(of)300 4144 y(these)c(intended)g(goals.)436 4413 y FC(\017)46 b FI(Abstractions.)38 b FP(W)-7 b(ell-de\256ned)28 b(and)e(high-level)i(abstractions)h(are)d(critical)h(to)f(the)g (success)h(of)527 4582 y(an)h(open)g(system.)43 b(Prairie)28 b(provides)h(abstractions)i(that)d(are)f(central)i(to)f(the)f (speci\256cation)j(of)527 4751 y(any)20 b(optimizer;)j(these)d (abstractions)j(capture)e(the)e(operation)j(of)d(an)h(optimizer)h (without)f(regard)527 4921 y(to)28 b(their)h(implementation.)46 b(Operators,)30 b(algorithms,)h(rules,)e(descriptors,)j(and)c(layers)h (repre-)527 5090 y(sent)23 b(the)f(various)i(abstractions)h(that)e(are) f(key)h(to)f(Prairie')-5 b(s)23 b(success.)32 b(Operators)24 b(represent)g(the)1905 5349 y(99)p eop %%Page: 100 112 100 111 bop 527 391 a FP(abstract)25 b(computations)i(on)c(streams.)31 b(Algorithms)25 b(describe)g(the)f(implementations)i(of)d(oper)n(-)527 561 y(ators.)30 b(Rules)20 b(\(T)-8 b(-rules)19 b(and)h(I-rules\))h (specify)f(the)g(transformations)i(that)e(an)f(optimizer)h(applies)527 730 y(to)27 b(generate)i(its)e(search)h(space;)i(the)d(internal)i (representation)i(of)c(the)g(search)h(space)g(is)f(left)g(as)527 899 y(an)d(implementation-level)30 b(detail.)j(Descriptors)27 b(are)d(used)h(to)f(encapsulate)k(the)c(properties)j(of)527 1069 y(expressions)f(in)d(the)g(search)g(space.)32 b(Unlike)23 b(other)h(rule-based)h(optimizers)g(which)e(use)g(multi-)527 1238 y(ple)k(structures)i(to)d(specify)j(properties)g(\(based)f(on)e (their)h(use\),)h(descriptors)i(represent)e(all)f(the)527 1408 y(properties)j(used)e(in)f(an)g(optimizer;)j(the)d (classi\256cation)j(of)d(properties)j(based)e(on)f(their)h(usage)527 1577 y(is)f(an)f(internal)j(detail,)f(better)f(left)g(to)g(an)f (implementation.)43 b(Layers)27 b(encapsulate)j(lar)n(ger)e(rule)527 1746 y(sets;)d(each)f(layer)g(typically)i(represents)h(a)c(rule)h (speci\256cation)i(in)d(its)h(own)f(right.)436 1984 y FC(\017)46 b FI(Extensibility)-5 b(.)44 b FP(Extensibility)30 b(refers)e(to)f(the)h(ease)g(with)f(which)h(an)f(existing)i(system)g (can)e(be)527 2153 y(changed.)59 b(The)32 b(language)i(constructs)h (that)e(Prairie)g(provides)h(to)e(specify)i(the)f(abstractions)527 2322 y(mentioned)22 b(above)f(are)f(designed)j(to)c(enable)j(a)d(DBI)g (to)h(quickly)h(and)g(ef)n(\256ciently)h(add)e(or)g(delete)527 2492 y(operators,)27 b(algorithms,)g(rules,)e(properties,)i(or)e (layers)h(to)e(construct)j(an)e(optimizer)h(for)e(a)h(new)527 2661 y(query)i(environment.)41 b(This)25 b(is)h(an)g(improvement)i (over)e(existing)i(rule-based)h(optimizers)f(be-)527 2830 y(cause)18 b(any)f(changes)i(made)e(by)f(the)h(DBI)f(are)h (seamless.)30 b(Thus,)17 b(modifying)i(an)e(optimizer)h(using)527 3000 y(Prairie)h(need)g(not)f(result)h(in)f(a)f(system)i(with)f(lots)g (of)g(patches)i(applied)g(haphazardly;)j(brittleness)527 3169 y(of)h(the)g(resulting)h(optimizer)h(is)d(less)h(of)g(a)f (concern.)436 3406 y FC(\017)46 b FI(Performance.)31 b FP(Performance)21 b(of)e(an)g(optimizer)i(is)e(critical)i(since)g (the)e(search)i(spaces)g(are)f(typ-)527 3576 y(ically)g(exponential)i (in)d(the)g(size)g(of)f(an)h(operator)i(tree.)30 b(The)18 b(experiences)k(of)c(many)h(researchers)527 3745 y(have)26 b(shown)f(that)g(a)g(very)g(general)i(framework)e(of)g(system)g (construction)k(can)c(result)h(in)e(inef-)527 3914 y(\256cient)g (implementations)i(either)e(because)g(the)f(abstractions)k(do)22 b(not)i(adequately)h(capture)g(the)527 4084 y(system)31 b(semantics,)h(or)e(because)h(the)f(translation)j(of)c(the)h (speci\256cation)i(into)f(an)e(executable)527 4253 y(system)23 b(does)h(not)f(exploit)h(the)e(properties)k(of)c(the)h(tar)n(get)h (application)h(or)e(architecture.)33 b(In)23 b(our)527 4423 y(research,)f(we)c(have)h(used)h(V)-12 b(olcano)20 b(as)e(the)h(tar)n(get)i(framework)e(for)g(translating)j(Prairie)d (speci\256-)527 4592 y(cations.)32 b(W)-7 b(e)21 b(have)i(implemented)h (the)e(P2V)f(preprocessor)k(that)e(transforms)h(the)e(abstractions)527 4761 y(embodied)d(in)e(Prairie)h(to)f(the)g(lower)n(-level)i(details)g (expected)g(by)e(the)h(V)-12 b(olcano)18 b(rule)g(engine.)30 b(W)-7 b(e)527 4931 y(took)28 b(care)f(to)f(ensure)i(that)f(the)g (translation)i(process)f(generated)i(ef)n(\256cient)d(internal)i (represen-)527 5100 y(tations)24 b(for)f(the)f(various)i(abstractions.) 34 b(T)-6 b(o)21 b(validate)k(the)d(performance)j(of)d(this)h (approach,)i(we)1882 5349 y(100)p eop %%Page: 101 113 101 112 bop 527 391 a FP(presented)25 b(various)f(benchmark)g (experiments,)h(both)e(with)f(small)g(and)h(lar)n(ge)g(optimizer)h (spec-)527 561 y(i\256cations)g(using)f(Prairie.)31 b(The)22 b(results)h(con\256rm)f(our)h(belief)g(that)g(the)f(preprocessor)k (approach)527 730 y(is)e(a)f(valid)h(step,)g(and)g(that)g(Prairie)g (abstractions)j(have)e(ef)n(\256cient)g(implementations.)436 974 y FC(\017)46 b FI(Recon\256gurability)-5 b(.)44 b FP(Layers)28 b(in)f(Prairie)h(encapsulate)j(a)c(set)h(of)f(rules;)k (they)d(can)g(be)f(used)h(as)527 1144 y(subsystems)f(to)d(construct)j (a)d(lar)n(ger)i(system)f(\(optimizer\).)36 b(W)-7 b(e)23 b(have)i(extended)i(Prairie)e(to)f(al-)527 1313 y(low)f(DBIs)f(to)h (specify)h(layers,)h(and)e(to)g(build)h(optimizers)h(as)e(a)f(linear)j (composition)g(of)e(layers.)527 1482 y(The)f(P2V)e(preprocessor)26 b(uses)c(the)h(composition)h(semantics)g(to)e(generate)h(an)f(ef)n (\256cient)i(mono-)527 1652 y(lithic)k(optimizer)h(from)e(a)f (composition)k(of)d(layers.)43 b(Again,)28 b(this)f(process)i(results)f (in)f(little)h(or)527 1821 y(no)22 b(loss)f(in)h(performance)h(of)f (the)f(resulting)j(optimizer)f(as)e(our)g(preliminary)j(experimental)g (ev-)527 1990 y(idence)h(shows.)300 2357 y FO(7.2)119 b(Futur)n(e)31 b(W)-7 b(ork)300 2620 y FP(Prairie)28 b(provides)h(an)e(open)h(environment)h(for)f(the)f(high-level)j (speci\256cation)f(of)e(query)h(optimizers.)296 2789 y(T)-6 b(ogether)21 b(with)f(the)g(P2V)f(preprocessor)k(to)d(generate)i (executable)h(optimizers,)g(this)d(approach)j(results)299 2959 y(in)f(extensible)j(speci\256cations.)34 b(Future)23 b(work)f(will)g(make)h(this)g(paradigm)h(even)f(more)g(useful.)31 b(In)23 b(this)300 3128 y(section,)i(we)e(describe)i(avenues)h(for)e (further)h(research.)436 3397 y FC(\017)46 b FP(Continuing)23 b(validation)h(of)d(Prairie)g(is)g(important)h(to)f(ensure)h(that)f (the)g(abstractions)j(embodied)527 3567 y(within)29 b(it)g(are)f (well-de\256ned)j(and)e(represent)i(important)f(concepts)h(of)d (optimization.)49 b(In)29 b(this)527 3736 y(dissertation,)k(we)28 b(have)i(presented)h(experimental)h(evidence)f(using)f(simple)f (optimizers)i(and)527 3905 y(the)f(Open)g(OODB)d(optimizer)-5 b(.)50 b(In)29 b(the)h(future,)i(interesting)g(experiments)g(will)d (involve)j(dis-)527 4075 y(tributed)21 b(and)f(parallel)h(databases,)h (multi-query)g(optimization,)g(and)e(real-time)g(queries.)31 b(Each)527 4244 y(application)i(introduces)f(a)d(set)h(of)g (constraints)i(concerning)h(the)d(evaluation)i(of)d(queries)j(and)527 4413 y(experimentation)27 b(is)22 b(needed)i(to)e(verify)h(that)g (Prairie)g(speci\256cations)i(can)e(adequately)i(capture)527 4583 y(the)f(semantics)i(of)e(the)g(application.)35 b(An)23 b(example)i(of)f(such)h(an)f(application)j(is)c(extending)k(the)527 4752 y(Open)19 b(OODB)d(optimizer)k(\(described)h(in)d(Chapter)h(5\))f (to)h(build)g(distributed)i(or)d(parallel)j(object-)527 4921 y(oriented)26 b(optimizers.)1882 5349 y(101)p eop %%Page: 102 114 102 113 bop 436 391 a FC(\017)46 b FP(Layered)36 b(Prairie)g (speci\256cations)j(present)d(several)h(opportunities)j(for)35 b(future)h(work.)66 b(Cur)n(-)527 561 y(rently)-6 b(,)29 b(Prairie)f(allows)f(DBIs)f(to)h(encapsulate)k(a)26 b(set)h(of)g(rules) h(in)f(a)g(layer)-5 b(.)42 b(Encapsulation)30 b(of)527 730 y(other)c(abstractions)h(in)e(Prairie)g(is)f(highly)i(desirable.)36 b(For)23 b(example,)j(a)e(layer)h(can)g(de\256ne)g(new)527 899 y(properties)g(in)c(a)g(descriptor)l(,)k(or)c(new)h(helper)h (functions.)32 b(The)21 b(site)h(information)i(of)e(streams)g(in)527 1069 y(an)j(optimizer)i(for)f(a)e(distributed)k(DBMS,)23 b(for)i(instance,)j(can)d(be)h(de\256ned)f(as)h(a)e(new)h(property)527 1238 y(in)20 b(the)g(DISTRIBUTION)c(layer)21 b(\(see)f(Chapter)h(6\).) 29 b(The)20 b(P2V)e(preprocessor)24 b(can)c(be)g(modi\256ed)527 1408 y(to)29 b(compact)g(layers)h(and)f(generate)i(a)d(monolithic)i (rule)f(set,)h(descriptor)l(,)j(and)c(a)f(single)i(set)e(of)527 1577 y(helper)d(functions.)436 1821 y FC(\017)46 b FP(In)29 b(this)g(dissertation,)j(we)c(presented)j(preliminary)g(experimental)g (evidence)g(to)d(validate)j(the)527 1990 y(performance)c(of)c(layered)j (optimizers.)33 b(Future)25 b(work)e(will)h(include)h(more)f (experiments)i(with)527 2160 y(lar)n(ge)i(layered)g(optimizer)g (speci\256cations.)43 b(For)26 b(instance,)j(the)e(Open)g(OODB)d (optimizer)k(is)f(a)527 2329 y(good)19 b(candidate)g(for)f(such)g(a)f (speci\256cation.)31 b(It)17 b(will)g(also)h(be)g(instructive)i(to)d (extend)i(the)e(layered)527 2498 y(Open)24 b(OODB)d(speci\256cation)26 b(to)e(distributed)j(or)c(replicated)j(databases.)436 2743 y FC(\017)46 b FP(Extending)23 b(the)e(Prairie)h(speci\256cation)i (language)f(to)e(allow)g(hierarchical,)j(non-linear)g(compo-)527 2912 y(sitions)f(\(as)e(opposed)j(to)d(linear)h(compositions\))j(will)c (allow)g(a)g(DBI)f(to)h(specify)i(more)e(optimiz-)527 3081 y(ers)j(than)g(are)g(currently)i(possible.)33 b(This)23 b(means)h(that)h(layers)f(can)g(have)h(multiple)f(parameters,)527 3251 y(each)18 b(of)g(which)g(can)f(be)h(instantiated)i(by)e(a)f(layer) -5 b(.)30 b(For)16 b(example,)k(a)d(retrieval)j(layer)e(implement-)527 3420 y(ing)j(an)g(abstract)i(RET)c(operator)k(with)d(the)h(index)h (scan)g(algorithm)h(may)d(require)j(an)d(additional)527 3589 y(parameter)i(to)d(de\256ne)h(the)h(implementation)h(of)e(the)g (index.)31 b(Experience)22 b(with)d(Genesis)i([4])f(has)527 3759 y(shown)i(that)g(such)g(parameterized)i(layers)f(can)e(capture)i (the)f(semantics)h(of)e(many)g(widely)h(used)527 3928 y(optimization)28 b(algorithms.)37 b(Extending)27 b(Prairie)e(to)g (allow)g(such)h(compositions)i(will)c(necessi-)527 4097 y(tate)g(a)f(modi\256cation)j(of)d(P2V')-5 b(s)23 b(layer)i(compaction) h(algorithm.)436 4342 y FC(\017)46 b FP(Extensible)29 b(search)f(strategies)h(is)d(another)i(important)g(area)f(of)g(future)h (work.)39 b(Currently)-6 b(,)29 b(the)527 4511 y(P2V)i(preprocessor)k (translates)f(Prairie)e(speci\256cations)j(into)d(V)-12 b(olcano)33 b(speci\256cations)i(to)c(be)527 4680 y(compiled)h(with)f (V)-12 b(olcano')-5 b(s)33 b(rule)e(engine.)54 b(However)l(,)33 b(V)-12 b(olcano')-5 b(s)32 b(rule)g(engine)g(implements)527 4850 y(a)c(hard-wired)i(search)g(strategy)g(that)f(is)f(very)h(rigid.) 45 b(Moreover)l(,)32 b(the)c(implementation)j(itself)527 5019 y(does)f(not)f(lend)h(itself)f(to)g(easy)g(change;)34 b(modifying)d(it)d(will)g(\(we)h(hypothesize\))j(require)f(ma-)1882 5349 y(102)p eop %%Page: 103 115 103 114 bop 527 391 a FP(jor)21 b(changes.)31 b(Since)21 b(Prairie)f(provides)j(abstractions)g(that)e(are)f(high-level)j(and)e (\(mostly\))g(inde-)527 561 y(pendent)g(of)d(the)h(underlying)j(search) d(strategy)-6 b(,)22 b(we)17 b(believe)k(that)e(Prairie)g (speci\256cations)i(can)e(be)527 730 y(easily)27 b(translated)h(to)e (another)h(rule)f(engine)h(with)f(an)f(appropriate)k(preprocessor)-5 b(.)40 b(Moreover)l(,)527 899 y(since)22 b(Prairie)g(allows)f (encapsulation)26 b(of)20 b(rule)i(sets)g(in)e(layers,)j(we)d(can)i (foresee)g(each)g(layer)g(en-)527 1069 y(capsulating)k(a)d(rule)g (engine.)32 b(Thus,)23 b(the)g(need)g(for)g(a)f(global)i(search)g (strategy)h(disappears,)h(and)527 1238 y(each)20 b(layer)h(implements)g (its)e(own)g(search)i(strategy)g(\(in)f(addition)i(to)d(its)g(own)g (search)i(space)g(and)527 1408 y(cost)i(model\).)31 b(This)21 b(is)h(similar)h(to)f(the)g(frameworks)h(proposed)h(in)e([39,)16 b(40,)g(44].)31 b(One)21 b(interest-)527 1577 y(ing)31 b(problem)h(is)e(the)g(compaction)j(of)d(layers)i(\320)d(namely)-6 b(,)33 b(how)d(can)h(we)e(generate)k(a)d(mono-)527 1746 y(lithic)22 b(rule)f(set)f(with)h(a)f(search)h(strategy)i(that)e(is)f (semantically)j(equivalent)g(to)e(the)f(composition)527 1916 y(of)26 b(the)g(search)h(strategies)h(in)e(the)g(dif)n(ferent)i (layers?)39 b(Since)26 b(each)g(layer)h(can)f(have)g(a)g(dif)n(ferent) 527 2085 y(rule)21 b(engine,)h(any)f(compaction)h(of)e(layers)i(should) g(generate)g(a)e(monolithic)i(rule)f(engine)h(that)e(is)527 2254 y(provably)29 b(equivalent)h(to)d(the)g(actions)h(of)f(the)g (hierarchical)j(ordering)e(of)f(the)g(individual)j(rule)527 2424 y(engines.)436 2661 y FC(\017)46 b FP(In)19 b(Chapter)h(6,)f(we)e (mentioned)k(that)e(layers)h(in)f(Prairie)g(are)g(mostly)g(symmetric.) 30 b(This)19 b(af)n(fords)i(a)527 2830 y(much)e(greater)h (\257exibility)h(in)d(layer)i(composition.)32 b(However)l(,)20 b(not)f(all)g(legal)g(compositions)j(are)527 3000 y(necessarily)29 b(valid)d(or)g(meaningful.)39 b(This)25 b(implies)h(a)f(need)i(for)e (some)h(validation)i(techniques)527 3169 y(that)23 b(can)g(detect)h (invalid)g(compositions.)33 b(Batory)24 b(and)e(Geraci)h([8])g (describe)h(a)e(useful)i(method)527 3338 y(for)17 b(design)h(rule)f (checking)i(in)e(layered)h(systems)g(that)f(validates)i(layer)f (compositions.)31 b(A)16 b(future)527 3508 y(goal)25 b(is)e(to)g(integrate)j(this)e(validation)j(into)d(the)g(P2V)e (preprocessor)-5 b(.)436 3745 y FC(\017)46 b FP(Multi-phase)27 b(query)e(optimizers)h(are)e(being)h(investigated)i(as)d(a)g(means)g (of)g(limiting)h(the)f(enor)n(-)527 3914 y(mous)30 b(size)h(of)f(the)g (search)i(spaces)f(in)f(most)g(optimizers.)52 b(In)30 b(this)h(approach,)i(the)e(optimizer)527 4084 y(is)c(implemented)h(as)e (a)g(composition)j(of)e(separate)h(phases,)g(each)g(phase)f(optimizing) i(the)e(out-)527 4253 y(put)22 b(of)f(another)-5 b(.)32 b(Systems)21 b(like)g(XPRS)e([48])j(and)f(Mariposa)i([47])f(are)f(some) g(examples)i(of)e(this)527 4423 y(approach.)44 b(The)27 b(Mariposa)i(distributed)h(DBMS,)25 b(for)i(instance,)j(implements)e(a) f(three-phase)527 4592 y(optimizer;)k(these)e(phases)g(are)e (compilation,)k(parallelization,)h(and)c(distribution.)45 b(The)27 b(com-)527 4761 y(pilation)32 b(phase)g(optimizes)g(an)e (operator)i(tree)f(assuming)h(a)e(centralized)j(DBMS,)28 b(the)i(paral-)527 4931 y(lelization)h(phase)e(introduces)i (intra-operator)i(parallelism,)e(and)e(the)f(distribution)k(phase)d (se-)527 5100 y(lects)c(sites)g(for)f(the)g(execution)j(of)d(the)g (various)i(algorithms.)34 b(As)24 b(Stonebraker)i(et)e(al)g(point)h (out)1882 5349 y(103)p eop %%Page: 104 116 104 115 bop 527 391 a FP(in)27 b([47],)i(partitioning)i(the)c (optimization)j(process)f(into)f(multiple)h(phases)f(can)g(result)g(in) f(sub-)527 561 y(optimal)21 b(plans.)31 b(However)l(,)22 b(careful)f(design)h(and)f(implementation)i(of)d(each)h(phase)g(can)g (signif-)527 730 y(icantly)26 b(reduce)f(the)f(search)h(space)f(of)g (the)g(optimizer)h(\(and,)f(consequently)-6 b(,)27 b(the)d (optimization)527 899 y(time\),)i(while)f(still)h(generating)j(a)c (good)h(access)h(plan.)37 b(The)25 b(design)i(of)e(such)h(multi-phase)i (op-)527 1069 y(timizers)f(can)e(be)h(greatly)h(facilitated)h(by)d (ensuring)j(that)e(each)g(phase)h(is)e(recon\256gurable;)30 b(this)527 1238 y(will)19 b(enable)i(DBIs)e(to)g(\256ne-tune)i(each)f (phase)h(to)f(generate)h(plans)g(that)f(are)f(most)h(likely)h(to)e (yield)527 1408 y(the)25 b(best)g(access)h(plan)f(for)f(queries)i(in)f (a)e(particular)k(application.)37 b(Prairie)25 b(may)f(be)g(a)g (valuable)527 1577 y(tool)d(in)f(building)i(multi-phase)h(optimizers,)g (where)d(each)h(phase)g(is)f(layered)i(and)e(speci\256ed)i(us-)527 1746 y(ing)i(Prairie.)436 1990 y FC(\017)46 b FP(Since)22 b(Prairie)g(depends)i(on)e(V)-12 b(olcano')-5 b(s)24 b(rule)e(engine,)h(and)f(since)h(V)-12 b(olcano)23 b(implements)g(a)f (top-)527 2160 y(down)g(search)h(strategy)-6 b(,)23 b(a)e(future)i (area)f(of)g(research)h(would)f(involve)h(investigating)j(the)21 b(use)h(of)527 2329 y(Prairie)28 b(for)f(specifying)j(bottom-up)f (optimizers.)44 b(Since)27 b(most)g(of)g(Prairie')-5 b(s)29 b(abstractions)h(do)527 2498 y(not)25 b(depend)h(on)e(the)g (underlying)k(search)d(strategy)-6 b(,)26 b(this)f(implies)g(that)g (Prairie)g(might)f(serve)h(as)527 2668 y(a)e(useful)i(framework)g(for)f (both)g(top-down)h(and)f(bottom-up)i(optimizers.)300 3034 y FO(7.3)119 b(Retr)n(ospective)300 3298 y FP(Our)29 b(research)i(concentrated)h(on)e(developing)i(a)d(high-level)i (framework)g(for)e(rule)g(speci\256cation)j(in)300 3467 y(query)g(optimizers,)i(and)d(a)f(preprocessor)k(for)d(the)g (generation)i(of)e(ef)n(\256cient)h(optimizers.)54 b(W)-7 b(e)29 b(have)300 3636 y(used)24 b(V)-12 b(olcano)25 b(as)f(the)g(backend)h(rule)f(engine)h(for)f(our)g(preprocessor)j(and)d (for)g(our)g(experiments.)576 3806 y(Most)17 b(of)f(the)h(abstractions) k(in)16 b(Prairie)h(capture)i(optimizer)f(actions)h(succintly)-6 b(.)31 b(The)16 b(descriptor)295 3975 y(abstraction,)23 b(for)d(instance,)i(not)e(only)g(allows)g(a)f(DBI)f(to)h(concisely)j (represent)f(all)f(properties,)i(but)e(also)296 4144 y(for)f(the)h(same)f(expression)k(to)c(have)i(dif)n(ferent)h (descriptors)g(\(i.e.,)e(dif)n(ferent)i(properties\))g(depending)h(on) 293 4314 y(which)17 b(side)h(of)f(a)f(rule)i(it)f(occurs)h(on.)29 b(Abstract)18 b(operators)i(and)d(algorithms)i(that)f(are)f(all)g (treated)i(as)d(\256rst-)300 4483 y(class)24 b(objects)h(allows)f (Prairie)f(speci\256cations)k(to)c(scale)h(gracefully)-6 b(.)34 b(W)-7 b(e)22 b(feel,)h(thus,)h(that)g(Prairie)g(is)f(a)300 4652 y(good)i(beginning)h(for)e(constructing)j(extensible,)f(scalable,) f(and)f(ef)n(\256cient)h(optimizers.)582 4822 y(Although)f(V)-12 b(olcano')-5 b(s)24 b(rule)f(engine)h(uses)f(an)f(ef)n(\256cient,)i (exhaustive)h(search)f(strategy)-6 b(,)24 b(its)e(im-)299 4991 y(plementation)j(leaves)e(it)f(extremely)i(inextensible.)34 b(Moreover)l(,)24 b(some)f(of)f(the)g(details)i(of)e(the)h(rule)f(en-) 1882 5349 y(104)p eop %%Page: 105 117 105 116 bop 300 391 a FP(gine)27 b(propagate)h(up)e(to)g(the)g(V)-12 b(olcano)27 b(rule)f(speci\256cation)j(language.)40 b(For)25 b(example,)i(the)g(data)f(struc-)300 561 y(tures)k(used)f(to)f(store)i (operator)h(trees)e(and)g(their)h(properties)h(are)e(optimized)h(for)f (maximum)f(storage)300 730 y(ef)n(\256ciency)-6 b(.)35 b(Unfortunately)-6 b(,)28 b(this)c(also)h(means)g(that)g(the)f(DBI)f (has)i(to)f(be)g(careful)i(and)f(knowledgable)294 899 y(enough)20 b(to)e(partition)j(properties)g(appropriately)-6 b(.)33 b(Another)19 b(example)g(of)f(this)h(in\257exibility)i(is)d(the) g(mul-)296 1069 y(titude)j(of)f(support)i(functions)g(with)e (speci\256c)h(parameter)g(lists)g(that)f(is)g(required)i(by)e(V)-12 b(olcano.)31 b(This)20 b(not)300 1238 y(only)31 b(disperses)j(the)c (optimizer)j(actions)f(over)f(a)g(wider)f(area,)j(but)e(also)g (constrains)j(the)d(DBI)e(since)299 1408 y(the)22 b(parameter)i(lists)g (of)e(the)g(support)j(functions)g(restrict)f(the)e(properties)j (accessible)h(in)c(the)h(function.)296 1577 y(Since)d(Prairie)g(is)g (designed)i(to)e(be)g(independent)j(of)d(many)g(of)f(these)i (implementation)i(details,)f(it)d(is)h(the)300 1746 y(P2V)25 b(preprocessor)30 b(that)d(currently)h(has)f(to)f(bear)h(the)g(brunt)g (of)f(the)h(burden)h(of)e(generating)j(many)d(of)300 1916 y(the)e(low-level)i(\252abstractions\272)i(of)23 b(V)-12 b(olcano.)34 b(A)22 b(better)j(approach)i(to)c(our)i(research)g (would)g(probably)300 2085 y(have)f(been)g(to)f(implement)i(our)f(own)f (rule)h(engine)g(\(instead)i(of)d(using)i(V)-12 b(olcano\))25 b(with)e(the)g(same)h(four)300 2254 y(goals)j(\(abstractions,)j (extensibility)-6 b(,)30 b(performance,)f(and)e(recon\256gurability\))j (as)c(the)g(rule)h(speci\256ca-)300 2424 y(tion)d(language.)583 2593 y(Cost-based)29 b(query)e(optimization)i(is)d(a)g(well-studied)j (area)e(of)f(research.)41 b(Even)26 b(though)i(the)296 2762 y(techniques)23 b(are)e(well)e(understood,)24 b(building)f(an)d (optimizer)h(is)f(still)h(an)f(expensive)j(proposition.)33 b(This)296 2932 y(problem)21 b(will)e(only)i(be)f(magni\256ed)g(as)g (DBMSs)e(are)i(called)h(upon)g(to)f(support)h(lar)n(ger)h(amounts)f(of) f(data)296 3101 y(as)g(well)g(as)g(unstructured,)k(novel,)e(or)e (heterogeneous)k(data.)31 b(What)20 b(is)g(needed)i(are)e(tools)h(that) g(can)f(help)300 3271 y(in)25 b(a)g(streamlining)j(the)d(process)i(of)e (optimizer)i(development;)i(these)d(tools)g(have)g(to)f(be)g(general)i (and)300 3440 y(contain)h(abstractions)i(that)d(are)f(applicable)j(to)d (a)g(wide)g(variety)i(of)e(applications.)43 b(This)26 b(dissertation)300 3609 y(is)d(a)g(step)i(in)e(that)h(direction.)1882 5349 y(105)p eop %%Page: 106 118 106 117 bop 2715 1118 a FG(Appendix)43 b(A)1145 1657 y FM(Complexity)53 b(of)e(the)g(System)h(R)2694 2031 y(Optimizer)296 2532 y FP(In)19 b(this)h(appendix,)j(we)18 b(sketch)j(a)e(proof)i(for)f(the)f(asymptotic)j(complexity)g(of)d(the)h (System)g(R)e(optimizer)298 2702 y([46])23 b(for)g(joining)h FH(n)c FP(relations.)33 b(This)22 b(complexity)i(holds)g(when)e(the)g (query)i(graph)f(is)f(fully)h(connected)300 2871 y(or)g(the)h (heuristic)i(of)e(delaying)h(cross-products)j(is)c(dropped.)33 b(This)23 b(is)g(the)h(worst-case)i(scenario.)583 3041 y(The)h(System)f(R)g(optimizer)i(only)g(generates)h(left-deep)g (operator)g(trees.)41 b(That)26 b(is,)h(the)g(inner)300 3210 y(input)h(of)e(a)h(join)g(operator)i(is)d(the)h(retrieval)i(of)e (a)f(stored)i(\256le.)40 b(It)26 b(is)h(easy)g(to)g(see)g(that,)h (under)g(this)f(as-)300 3379 y(sumption,)e(the)f(total)h(number)g(of)e (distinct)j(expressions)h(is)d FH(n)p FA(!)p FP(.)31 b(However)l(,)24 b(System)g(R)e(uses)j(dynamic)300 3549 y(programming)h([19])e(to)f(substantially)28 b(reduce)d(this)f (complexity)-6 b(.)583 3718 y(Below)g(,)35 b(we)d(derive)h(the)g (complexity)i(of)e(the)g(System)f(R)g(optimizer)i(using)g(dynamic)g (pro-)300 3887 y(gramming.)e(The)23 b(optimizer)i(constructs)h(optimal) f(plans)g(for)e(each)i(possible)g(join)g(of)e FH(j)28 b FP(relations,)e(for)293 4057 y FH(j)31 b FA(=)25 b(0)p FH(;)15 b(:)g(:)g(:)32 b(;)15 b(n)p FP(.)28 b(At)16 b(each)i(stage,)h (only)f(the)f(best)h(plan)f(for)h(joining)h(a)d(given)i(subset)h(of)e (relations)i(is)e(main-)300 4226 y(tained.)38 b(Thus,)25 b(the)h(complexity)i(of)d(the)h(System)f(R)f(optimizer)j(is)e (determined)j(by)d(the)h(total)g(number)300 4395 y(of)d(operator)j (trees)e(that)h(need)f(to)f(be)h(examined)h(at)e(each)i(stage.)583 4565 y(The)i(number)i(of)e(operator)j(trees)e(with)f(1)g(relation)i(is) e FH(n)38 b FA(=)2539 4496 y Fb(\000)2577 4525 y Fs(n)2581 4596 y Fv(0)2620 4496 y Fb(\001)2658 4565 y FP(.)k(The)26 b(number)j(of)e(operator)300 4734 y(trees)d(with)g(1)f(relation)i (after)g(pruning)g(is)f FH(n)g FA(=)1801 4665 y Fb(\000)1839 4694 y Fs(n)1843 4766 y Fv(1)1882 4665 y Fb(\001)1920 4734 y FP(.)583 4904 y(The)k(number)h(of)f(operator)i(trees)f(with)f(2) g(relations)i(is)2379 4834 y Fb(\000)2417 4863 y Fs(n)2421 4935 y Fv(1)2460 4834 y Fb(\001)2498 4904 y FA(\()p FH(n)c FC(\000)g FA(1\))p FP(;)2847 4834 y Fb(\000)2885 4863 y Fs(n)2889 4935 y Fv(1)2928 4834 y Fb(\001)2993 4904 y FP(is)i(the)g(number)h(of)300 5073 y(1-relation)h(operator)f(trees,)g (and)f FA(\()p FH(n)d FC(\000)g FA(1\))j FP(is)f(the)g(number)i(of)e (2-relation)j(operator)f(trees)g(generated)1882 5349 y(106)p eop %%Page: 107 119 107 118 bop 297 391 a FP(from)21 b(each)g(1-relation)j(tree.)30 b(The)20 b(number)i(of)f(operator)i(trees)e(with)g(2)f(relations)j (after)f(pruning)h(is)3461 322 y Fb(\000)3499 351 y Fs(n)3503 423 y Fv(2)3542 322 y Fb(\001)3580 391 y FP(.)583 561 y(In)k(general,)h(the)f(number)g(of)f(operator)j(trees)e(with)f FH(j)31 b FP(relations)e(is)2748 491 y Fb(\000)2826 520 y Fs(n)2786 592 y(j)t FB(\000)p Fv(1)2909 491 y Fb(\001)2947 561 y FA(\()p FH(n)24 b FC(\000)f FH(j)30 b FA(+)23 b(1\))p FP(.)40 b(The)300 730 y(number)24 b(of)g(operator)i(trees)e(with)f FH(j)29 b FP(relations)c(after)g(pruning)g(is)2383 661 y Fb(\000)2421 690 y Fs(n)2426 761 y(j)2463 661 y Fb(\001)2502 730 y FP(.)583 899 y(The)f(complexity)h(of)f(the)g(System)f(R)f (optimization)27 b(algorithm)e(is,)e(thus,)h(given)h(by)f(the)f(sum) 1464 1078 y Fs(n)p FB(\000)p Fv(1)1471 1103 y Fb(X)1469 1285 y Fs(j)t Fv(=0)1612 1040 y Fb( )1678 1122 y FH(n)1684 1246 y(j)1733 1040 y Fb(!)1798 1183 y FA(\()p FH(n)e FC(\000)e FH(j)5 b FA(\))27 b(=)e FH(n)p FA(2)2299 1146 y Fs(n)p FB(\000)p Fv(1)578 1476 y FP(In)19 b(other)h(words,)g(the)f (System)g(R)f(optimizer)j(has)e(a)f(worst-case)j(complexity)h(that)d (is)g(exponen-)300 1646 y(tial)24 b(in)f(the)h(number)h(of)e(relations) j(to)d(be)h(joined.)1882 5349 y(107)p eop %%Page: 108 120 108 119 bop 2724 1118 a FG(Appendix)43 b(B)1081 1657 y FM(Bene\256ts)51 b(of)h(Rule)f(Compaction)292 2159 y FP(In)17 b(this)g(appendix,)k(we)16 b(present)i(an)f(informal)h(ar)n (gument)g(that)g(the)f(run-time)h(of)e(an)h(optimizer)h(decreases)300 2328 y(when)24 b(rules)g(are)g(compacted)h(using)g(the)f(techniques)i (described)h(in)c(Chapter)i(4.)583 2498 y(Assume)g(that)g FH(O)h FP(original)g(rules)f(are)g(compacted)h(to)e FH(C)30 b FP(rules)25 b(\()p FH(C)35 b(<)27 b(O)s FP(\).)33 b(If)24 b(the)g(compacted)300 2667 y(rule)i(set)h(\(with)f FH(C)31 b FP(rules\))c(runs)g(in)f(time)g FH(T)13 b FP(,)25 b(then)h(the)h (original)h(rule)e(set)g(\(with)g FH(O)i FP(rules\))f(runs)g(in)3469 2631 y Fs(O)p 3469 2646 56 4 v 3469 2698 a(C)3534 2667 y FH(T)299 2836 y FP(time.)j(T)-6 b(o)21 b(see)i(this,)f(if)g(a)g (compacted)j(rule)d FH(c)g FP(is)g(obtained)j(by)d(compacting)j FH(k)g FP(original)f(rules,)f(then)g(one)294 3006 y(application)e(of)d (the)g(compacted)i(rule)f FH(c)f FP(requires)i(the)e(equivalent)j(of)d (the)g FH(k)i FP(original)g(rule)f(applications.)300 3175 y(That)k(is,)g(a)h(linear)g(speedup)i(is)d(achieved)j(by)e (compacting)i(rules.)576 3344 y(Note,)18 b(however)l(,)i(that)e FH(T)29 b FP(\(the)17 b(time)g(it)g(takes)h(to)f(optimize)i(a)d (query\))j(is)e(actually)i(exponential)h(in)297 3514 y FH(n)f FP(\(the)i(number)h(of)e(relations)j(to)d(be)h(joined\),)h(as) f(proved)h(in)e(Appendix)j(A.)28 b(Thus,)21 b(the)g(bene\256ts)g(of)g (rule)294 3683 y(compaction)g(also)d(extend)i(to)e(reducing)j(memory)d (requirements:)32 b(each)18 b(time)g(a)g(rule)h(is)f(applied,)j(a)c (new)294 3853 y(operator)j(tree)e(is)g(introduced.)32 b(By)17 b(compacting)k(rules,)f(intermediate)g(trees)f(are)f(not)h (generated.)31 b(There)300 4022 y(might)25 b(be)g(a)f(very)h(lar)n(ge)h (\(e.g.,)f(exponential\))j(number)d(of)g(such)g(intermediate)j(trees)d (whose)g(creation)300 4191 y(are)f(eliminated)h(through)h(rule)e (compaction.)1882 5349 y(108)p eop %%Page: 109 121 109 120 bop 2715 1118 a FG(Appendix)43 b(C)1270 1657 y FM(The)51 b(Open)g(OODB)g(Rule)h(Set)300 2159 y FP(In)31 b(this)h(appendix,)k(we)31 b(list)g(the)h(rules)g(that)g(appear)h(in)f (the)f(Open)h(OODB)d(optimizer)-5 b(.)56 b(Figure)32 b(C.1)298 2328 y(shows)23 b(the)g(17)f(transformation)j(rules)f(and)e (9)g(implementation)j(rules)e(using)h(the)e(V)-12 b(olcano)24 b(optimizer)n(-)300 2498 y(generator)-5 b(.)58 b(Figure)32 b(C.2)f(shows)h(the)g(22)g(transformation)j(rules)d(and)h(1)m(1)e (implementation)k(rules)d(in)300 2667 y(the)e(Prairie)h(framework.)51 b(Note)30 b(that)h(the)f(\256rst)g(\256ve)g(Prairie)g(T)-8 b(-rules)31 b(\(Figure)g(C.2\))e(have)i(no)f(coun-)299 2836 y(terparts)25 b(on)d(the)h(V)-12 b(olcano)24 b(side;)g(these)g (additional)h(T)-8 b(-rules)23 b(are)g(required)i(to)e(introduce)i(the) e(enforcer)n(-)300 3006 y(operator)29 b(PR)p 746 3006 28 4 v 32 w(ASSEMBL)-9 b(Y)23 b(into)k(the)g(various)i(operator)g (trees.)42 b(Similarly)-6 b(,)28 b(the)f(last)h(two)e(Prairie)h(I-)300 3175 y(rules)h(\(Figure)g(C.2\))e(are)h(required)j(to)d(introduce)i (the)f(Null)f(algorithm)h(and)g(the)f(enforcer)n(-algorithm)299 3344 y(Enf)p 435 3344 V 33 w(assembly)-6 b(.)32 b(The)23 b(remaining)h(Prairie)g(rules)f(have)h(a)e(one-to-one)k(correspondence) h(with)c(the)g(V)-12 b(ol-)300 3514 y(cano)24 b(rules.)583 3683 y(Most)i(of)g(the)g(rules)h(in)f(the)g(Open)g(OODB)d(optimizer)28 b(are)e(quite)g(complex)h(with)f(substantial)300 3853 y(portions)g(of)e(code)g(for)g(manipulating)j(properties.)34 b(W)-7 b(e)23 b(compare)h(two)g(simple)g(transformation)j(rules)300 4022 y(in)d(Figure)g(C.3,)e(which)j(shows)f(the)g(corresponding)k (rules)d(for)e(delaying)k(the)d(materialization)j(opera-)297 4191 y(tion.)k(Figure)21 b(C.3\(a\))g(shows)h(the)f(V)-12 b(olcano)23 b(rule,)e(and)h(Figure)f(C.3\(b\))g(shows)h(the)f(Prairie)h (rule)f(for)g(this)300 4361 y(transformation.)34 b(Note)23 b(that)h(the)f(Prairie)h(T)-8 b(-rule)23 b(has)h(more)f(statements)i (that)f(compute)h(properties)h(of)292 4530 y(new)16 b(expressions.)32 b(This)16 b(is)g(because)j(some)d(properties)j(in)e(V)-12 b(olcano)17 b(are)g(computed)h(automatically)i(\(by)300 4699 y(DBI-written)26 b(support)i(functions\))g(when)e(rules)h(are)f (applied,)h(as)f(mentioned)i(in)d(Chapter)i(2.)37 b(Prairie)300 4869 y(requires)26 b(a)d(DBI)f(to)h(specify)j(all)d(property)j (transformations)h(explicitly)-6 b(.)1882 5349 y(109)p eop %%Page: 110 122 110 121 bop 323 1252 3237 4 v 323 3916 4 2665 v 374 1340 a FI(T)-7 b(ransformation)25 b(rules)374 1427 y Fu(\()p Fh(OP)p 465 1427 15 4 v 18 w(SELECT)19 b(?op)p 755 1427 V 18 w(ar)o(g1)e Fu(\(?1\)\))h Ft(\000)-10 b(!)17 b Fu(\()p Fh(OP)p 1231 1427 V 18 w(SELECT)i(?op)p 1521 1427 V 18 w(ar)o(g2)e Fu(\(\()p Fh(OP)p 1756 1427 V 18 w(SELECT)i(?op)p 2046 1427 V 18 w(ar)o(g3)e Fu(\(?1\)\)\)\))374 1514 y(\()p Fh(OP)p 465 1514 V 18 w(MA)-6 b(T)19 b(?op)p 678 1514 V 17 w(ar)o(g1)f Fu(\(\()p Fh(OP)p 913 1514 V 17 w(SELECT)i(?op)p 1203 1514 V 18 w(ar)o(g2)d Fu(\(?1\)\)\)\))h Ft(\000)-11 b(!)p Fu(!\()p Fh(OP)p 1727 1514 V 17 w(SELECT)19 b(?op)p 2016 1514 V 18 w(ar)o(g3)f Fu(\(\()p Fh(OP)p 2252 1514 V 17 w(MA)-6 b(T)19 b(op)p 2442 1514 V 18 w(ar)o(g4)e Fu(\(?1\)\)\)\))374 1601 y(\()p Fh(OP)p 465 1601 V 18 w(SELECT)i(?op)p 755 1601 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 1601 V 18 w(MA)-6 b(T)19 b(?op)p 1203 1601 V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h Ft(\000)-11 b(!)p Fu(!\()p Fh(OP)p 1727 1601 V 17 w(MA)-6 b(T)19 b(?op)p 1939 1601 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p 2174 1601 V 18 w(SELECT)i(op)p 2442 1601 V 18 w(ar)o(g4)e Fu(\(?1\)\)\)\))374 1688 y(\()p Fh(OP)p 465 1688 V 18 w(SELECT)i(?op)p 755 1688 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 1688 V 18 w(UNNEST)h(?op)p 1294 1688 V 18 w(ar)o(g2)f Fu(\(?1\)\)\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1818 1688 V 18 w(UNNEST)g(?op)p 2122 1688 V 18 w(ar)o(g3)f Fu(\(\()p Fh(OP)p 2357 1688 V 17 w(SELECT)j(op)p 2625 1688 V 17 w(ar)o(g4)e Fu(\(?1\)\)\)\))374 1775 y(\()p Fh(OP)p 465 1775 V 18 w(MA)-6 b(T)19 b(?op)p 678 1775 V 17 w(ar)o(g1)f Fu(\(?1\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1154 1775 V 17 w(JOIN)g(?op)p 1369 1775 V 18 w(ar)o(g2)f Fu(\(?1)h(\()p Fh(OP)p 1681 1775 V 17 w(GET)h(?op)p 1885 1775 V 18 w(ar)o(g3)e Fu(\(\)\)\)\))374 1863 y(\()p Fh(OP)p 465 1863 V 18 w(SELECT)i(?op)p 755 1863 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 1863 V 18 w(JOIN)g(?op)p 1205 1863 V 18 w(ar)o(g2)h Fu(\(?1)g(?2\)\)\)\))f Ft(\000)-10 b(!)17 b Fu(\()p Fh(OP)p 1806 1863 V 18 w(JOIN)g(?op)p 2021 1863 V 18 w(ar)o(g3)h Fu(\(?1)g(\()p Fh(OP)p 2334 1863 V 17 w(SELECT)h(op)p 2601 1863 V 18 w(ar)o(g4)f Fu(\(?2\)\)\)\))374 1950 y(\()p Fh(OP)p 465 1950 V 18 w(SELECT)h(?op)p 755 1950 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 1950 V 18 w(JOIN)g(?op)p 1205 1950 V 18 w(ar)o(g2)h Fu(\(?1)g(?2\)\)\)\))f Ft(\000)-10 b(!)17 b Fu(\()p Fh(OP)p 1806 1950 V 18 w(JOIN)g(?op)p 2021 1950 V 18 w(ar)o(g3)h Fu(\(\()p Fh(OP)p 2257 1950 V 17 w(SELECT)i(op)p 2525 1950 V 17 w(ar)o(g4)e Fu(\(?1\)\))f(?2\)\))374 2037 y(\()p Fh(OP)p 465 2037 V 18 w(JOIN)g(?op)p 680 2037 V 18 w(ar)o(g1)h Fu(\(?1)f(\()p Fh(OP)p 992 2037 V 18 w(MA)-6 b(T)19 b(?op)p 1205 2037 V 18 w(ar)o(g2)e Fu(\(?2\)\)\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1729 2037 V 17 w(MA)-6 b(T)19 b(?op)p 1941 2037 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p 2176 2037 V 18 w(JOIN)h(op)p 2370 2037 V 17 w(ar)o(g4)g Fu(\(?1)g(?2\)\)\)\))374 2124 y(\()p Fh(OP)p 465 2124 V 18 w(JOIN)f(?op)p 680 2124 V 18 w(ar)o(g1)h Fu(\(\()p Fh(OP)p 916 2124 V 17 w(SELECT)h(?op)p 1205 2124 V 18 w(ar)o(g2)f Fu(\(?1\)\))f(?2\)\))h Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1807 2124 V 17 w(SELECT)19 b(?op)p 2096 2124 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p 2331 2124 V 18 w(JOIN)g(op)p 2524 2124 V 18 w(ar)o(g4)g Fu(\(?1)h(?2\)\)\)\))374 2211 y(\()p Fh(OP)p 465 2211 V 18 w(MA)-6 b(T)19 b(?op)p 678 2211 V 17 w(ar)o(g1)f Fu(\(\()p Fh(OP)p 913 2211 V 17 w(JOIN)g(?op)p 1128 2211 V 18 w(ar)o(g2)f Fu(\(?1)h(?2\)\)\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1729 2211 V 17 w(JOIN)g(?op)p 1944 2211 V 18 w(ar)o(g3)f Fu(\(\()p Fh(OP)p 2179 2211 V 18 w(MA)-6 b(T)19 b(op)p 2370 2211 V 17 w(ar)o(g4)f Fu(\(?1\)\))f(?2\)\))374 2298 y(\()p Fh(OP)p 465 2298 V 18 w(JOIN)g(?op)p 680 2298 V 18 w(ar)o(g1)h Fu(\(?1)f(?2\)\))h Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1234 2298 V 17 w(JOIN)17 b(?op)p 1448 2298 V 18 w(ar)o(g2)g Fu(\(?2)h(?1\)\))374 2386 y(\()p Fh(OP)p 465 2386 V 18 w(SELECT)h(?op)p 755 2386 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 2386 V 18 w(SELECT)i(?op)p 1280 2386 V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1805 2386 V 17 w(SELECT)19 b(?op)p 2094 2386 V 18 w(ar)o(g3)e Fu(\(\()p Fh(OP)p 2329 2386 V 18 w(SELECT)i(op)p 2597 2386 V 18 w(ar)o(g4)e Fu(\(?1\)\)\)\))374 2473 y(\()p Fh(OP)p 465 2473 V 18 w(MA)-6 b(T)19 b(?op)p 678 2473 V 17 w(ar)o(g1)f Fu(\(\()p Fh(OP)p 913 2473 V 17 w(MA)-6 b(T)19 b(?op)p 1125 2473 V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1650 2473 V 17 w(MA)k(T)18 b(?op)p 1861 2473 V 18 w(ar)o(g3)g Fu(\(\()p Fh(OP)p 2097 2473 V 17 w(MA)-6 b(T)19 b(op)p 2287 2473 V 18 w(ar)o(g4)e Fu(\(?1\)\)\)\))374 2560 y(\()p Fh(OP)p 465 2560 V 18 w(SELECT)i(?op)p 755 2560 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 2560 V 18 w(SELECT)i(?op)p 1280 2560 V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1805 2560 V 17 w(SELECT)19 b(?op)p 2094 2560 V 18 w(ar)o(g3)e Fu(\(?1\)\))374 2647 y(\()p Fh(OP)p 465 2647 V 18 w(JOIN)g(?op)p 680 2647 V 18 w(ar)o(g1)h Fu(\(\()p Fh(OP)p 916 2647 V 17 w(JOIN)g(?op)p 1131 2647 V 18 w(ar)o(g2)f Fu(\(?1)h(?2\)\))g(?3\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(OP)p 1809 2647 V 17 w(JOIN)g(?op)p 2024 2647 V 18 w(ar)o(g3)f Fu(\(?1)h(\()p Fh(OP)p 2336 2647 V 17 w(JOIN)g(op)p 2529 2647 V 18 w(ar)o(g4)f Fu(\(?2)h (?3\)\)\)\))374 2734 y(\()p Fh(OP)p 465 2734 V 18 w(MA)-6 b(T)19 b(?op)p 678 2734 V 17 w(ar)o(g1)f Fu(\(\()p Fh(OP)p 913 2734 V 17 w(MA)-6 b(T)19 b(?op)p 1125 2734 V 18 w(ar)o(g2)e Fu(\(?1\)\)\)\))h Ft(\000)-10 b(!)17 b Fu(\()p Fh(OP)p 1649 2734 V 18 w(MA)-6 b(T)19 b(?op)p 1862 2734 V 17 w(ar)o(g3)f Fu(\(?1\)\))374 2821 y(\()p Fh(OP)p 465 2821 V 18 w(JOIN)f(?op)p 680 2821 V 18 w(ar)o(g1)h Fu(\(?1)f(?2\)\))h Ft(\000)-10 b(!)p Fu(!\()p Fh(OP)p 1234 2821 V 17 w(JOIN)17 b(?op)p 1448 2821 V 18 w(ar)o(g2)g Fu(\(?2)h(?1\)\))374 3019 y FI(Implementation)24 b(rules)374 3107 y Fu(\()p Fh(OP)p 465 3107 V 18 w(JOIN)17 b(?op)p 680 3107 V 18 w(ar)o(g1)h Fu(\(?1)f(?2\)\))h Ft(\000)-10 b(!)17 b Fu(\()p Fh(Al)p 1219 3107 V 18 w(hh)p 1287 3107 V 18 w(join)g(?al)p 1458 3107 V 18 w(ar)o(g1)g Fu(\(?1)h(?2\)\))374 3194 y(\()p Fh(OP)p 465 3194 V 18 w(JOIN)f(?op)p 680 3194 V 18 w(ar)o(g1)h Fu(\(?1)f(\()p Fh(OP)p 992 3194 V 18 w(GET)i(?op)p 1197 3194 V 17 w(ar)o(g2)f Fu(\(\)\)\)\))f Ft(\000)-10 b(!)17 b Fu(\()p Fh(Al)p 1647 3194 V 18 w(ptr)p 1721 3194 V 17 w(hh)p 1788 3194 V 18 w(join)g(?al)p 1959 3194 V 18 w(ar)o(g1)g Fu(\(?1\)\))374 3281 y(\()p Fh(OP)p 465 3281 V 18 w(SELECT)i(?op)p 755 3281 V 18 w(ar)o(g1)e Fu(\(?1\)\))h Ft(\000)-10 b(!)17 b Fu(\()p Fh(Al)p 1217 3281 V 18 w(\256lter)g(?al)p 1405 3281 V 18 w(ar)o(g1)g Fu(\(?1\)\))374 3368 y(\()p Fh(OP)p 465 3368 V 18 w(MA)-6 b(T)19 b(?op)p 678 3368 V 17 w(ar)o(g1)f Fu(\(?1\)\))g Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1140 3368 V 17 w(assembly)g(?al)p 1418 3368 V 18 w(ar)o(g1)g Fu(\(?1\)\))374 3455 y(\()p Fh(OP)p 465 3455 V 18 w(GET)g(?op)p 669 3455 V 18 w(ar)o(g1)f Fu(\(\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1072 3455 V 18 w(\256le)p 1154 3455 V 17 w(scan)h(?al)p 1336 3455 V 18 w(ar)o(g1)e Fu(\(\)\))374 3542 y(\()p Fh(OP)p 465 3542 V 18 w(UNNEST)h(?op)p 769 3542 V 18 w(ar)o(g1)f Fu(\(?1\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1231 3542 V 18 w(unnest)f(?al)p 1454 3542 V 18 w(ar)o(g1)h Fu(\(?1\)\))374 3630 y(\()p Fh(OP)p 465 3630 V 18 w(PROJECT)h(?op)p 783 3630 V 18 w(ar)o(g1)e Fu(\(?1\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1245 3630 V 18 w(project)f(?al)p 1477 3630 V 18 w(ar)o(g1)g Fu(\(?1\)\))374 3717 y(\()p Fh(OP)p 465 3717 V 18 w(SELECT)i(?op)p 755 3717 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 3717 V 18 w(MA)-6 b(T)19 b(?op)p 1203 3717 V 18 w(ar)o(g2)e Fu(\(\()p Fh(OP)p 1438 3717 V 17 w(GET)i(?op)p 1642 3717 V 18 w(ar)o(g3)e Fu(\(\)\)\)\)\)\))h Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 2141 3717 V 17 w(index)p 2269 3717 V 18 w(scan)g(?al)p 2451 3717 V 18 w(ar)o(g1)f Fu(\(\)\))374 3804 y(\()p Fh(OP)p 465 3804 V 18 w(SELECT)i(?op)p 755 3804 V 18 w(ar)o(g1)e Fu(\(\()p Fh(OP)p 990 3804 V 18 w(GET)h(?op)p 1194 3804 V 18 w(ar)o(g2)g Fu(\(\)\)\)\))f Ft(\000)-11 b(!)18 b Fu(\()p Fh(Al)p 1645 3804 V 18 w(index)p 1774 3804 V 17 w(scan)h(?al)p 1956 3804 V 18 w(ar)o(g1)e Fu(\(\)\))p 3557 3916 4 2665 v 323 3919 3237 4 v 3558 3936 19 2672 v 340 3936 3237 19 v 913 4132 a FP(Figure)24 b(C.1:)31 b(V)-12 b(olcano)25 b(rules)f(for)g(the)g(Open)f(OODB)e (optimizer)1884 5349 y(1)m(10)p eop %%Page: 111 123 111 122 bop 323 958 3237 4 v 323 4209 4 3251 v 374 1046 a FI(T)-7 b(ransformation)25 b(rules)374 1133 y Fh(OP)p 441 1133 15 4 v 18 w(SELECT)q Fu(\()p Fn(S)700 1143 y Fg(1)733 1133 y Fu(\))17 b(:)g Fm(D)861 1143 y Fa(2)915 1133 y Fu(=)-11 b Ft(\))17 b Fh(PR)p 1093 1133 V 18 w(SELECT)r Fu(\()p Fh(PR)p 1379 1133 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)1717 1143 y Fg(1)1749 1133 y Fu(\))17 b(:)h Fm(D)1878 1143 y Fa(3)1913 1133 y Fu(\))g(:)f Fm(D)2042 1143 y Fa(4)374 1221 y Fh(OP)p 441 1221 V 18 w(PROJECT)q Fu(\()p Fn(S)728 1231 y Fg(1)760 1221 y Fu(\))h(:)f Fm(D)889 1231 y Fa(2)943 1221 y Fu(=)-11 b Ft(\))17 b Fh(PR)p 1121 1221 V 18 w(PROJECT)q Fu(\()p Fh(PR)p 1434 1221 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)1772 1231 y Fg(1)1804 1221 y Fu(\))18 b(:)f Fm(D)1933 1231 y Fa(3)1969 1221 y Fu(\))g(:)h Fm(D)2098 1231 y Fa(4)374 1308 y Fh(OP)p 441 1308 V 18 w(JOIN)p Fu(\()p Fn(S)626 1318 y Fg(1)658 1308 y Fn(;)10 b(S)725 1318 y Fg(2)757 1308 y Fu(\))18 b(:)f Fm(D)886 1318 y Fa(3)940 1308 y Fu(=)-11 b Ft(\))17 b Fh(PR)p 1118 1308 V 18 w(JOIN)p Fu(\()p Fh(PR)p 1329 1308 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)1667 1318 y Fg(1)1699 1308 y Fu(\))17 b(:)h Fm(D)1828 1318 y Fa(4)1863 1308 y Fn(;)11 b Fh(PR)p 1957 1308 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)2295 1318 y Fg(2)2327 1308 y Fu(\))17 b(:)h Fm(D)2456 1318 y Fa(5)2491 1308 y Fu(\))g(:)f Fm(D)2620 1318 y Fa(6)374 1395 y Fh(OP)p 441 1395 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)623 1405 y Fg(1)655 1395 y Fu(\))18 b(:)f Fm(D)784 1405 y Fa(2)837 1395 y Fu(=)-11 b Ft(\))18 b Fh(PR)p 1016 1395 V 18 w(MA)-6 b(T)q Fu(\()p Fh(PR)p 1224 1395 V 18 w(ASSEMBL)h(Y)q Fu(\()p Fn(S)1562 1405 y Fg(1)1594 1395 y Fu(\))17 b(:)h Fm(D)1723 1405 y Fa(3)1758 1395 y Fu(\))g(:)f Fm(D)1887 1405 y Fa(4)374 1482 y Fh(OP)p 441 1482 V 18 w(UNNEST)p Fu(\()p Fn(S)714 1492 y Fg(1)746 1482 y Fu(\))h(:)f Fm(D)875 1492 y Fa(2)929 1482 y Fu(=)-11 b Ft(\))17 b Fh(PR)p 1107 1482 V 18 w(UNNEST)q Fu(\()p Fh(PR)p 1407 1482 V 17 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)1744 1492 y Fg(1)1776 1482 y Fu(\))18 b(:)f Fm(D)1905 1492 y Fa(3)1941 1482 y Fu(\))h(:)f Fm(D)2070 1492 y Fa(4)374 1569 y Fh(OP)p 441 1569 V 18 w(SELECT)q Fu(\()p Fn(S)700 1579 y Fg(1)733 1569 y Fu(\))g(:)g Fm(D)861 1579 y Fa(2)915 1569 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1096 1569 V 18 w(SELECT)r Fu(\()p Fh(OP)p 1385 1569 V 17 w(SELECT)r Fu(\()p Fn(S)1644 1579 y Fg(1)1676 1569 y Fu(\))h(:)f Fm(D)1805 1579 y Fa(3)1841 1569 y Fu(\))g(:)h Fm(D)1970 1579 y Fa(4)374 1656 y Fh(OP)p 441 1656 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p 652 1656 V 18 w(SELECT)q Fu(\()p Fn(S)911 1666 y Fg(1)943 1656 y Fu(\))18 b(:)f Fm(D)1072 1666 y Fa(2)1108 1656 y Fu(\))h(:)f Fm(D)1237 1666 y Fa(3)1290 1656 y Fu(=)-11 b Ft(\))18 b Fh(OP)p 1472 1656 V 18 w(SELECT)q Fu(\()p Fh(OP)p 1760 1656 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)1942 1666 y Fg(1)1974 1656 y Fu(\))18 b(:)f Fm(D)2103 1666 y Fa(4)2139 1656 y Fu(\))g(:)h Fm(D)2268 1666 y Fa(5)374 1744 y Fh(OP)p 441 1744 V 18 w(SELECT)q Fu(\()p Fh(OP)p 729 1744 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)911 1754 y Fg(1)943 1744 y Fu(\))18 b(:)f Fm(D)1072 1754 y Fa(2)1108 1744 y Fu(\))h(:)f Fm(D)1237 1754 y Fa(3)1290 1744 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p 1489 1744 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p 1700 1744 V 18 w(SELECT)q Fu(\()p Fn(S)1959 1754 y Fg(1)1992 1744 y Fu(\))17 b(:)g Fm(D)2120 1754 y Fa(4)2156 1744 y Fu(\))h(:)f Fm(D)2285 1754 y Fa(5)374 1831 y Fh(OP)p 441 1831 V 18 w(SELECT)q Fu(\()p Fh(OP)p 729 1831 V 18 w(UNNEST)p Fu(\()p Fn(S)1002 1841 y Fg(1)1035 1831 y Fu(\))g(:)g Fm(D)1163 1841 y Fa(2)1199 1831 y Fu(\))h(:)f Fm(D)1328 1841 y Fa(3)1382 1831 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1563 1831 V 18 w(UNNEST)p Fu(\()p Fh(OP)p 1865 1831 V 18 w(SELECT)r Fu(\()p Fn(S)2125 1841 y Fg(1)2157 1831 y Fu(\))g(:)h Fm(D)2286 1841 y Fa(4)2321 1831 y Fu(\))g(:)f Fm(D)2450 1841 y Fa(5)374 1918 y Fh(OP)p 441 1918 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)623 1928 y Fg(1)655 1918 y Fu(\))18 b(:)f Fm(D)784 1928 y Fa(2)837 1918 y Fu(=)-11 b Ft(\))18 b Fh(OP)p 1019 1918 V 18 w(JOIN)o Fu(\()p Fn(S)1203 1928 y Fg(1)1236 1918 y Fn(;)10 b Fh(OP)p 1332 1918 V 18 w(GET)q Fu(\()p Fn(F)1507 1928 y Fg(3)1538 1918 y Fu(\))18 b(:)f Fm(D)1667 1928 y Fa(4)1703 1918 y Fu(\))h(:)f Fm(D)1832 1928 y Fa(5)374 2005 y Fh(OP)p 441 2005 V 18 w(SELECT)q Fu(\()p Fh(OP)p 729 2005 V 18 w(JOIN)p Fu(\()p Fn(S)914 2015 y Fg(1)946 2005 y Fn(;)11 b(S)1014 2015 y Fg(2)1046 2005 y Fu(\))17 b(:)g Fm(D)1174 2015 y Fa(3)1210 2005 y Fu(\))h(:)f Fm(D)1339 2015 y Fa(4)1393 2005 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1574 2005 V 18 w(JOIN)p Fu(\()p Fn(S)1759 2015 y Fg(1)1791 2005 y Fn(;)10 b Fh(OP)p 1887 2005 V 18 w(SELECT)r Fu(\()p Fn(S)2147 2015 y Fg(2)2179 2005 y Fu(\))17 b(:)h Fm(D)2308 2015 y Fa(5)2343 2005 y Fu(\))g(:)f Fm(D)2472 2015 y Fa(6)374 2092 y Fh(OP)p 441 2092 V 18 w(SELECT)q Fu(\()p Fh(OP)p 729 2092 V 18 w(JOIN)p Fu(\()p Fn(S)914 2102 y Fg(1)946 2092 y Fn(;)11 b(S)1014 2102 y Fg(2)1046 2092 y Fu(\))17 b(:)g Fm(D)1174 2102 y Fa(3)1210 2092 y Fu(\))h(:)f Fm(D)1339 2102 y Fa(4)1393 2092 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1574 2092 V 18 w(JOIN)p Fu(\()p Fh(OP)p 1788 2092 V 17 w(SELECT)r Fu(\()p Fn(S)2047 2102 y Fg(1)2079 2092 y Fu(\))h(:)f Fm(D)2208 2102 y Fa(5)2244 2092 y Fn(;)10 b(S)2311 2102 y Fg(2)2343 2092 y Fu(\))18 b(:)f Fm(D)2472 2102 y Fa(6)374 2180 y Fh(OP)p 441 2180 V 18 w(JOIN)p Fu(\()p Fn(S)626 2190 y Fg(1)658 2180 y Fn(;)10 b Fh(OP)p 754 2180 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)936 2190 y Fg(2)968 2180 y Fu(\))18 b(:)f Fm(D)1097 2190 y Fa(3)1133 2180 y Fu(\))h(:)f Fm(D)1262 2190 y Fa(4)1315 2180 y Fu(=)-11 b Ft(\))18 b Fh(OP)p 1497 2180 V 17 w(MA)-6 b(T)r Fu(\()p Fh(OP)p 1708 2180 V 17 w(JOIN)p Fu(\()p Fn(S)1892 2190 y Fg(1)1924 2180 y Fn(;)11 b(S)1992 2190 y Fg(2)2024 2180 y Fu(\))17 b(:)h Fm(D)2153 2190 y Fa(5)2188 2180 y Fu(\))g(:)f Fm(D)2317 2190 y Fa(6)374 2267 y Fh(OP)p 441 2267 V 18 w(JOIN)p Fu(\()p Fn(S)626 2277 y Fg(1)658 2267 y Fn(;)10 b Fh(OP)p 754 2267 V 18 w(SELECT)r Fu(\()p Fn(S)1014 2277 y Fg(2)1046 2267 y Fu(\))17 b(:)g Fm(D)1174 2277 y Fa(3)1210 2267 y Fu(\))h(:)f Fm(D)1339 2277 y Fa(4)1393 2267 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p 1592 2267 V 17 w(SELECT)r Fu(\()p Fh(OP)p 1880 2267 V 18 w(JOIN)p Fu(\()p Fn(S)2065 2277 y Fg(1)2097 2267 y Fn(;)10 b(S)2164 2277 y Fg(2)2196 2267 y Fu(\))18 b(:)f Fm(D)2325 2277 y Fa(5)2361 2267 y Fu(\))h(:)f Fm(D)2490 2277 y Fa(6)374 2354 y Fh(OP)p 441 2354 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p 652 2354 V 18 w(JOIN)o Fu(\()p Fn(S)836 2364 y Fg(1)869 2354 y Fn(;)10 b(S)936 2364 y Fg(2)968 2354 y Fu(\))18 b(:)f Fm(D)1097 2364 y Fa(3)1133 2354 y Fu(\))h(:)f Fm(D)1262 2364 y Fa(4)1315 2354 y Fu(=)-11 b Ft(\))18 b Fh(OP)p 1497 2354 V 17 w(JOIN)p Fu(\()p Fh(OP)p 1710 2354 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)1892 2364 y Fg(1)1924 2354 y Fu(\))18 b(:)f Fm(D)2053 2364 y Fa(5)2089 2354 y Fn(;)10 b(S)2156 2364 y Fg(2)2188 2354 y Fu(\))18 b(:)f Fm(D)2317 2364 y Fa(6)374 2441 y Fh(OP)p 441 2441 V 18 w(JOIN)p Fu(\()p Fn(S)626 2451 y Fg(1)658 2441 y Fn(;)10 b(S)725 2451 y Fg(2)757 2441 y Fu(\))18 b(:)f Fm(D)886 2451 y Fa(3)940 2441 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p 1139 2441 V 17 w(JOIN)p Fu(\()p Fn(S)1323 2451 y Fg(2)1355 2441 y Fn(;)11 b(S)1423 2451 y Fg(1)1455 2441 y Fu(\))18 b(:)f Fm(D)1584 2451 y Fa(4)374 2528 y Fh(OP)p 441 2528 V 18 w(SELECT)q Fu(\()p Fh(OP)p 729 2528 V 18 w(SELECT)r Fu(\()p Fn(S)989 2538 y Fg(1)1021 2528 y Fu(\))g(:)h Fm(D)1150 2538 y Fa(2)1186 2528 y Fu(\))f(:)g Fm(D)1314 2538 y Fa(3)1368 2528 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p 1567 2528 V 18 w(SELECT)q Fu(\()p Fh(OP)p 1855 2528 V 18 w(SELECT)q Fu(\()p Fn(S)2114 2538 y Fg(1)2147 2528 y Fu(\))g(:)g Fm(D)2275 2538 y Fa(4)2311 2528 y Fu(\))h(:)f Fm(D)2440 2538 y Fa(5)374 2615 y Fh(OP)p 441 2615 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p 652 2615 V 18 w(MA)g(T)q Fu(\()p Fn(S)834 2625 y Fg(1)866 2615 y Fu(\))17 b(:)h Fm(D)995 2625 y Fa(2)1030 2615 y Fu(\))g(:)f Fm(D)1159 2625 y Fa(3)1213 2615 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p 1412 2615 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p 1623 2615 V 17 w(MA)g(T)q Fu(\()p Fn(S)1804 2625 y Fg(1)1837 2615 y Fu(\))17 b(:)g Fm(D)1965 2625 y Fa(4)2001 2615 y Fu(\))h(:)f Fm(D)2130 2625 y Fa(5)374 2703 y Fh(OP)p 441 2703 V 18 w(SELECT)q Fu(\()p Fh(OP)p 729 2703 V 18 w(SELECT)r Fu(\()p Fn(S)989 2713 y Fg(1)1021 2703 y Fu(\))g(:)h Fm(D)1150 2713 y Fa(2)1186 2703 y Fu(\))f(:)g Fm(D)1314 2713 y Fa(3)1368 2703 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p 1567 2703 V 18 w(SELECT)q Fu(\()p Fn(S)1826 2713 y Fg(1)1858 2703 y Fu(\))h(:)f Fm(D)1987 2713 y Fa(4)374 2790 y Fh(OP)p 441 2790 V 18 w(JOIN)p Fu(\()p Fh(OP)p 655 2790 V 17 w(JOIN)p Fu(\()p Fn(S)839 2800 y Fg(1)871 2790 y Fn(;)11 b(S)939 2800 y Fg(2)971 2790 y Fu(\))18 b(:)f Fm(D)1100 2800 y Fa(4)1136 2790 y Fn(;)10 b(S)1203 2800 y Fg(3)1235 2790 y Fu(\))18 b(:)f Fm(D)1364 2800 y Fa(5)1418 2790 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1599 2790 V 18 w(JOIN)p Fu(\()p Fn(S)1784 2800 y Fg(1)1816 2790 y Fn(;)10 b Fh(OP)p 1912 2790 V 18 w(JOIN)p Fu(\()p Fn(S)2097 2800 y Fg(2)2129 2790 y Fn(;)g(S)2196 2800 y Fg(3)2228 2790 y Fu(\))18 b(:)f Fm(D)2357 2800 y Fa(6)2393 2790 y Fu(\))h(:)f Fm(D)2522 2800 y Fa(7)374 2877 y Fh(OP)p 441 2877 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p 652 2877 V 18 w(MA)g(T)q Fu(\()p Fn(S)834 2887 y Fg(1)866 2877 y Fu(\))17 b(:)h Fm(D)995 2887 y Fa(2)1030 2877 y Fu(\))g(:)f Fm(D)1159 2887 y Fa(3)1213 2877 y Fu(=)-11 b Ft(\))17 b Fh(OP)p 1394 2877 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)1576 2887 y Fg(1)1608 2877 y Fu(\))18 b(:)f Fm(D)1737 2887 y Fa(4)374 2964 y Fh(OP)p 441 2964 V 18 w(JOIN)p Fu(\()p Fn(S)626 2974 y Fg(1)658 2964 y Fn(;)10 b(S)725 2974 y Fg(2)757 2964 y Fu(\))18 b(:)f Fm(D)886 2974 y Fa(3)940 2964 y Fu(=)-11 b Ft(\))p Fu(!)17 b Fh(OP)p 1139 2964 V 17 w(JOIN)p Fu(\()p Fn(S)1323 2974 y Fg(2)1355 2964 y Fn(;)11 b(S)1423 2974 y Fg(1)1455 2964 y Fu(\))18 b(:)f Fm(D)1584 2974 y Fa(4)374 3138 y FI(Implementation)24 b(rules)374 3226 y Fh(PR)p 438 3226 V 18 w(JOIN)p Fu(\()p Fn(S)623 3236 y Fg(1)655 3226 y Fn(;)11 b(S)723 3236 y Fg(2)755 3226 y Fu(\))17 b(:)h Fm(D)884 3236 y Fa(3)937 3226 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1105 3226 V 17 w(hh)p 1172 3226 V 18 w(join)p Fu(\()p Fn(S)1327 3236 y Fg(1)1376 3226 y Fu(:)g Fm(D)1464 3236 y Fa(4)1499 3226 y Fn(;)11 b(S)1567 3236 y Fg(2)1617 3226 y Fu(:)17 b Fm(D)1704 3236 y Fa(5)1740 3226 y Fu(\))g(:)h Fm(D)1869 3236 y Fa(6)374 3313 y Fh(PR)p 438 3313 V 18 w(JOIN)p Fu(\()p Fn(S)623 3323 y Fg(1)655 3313 y Fn(;)11 b Fh(OP)p 752 3313 V 17 w(GET)q Fu(\()p Fn(F)926 3323 y Fg(2)958 3313 y Fu(\))18 b(:)f Fm(D)1087 3323 y Fa(3)1123 3313 y Fu(\))g(:)h Fm(D)1252 3323 y Fa(4)1305 3313 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1473 3313 V 17 w(ptr)p 1546 3313 V 18 w(hh)p 1614 3313 V 17 w(join)p Fu(\()p Fn(S)1768 3323 y Fg(1)1818 3313 y Fu(:)f Fm(D)1905 3323 y Fa(6)1941 3313 y Fu(\))g(:)h Fm(D)2070 3323 y Fa(5)374 3400 y Fh(PR)p 438 3400 V 18 w(SELECT)r Fu(\()p Fn(S)698 3410 y Fg(1)730 3400 y Fu(\))f(:)h Fm(D)859 3410 y Fa(2)912 3400 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1080 3400 V 17 w(\256lter)p Fu(\()p Fn(S)1251 3410 y Fg(1)1300 3400 y Fu(:)g Fm(D)1388 3410 y Fa(4)1423 3400 y Fu(\))g(:)f Fm(D)1552 3410 y Fa(3)374 3487 y Fh(PR)p 438 3487 V 18 w(MA)-6 b(T)q Fu(\()p Fn(S)620 3497 y Fg(1)652 3487 y Fu(\))18 b(:)f Fm(D)781 3497 y Fa(2)835 3487 y Fu(=)-11 b Ft(\))17 b Fh(Al)p 1002 3487 V 18 w(assembly)p Fu(\()p Fn(S)1264 3497 y Fg(1)1314 3487 y Fu(:)g Fm(D)1401 3497 y Fa(4)1437 3487 y Fu(\))h(:)f Fm(D)1566 3497 y Fa(3)374 3574 y Fh(OP)p 441 3574 V 18 w(GET)q Fu(\()p Fn(F)616 3584 y Fg(1)648 3574 y Fu(\))g(:)g Fm(D)776 3584 y Fa(2)830 3574 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 998 3574 V 17 w(\256le)p 1079 3574 V 18 w(scan)p Fu(\()p Fn(F)1245 3584 y Fg(1)1277 3574 y Fu(\))g(:)f Fm(D)1406 3584 y Fa(3)374 3661 y Fh(PR)p 438 3661 V 18 w(UNNEST)q Fu(\()p Fn(S)712 3671 y Fg(1)744 3661 y Fu(\))g(:)g Fm(D)872 3671 y Fa(2)926 3661 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1094 3661 V 17 w(unnest)p Fu(\()p Fn(S)1300 3671 y Fg(1)1350 3661 y Fu(:)f Fm(D)1437 3671 y Fa(4)1473 3661 y Fu(\))h(:)f Fm(D)1602 3671 y Fa(3)374 3749 y Fh(PR)p 438 3749 V 18 w(PROJECT)q Fu(\()p Fn(S)725 3759 y Fg(1)757 3749 y Fu(\))h(:)f Fm(D)886 3759 y Fa(2)940 3749 y Fu(=)-11 b Ft(\))17 b Fh(Al)p 1107 3749 V 18 w(project)p Fu(\()p Fn(S)1323 3759 y Fg(1)1372 3749 y Fu(:)g Fm(D)1459 3759 y Fa(4)1495 3749 y Fu(\))h(:)f Fm(D)1624 3759 y Fa(3)374 3836 y Fh(PR)p 438 3836 V 18 w(SELECT)r Fu(\()p Fh(PR)p 724 3836 V 18 w(MA)-6 b(T)q Fu(\()p Fh(OP)p 935 3836 V 17 w(GET)q Fu(\()p Fn(F)1109 3846 y Fg(1)1141 3836 y Fu(\))18 b(:)f Fm(D)1270 3846 y Fa(2)1306 3836 y Fu(\))h(:)f Fm(D)1435 3846 y Fa(3)1471 3836 y Fu(\))g(:)g Fm(D)1599 3846 y Fa(4)1653 3836 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1821 3836 V 17 w(index)p 1949 3836 V 18 w(scan)p Fu(\()p Fn(F)2115 3846 y Fg(1)2147 3836 y Fu(\))g(:)f Fm(D)2276 3846 y Fa(5)374 3923 y Fh(PR)p 438 3923 V 18 w(SELECT)r Fu(\()p Fh(OP)p 727 3923 V 17 w(GET)q Fu(\()p Fn(F)901 3933 y Fg(1)933 3923 y Fu(\))h(:)f Fm(D)1062 3933 y Fa(2)1098 3923 y Fu(\))h(:)f Fm(D)1227 3933 y Fa(3)1280 3923 y Fu(=)-11 b Ft(\))18 b Fh(Al)p 1448 3923 V 18 w(index)p 1577 3923 V 17 w(scan)q Fu(\()p Fn(F)1743 3933 y Fg(1)1775 3923 y Fu(\))f(:)h Fm(D)1904 3933 y Fa(4)374 4010 y Fh(PR)p 438 4010 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)776 4020 y Fg(1)808 4010 y Fu(\))18 b(:)f Fm(D)937 4020 y Fa(2)990 4010 y Fu(=)-11 b Ft(\))18 b Fh(Null)o Fu(\()p Fn(S)1255 4020 y Fg(1)1305 4010 y Fu(:)f Fm(D)1392 4020 y Fa(3)1428 4010 y Fu(\))h(:)f Fm(D)1557 4020 y Fa(4)374 4097 y Fh(PR)p 438 4097 V 18 w(ASSEMBL)-5 b(Y)q Fu(\()p Fn(S)776 4107 y Fg(1)808 4097 y Fu(\))18 b(:)f Fm(D)937 4107 y Fa(2)990 4097 y Fu(=)-11 b Ft(\))18 b Fh(Enf)p 1180 4097 V 18 w(assembly)p Fu(\()p Fn(S)1442 4107 y Fg(1)1492 4097 y Fu(:)f Fm(D)1579 4107 y Fa(3)1615 4097 y Fu(\))h(:)f Fm(D)1744 4107 y Fa(4)p 3557 4209 4 3251 v 323 4212 3237 4 v 3558 4229 19 3258 v 340 4229 3237 19 v 940 4425 a FP(Figure)24 b(C.2:)31 b(Prairie)24 b(rules)g(for)g(the)g(Open)f(OODB)e(optimizer)1885 5349 y(1)m(1)m(1)p eop %%Page: 112 124 112 123 bop 318 1414 3247 4 v 318 3754 4 2340 v 386 1489 a Fv(\()p FF(OP)p 502 1489 20 4 v 24 w(JOIN)19 b(?op)p 784 1489 V 25 w(ar)o(g1)i Fv(\(?1)f(\()p FF(OP)p 1173 1489 V 24 w(MA)-7 b(T)19 b(?op)p 1452 1489 V 25 w(ar)o(g2)h Fv(\(?2\)\)\)\))j FB(\000)-12 b(!)19 b Fv(\()p FF(OP)p 2084 1489 V 24 w(MA)-7 b(T)19 b(?op)p 2363 1489 V 25 w(ar)o(g3)h Fv(\(\()p FF(OP)p 2663 1489 V 25 w(JOIN)g(op)p 2918 1489 V 24 w(ar)o(g4)g Fv(\(?1)h(?2\)\)\)\))16 b FF(\(C.1\))386 1568 y(\045cond)p 573 1568 V 25 w(code)386 1647 y FB(ff)601 1725 y FF(1.)22 b(if)c Fv(\()p FF(dependent)p 1032 1725 V 27 w(mat)p 1158 1725 V 24 w(and)p 1277 1725 V 25 w(pred)q Fv(\()p FF(?op)p 1542 1725 V 26 w(ar)o(g2)p Fs(;)12 b FF(?op)p 1811 1725 V 25 w(ar)o(g1)p Fs(;)g FF(PRED)p 2154 1725 V 23 w(DEPENDS)p 2477 1725 V 23 w(ON)p 2596 1725 V 24 w(MA)-7 b(T)o Fv(\))20 b(==)g FF(TRUE)o Fv(\))736 1804 y FF(REJECT)c Fv(;)386 1883 y FB(gg)386 1962 y FF(\045appl)p 558 1962 V 25 w(code)386 2041 y FB(ff)601 2120 y FF(2.)22 b(copy)p 805 2120 V 25 w(operator)p 1049 2120 V 27 w(ar)o(g)p Fv(\()p FF(?op)p 1281 2120 V 25 w(ar)o(g4)q Fs(;)12 b FF(?op)p 1550 2120 V 24 w(ar)o(g1)q Fv(\))17 b(;)601 2199 y FF(3.)22 b(copy)p 805 2199 V 25 w(operator)p 1049 2199 V 27 w(ar)o(g)p Fv(\()p FF(?op)p 1281 2199 V 25 w(ar)o(g3)q Fs(;)12 b FF(?op)p 1550 2199 V 24 w(ar)o(g2)q Fv(\))17 b(;)386 2278 y FB(gg)1702 2428 y Fy(\(a\))h(V)-10 b(olcano)21 b(rule)p 369 2527 3146 4 v 374 2577 a FF(OP)p 463 2577 20 4 v 24 w(JOIN)p Fv(\()p Fs(S)697 2586 y Fu(1)732 2577 y Fs(;)11 b FF(OP)p 852 2577 V 24 w(MA)-7 b(T)o Fv(\()p Fs(S)1082 2586 y Fu(2)1117 2577 y Fv(\))20 b(:)f Fo(D)1265 2586 y Fm(3)1304 2577 y Fv(\))h(:)g Fo(D)1453 2586 y Fm(4)1511 2577 y Fv(=)-12 b FB(\))19 b FF(OP)p 1733 2577 V 24 w(MA)-7 b(T)o Fv(\()p FF(OP)p 2009 2577 V 25 w(JOIN)p Fv(\()p Fs(S)2244 2586 y Fu(1)2279 2577 y Fs(;)11 b(S)2353 2586 y Fu(2)2387 2577 y Fv(\))20 b(:)g Fo(D)2536 2586 y Fm(5)2575 2577 y Fv(\))g(:)f Fo(D)2723 2586 y Fm(6)3371 2577 y FF(\(C.2\))374 2681 y FB(ff)374 2839 y(gg)374 2918 y FF(1.)j(dependent)p 720 2918 V 27 w(mat)p 846 2918 V 25 w(and)p 966 2918 V 24 w(pred)q Fv(\(&\()p Fo(D)1275 2927 y Fm(3)1315 2918 y Fs(:)p FF(oa)p Fv(\))p Fs(;)12 b Fv(&\()p Fo(D)1600 2927 y Fm(4)1640 2918 y Fs(:)p FF(oa)p Fv(\))p Fs(;)g FF(PRED)p 1955 2918 V 23 w(DEPENDS)p 2278 2918 V 23 w(ON)p 2397 2918 V 24 w(MA)-7 b(T)o Fv(\)!)20 b(=)f FF(TRUE)374 2997 y FB(ff)590 3075 y FF(2.)j(dcopy)q Fv(\()p Fo(D)913 3084 y Fm(5)953 3075 y Fs(:)p FF(oa)p Fs(;)11 b Fo(D)1128 3084 y Fm(4)1167 3075 y Fs(:)p FF(oa)q Fv(\))17 b(;)590 3154 y FF(3.)22 b(dcopy)q Fv(\()p Fo(D)913 3163 y Fm(6)953 3154 y Fs(:)p FF(oa)p Fs(;)11 b Fo(D)1128 3163 y Fm(3)1167 3154 y Fs(:)p FF(oa)q Fv(\))17 b(;)590 3233 y FF(4.)22 b(dcopy)q Fv(\()p Fo(D)913 3242 y Fm(6)953 3233 y Fs(:)p FF(lp)p Fs(;)11 b Fo(D)1117 3242 y Fm(4)1156 3233 y Fs(:)p FF(lp)q Fv(\);)590 3312 y FF(5.)22 b(init)p 753 3312 V 25 w(descriptor)p 1041 3312 V 27 w(OP)p 1153 3312 V 24 w(JOIN)p Fv(\(&\()p Fo(D)1488 3321 y Fm(5)1527 3312 y Fv(\))p Fs(;)12 b Fv(&\()p Fo(D)1730 3321 y Fm(1)1770 3312 y Fv(\))p Fs(;)f Fv(&\()p Fo(D)1972 3321 y Fm(2)2012 3312 y Fv(\)\))17 b(;)374 3391 y FB(gg)434 3541 y Fy(\(b\))h(Prairie)f (rule)g(corresponding)j(to)e(the)g(rule)f(in)h(\(a\).)24 b(Statement)17 b(numbers)i(correspond)h(to)d(the)h(same)g(numbered)434 3633 y(statements)i(in)e(\(a\).)p 3562 3754 4 2340 v 318 3757 3247 4 v 3564 3774 19 2347 v 335 3774 3247 19 v 1070 3970 a FP(Figure)24 b(C.3:)31 b(Comparison)25 b(of)e(an)h(Open)f(OODB)f(rule)1884 5349 y(1)m(12)p eop %%Page: 113 125 113 124 bop 2441 1180 a FM(Bibliography)345 1681 y FP([1])47 b(M.)22 b(M.)g(Astrahan)j(et)e(al.)33 b(System)23 b(R:)g(Relational)i (approach)h(to)d(database)i(management.)35 b FD(ACM)497 1851 y(T)-5 b(ransactions)26 b(on)e(Database)h(Systems)p FP(,)g(1\(2\):97\261137,)h(June)f(1976.)345 2095 y([2])47 b(Don)17 b(Batory)-6 b(.)21 b(Modeling)e(the)e(storage)i(architectures) i(of)16 b(commercial)j(database)g(systems.)j FD(ACM)497 2264 y(T)-5 b(ransactions)26 b(on)e(Database)h(Systems)p FP(,)g(10\(4\):463\261528,)i(December)e(1985.)345 2508 y([3])47 b(Don)25 b(Batory)-6 b(.)42 b(Extensible)27 b(cost)f(models)g(and)f(query)h(optimization)i(in)d(GENESIS.)39 b FD(Database)497 2678 y(Engineering)p FP(,)26 b(9\(4\):30\26136,)g (December)f(1986.)345 2922 y([4])47 b(Don)23 b(Batory)-6 b(.)34 b(Building)25 b(blocks)g(of)f(database)h(management)h(systems.) 34 b(T)-6 b(echnical)25 b(Report)f(TR)497 3091 y(87\26123,)h(The)e (University)i(of)f(T)-6 b(exas)23 b(at)h(Austin,)f(February)i(1988.)345 3335 y([5])47 b(Don)17 b(Batory)-6 b(.)23 b(On)17 b(the)h(reusability)i (of)e(query)h(optimization)h(algorithms.)k FD(Information)c(Systems)p FP(,)497 3505 y(49\(1/3\),)25 b(1989.)345 3749 y([6])47 b(Don)24 b(Batory)-6 b(.)40 b(The)25 b(Genesis)g(database)i(system)f (compiler:)35 b(User)24 b(manual.)41 b(T)-6 b(echnical)26 b(Report)497 3918 y(TR)c(90\26127,)j(The)e(University)i(of)f(T)-6 b(exas)23 b(at)g(Austin,)h(August)h(1990.)345 4162 y([7])47 b(Don)28 b(Batory)-6 b(,)31 b(Lou)d(Coglianese,)k(Mark)c(Goodwin,)i (and)f(Steve)g(Shafer)-5 b(.)59 b(Creating)30 b(reference)497 4332 y(architectures:)52 b(An)31 b(example)i(from)f(avionics.)78 b(In)31 b FD(Pr)m(oceedings)k(Symposium)e(on)f(Softwar)m(e)497 4501 y(Reusability)p FP(,)25 b(Seattle,)f(April)g(1995.)345 4745 y([8])47 b(Don)24 b(Batory)h(and)g(Bart)f(Geraci.)37 b(V)-10 b(alidating)26 b(component)g(compositions)i(in)c(software)h (system)497 4914 y(generators.)36 b(T)-6 b(echnical)25 b(Report)f(TR)e(95\26103,)j(The)e(University)i(of)f(T)-6 b(exas)23 b(at)h(Austin,)f(1995.)1884 5349 y(1)m(13)p eop %%Page: 114 126 114 125 bop 345 391 a FP([9])47 b(Don)24 b(Batory)h(and)f(Sean)g (O'Malley)-6 b(.)37 b(The)24 b(design)h(and)g(implementation)i(of)d (hierarchical)j(soft-)497 561 y(ware)21 b(systems)h(with)f(reusable)i (components.)31 b FD(ACM)19 b(T)-5 b(ransactions)24 b(on)d(Softwar)m(e) i(Engineering)497 730 y(and)h(Methodology)p FP(,)i(1\(4\):355\261398,)i (October)c(1992.)300 974 y([10])47 b(Don)33 b(Batory)-6 b(,)36 b(V)-5 b(ivek)34 b(Singhal,)i(Marty)e(Sirkin,)i(and)e(Jef)n(f)g (Thomas.)82 b(Scalable)35 b(software)f(li-)497 1144 y(braries.)60 b(In)28 b FD(Pr)m(oceedings)j(1993)f(ACM)c(SIGSOFT)h(Confer)m(ence)p FP(,)32 b(pages)e(191\261199,)i(Los)c(An-)497 1313 y(geles,)c(December) g(1993.)303 1557 y([1)m(1])47 b(Don)38 b(Batory)-6 b(,)42 b(V)-5 b(ivek)38 b(Singhal,)k(Jef)n(f)d(Thomas,)i(Sankar)e(Dasari,)j (Bart)c(Geraci,)j(and)e(Marty)497 1726 y(Sirkin.)28 b(The)19 b(GenV)-12 b(oca)21 b(model)g(of)f(software-system)k(generators.)30 b FD(IEEE)18 b(Softwar)m(e)p FP(,)k(1)m(1\(5\):89\261)497 1896 y(94,)h(September)i(1994.)300 2140 y([12])47 b(Don)20 b(Batory)h(and)g(Devang)g(V)-10 b(asavada.)28 b(Software)21 b(components)i(for)d(object-oriented)25 b(database)497 2309 y(systems.)30 b FD(International)25 b(Journal)f(of)d(Softwar)m(e)h (Engineering)i(and)e(Knowledge)h(Engineering)p FP(,)497 2478 y(3\(2\):165\261192,)k(1993.)300 2723 y([13])47 b(Dina)18 b(Bitton,)h(David)g(J.)e(DeW)l(itt,)j(and)e(Carolyn)h(T)m (urby\256ll.)24 b(Benchmarking)d(database)f(systems:)497 2892 y(A)26 b(systematic)k(approach.)55 b(In)28 b FD(Pr)m(oceedings)h (9th)f(International)k(Confer)m(ence)d(on)f(V)-10 b(ery)27 b(Lar)m(ge)497 3061 y(Data)c(Bases)p FP(,)h(pages)h(8\26119,)f (Florence,)h(November)f(1983.)300 3305 y([14])47 b(Dina)26 b(Bitton)i(and)f(Carolyn)h(T)m(urby\256ll.)48 b(A)26 b(retrospective)k(on)d(the)g(wisconsin)h(benchmark.)51 b(In)497 3475 y(Michael)26 b(Stonebraker)l(,)i(editor)l(,)f FD(Readings)f(in)f(Database)i(Systems)p FP(.)e(Mor)n(gan)i(Kaufmann,)f (San)497 3644 y(Mateo,)e(second)h(edition,)g(1994.)300 3888 y([15])47 b(Jos)617 3887 y(\302)612 3888 y(e)27 b(A.)e(Blakeley)-6 b(,)29 b(W)l(illiam)e(J.)f(McKenna,)i(and)f(Goetz)g (Graefe.)49 b(Experiences)29 b(building)g(the)497 4058 y(Open)17 b(OODB)d(query)19 b(optimizer)-5 b(.)22 b(In)17 b FD(Pr)m(oceedings)i(1993)f(ACM)d(SIGMOD)g(International)21 b(Con-)497 4227 y(fer)m(ence)k(on)e(Management)j(of)d(Data)p FP(,)h(pages)g(287\261296,)i(W)-7 b(ashington,)25 b(May)f(1993.)300 4471 y([16])47 b(M.)25 b(W)-8 b(.)25 b(Blasgen)i(and)g(K.)e(P)-10 b(.)25 b(Eswaran.)47 b(Storage)27 b(and)g(access)h(in)e(relational)j (data)e(bases.)48 b FD(IBM)497 4640 y(Systems)24 b(Journal)p FP(,)i(16\(4\):363\261377,)i(1977.)300 4884 y([17])47 b(Michael)32 b(J.)e(Carey)-6 b(,)34 b(David)d(J.)f(DeW)l(itt,)j(Daniel) f(Frank,)h(Goetz)e(Graefe,)i(M.)d(Muralikrishna,)497 5054 y(Joel)d(E.)e(Richardson,)k(and)e(Eugene)h(J.)d(Shekita.)49 b(The)26 b(architecture)k(of)d(the)f(EXODUS)e(exten-)1884 5349 y(1)m(14)p eop %%Page: 115 127 115 126 bop 497 391 a FP(sible)29 b(DBMS.)55 b(In)28 b FD(Pr)m(oceedings)j(International)h(W)-8 b(orkshop)30 b(on)e(Object-Oriented)k(Database)497 561 y(Systems)p FP(,)24 b(pages)h(52\26165,)g(Asilomar)l(,)f(September)g(1986.)300 805 y([18])47 b(Chin-Liang)22 b(Chang)e(and)h(Richard)g(Char)n(-T)m (ung)h(Lee.)27 b FD(Symbolic)21 b(Logic)g(and)g(Mechanical)h(The-)497 974 y(or)m(em)h(Pr)m(oving)p FP(.)34 b(Academic)24 b(Press,)g(1973.)300 1218 y([19])47 b(Thomas)26 b(Cormen,)g(Charles)g(Leiserson,)i(and)e (Ronald)g(Rivest.)45 b FD(Intr)m(oduction)29 b(to)c(Algorithms)p FP(.)497 1388 y(MIT)d(Press,)i(Cambridge,)g(1990.)300 1632 y([20])47 b(Dean)30 b(Daniels,)j(Pat)d(Selinger)l(,)j(Laura)e (Haas,)g(Bruce)g(Lindsay)-6 b(,)33 b(C.)c(Mohan,)k(Adrian)e(W)-7 b(alker)l(,)497 1801 y(and)24 b(Paul)f(W)l(ilms.)34 b(An)22 b(introduction)28 b(to)23 b(distributed)k(query)e(compilation)h(in)d(R) 3077 1768 y FB(\003)3116 1801 y FP(.)33 b(In)23 b FD(Pr)m(oceed-)497 1970 y(ings)i(2nd)f(International)29 b(Confer)m(ence)d(on)e (Distributed)i(Databases)p FP(,)g(pages)g(291\261309,)g(Berlin,)497 2140 y(September)e(1982.)300 2384 y([21])47 b(Dinesh)28 b(Das)g(and)g(Don)f(Batory)-6 b(.)55 b(Prairie:)40 b(An)27 b(algebraic)k(framework)d(for)g(rule)g(speci\256cation)497 2553 y(in)f(query)i(optimizers.)55 b(In)28 b FD(Pr)m(oceedings)h(of)f (the)g(W)-8 b(orkshop)29 b(on)e(Database)i(Query)f(Optimizer)497 2723 y(Generators)e(and)e(Rule-Based)h(Optimizers)p FP(,)f(pages)h (139\261154,)g(Dallas,)f(September)h(1993.)300 2967 y([22])47 b(Dinesh)27 b(Das)e(and)i(Don)f(Batory)-6 b(.)47 b(Prairie:)37 b(A)25 b(rule)i(speci\256cation)h(framework)g(for)e(query)h(opti-)497 3136 y(mizers.)34 b(T)-6 b(echnical)25 b(Report)f(TR)e(94\26116,)i(The) f(University)j(of)d(T)-6 b(exas)24 b(at)f(Austin,)h(May)g(1994.)300 3380 y([23])47 b(Dinesh)30 b(Das)e(and)i(Don)f(Batory)-6 b(.)62 b(Prairie:)43 b(A)28 b(rule)h(speci\256cation)j(framework)e(for) g(query)g(op-)497 3549 y(timizers.)51 b(In)26 b FD(Pr)m(oceedings)k(1) -7 b(1th)28 b(International)i(Confer)m(ence)f(on)e(Data)g(Engineering)p FP(,)j(pages)497 3719 y(201\261210,)c(T)-6 b(aipei,)23 b(March)h(1995.)300 3963 y([24])47 b(Leonidas)29 b(Fegaras,)h(David)e (Maier)l(,)h(and)g(T)m(im)d(Sheard.)56 b(Specifying)30 b(rule-based)g(query)f(opti-)497 4132 y(mizers)e(in)f(a)g(re\257ective) i(framework.)49 b(In)26 b FD(Pr)m(oceedings)j(Thir)m(d)d(International) 31 b(Confer)m(ence)d(on)497 4302 y(Deductive)21 b(and)e (Object-Oriented)k(Databases)p FP(,)e(pages)g(146\261168,)h(Phoenix,)f (December)e(1993.)300 4546 y([25])47 b(Johann)27 b(Christoph)f (Freytag.)42 b(A)24 b(rule-based)k(view)d(of)f(query)j(optimization.)43 b(In)25 b FD(Pr)m(oceedings)497 4715 y(1987)i(ACM)e(SIGMOD)g (International)30 b(Confer)m(ence)e(on)f(Management)h(of)e(Data)p FP(,)h(pages)g(173\261)497 4884 y(180,)d(San)f(Francisco,)i(May)e (1987.)1884 5349 y(1)m(15)p eop %%Page: 116 128 116 127 bop 300 391 a FP([26])47 b(E.)42 b(Gamma,)48 b(R.)43 b(Helm,)48 b(R.)43 b(Johnson,)51 b(and)45 b(J.)e(Vlissides.)137 b FD(Design)45 b(Patterns:)74 b(Micr)m(o-)497 561 y(Ar)m(chitectur)m (es)24 b(for)d(Reusable)i(Object-Oriented)i(Design)p FP(.)30 b(Addison-W)-7 b(esley)h(,)25 b(Reading,)d(1994.)300 805 y([27])47 b(D.)20 b(Garlan)j(and)f(M.)f(Shaw)-6 b(.)29 b(An)21 b(introduction)26 b(to)21 b(software)i(architecture.)34 b(In)22 b(V)-12 b(.)20 b(Ambriloa)j(and)497 974 y(G.)k(T)-6 b(ortora,)29 b(editors,)i FD(Advances)f(in)e(Softwar)m(e)i(Engineering) g(and)f(Knowledge)h(Engineering)p FP(,)497 1144 y(volume)24 b(1.)f(W)-7 b(orld)24 b(Scienti\256c)g(Publishing)i(Company)-6 b(,)24 b(1993.)300 1388 y([28])47 b(Goetz)24 b(Graefe.)34 b FD(Rule-Based)24 b(Query)g(Optimization)i(in)d(Extensible)j(Database) f(Systems)p FP(.)34 b(PhD)497 1557 y(thesis,)24 b(University)i(of)d(W)l (isconsin\261Madison,)29 b(1987.)300 1801 y([29])47 b(Goetz)21 b(Graefe.)28 b(Query)21 b(evaluation)j(techniques)f(for)e(lar)n(ge)h (databases.)31 b FD(ACM)18 b(Computing)k(Sur)n(-)497 1970 y(veys)p FP(,)i(25\(2\):73\261170,)j(June)e(1993.)300 2214 y([30])47 b(Goetz)18 b(Graefe)g(and)g(David)g(J.)f(DeW)l(itt.)22 b(The)17 b(EXODUS)e(optimizer)k(generator)-5 b(.)24 b(In)18 b FD(Pr)m(oceedings)497 2384 y(1987)27 b(ACM)e(SIGMOD)g(International) 30 b(Confer)m(ence)e(on)f(Management)h(of)e(Data)p FP(,)h(pages)g (387\261)497 2553 y(394,)d(San)f(Francisco,)i(May)e(1987.)300 2797 y([31])47 b(Goetz)23 b(Graefe)g(and)g(W)l(illiam)g(McKenna.)32 b(The)22 b(V)-12 b(olcano)24 b(optimizer)g(generator:)33 b(Extensibility)497 2967 y(and)25 b(ef)n(\256cient)g(search.)39 b(In)24 b FD(Pr)m(oceedings)i(9th)f(International)j(Confer)m(ence)f(on) d(Data)g(Engineer)n(-)497 3136 y(ing)p FP(,)g(pages)g(209\261218,)i(V) -5 b(ienna,)23 b(April)h(1993.)300 3380 y([32])47 b(Jim)25 b(Gray)-6 b(.)44 b FD(The)25 b(Benchmark)i(Handbook)g(for)f(Database)i (and)e(T)-5 b(ransaction)28 b(Pr)m(ocessing)g(Sys-)497 3549 y(tems)p FP(.)33 b(Mor)n(gan)25 b(Kaufman,)f(San)f(Mateo,)g (second)j(edition,)f(1993.)300 3794 y([33])47 b(L.)14 b(M.)h(Haas,)j(J.)d(C.)g(Freytag,)j(G.)c(M.)h(Lohman,)j(and)e(H.)f (Pirahesh.)21 b(Extensible)d(query)f(processing)497 3963 y(in)30 b(Starburst.)65 b(Research)31 b(Report)g(RJ)e(6610,)j(IBM)c (Almaden)i(Research)i(Center)l(,)f(December)497 4132 y(1988.)300 4376 y([34])47 b(Matthias)21 b(Jarke)g(and)g(J)1239 4375 y(\310)1231 4376 y(ur)n(gen)h(Koch.)27 b(Query)21 b(optimization)h(in)e(database)j(systems.)28 b FD(ACM)18 b(Com-)497 4546 y(puting)25 b(Surveys)p FP(,)g(16\(2\):1)m(1)m (1\261152,)i(June)e(1984.)300 4790 y([35])47 b(W)-7 b(on)19 b(Kim,)g(David)g(S.)f(Reiner)l(,)j(and)f(Don)f(S.)f(Batory)-6 b(,)20 b(editors.)27 b FD(Query)20 b(Pr)m(ocessing)h(in)f(Database)497 4959 y(Systems)p FP(.)34 b(Springer)n(-V)-10 b(erlag,)26 b(1985.)1884 5349 y(1)m(16)p eop %%Page: 117 129 117 128 bop 300 391 a FP([36])47 b(Guy)25 b(M.)f(Lohman.)42 b(Grammar)n(-like)26 b(functional)j(rules)d(for)f(representing)k(query) d(optimization)497 561 y(alternatives.)42 b(In)25 b FD(Pr)m(oceedings)i (1988)e(ACM)e(SIGMOD)g(International)29 b(Confer)m(ence)d(on)f(Man-)497 730 y(agement)g(of)e(Data)p FP(,)g(pages)i(18\26127,)g(Chicago,)f(June) h(1988.)300 959 y([37])47 b(Guy)26 b(M.)e(Lohman,)j(C.)e(Mohan,)i (Laura)f(M.)f(Haas,)h(Bruce)g(G.)f(Lindsay)-6 b(,)27 b(Patricia)g(G.)e(Selinger)l(,)497 1128 y(Paul)d(F)-7 b(.)21 b(W)l(ilms,)h(and)h(Dean)g(Daniels.)32 b(Query)23 b(processing)i(in)d(R)2561 1095 y FB(\003)2600 1128 y FP(.)31 b(Research)24 b(Report)f(RJ)e(4272,)497 1297 y(IBM)h(Research)j(Laboratory)-6 b(,)26 b(San)d(Jose,)h(April)f(1984.) 300 1526 y([38])47 b(W)l(illiam)23 b(McKenna.)31 b FD(Ef\256cient)23 b(Sear)m(ch)h(in)e(Extensible)i(Database)f(Query)g(Optimization:)33 b(The)497 1696 y(Volcano)25 b(Optimizer)f(Generator)p FP(.)35 b(PhD)23 b(thesis,)h(University)i(of)d(Colorado)i(at)f(Boulder) l(,)g(1993.)300 1924 y([39])47 b(Gail)16 b(Mitchell,)j(Umeshwar)d (Dayal,)i(and)f(Stanley)h(B.)c(Zdonik.)21 b(Control)d(of)e(an)h (extensible)i(query)497 2094 y(optimizer:)31 b(A)19 b(planning-based)24 b(approach.)29 b(In)20 b FD(Pr)m(oceedings)i(19th)e(International)k (Confer)m(ence)497 2263 y(on)g(V)-10 b(ery)23 b(Lar)m(ge)g(Data)h (Bases)p FP(,)f(pages)i(517\261528,)h(Dublin,)e(August)g(1993.)300 2492 y([40])47 b(Gail)17 b(Mitchell,)i(Stanley)g(B.)c(Zdonik,)20 b(and)d(Umeshwar)h(Dayal.)k(An)16 b(architecture)21 b(for)c(query)i (pro-)497 2661 y(cessing)j(in)e(persistent)j(object)f(stores.)29 b(In)20 b FD(Pr)m(oceedings)j(of)d(the)g(Hawaii)h(International)j (Confer)n(-)497 2830 y(ence)g(on)g(System)g(Sciences)p FP(,)h(volume)g(II,)e(pages)i(787\261798,)g(January)h(1992.)300 3059 y([41])47 b(Patrick)34 b(O'Neil.)81 b FD(Database:)52 b(Principles,)38 b(Pr)m(ogramming,)e(and)e(Performance)p FP(.)83 b(Mor)n(gan)497 3228 y(Kaufmann,)24 b(San)f(Mateo,)h(1994.)300 3457 y([42])47 b(W)-8 b(.)18 b(B.)g(Rubenstein,)k(M.)d(S.)f(Kubicar)l (,)j(and)f(R.)e(G.)g(G.)g(Cattell.)27 b(Benchmarking)22 b(simple)e(database)497 3626 y(operations.)57 b(In)28 b FD(Pr)m(oceedings)i(1987)f(ACM)c(SIGMOD)i(International)32 b(Confer)m(ence)d(on)f(Man-)497 3796 y(agement)d(of)e(Data)p FP(,)g(pages)i(387\261394,)h(San)d(Francisco,)i(May)e(1987.)300 4024 y([43])47 b(P)-10 b(.)19 b(Schwarz,)i(W)-8 b(.)20 b(Chang,)h(J.)f(C.)g(Freytag,)i(G.)d(Lohman,)i(J.)g(McPherson,)h(C.)d (Mohan,)j(and)g(H.)d(Pi-)497 4194 y(rahesh.)49 b(Extensibility)29 b(in)e(the)f(Starburst)i(database)h(system.)48 b(In)26 b FD(Pr)m(oceedings)j(International)497 4363 y(W)-8 b(orkshop)26 b(on)f(Object-Oriented)j(Database)f(Systems)p FP(,)f(pages)g(85\26192,) g(Asilomar)l(,)g(September)497 4533 y(1986.)300 4761 y([44])47 b(Edward)25 b(Sciore)h(and)f(John)i(Sieg,)e(Jr)-5 b(.)41 b(A)24 b(modular)j(query)f(optimizer)h(generator)-5 b(.)44 b(In)25 b FD(Pr)m(oceed-)497 4931 y(ings)20 b(6th)g (International)k(Confer)m(ence)e(on)d(Data)h(Engineering)p FP(,)j(pages)e(146\261153,)h(Los)d(Angeles,)497 5100 y(February)25 b(1990.)1884 5349 y(1)m(17)p eop %%Page: 118 130 118 129 bop 300 391 a FP([45])47 b(P)-10 b(.)24 b(G.)h(Selinger)i(and)f (M.)f(Adiba.)45 b(Access)27 b(path)g(selection)h(in)e(distributed)j (data)d(base)h(manage-)497 561 y(ment)17 b(systems.)23 b(In)17 b(Deen)g(and)g(Hammersly)-6 b(,)19 b(editors,)h FD(Pr)m(oceedings)f(International)i(Confer)m(ence)497 730 y(on)j(Databases)p FP(,)h(pages)g(204\261215,)g(University)h(of)d (Aberdeen,)i(July)f(1980.)300 974 y([46])47 b(P)-10 b(.)17 b(G.)g(Selinger)l(,)k(M.)c(M.)g(Astrahan,)k(D.)c(D.)g(Chamberlin,)k(R.) c(A.)g(Lorie,)i(and)g(T)-7 b(.)17 b(G.)h(Price.)24 b(Access)497 1144 y(path)c(selection)j(in)c(a)h(relational)i(database)g(management)f (system.)28 b(In)19 b FD(Pr)m(oceedings)j(1979)f(ACM)497 1313 y(SIGMOD)30 b(International)36 b(Confer)m(ence)d(on)f(Management)h (of)f(Data)p FP(,)h(pages)g(23\26134,)i(Boston,)497 1482 y(May)23 b(1979.)300 1726 y([47])47 b(Michael)27 b(Stonebraker)l(,)i (Paul)d(M.)f(Aoki,)h(Robert)h(Devine,)g(W)l(itold)g(Litwin,)f(and)h (Michael)g(Ol-)497 1896 y(son.)35 b(Mariposa:)f(A)22 b(new)i(architecture)j(for)d(distributed)j(data.)36 b(In)23 b FD(Pr)m(oceedings)j(10th)f(Interna-)497 2065 y(tional)g(Confer)m (ence)g(on)f(Data)f(Engineering)p FP(,)j(pages)f(54\26165,)g(Houston,)f (February)h(1994.)300 2309 y([48])47 b(Michael)23 b(Stonebraker)l(,)i (Randy)e(Katz,)f(David)g(Patterson,)i(and)f(John)g(Ousterhout.)33 b(The)22 b(design)497 2478 y(of)27 b(XPRS.)47 b(In)27 b FD(Pr)m(oceedings)i(14th)f(International)j(Confer)m(ence)e(on)e(V)-10 b(ery)26 b(Lar)m(ge)h(Data)g(Bases)p FP(,)497 2648 y(pages)e (318\261330,)g(Los)e(Angeles,)i(1988.)300 2892 y([49])47 b(Michael)22 b(Stonebraker)i(and)e(Lawrence)f(A.)f(Rowe.)29 b(The)20 b(design)j(of)e(Postgres.)31 b(In)21 b FD(Pr)m(oceedings)497 3061 y(1986)27 b(ACM)e(SIGMOD)g(International)30 b(Confer)m(ence)e(on)f (Management)h(of)e(Data)p FP(,)h(pages)g(340\261)497 3231 y(355,)d(W)-7 b(ashington,)25 b(May)f(1986.)300 3475 y([50])47 b(David)27 b(L.)d(W)-7 b(ells,)27 b(Jos)1222 3474 y(\302)1217 3475 y(e)g(A.)e(Blakeley)-6 b(,)28 b(and)e(Craig)h(W) -8 b(.)24 b(Thompson.)48 b(Architecture)29 b(of)d(an)g(open)497 3644 y(object-oriented)k(database)e(management)f(system.)44 b FD(IEEE)24 b(Computer)p FP(,)i(25\(10\):74\26182,)k(Octo-)497 3813 y(ber)24 b(1992.)300 4058 y([51])47 b(C.)25 b(T)-7 b(.)26 b(Y)-10 b(u)26 b(and)h(C.)f(C.)f(Chang.)51 b(Distributed)29 b(query)f(processing.)53 b FD(ACM)25 b(Computing)k(Surveys)p FP(,)497 4227 y(16\(4\):399\261433,)f(December)c(1984.)1884 5349 y(1)m(18)p eop %%Page: 119 131 119 130 bop 3229 1180 a FM(V)-8 b(ita)300 1681 y FP(Dinesh)25 b(Das)e(was)h(born)g(in)g(Kharagpur)l(,)i(India)f(on)f(August)h(4,)e (1967,)i(the)f(son)h(of)f(Joshi)h(Markandeya)300 1851 y(Das)f(and)g(Annapurna)j(Das.)32 b(After)24 b(graduating)j(from)d (Central)h(School)g(in)f(1984,)h(he)g(entered)h(the)e(In-)298 2020 y(dian)e(Institute)h(of)e(T)-6 b(echnology)g(,)24 b(Kharagpur)l(,)g(where)d(he)h(received)h(the)f(degree)h(of)e(Bachelor) i(of)e(T)-6 b(ech-)295 2190 y(nology)20 b(in)f(Computer)h(Science)g (and)f(Engineering)i(with)e(honors)h(in)f(June)h(1988.)30 b(In)19 b(September)h(1988,)300 2359 y(he)26 b(entered)i(the)e (Graduate)h(School)g(of)f(The)g(University)i(of)e(T)-6 b(exas)26 b(at)f(Austin.)39 b(He)26 b(received)i(the)e(de-)300 2528 y(gree)e(of)f(Master)h(of)f(Science)h(in)g(Computer)g(Sciences)g (from)g(The)f(University)i(of)e(T)-6 b(exas)23 b(at)h(Austin)g(in)300 2698 y(December)g(1990.)300 3339 y(Permanent)h(Address:)32 b(P)-10 b(.O.)21 b(Box)j(8734)1065 3509 y(Austin,)g(TX)e(78713)300 3960 y(This)h(dissertation)k(was)c(typeset)j(with)d(L)1578 3945 y FF(A)1613 3960 y FP(T)1654 3981 y(E)1697 3960 y(X)14 b(2)1822 3974 y FH(")1868 3927 y Fv(1)1930 3960 y FP(by)24 b(the)g(author)-5 b(.)p 300 4832 1320 4 v 400 4886 a Fu(1)434 4917 y Fy(L)453 4901 y Fh(A)478 4917 y Fy(T)512 4934 y(E)548 4917 y(X)11 b(2)650 4925 y Fq(")706 4917 y Fy(is)17 b(an)g(extension)h(of)f(L)1261 4901 y Fh(A)1286 4917 y Fy(T)1320 4934 y(E)1355 4917 y(X.)24 b(L)1471 4901 y Fh(A)1496 4917 y Fy(T)1530 4934 y(E)1565 4917 y(X)16 b(is)h(a)f(collection)i(of)f(macros)g(for)g(T)2512 4934 y(E)2547 4917 y(X.)24 b(T)2678 4934 y(E)2713 4917 y(X)17 b(is)f(a)h(trademark)h(of)f(the)f(Amer)o(-)300 5009 y(ican)22 b(Mathematical)h(Society)-5 b(.)35 b(The)22 b(macros)g(used)h(in)f(formatting)g(this)g(dissertation)h(were)f (written)f(by)i(Dinesh)f(Das,)h(De-)300 5100 y(partment)c(of)g (Computer)h(Sciences,)f(The)f(University)i(of)f(T)-5 b(exas)18 b(at)h(Austin.)1884 5349 y FP(1)m(19)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF