diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/utthesis/tr94-16.ps |
Initial commit
Diffstat (limited to 'macros/latex/contrib/utthesis/tr94-16.ps')
-rw-r--r-- | macros/latex/contrib/utthesis/tr94-16.ps | 7614 |
1 files changed, 7614 insertions, 0 deletions
diff --git a/macros/latex/contrib/utthesis/tr94-16.ps b/macros/latex/contrib/utthesis/tr94-16.ps new file mode 100644 index 0000000000..5bef7ffec0 --- /dev/null +++ b/macros/latex/contrib/utthesis/tr94-16.ps @@ -0,0 +1,7614 @@ +%!PS-Adobe-2.0 +%%Creator: dvips 5.521 Copyright 1986, 1993 Radical Eye Software +%%Title: paper.dvi +%%CreationDate: Fri May 20 20:04:27 1994 +%%Pages: 25 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentFonts: Times-Bold Times-Roman Times-Italic Courier +%%EndComments +%DVIPSCommandLine: dvips paper -o +%DVIPSSource: TeX output 1994.05.20:2003 +%%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 4 get round 4 exch put dup dup 5 get +round 5 exch put 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 add]{ +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 +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-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 300 300 +(/v/ahhnold/v3/ddas/research/papers/TR94-16/paper.dvi) +@start /Fa 139[22 6[22 3[22 3[22 101[{}4 37.500000 /Courier +rf /Fb 188[22 67[{}1 33.333332 /Times-Italic rf /Fc 135[27 +3[27 27 3[27 27 27 27 2[27 2[27 27 1[27 27 27 97[{}13 +45.624989 /Courier rf /Fd 3 49 df<020002000200C218F2783AE00F800F803AE0F2 +78C2180200020002000D0E7E8E12>3 D<0000600000003000000030000000180000000C +00FFFFFE00FFFFFF00000001C0000000F00000003C00000070000001C000000380FFFFFE +00FFFFFC0000000C00000018000000300000003000000060001E147E9123>41 +D<060F0F0E1E1E1C3C383830707060E0C04008117F910A>48 D E +/Fe 4 104 df<0300030003000300E31C73381FE0078007801FE07338E31C0300030003 +0003000E107E9013>3 D<000018000000000C000000000C000000000600000000070000 +0000030000FFFFFFC000FFFFFFE00000000038000000001E0000000007800000000E0000 +000038000000007000FFFFFFC000FFFFFF80000000030000000006000000000600000000 +0C000000000C0000000018000021167E9326>41 D<003C00E001C0038003800380038003 +800380038003800380038003800380038007001E00F8001E000700038003800380038003 +800380038003800380038003800380038001C000E0003C0E257E9B13>102 +D<F8001E000700038003800380038003800380038003800380038003800380038001C000 +E0003C00E001C0038003800380038003800380038003800380038003800380038007001E +00F8000E257E9B13>I E /Ff 7 56 df<06003E00CE000E000E000E000E000E000E000E +000E000E000E000E000E007FE00B107E8F11>49 D<3F8079C0F8E0F8707070007000E000 +E001C0038006000C3018303FE07FE0FFE00C107E8F11>I<0FC038707878783878783870 +00E00FC000702038703CF83CF83CF03870701FC00E107F8F11>I<00E001E003E002E006 +E00CE018E030E060E0C0E0FFFC00E000E000E000E007FC0E107F8F11>I<60607FC07F80 +7F00600060007F8061C040E000F060F0F0F0F0F0F0E061C03F000C107E8F11>I<07E01C +30303870786078E030E7C0E830F018E01CE01CE01C601C301818300FC00E107F8F11>I< +60007FFC7FF87FF0C060C0C001800300070006000E000E001E001E001E001E000C000E11 +7E9011>I E /Fg 1 69 df<FFFFF000FFFFFC000F803F000F800F800F8007C00F8003E0 +0F8003E00F8001F00F8001F00F8001F80F8001F80F8001F80F8001F80F8001F80F8001F8 +0F8001F80F8001F80F8001F00F8001F00F8003F00F8003E00F8007C00F800F800F803F00 +FFFFFC00FFFFF0001D1A7E9922>68 D E /Fh 1 111 df<71F09A189C18981818183030 +303030323062606460380F0B7E8A13>110 D E /Fi 10 112 df<60F0F0F0F0F0F06060 +6060606060606060200000000060F0F060041A7D990B>33 D<00800100020004000C0008 +0018003000300030006000600060006000E000E000E000E000E000E000E000E000E000E0 +006000600060006000300030003000180008000C00040002000100008009267D9B0F>40 +D<8000400020001000180008000C00060006000600030003000300030003800380038003 +8003800380038003800380038003000300030003000600060006000C0008001800100020 +004000800009267E9B0F>I<000C0000000C0000000C0000000C0000000C0000000C0000 +000C0000000C0000000C0000000C0000000C0000000C0000FFFFFF80FFFFFF80000C0000 +000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000 +000C0000000C0000191A7E951E>43 D<60F0F060000000000000000060F0F06004107D8F +0B>58 D<60F0F060000000000000000060F0F0701010102020404004177D8F0B>I<FFFF +FF80FFFFFF80000000000000000000000000000000000000000000000000FFFFFF80FFFF +FF80190A7E8D1E>61 D<0FCF001871803030007038007038007038007038003030001860 +002FC0006000006000007000003FF0003FFC001FFE00600F00C00300C00300C00300C003 +00600600381C0007E00011187F8F13>103 D<FC001C001C001C001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF8009 +1A80990A>108 D<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C +1C3807E010107F8F13>111 D E /Fj 15 64 df<07800018001840001800302000300030 +1800E00060170360006008FCC000E008018000E008018000E008030000E008060000E008 +060000E0080C0000600818000060101800003010300000302060000018406000000780C0 +000000018078000001818400000303020000030301000006070100000C060100000C0E00 +8000180E008000300E008000300E008000600E008000C00E008000C00E00800180060100 +0300070100030003010006000302000C00018400040000780021257EA126>37 +D<0040008001000300060004000C001800180038003000300070006000600060006000E0 +00E000E000E000E000E000E000E000E000E000E000E00060006000600060007000300030 +003800180018000C000400060003000100008000400A2E7BA112>40 +D<8000400020003000180008000C00060006000700030003000380018001800180018001 +C001C001C001C001C001C001C001C001C001C001C001C001800180018001800380030003 +000700060006000C000800180030002000400080000A2E7EA112>I<0003000000030000 +000300000003000000030000000300000003000000030000000300000003000000030000 +00030000000300000003000000030000FFFFFFFCFFFFFFFC000300000003000000030000 +000300000003000000030000000300000003000000030000000300000003000000030000 +0003000000030000000300001E207E9A23>43 D<03F0000E1C001C0E0018060038070070 +0380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F0 +03C0F003C0F003C0F003C0F003C07003807003807003807807803807001806001C0E000E +1C0003F000121F7E9D17>48 D<008003800F80F380038003800380038003800380038003 +80038003800380038003800380038003800380038003800380038003800380038007C0FF +FE0F1E7C9D17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F8 +03C02007C00007C0000780000780000F00000E00001C0000380000700000600000C00001 +80000300000600400C00401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F000 +0C1C00100E00200F00780F80780780780780380F80000F80000F00000F00001E00001C00 +00700007F000003C00000E00000F000007800007800007C02007C0F807C0F807C0F807C0 +F00780400780400F00200E00183C0007F000121F7E9D17>I<000600000600000E00000E +00001E00002E00002E00004E00008E00008E00010E00020E00020E00040E00080E00080E +00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E +00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE00010000010000010 +000010000010000010000011F000161C00180E001007001007800003800003800003C000 +03C00003C07003C0F003C0F003C0E00380400380400700200600100C0008380007E00012 +1F7E9D17>I<007C000182000701000E03800C0780180780380300380000780000700000 +700000F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C0 +7003C07003C07003803803803807001807000C0E00061C0001F000121F7E9D17>I<70F8 +F8F8700000000000000000000070F8F8F87005147C930D>58 D<70F8F8F8700000000000 +000000000070F0F8F878080808101010202040051D7C930D>I<7FFFFFF8FFFFFFFC0000 +000000000000000000000000000000000000000000000000000000000000FFFFFFFC7FFF +FFF81E0C7E9023>61 D<0FE0103C601E400EE00FF00FF00F600F001E001C003800700060 +00C00080008001000100010001000100010000000000000000000000038007C007C007C0 +038010207E9F15>63 D E /Fk 8 108 df<01800780FF80FF8007800780078007800780 +0780078007800780078007800780078007800780FFF8FFF80D157D9414>49 +D<0FC03FF870FCF83CF83EF81E701E003E003C0038007000E001C0038006060C06180E3F +FC7FFCFFFCFFFC0F157E9414>I<0FC01FF03078787C783C783C107C007800E00FE00078 +003C003C003E703EF83EF83EF83C70783FF00FC00F157E9414>I<000C00001C00003C00 +007C0000FC0001BC00033C00063C000C3C00183C00303C00603C00C03C00FFFF80FFFF80 +003C00003C00003C00003C0003FF8003FF8011157F9414>I<700C7FF87FF07FE07F8060 +006000600067E07870603C003C003E003E703EF03EF03EE03C70783FF00FC00F157E9414 +>I<03F00FF81E1C383C383C70187000F000F3E0F438F81CF01CF01EF01EF01E701E701E +781C3C381FF007E00F157E9414>I<387C7C7C3800000000FCFC3C3C3C3C3C3C3C3C3C3C +3CFFFF08187F970B>105 D<FC0000FC00003C00003C00003C00003C00003C00003C0000 +3C1F803C1F803C1C003C38003C60003DC0003FE0003FE0003E70003C78003C3C003C1E00 +3C0E00FF1FC0FF1FC012177F9615>107 D E /Fl 3 80 df<FFFFFE0000FFFFFFC00007 +E007F00007E001F80007E000FC0007E0007E0007E0003F0007E0003F0007E0001F8007E0 +001F8007E0001F8007E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E000 +1FC007E0001FC007E0001FC007E0001FC007E0001F8007E0001F8007E0001F8007E0003F +0007E0003F0007E0007E0007E000FC0007E001F80007E007F000FFFFFFC000FFFFFE0000 +221F7E9E28>68 D<FFFFFFFF07E007E007E007E007E007E007E007E007E007E007E007E0 +07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0FFFFFFFF101F +7E9E14>73 D<001FF80000FFFF0001F81F8007E007E00FC003F01F8001F81F0000F83F00 +00FC7F0000FE7E00007E7E00007EFE00007FFE00007FFE00007FFE00007FFE00007FFE00 +007FFE00007FFE00007FFE00007F7E00007E7F0000FE7F0000FE3F0000FC3F8001FC1F80 +01F80FC003F007E007E001F81F8000FFFF00001FF800201F7D9E27>79 +D E /Fm 1 4 df<FFFFFFFCFFFFFFFCC000000CC000000CC000000CC000000CC000000C +C000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000C +C000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000CC000000C +C000000CC000000CC000000CC000000CFFFFFFFC7FFFFFFC1E1F7E9E23>3 +D E /Fn 167[26 7[20 2[32 22 6[22 3[26 65[{}6 36.499977 +/Times-Roman rf /Fo 139[9 13 11 1[17 17 17 1[9 2[9 1[17 +1[15 17 15 1[15 12[20 18 22 2[24 24 30 20 1[13 11 2[18 +20 1[22 1[24 20[8 2[11 11 40[{}29 33.333332 /Times-Roman +rf /Fp 8 121 df<60F0F06004047D830B>58 D<60F0F07010101020204040040B7D830B +>I<000010000000300000007000000070000000F8000000B80000013800000238000002 +380000043800000C38000008380000103C0000101C0000201C0000401C00007FFC000080 +1C0000801C0001001C0002001C0002000E0004000E000C000E001C000E00FF00FFC01A1A +7F991D>65 D<03FFFFC0007001C0007000C00070004000E0004000E0004000E0004000E0 +004001C0200001C0200001C0200001C0600003FFC0000380C00003804000038040000700 +80000700010007000100070002000E0002000E0006000E0004000E000C001C003800FFFF +F8001A1A7E991C>69 D<03FFFFC0007001C0007000C00070004000E0004000E0004000E0 +004000E0004001C0200001C0200001C0200001C0600003FFC0000380C000038040000380 +4000070080000700000007000000070000000E0000000E0000000E0000000E0000001E00 +0000FFE000001A1A7E9919>I<000FE0000038380000E00E0001C00700070007000F0003 +800E0003801C0003803C0003C0380003C0780003C0780003C0F0000780F0000780F00007 +80F0000F00F0000F00F0000E00F0001E00F0003C0070003800700070003800E0001C03C0 +000E0F000003F800001A1A7E991D>79 D<001F080060D800803801003803001006001006 +001006001006000007000007C00003FC0001FF00007F80000FC00001C00001C00000C020 +00C02000C0600180600180600300700600CC1C0083F000151A7E9917>83 +D<07878008C8C010F1C020E0C020E00020E00001C00001C00001C00001C0000381000381 +00C38100E58200C5840078780012107F8F16>120 D E /Fq 134[19 +19 2[21 12 15 17 1[21 19 21 31 10 2[10 21 19 1[17 21 +17 1[19 10[27 3[27 29 23 29 5[15 3[25 27 2[27 1[19 63[{}28 +37.500000 /Times-Bold rf /Fr 134[17 3[19 10 15 15 19 +19 1[19 27 3[10 19 19 10 17 3[19 97[{}15 37.500000 /Times-Italic +rf /Fs 10 58 df<1F00318060C04040C060C060C060C060C060C060C060C060404060C0 +31801F000B107F8F0F>48 D<187898181818181818181818181818FF08107D8F0F>I<1F +00618040C08060C0600060006000C00180030006000C00102020207FC0FFC00B107F8F0F +>I<1F00218060C060C000C0008001001F00008000400060C060C060804060801F000B10 +7F8F0F>I<01800180038005800D801980118021804180C180FFE001800180018001800F +E00B107F8F0F>I<20C03F802E002000200020002F0030802040006000600060C06080C0 +61801F000B107F8F0F>I<0780184030C060C06000C000CF00F080E040C060C060C06040 +6060C030801F000B107F8F0F>I<40007FF07FE080408040008001000200020006000400 +04000C000C000C000C000C000C117F900F>I<1F00318060C060C060C031803F000E0033 +8061C0C060C060C060C04060C01F000B107F8F0F>I<1F00318060C0C040C060C060C060 +40E021E01E600060004060C0608063001E000B107F8F0F>I E /Ft +11 62 df<07C018303018701C600C600CE00EE00EE00EE00EE00EE00EE00EE00EE00E60 +0C600C701C30181C7007C00F157F9412>48 D<06000E00FE000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E000E000E00FFE00B157D9412>I<0F8030E0 +40708030C038E0384038003800700070006000C00180030006000C08080810183FF07FF0 +FFF00D157E9412>I<0FE030306018701C701C001C00180038006007E000300018000C00 +0E000EE00EE00EC00C401830300FE00F157F9412>I<00300030007000F001F001700270 +047008701870107020704070C070FFFE0070007000700070007003FE0F157F9412>I<60 +307FE07FC0440040004000400040004F8070E040700030003800384038E038E038803040 +6020C01F000D157E9412>I<01F00608080C181C301C70006000E000E3E0EC30F018F00C +E00EE00EE00E600E600E300C3018183007C00F157F9412>I<40007FFE7FFC7FF8C00880 +1080200040008000800100030003000200060006000E000E000E000E000E0004000F167E +9512>I<07E018302018600C600C700C78183E101F6007C00FF018F8607C601EC00EC006 +C006C004600C38300FE00F157F9412>I<07C0183030186018E00CE00CE00EE00EE00E60 +1E301E186E0F8E000E000C001C70187018603020E01F800F157F9412>I<FFFFFCFFFFFC +000000000000000000000000000000000000FFFFFCFFFFFC160A7E8C1B>61 +D E /Fu 6 106 df<FFFFFFC0FFFFFFC01A027C8B23>0 D<70F8F8F87005057C8D0D>I< +03F0000FFC001FFE003FFF007FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0 +7FFF807FFF803FFF001FFE000FFC0003F00012127E9317>15 D<000000C000000000C000 +00000060000000006000000000300000000018000000000C007FFFFFFE00FFFFFFFF0000 +000001C000000000E0000000003C000000000F000000003C000000007000000001C00000 +000380FFFFFFFE007FFFFFFC000000001800000000180000000030000000006000000000 +6000000000C000000000C000281A7E972D>41 D<0020006000C000C000C0018001800300 +03000300060006000C000C0018001800180030003000600060006000C000C00060006000 +6000300030001800180018000C000C00060006000300030003000180018000C000C000C0 +006000200B2E7CA112>104 D<C000C000600060006000300030001800180018000C000C +00060006000300030003000180018000C000C000C00060006000C000C000C00180018003 +0003000300060006000C000C0018001800180030003000600060006000C000C0000B2E7E +A112>I E /Fv 9 111 df<60F0F06004047D830A>58 D<00080018003000300030006000 +60006000C000C000C0018001800180030003000600060006000C000C000C001800180018 +00300030003000600060006000C000C0000D217E9812>61 D<07FFF00000E01C0000E006 +0000E0070000E0070001C0070001C0070001C0070001C00E0003801C000380700003FF80 +000380E000070070000700380007003800070038000E0070000E0070000E0070800E0070 +801C003100FF801E0019177F961B>82 D<071018F0307060706060C060C060C06080C080 +C480C4C1C446C838700E0E7E8D13>97 D<7C001800180018001800300030003000300067 +8068C070406060C060C060C060C06080C080C08180C10046003C000B177E960F>I<07C0 +0C20107020706000C000C000C00080008000C010C02060C03F000C0E7E8D0F>I<030003 +8003000000000000000000000000001C002400460046008C000C00180018001800310031 +00320032001C0009177F960C>105 D<00180038001000000000000000000000000001C0 +022004300430086000600060006000C000C000C000C001800180018001806300E300C600 +78000D1D80960E>I<383C0044C6004702004602008E06000C06000C06000C0600180C00 +180C40181840181880300980300E00120E7F8D15>110 D E /Fw +19 121 df<70F8F8F87005057C840D>58 D<70F0F8F878080808101010202040050E7C84 +0D>I<0000400000C0000180000180000180000300000300000300000600000600000C00 +000C00000C0000180000180000180000300000300000600000600000600000C00000C000 +00C0000180000180000180000300000300000600000600000600000C00000C00000C0000 +180000180000300000300000300000600000600000600000C00000C00000122D7EA117> +61 D<E0000000780000001E0000000780000001E0000000780000001C00000007000000 +03C0000000F00000003C0000000F00000003C0000003C000000F0000003C000000F00000 +03C00000070000001C00000078000001E00000078000001E00000078000000E00000001A +1A7C9723>I<000002000000060000000E0000000E0000001E0000001F0000002F000000 +6F0000004F0000008F0000008F0000010F0000030F0000020F0000040F8000040F800008 +078000180780001007800020078000200780007FFF800080078000800780010007C00100 +03C0020003C0040003C0040003C00C0003C03C0007C0FF003FFC1E207E9F22>65 +D<01FFFFFF80001E000F00001E000300001E000300001E000100003C000100003C000100 +003C000100003C000100007802020000780200000078020000007806000000F00C000000 +FFFC000000F00C000000F00C000001E008000001E008000001E008000001E000040003C0 +00080003C000080003C000100003C0001000078000200007800060000780004000078001 +C0000F0007C000FFFFFF8000211F7E9E22>69 D<01FFFFFF001E001E001E0006001E0006 +001E0002003C0002003C0002003C0002003C000200780004007802000078020000780200 +00F0040000F00C0000FFFC0000F00C0001E0080001E0080001E0080001E0080003C00000 +03C0000003C0000003C00000078000000780000007800000078000000F800000FFFC0000 +201F7E9E1D>I<01FFF0001F00001E00001E00001E00003C00003C00003C00003C000078 +0000780000780000780000F00000F00000F00000F00001E00001E00001E00001E00003C0 +0003C00003C00003C0000780000780000780000780000F8000FFF000141F7E9E14>73 +D<01FE00000FF8001E00001F80001700001F00001700002F00001700004F00002700005E +00002700009E00002700011E00002700011E00004380023C00004380023C00004380043C +00004380083C000083800878000083801078000083802078000081C02078000101C040F0 +000101C080F0000101C080F0000101C100F0000201C101E0000201C201E0000201C401E0 +000200E401E0000400E803C0000400F003C0000400F003C0000C00E003C0001E00C007C0 +00FFC0C07FFC002D1F7E9E2C>77 D<01FF001FF8001F0003C0001F800100001780010000 +178001000023C002000023C002000021E002000021E002000041F004000040F004000040 +F004000040780400008078080000807C080000803C080000803C080001001E100001001E +100001000F100001000F100002000FA000020007A000020007A000020003E000040003C0 +00040003C000040001C0000C0001C0001E00008000FFC0008000251F7E9E25>I<0000FF +00000781C0001C00E0003800700070003801C0001C03C0001C0380001E0700000E0F0000 +0E1E00000E1E00000E3C00000E3C00000E7800001E7800001E7800001E7800001EF00000 +3CF000003CF0000038F0000078F0000070700000F0700001E0780001C078000380380007 +001C000E001C001C000F0070000381C00000FF00001F217F9F23>I<01FFFF80001E00F0 +001E0038001E001C001E001C003C001E003C001E003C001E003C001E0078003C0078003C +00780078007800F000F001C000F0070000FFF80000F00E0001E0070001E0078001E00380 +01E003C003C0078003C0078003C0078003C0078007800F0007800F0207800F0207800F04 +0F800704FFF80308000001F01F207E9E23>82 D<0003F040000C08C00030058000600380 +00C0038001C00180018001000380010003800100038001000380000003C0000003E00000 +03FC000001FFC00000FFF000007FF800001FF8000001FC0000007C0000003C0000001C00 +00001C0020001C0020001C00200018006000380060003000600070007000E000E8018000 +C603000081FC00001A217E9F1C>I<00F1800389C00707800E03801C03803C0380380700 +780700780700780700F00E00F00E00F00E00F00E10F01C20F01C20703C20705C40308C40 +0F078014147E9318>97 D<07803F8007000700070007000E000E000E000E001C001C001C +F01D0C3A0E3C0E380F380F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031 +C01F0010207E9F14>I<007C0001C3000700800E07801E07801C07003C02007800007800 +00780000F00000F00000F00000F00000F000007001007002003004001838000FC0001114 +7E9314>I<00E001E001E000C000000000000000000000000000000E0013002380438043 +8043808700070007000E000E001C001C001C20384038403840388019000E000B1F7E9E10 +>105 D<0000C00001E00001E00001C00000000000000000000000000000000000000000 +00001E00002300004380008380010380010380020700000700000700000700000E00000E +00000E00000E00001C00001C00001C00001C000038000038000038000038000070000070 +0030700078E000F1C0006380003E00001328819E13>I<03C1C00C62201034701038F020 +38F020386040700000700000700000700000E00000E00000E00000E02061C040F1C040F1 +C080E2C080446300383C0014147E931A>120 D E /Fx 138[25 15 +18 20 1[25 23 25 38 13 2[13 25 23 1[20 25 20 25 23 12[30 +25 2[28 35 5[18 2[28 1[33 2[33 13[23 23 23 2[11 15 45[{}30 +45.624989 /Times-Bold rf /Fy 133[22 25 25 1[25 28 17 +19 22 28 28 25 28 41 14 2[14 28 25 17 22 28 22 1[25 10[36 +1[33 1[36 1[30 39 36 4[19 4[36 36 33 12[25 25 25 25 25 +2[12 46[{}38 50.000000 /Times-Bold rf /Fz 47[37 21[17 +10[21 21 3[17 47[17 19 19 27 19 19 10 15 12 19 19 19 +19 29 10 19 10 10 19 19 12 17 19 17 19 17 7[27 1[35 27 +27 23 21 25 27 21 27 27 33 23 1[15 12 1[27 21 23 27 25 +1[27 5[10 1[19 19 19 19 19 19 19 19 19 19 10 9 12 9 2[12 +12 40[{}69 37.500000 /Times-Roman rf /FA 2 49 df<0C000C00CCC0EDC07F800C +007F80EDC0CCC00C000C000A0B7D8B10>3 D<081C1C3838383070706060C0C0060D7E8D +09>48 D E /FB 133[18 20 20 1[20 23 13 18 18 1[23 23 23 +33 13 20 13 13 23 23 13 20 23 20 23 23 9[38 3[23 28 33 +28 33 1[38 3[15 1[33 1[28 33 30 28 28 7[23 23 23 23 2[23 +23 23 3[15 11 44[{}47 45.624989 /Times-Italic rf /FC +81[33 53[30 43 1[33 20 23 27 1[33 30 33 50 17 33 1[17 +33 30 20 27 33 27 1[30 10[43 1[40 1[43 1[37 6[23 3[40 +1[43 1[43 6[20 3[30 30 30 30 30 30 3[20 45[{}37 59.999973 +/Times-Bold rf /FD 81[23 51[18 21 21 30 21 21 12 16 14 +21 21 21 21 32 12 21 12 12 21 21 14 18 21 18 21 18 9[39 +30 30 25 2[30 23 30 30 3[16 14 2[23 6[18 3[12 12 2[21 +21 21 21 5[10 14 10 2[14 14 40[{}50 41.666668 /Times-Roman +rf /FE 139[14 16 18 14[18 23 21 31[30 65[{}7 41.666668 +/Times-Bold rf /FF 78[25 55[25 25 1[25 25 14 19 17 1[25 +25 25 39 3[14 25 1[17 22 25 22 25 22 11[36 30 28 14[36 +33 33 36 46 7[25 25 4[25 25 2[12 1[12 44[{}34 50.000000 +/Times-Roman rf /FG 47[45 13[15 7[20 8[23 1[25 25 3[20 +47[20 23 23 33 23 23 13 18 15 23 23 23 23 35 13 23 13 +13 23 23 15 20 23 20 23 20 3[15 1[15 1[33 33 43 33 33 +28 25 30 33 25 33 33 40 28 33 18 15 33 33 25 28 33 30 +30 33 1[20 3[13 13 23 23 23 23 23 23 23 23 23 23 13 11 +15 11 26 1[15 15 15 1[38 37[{}82 45.624989 /Times-Roman +rf /FH 3 104 df<00C00000C00000C00000C00000C000E0C1C0F0C3C038C7000EDC0003 +F00000C00003F0000EDC0038C700F0C3C0E0C1C000C00000C00000C00000C00000C00012 +157D9619>3 D<0003C0001E0000380000700000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00001C0 +000380000F0000F800000F000003800001C00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000070 +00003800001E000003C012317DA419>102 D<F800000F000003800001C00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E000007000003800001E000003C0001E0000380000700000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00001C0000380000F0000F8000012317DA419>I +E /FI 81[40 51[32 36 1[52 1[40 24 28 32 1[40 36 40 60 +20 40 1[20 2[24 32 1[32 1[36 13[40 52 56 44 56 8[44 4[52 +6[24 58[{}27 72.000000 /Times-Bold rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin + +%%EndSetup +%%Page: 1 1 +1 0 bop 342 206 a FI(Prairie:)25 b(A)17 b(Rule)h(Speci\256cation)e +(Framew)o(ork)643 306 y(f)n(or)i(Query)f(Optimizers)1308 +280 y FH(\003)722 407 y FG(T)m(echnical)11 b(Report)g(TR)g(94\26116)580 +539 y FF(Dinesh)i(Das)325 b(Don)12 b(Batory)631 603 y(Department)g(of)g +(Computer)f(Sciences)638 667 y(The)i(Uni)o(v)o(ersity)f(of)g(T)m(e)o +(xas)h(at)g(Austin)708 731 y(Austin,)g(T)m(e)o(xas)g(78712\2611188)679 +795 y FH(f)p FF(ddas,batory)p FH(g)p FF(@cs.ute)o(xas.edu)898 +996 y FE(Abstract)241 1066 y FD(From)i(our)g(e)o(xperience,)j(current)d +(rule-based)h(query)e(optimizers)h(do)g(not)g(pro)o(vide)f(a)i(v)o(ery) +f(intuiti)o(v)o(e)179 1121 y(and)e(well-de\256ned)f(frame)o(work)h(to)g +(de\256ne)g(rules)g(and)g(actions.)23 b(T)m(o)13 b(remedy)h(this)e +(situation,)g(we)i(propose)179 1176 y(an)i(e)o(xtensible)g(and)g +(structured)f(algebraic)i(frame)o(work)e(called)i(Prairie)e(for)h +(specifying)f(rules.)33 b(Prairie)179 1231 y(facilitates)10 +b(rule-writing)f(by)i(enabling)f(a)i(user)g(to)e(write)h(rules)g(and)h +(actions)f(more)g(quickly)m(,)g(correctly)g(and)179 1285 +y(in)e(an)i(easy-to-understand)e(and)i(easy-to-deb)o(ug)e(manner)n(.) +241 1340 y(Query)14 b(optimizers)g(consist)g(of)g(three)h(major)f +(parts:)23 b(a)15 b(search)h(space,)h(a)e(cost)f(model)h(and)f(a)h +(search)179 1395 y(strate)o(gy)m(.)25 b(The)14 b(approach)g(we)g(take)f +(is)h(only)e(to)h(de)o(v)o(elop)h(the)f(algebra)h(which)f(de\256nes)h +(the)f(search)i(space)179 1450 y(and)d(the)g(cost)g(model;)g(we)g(do)g +(not)f(propose)h(a)g(search)h(engine)f(\(i.e.,)h(search)h(strate)o +(gy\))d(to)h(dri)o(v)o(e)f(the)h(rules.)179 1505 y(W)m(e)j(ha)o(v)o(e)h +(chosen)f(the)f(V)-5 b(olcano)14 b(optimizer)g(generator)h(as)g(our)g +(search)g(engine,)h(because)h(it)d(is)g(publicly)179 +1559 y(a)o(v)o(ailable,)c(and)f(also)h(because)h(it)e(has)g(an)h(ef)o +(\256cient)g(branch-and-bound)e(search)i(strate)o(gy)m(.)16 +b(Using)8 b(Prairie)i(as)179 1614 y(a)g(front-end,)e(we)i(translate)f +(Prairie)h(rules)f(to)g(V)-5 b(olcano)8 b(to)h(v)o(alidate)g(our)g +(claim)h(that)e(Prairie)i(makes)g(it)e(easier)179 1669 +y(to)h(write)h(rules.)241 1724 y(W)m(e)g(describe)h(our)e(algebra)h +(and)g(present)g(e)o(xperimental)g(results)g(which)f(sho)o(w)h(that)f +(using)g(a)i(high-le)o(v)o(el)179 1779 y(frame)o(work)f(like)f(Prairie) +h(to)g(design)g(lar)o(ge-scale)h(optimizers)f(does)g(not)f(sacri\256ce) +j(ef)o(\256cienc)o(y)m(.)75 1931 y FC(1)60 b(Intr)o(oduction)75 +2041 y FG(Query)19 b(optimization)e([9,)8 b(12,)f(20])19 +b(is)f(a)i(fundamental)e(part)h(of)g(database)f(systems.)40 +b(It)18 b(is)h(the)g(process)f(of)75 2103 y(generating)11 +b(an)i(ef)o(\256cient)f(access)g(plan)g(for)g(a)h(database)f(query)m(.) +19 b(Informally)m(,)12 b(an)h(access)f(plan)g(is)f(an)i(e)o(x)o +(ecution)75 2165 y(strate)o(gy)8 b(for)i(a)f(query;)g(it)f(is)h(the)g +(sequence)f(of)h(lo)o(w-le)o(v)o(el)f(database)h(retrie)o(v)o(al)f +(operations)g(that,)h(when)f(e)o(x)o(ecuted,)75 2227 +y(produce)14 b(the)g(database)g(records)h(that)f(satisfy)f(the)h(query) +m(.)26 b(There)15 b(are)g(three)g(basic)f(aspects)g(that)g(de\256ne)g +(and)75 2289 y(in\257uence)d(query)g(optimization:)j(the)d(search)g +(space,)h(the)f(cost)f(model,)i(and)f(the)g(search)g(strate)o(gy)m(.) +137 2351 y(The)k FB(sear)n(c)o(h)f(space)g FG(is)g(the)h(set)f(of)g +(logically)f(equi)o(v)o(alent)g(access)i(plans)f(that)f(can)i(be)g +(used)f(to)g(e)o(v)o(aluate)g(a)75 2413 y(query)m(.)27 +b(All)14 b(plans)g(in)g(a)h(query')m(s)g(search)g(space)f(return)h(the) +f(same)h(result;)h(ho)o(we)o(v)o(er)n(,)g(some)e(plans)g(are)i(more)75 +2475 y(ef)o(\256cient)c(than)g(others.)20 b(The)12 b +FB(cost)g(model)f FG(assigns)g(a)i(cost)f(to)g(each)h(plan)e(in)h(the)g +(search)h(space.)20 b(The)13 b(cost)e(of)i(a)75 2537 +y(plan)d(is)g(an)g(estimate)g(of)h(the)f(resources)g(used)g(when)g(the) +g(plan)g(is)f(e)o(x)o(ecuted;)i(the)f(lo)o(wer)g(the)g(cost,)g(the)g +(better)g(the)p 75 2576 720 2 v 124 2603 a FA(\003)142 +2619 y Fz(This)e(research)f(was)g(supported)g(in)h(part)h(by)f(grants)f +(from)i(The)f(Uni)o(v)o(ersity)h(of)f(T)m(e)o(xas)g(Applied)f(Research) +g(Laboratories,)g(Schlum-)75 2669 y(ber)o(ger)o(,)i(and)f(Digital)i +(Equipment)f(Corporation.)964 2793 y FG(1)p eop +%%Page: 2 2 +2 1 bop 75 14 a FG(plan.)20 b(The)12 b FB(sear)n(c)o(h)h(str)o(ate)n +(gy)e FG(is)h(a)h(speci\256cation)e(of)i(which)f(plans)f(in)h(the)h +(search)f(space)h(are)g(to)f(be)h(e)o(xamined.)75 77 +y(If)i(the)g(search)f(space)h(is)f(small,)i(a)f(viable)f(strate)o(gy)g +(is)g(to)h(enumerate)g(and)f(e)o(v)o(aluate)g(e)o(v)o(ery)h(plan.)27 +b(Ho)o(we)o(v)o(er)n(,)75 139 y(most)14 b(search)g(spaces,)h(e)o(v)o +(en)f(for)h(simple)e(queries,)i(are)g(enormous,)f(and)g(thus)f(query)h +(optimizers)f(often)h(need)75 201 y(heuristics)c(to)g(control)g(the)h +(number)h(of)f(plans)f(to)h(be)g(e)o(xamined.)137 263 +y(T)n(raditionally)m(,)19 b(query)f(optimizers)f(ha)o(v)o(e)i(been)g(b) +o(uilt)e(as)h(monolithic)f(subsystems)f(of)j(a)f(DBMS.)i(This)75 +325 y(simply)11 b(re\257ects)h(the)g(fact)f(that)g(traditional)f +(database)i(systems)f(are)h(themselv)o(es)g(monolithic:)j(the)d +(algorithms)75 387 y(used)k(for)g(storing)f(and)h(retrie)o(ving)g(data) +g(are)h(hard-wired)f(and)g(are)h(rather)g(dif)o(\256cult)e(to)h +(change.)32 b(The)16 b(need)75 449 y(to)e(ha)o(v)o(e)i(e)o(xtensible)d +(database)i(systems,)g(and)g(in)f(turn)g(e)o(xtensible)g(optimizers,)h +(has)g(long)f(been)h(recognized)75 511 y(in)i(systems)f(like)f(Genesis) +i([1],)h(EXODUS)f([3],)i(Starb)o(urst)d([15])h(and)g(Postgres)f([18].) +34 b(Rule-based)16 b(query)75 573 y(optimizers)e(are)h(among)f(the)g +(major)h(conceptual)e(adv)o(ances)h(that)g(ha)o(v)o(e)h(been)f +(proposed)g(to)g(deal)g(with)g(query)75 635 y(optimizer)f(e)o +(xtensibility)e([6\2618,)c(10,)g(11,)h(13].)23 b(The)14 +b(e)o(xtensibility)d(translates)h(into)h(the)g(ability)f(to)h +(incorporate)75 698 y(ne)o(w)18 b(operators,)i(algorithms,)f(cost)e +(models,)j(or)e(search)h(strate)o(gies)e(without)f(changing)h(the)h +(optimization)75 760 y(algorithm.)137 822 y(In)12 b(this)f(paper)n(,)i +(we)f(describe)g(an)g(algebraic)g(frame)o(work)g(called)f +FB(Pr)o(airie)g FG(for)h(specifying)f(rules)h(in)f(a)h(query)75 +884 y(optimizer)m(.)k(Prairie)10 b(is)f(similar)g(to)g(other)h(rule)f +(speci\256cation)g(languages)f(like)h(Starb)o(urst)g([13])g(and)h(V)-6 +b(olcano)9 b([8],)75 946 y(and)14 b(indeed,)h(we)g(ha)o(v)o(e)g(based)f +(our)g(work)g(on)g(V)-6 b(olcano)14 b(to)g(capture)g(most)g(of)h(the)f +(adv)o(antages)f(of)i(rule-based)75 1008 y(optimizers.)22 +b(Ho)o(we)o(v)o(er)n(,)14 b(Prairie)f(attempts)g(to)g(pro)o(vide)f +(some)i(ke)o(y)e(features)i(that,)f(we)h(ha)o(v)o(e)f(found,)g +(simplify)75 1070 y(the)e(ef)o(fort)g(in)g(writing)e(rules:)124 +1165 y(1.)21 b(A)10 b(frame)o(work)h(in)f(which)g(users)g(can)g +(de\256ne)h(a)g(query)f(optimizer)g(concisely)g(in)g(terms)g(of)h(a)g +(well-de\256ned)179 1228 y(set)e(of)g(operators)f(and)h(algorithms.)15 +b FB(All)8 b FG(operators)h(and)g(algorithms)e(are)j(considered)e +(\256rst-class)h(objects,)179 1290 y(i.e.,)k FB(any)e +FG(of)h(them)g(can)g(occur)g(in)f(an)o(y)h(rule,)g(and)f +FB(only)g FG(these)h(operators)f(and)g(algorithms)g(can)h(appear)g(in) +179 1352 y(rules.)22 b(This)12 b(scheme)i(eliminates)e(the)h(need)g +(for)h(special)e(classes)h(of)g(operators)g(and)g(algorithms,)g(such) +179 1414 y(as)e(enforcers)g(in)g(V)-6 b(olcano)11 b(and)g(glue)f(in)h +(Starb)o(urst,)g(that)g(signi\256cantly)e(complicate)i(rule)g +(speci\256cation.)124 1509 y(2.)21 b(A)16 b(frame)o(work)h(in)f(which)g +(users)g(can)h(de\256ne)g(a)g(list)e(of)h(properties)g(to)g +(characterize)h(the)g(e)o(xpressions)179 1571 y(generated)e(in)f(the)h +(optimization)e(process.)27 b(Again,)16 b(the)e(goal)h(here)g(is)f(to)h +(allo)o(w)f(the)h(user)g(to)f(treat)h FB(all)179 1633 +y FG(properties)10 b(as)i(ha)o(ving)e(equal)h(status.)16 +b(This)10 b(is)h(dif)o(ferent)g(from)h(V)-6 b(olcano)11 +b(where)h(the)f(user)g(must)g(classify)179 1695 y(properties)f(as)h +(logical,)g(physical,)f(or)h(operator/algorithm)e(ar)o(guments.)124 +1791 y(3.)21 b(A)10 b(frame)o(work)f(in)h(which)f(users)g(can)h +(specify)f(mapping)h(functions)e(between)h(properties)g(concomitantly) +179 1853 y(with)16 b(the)h(corresponding)e(rules.)33 +b(This)16 b(contrasts)g(with)g(e)o(xisting)g(approaches)g(in)h(which)f +(mappings)179 1915 y(between)g(properties)f(are)i(fragmented)g(into)e +(multiple)g(functions)g(and)h(at)h(logically)d(dif)o(ferent)i(places) +179 1977 y(than)11 b(the)g(corresponding)f(rules.)17 +b(Research)12 b(into)e(rule-based)h(optimizers)g(has)g(re)o(v)o(ealed)h +(that)f(property-)179 2039 y(mapping)f(functions)g(are)i(a)f(major)h +(source)f(of)g(user)g(ef)o(fort,)g(so)g(this)f(is)h(an)g(important)f +(goal.)124 2135 y(4.)21 b(The)9 b(format)g(\(Prairie\))h(in)e(which)h +(users)f(can)i(cleanly)e(specify)h(rules)f(is)h(not)f(necessarily)g +(the)h(same)h(format)179 2197 y(needed)i(for)h(generating)f(ef)o +(\256cient)h(optimizers.)21 b(Thus,)12 b(there)h(is)g(a)g(need)g(for)g +(a)g(pre-processor)f(\(written)179 2259 y(by)f(us\))g(that)f +(translates)g(between)h(these)g(competing)f(representations.)137 +2354 y(Prairie)k(stri)o(v)o(es)e(for)i(uniformity)d(in)i(dealing)f +(with)h(issues)f(that)g(ha)o(v)o(e)i(been)f(a)h(source)f(of)g(most)g +(user)g(ef)o(fort)75 2416 y(and)f(potential)f(user)h(errors.)21 +b(In)13 b(the)f(follo)o(wing)e(sections,)i(we)g(present)g(the)h +(Prairie)f(frame)o(work.)21 b(W)l(e)13 b(e)o(xplain)75 +2478 y(ho)o(w)c(our)h(P2V)g(pre-processor)f(maps)h(Prairie)g(rule)g +(speci\256cations)f(into)f(V)-6 b(olcano)9 b(rule)h(speci\256cations)f +(that)g(can)75 2540 y(be)h(processed)g(ef)o(\256ciently)m(.)15 +b(Experimental)9 b(results)g(to)h(support)f(this)f(claim)j(are)f(gi)o +(v)o(en)g(in)g(Section)f(4,)i(where)f(we)75 2602 y(compare)h +(implementations)d(of)i(the)g(T)m(e)o(xas)g(Instruments)e(Open)i(OODB)g +(query)g(optimizer)f(using)g(both)g(Prairie)75 2665 y(and)i(V)-6 +b(olcano.)16 b(W)l(e)c(conclude)e(with)g(a)i(summary)f(and)g(related)g +(research.)964 2793 y(2)p eop +%%Page: 3 3 +3 2 bop 75 14 a FC(2)60 b(Prairie:)18 b(A)e(language)e(f)o(or)f(rule)h +(speci\256cation)75 124 y FG(The)d(basic)g(concepts)g(and)g +(de\256nitions)f(that)h(underly)f(the)h(Prairie)h(model)g(are)g +(presented)f(in)g(this)f(section.)16 b(The)75 186 y(goal)c(is)f(to)h +(lay)f(a)i(foundation)d(for)i(reasoning)f(about)h(query)f(optimizers)g +(algebraically;)h(this)f(is)g(necessary)h(for)75 248 +y(our)f(subsequent)e(discussion)g(about)h(translating)g(Prairie)h +(speci\256cations)f(to)h(those)f(of)h(V)-6 b(olcano.)75 +378 y Fy(2.1)50 b(Notation)11 b(and)h(assumptions)75 +471 y Fx(Stor)o(ed)j(Files)f(and)g(Str)o(eams.)47 b FG(A)14 +b(\256le)g(is)g FB(stor)n(ed)h FG(if)f(its)f(tuples)g(reside)h(on)g +(disk.)25 b(In)14 b(the)g(case)h(of)f(relational)75 533 +y(databases,)i(stored)e(\256les)h(are)h(sometimes)f(called)g +FB(base)g(r)n(elations)p FG(;)f(we)i(will)e(denote)g(them)i(by)e +Fw(R)i FG(or)f Fw(R)1784 540 y Fv(i)1797 533 y FG(.)29 +b(In)75 595 y(object-oriented)15 b(schemas,)j(stored)e(\256les)h(are)g +FB(classes)p FG(;)h(we)f(will)e(denote)h(them)h(by)f +FB(C)h FG(or)g FB(C)1601 602 y Fv(i)1615 595 y FG(.)33 +b(Henceforth,)75 657 y(whene)o(v)o(er)9 b(we)h(refer)g(to)f(a)g(stored) +g(\256le,)h(we)g(mean)f(a)h(relation)e(or)i(a)f(class;)g(when)g(the)g +(distinction)e(is)h(unimportant,)75 719 y(we)15 b(will)e(use)h +Fw(F)22 b FG(or)14 b Fw(F)435 726 y Fv(i)450 719 y FG(.)26 +b(A)15 b FB(str)n(eam)f FG(is)g(a)g(sequence)h(of)f(tuples)g(and)g(is)g +(the)g(result)g(of)g(a)h(computation)e(on)h(one)75 781 +y(or)f(more)h(streams)f(or)h(stored)e(\256les;)i(tuples)e(of)h(streams) +h(are)f(returned)g(one)g(at)h(a)f(time,)h(typically)e(on)h(demand.)75 +844 y(Streams)f(can)f(be)h FB(named)p FG(,)e(denoted)h(by)g +Fw(S)746 851 y Fv(i)760 844 y FG(,)g(or)g FB(unnamed)p +FG(.)75 972 y Fx(Database)16 b(Operations.)46 b FG(An)17 +b FB(oper)o(ation)e FG(is)h(a)h(computation)e(on)i(one)f(or)h(more)g +(streams)g(or)g(stored)f(\256les.)75 1034 y(There)i(are)g(two)e(types)h +(of)g(database)g(operations)f(in)h(Prairie:)29 b(abstract)17 +b(\(or)g(implementation-unspeci\256ed\))75 1096 y(operators)10 +b(and)h(concrete)h(algorithms.)j(Each)c(is)g(detailed)f(belo)o(w)m(.) +179 1200 y Fx(Operators.)21 b FG(Abstract)7 b(\(or)g(conceptual\))g +FB(oper)o(ators)g FG(sp)o(ecify)g(computati)o(ons)f(on)h(st)o(reams)g +(or)g(stored)g(\256les;)270 1262 y(the)o(y)h(are)g(denoted)f(by)g(all)g +(capital)g(letters)g(\(e.g.,)j(JOIN\).)e(Operators)f(ha)o(v)o(e)h(two)e +(types)h(of)h(parameters:)270 1324 y(essential)h(and)g(additional.)14 +b FB(Essential)8 b(par)o(ameters)g FG(are)i(the)g(stream)g(or)g(\256le) +g(inputs)e(to)h(an)h(operator;)270 1386 y(these)j(are)h(the)f(primary)h +(inputs)d(to)i(be)h(processed)f(by)g(an)g(operator)m(.)23 +b FB(Additional)11 b(par)o(ameters)g FG(are)270 1448 +y(\252\256ne-grain\272)19 b(quali\256cations)d(of)i(an)g(operator;)j +(their)d(purpose)f(is)h(to)g(describe)g(an)g(operator)g(in)270 +1510 y(more)10 b(detail)f(than)g(essential)g(parameters.)16 +b(As)10 b(e)o(xamples,)g(some)g(operators)f(are)h(described)f(belo)o +(w;)270 1573 y(for)15 b(each)g(we)g(e)o(xplicitly)e(indicate)h(their)g +(essential)g(parameters)h(and)f(parenthetically)f(note)i(their)270 +1635 y(additional)9 b(parameters.)304 1713 y Fu(\017)21 +b FG(SOR)m(T\()p Fw(S)504 1720 y Ft(1)524 1713 y FG(\))10 +b(sorts)f(stream)h Fw(S)804 1720 y Ft(1)824 1713 y FG(.)16 +b(The)10 b(sorting)e(attrib)o(ute)h(is)g(an)h(additional)e(parameter)j +(of)f(SOR)m(T)m(.)304 1784 y Fu(\017)21 b FG(RET\()p +Fw(F)6 b FG(\))13 b(retrie)o(v)o(es)f(tuples)e(of)j(stored)e(\256le)h +Fw(F)6 b FG(.)20 b(Additional)10 b(parameters)j(to)e(RET)h(include)f +(the)348 1846 y(selection)f(predicate,)h(the)g(projected)f(attrib)o +(utes)g(list,)g(and)h(the)g(output)f(tuple)g(order)m(.)304 +1916 y Fu(\017)21 b FG(JOIN\()p Fw(S)490 1923 y Ft(1)509 +1916 y FG(,)12 b Fw(S)560 1923 y Ft(2)579 1916 y FG(\))g(joins)e +(streams)h Fw(S)884 1923 y Ft(1)915 1916 y FG(and)g Fw(S)1020 +1923 y Ft(2)1040 1916 y FG(.)17 b(\()p Fw(S)1111 1923 +y Ft(1)1142 1916 y FG(denotes)10 b(the)h FB(outer)g(str)n(eam)f +FG(and)h Fw(S)1705 1923 y Ft(2)1736 1916 y FG(denotes)348 +1978 y(the)17 b FB(inner)f(str)n(eam)p FG(\).)34 b(Additional)14 +b(parameters)k(to)f(JOIN)f(include)h(the)f(join)g(predicate)h(and)348 +2040 y(output)9 b(stream)j(tuple)e(order)m(.)270 2119 +y(Other)h(operators)f(are)i(de\256ned)g(as)f(the)o(y)g(are)h(needed.) +179 2198 y Fx(Algorithms.)20 b FB(Algorithms)10 b FG(are)k(concrete)f +(implementations)f(of)h(conceptual)g(operators;)g(the)o(y)g(will)f(be) +270 2260 y(represented)j(in)f(lo)o(wer)g(case)i(with)d(the)i(\256rst)g +(letter)f(capitalized.)27 b(Algorithms)13 b(ha)o(v)o(e)i(at)g(least)f +(the)270 2322 y(same)7 b(essential)g(and)g(additional)g(p)o(arameters)g +(as)g(the)g(conceptual)f(operators)h(t)o(hat)g(t)o(he)o(y)g(implement.) +1858 2306 y Ft(1)270 2384 y FG(Furthermore,)15 b(there)e(can)h(be,)h +(and)e(usually)f(are,)j(se)o(v)o(eral)e(algorithms)f(for)i(a)g +(particular)f(operator)m(.)270 2446 y(F)o(or)c(e)o(xample,)g(File)p +588 2446 14 2 v 16 w(scan,)g(Btree)p 803 2446 V 17 w(scan)e(and)h(Inde) +o(x)p 1085 2446 V 16 w(scan)g(are)h(all)e(v)o(alid)g(algorithms)f(that) +i(implement)270 2508 y(the)14 b(operator)g(RET)m(,)g(and)g(Mer)o(ge)p +814 2508 V 17 w(join)g(and)g(Nested)p 1124 2508 V 15 +w(loops)f(are)i(algorithms)e(that)h(implement)f(the)270 +2571 y(JOIN)e(operator)m(.)17 b(Dif)o(ferent)10 b(algorithms)g(of)o +(fer)i(dif)o(ferent)f(e)o(x)o(ecution)f(ef)o(\256ciencies.)p +75 2611 720 2 v 125 2641 a Fs(1)142 2657 y Fz(Algorithms)g(may)e(ha)o +(v)o(e)h Fr(tuning)g(par)o(ameters)d Fz(which)j(are)g(not)g(parameters) +f(in)i(the)f(operators)f(the)o(y)h(implement.)964 2793 +y FG(3)p eop +%%Page: 4 4 +4 3 bop 277 17 1396 7 v 277 67 2 51 v 304 52 a Fq(Operator)p +535 67 V 106 w(Description)p 881 67 V 161 w(Additional)9 +b(Parameters)p 1297 67 V 49 w(Algorithm)p 1671 67 V 277 +73 1396 7 v 277 123 2 51 v 304 133 a Fz(JOIN\()p Fp(S)420 +137 y Fs(1)438 133 y Fz(,)g Fp(S)479 137 y Fs(2)497 133 +y Fz(\))p 535 123 V 52 w(Join)g(streams)f Fp(S)779 137 +y Fs(1)797 133 y Fz(,)i Fp(S)839 137 y Fs(2)p 881 123 +V 908 108 a Fz(tuple)p 985 108 12 2 v 13 w(order)p 1297 +123 2 51 v 248 w(Nested)p 1430 108 12 2 v 12 w(loops\()p +Fp(S)1557 112 y Fs(1)1575 108 y Fz(,)f Fp(S)1616 112 +y Fs(2)1634 108 y Fz(\))p 1671 123 2 51 v 1298 125 375 +2 v 277 173 2 51 v 535 173 V 881 173 V 908 158 a(join)p +968 158 12 2 v 13 w(predicate)p 1297 173 2 51 v 206 w(Mer)o(ge)p +1422 158 12 2 v 13 w(join\()p Fp(S)1526 162 y Fs(1)1545 +158 y Fz(,)g Fp(S)1586 162 y Fs(2)1604 158 y Fz(\))p +1671 173 2 51 v 277 175 1396 2 v 277 232 2 57 v 304 262 +a(RET\()p Fp(F)c Fz(\))p 535 232 V 561 266 a(Retrie)o(v)o(e)10 +b(\256le)f Fp(F)p 881 232 V 908 213 a Fz(tuple)p 985 +213 12 2 v 13 w(order)p 1297 232 2 57 v 1323 225 a(File)p +1383 225 12 2 v 14 w(scan\()p Fp(F)c Fz(\))p 1671 232 +2 57 v 277 282 2 51 v 535 282 V 881 282 V 908 267 a(selection)p +1044 267 12 2 v 12 w(predicate)p 1297 282 2 51 v 1298 +259 374 2 v 1671 282 2 51 v 277 333 V 535 333 V 881 333 +V 908 317 a(projected)p 1050 317 12 2 v 12 w(attrib)o(utes)p +1297 333 2 51 v 1323 308 a(Inde)o(x)p 1410 308 12 2 v +13 w(scan\()p Fp(F)g Fz(\))p 1671 333 2 51 v 277 335 +1396 2 v 277 385 2 51 v 304 394 a(SOR)n(T\()p Fp(S)433 +398 y Fs(1)450 394 y Fz(\))p 535 385 V 561 396 a(Sort)10 +b(stream)f Fp(S)765 400 y Fs(1)p 881 385 V 908 394 a +Fz(tuple)p 985 394 12 2 v 13 w(order)p 1297 385 2 51 +v 1323 370 a(Mer)o(ge)p 1422 370 12 2 v 13 w(sort\()p +Fp(S)1524 374 y Fs(1)1543 370 y Fz(\))p 1671 385 2 51 +v 1298 387 375 2 v 277 435 2 51 v 535 435 V 881 435 V +1297 435 V 1323 420 a(Null\()p Fp(S)1424 424 y Fs(1)1443 +420 y Fz(\))p 1671 435 V 277 442 1396 7 v 80 518 a FG(T)l(able)i(1:)16 +b(Operators)11 b(and)g(algorithms)e(in)i(a)h(centralized)e(query)h +(optimizer)g(and)g(their)f(additional)g(parameters)p +88 662 1766 2 v 88 1208 2 546 v 286 725 a Fo(SOR)n(T)f(\(JOIN)f(\(RET)h +(\()p Fv(R)588 730 y Fs(1)605 725 y Fo(\),)g(RET)g(\()p +Fv(R)742 730 y Fs(2)759 725 y Fo(\)\)\))498 798 y + tx@Dict begin tx@NodeDict begin { } /TheNodesort 16 { .5 5.384 0.09999 +false .5 19.96799 InitRnode } NewNode end end + 498 +798 a Fo(SOR)n(T)503 869 y + tx@Dict begin tx@NodeDict begin { } /TheNodejoin 16 { .5 5.384 0.09999 +false .5 17.328 InitRnode } NewNode end end + 503 869 a Fo(JOIN)468 1000 +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 + 468 1000 a 437 940 a + tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 437 940 a Fo(RET)578 940 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 578 +940 a Fo(RET)468 1000 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 + 468 1000 a 468 1000 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 + 468 1000 +a 446 1009 a + tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 446 1009 a Fv(R)473 1014 y Fs(1)588 1009 +y + tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 588 1009 a Fv(R)615 1014 y Fs(2)468 1000 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 + 468 1000 +a 468 1000 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 + 468 1000 a 155 1103 a Fz(\(a\))16 b(An)g(e)o(xpression)d +(and)i(its)h(corresponding)d(operator)155 1153 y(tree)p +976 1195 2 521 v 1329 795 a + tx@Dict begin tx@NodeDict begin { } /TheNodemergesort 16 { .5 5.384 +1.744 false .5 35.61601 InitRnode } NewNode end end + 1329 795 a Fo(Mer)o(ge)p +1418 795 10 2 v 11 w(sort)1315 865 y + tx@Dict begin tx@NodeDict begin { } /TheNodenestedloops 16 { .5 5.384 +1.728 false .5 42.432 InitRnode } NewNode end end + 1315 865 a Fo(Nested)p +1410 865 10 2 v 11 w(loops)1332 1000 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 + 1332 1000 a 1271 +940 a + tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr1 16 { .5 5.384 +0.064 false .5 29.544 InitRnode } NewNode end end + 1271 940 a Fo(File)p 1324 940 10 2 v 12 w(scan)1412 +940 y + tx@Dict begin tx@NodeDict begin { } /TheNodefilescanr2 16 { .5 5.384 +0.064 false .5 29.544 InitRnode } NewNode end end + 1412 940 a Fo(File)p 1465 940 10 2 v 13 w(scan)1332 +1000 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 + 1332 1000 a 1332 1000 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 + 1332 1000 a 1310 1009 +a + tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1310 1009 a Fv(R)1337 1014 y Fs(1)1452 1009 y + tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1452 +1009 a Fv(R)1479 1014 y Fs(2)1332 1000 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 + 1332 1000 a +1332 1000 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 + 1332 1000 a 1054 1103 a Fz(\(b\))d(Possible)e(access)f +(plan)h(for)i(operator)f(tree)g(in)h(\(a\))p 1852 1208 +2 546 v 88 1210 1766 2 v 1853 1218 10 549 v 96 1218 1766 +10 v 483 1321 a FG(Figure)h(1:)16 b(Example)11 b(of)g(an)h(operator)e +(tree)i(and)f(access)g(plan)75 1501 y(T)l(able)20 b(1)g(lists)e(some)i +(operators)f(and)h(algorithms)e(implementing)h(them)h(together)f(with)g +(their)g(additional)75 1563 y(parameters.)75 1692 y Fx(Operator)12 +b(T)m(r)o(ees.)46 b FG(An)11 b FB(oper)o(ator)e(tr)n(ee)i +FG(is)f(a)h(rooted)g(tree)g(whose)f(non-leaf,)h(or)g +FB(interior)p FG(,)e(nodes)h(are)i(database)75 1754 y(operations)k +(\(operators)h(or)h(algorithms\))f(and)g(whose)g(leaf)h(nodes)f(are)i +(stored)e(\256les.)36 b(The)17 b(children)g(of)h(an)75 +1816 y(interior)12 b(node)g(in)g(an)h(operator)f(tree)h(are)g(the)g +(essential)e(parameters)i(\(i.e.,)i(the)d(stream)h(or)g(\256le)g +(parameters\))g(of)75 1878 y(the)e(node.)18 b(Additional)10 +b(parameters)i(are)g(implicitly)e(attached)i(to)f(each)h(node.)18 +b(Algebraically)m(,)11 b(operator)g(trees)75 1940 y(are)17 +b(compositions)c(of)j(database)g(operations;)g(thus,)h(we)f(will)f +(also)g(call)h(operator)g(trees)g FB(e)o(xpr)n(essions)p +FG(;)g(both)75 2003 y(terms)11 b(will)f(be)i(used)e(interchangeably)m +(.)75 2114 y(E)p Fn(XAMPLE)j FG(1.)79 b(A)12 b(simple)g(e)o(xpression)g +(and)g(its)g(operator)g(tree)h(representation)e(are)j(sho)o(wn)d(in)h +(Figure)g(1\(a\).)75 2177 y(Relations)c Fw(R)291 2184 +y Ft(1)320 2177 y FG(and)h Fw(R)430 2184 y Ft(2)459 2177 +y FG(are)h(\256rst)f(RET)n(rie)o(v)o(ed,)h(and)g(then)e(JOINed,)i(and)f +(\256nally)g(SOR)m(T)m(ed)h(resulting)d(in)i(a)h(stream)75 +2239 y(sorted)e(on)g(a)g(speci\256c)h(attrib)o(ute.)14 +b(The)8 b(\256gure)h(sho)o(ws)e(only)g(the)h(essential)f(parameters)i +(of)f(the)g(v)o(arious)g(operators,)75 2301 y(not)i(the)h(additional)f +(parameters.)1225 b Fm(\003)75 2463 y Fx(Descriptors.)45 +b FG(A)14 b FB(pr)n(operty)d FG(of)i(a)h(node)e(is)h(a)g(\(user)o +(-de\256ned\))h(v)o(ariable)e(that)g(contains)g(information)g(used)h +(by)75 2525 y(an)f(optimizer)m(.)17 b(An)11 b FB(annotation)e +FG(is)i(a)h Fu(h)p FB(pr)n(operty)m(,)e(value)p Fu(i)h +FG(pair)h(that)e(is)h(assigned)g(to)g(a)h(node.)17 b(A)11 +b FB(descriptor)g FG(is)g(a)75 2587 y(list)h(of)g(annotations)f(that)h +(describes)g(a)h(node)f(of)h(an)g(operator)f(tree;)i(e)o(v)o(ery)f +(node)f(has)h(its)f(o)o(wn)g(descriptor)m(.)20 b(As)75 +2649 y(an)10 b(e)o(xample,)h(T)l(able)f(2)g(lists)e(some)i(typical)f +(properties)g(that)g(might)h(be)g(used)f(in)h(a)g(descriptor)m(.)16 +b(It)9 b(must)h(be)g(noted)964 2793 y(4)p eop +%%Page: 5 5 +5 4 bop 376 17 1198 7 v 376 67 2 51 v 403 52 a Fq(Pr)o(operty)p +719 67 V 198 w(Description)p 1572 67 V 376 73 1198 7 +v 376 123 2 51 v 403 108 a Fz(join)p 463 108 12 2 v 13 +w(predicate)p 719 123 2 51 v 133 w(join)10 b(predicate)e(for)i(JOIN)f +(operator)p 1572 123 V 376 125 1198 2 v 376 175 2 51 +v 403 160 a(selection)p 539 160 12 2 v 12 w(predicate)p +719 175 2 51 v 58 w(selection)f(predicate)h(for)g(RET)g(operator)p +1572 175 V 376 177 1198 2 v 376 227 2 51 v 403 212 a(tuple)p +480 212 12 2 v 13 w(order)p 719 227 2 51 v 175 w(tuple)g(order)g(of)h +(resulting)f(stream,)g(DONT)p 1322 212 12 2 v 13 w(CARE)g(if)i(none)p +1572 227 2 51 v 376 229 1198 2 v 376 279 2 51 v 403 264 +a(num)p 472 264 12 2 v 13 w(records)p 719 279 2 51 v +151 w(number)e(of)g(tuples)g(of)g(resulting)g(stream)p +1572 279 V 376 281 1198 2 v 376 331 2 51 v 403 316 a(tuple)p +480 316 12 2 v 13 w(size)p 719 331 2 51 v 195 w(size)g(of)g(indi)o +(vidual)g(tuple)g(in)g(stream)p 1572 331 V 376 332 1198 +2 v 376 383 2 51 v 403 368 a(projected)p 545 368 12 2 +v 12 w(attrib)o(utes)p 719 383 2 51 v 52 w(list)h(of)g(projected)e +(attrib)o(utes)i(for)f(RET)g(operator)p 1572 383 V 376 +384 1198 2 v 376 435 2 51 v 403 419 a(attrib)o(utes)p +719 435 V 204 w(list)h(of)g(attrib)o(utes)p 1572 435 +V 376 436 1198 2 v 376 486 2 51 v 403 471 a(cost)p 719 +486 V 281 w(estimated)f(cost)f(of)i(algorithm)p 1572 +486 V 376 493 1198 7 v 546 569 a FG(T)l(able)i(2:)j(Properties)c(of)g +(nodes)g(in)f(an)i(operator)e(tree)75 749 y(here)i(that)f(streams)h +(and)g(stored)f(\256les)g(may)i(ha)o(v)o(e)f(dif)o(ferent)f(descriptor) +g(structures.)17 b(The)12 b(follo)o(wing)d(notations)75 +811 y(will)g(be)h(useful)f(in)h(our)g(subsequent)e(discussions.)14 +b(If)c Fw(S)962 818 y Fv(i)986 811 y FG(is)g(a)g(stream,)h(then)f +Fl(D)1329 818 y Fk(i)1352 811 y FG(is)g(its)f(descriptor)m(.)16 +b(Annotations)75 873 y(of)g Fw(S)157 880 y Fv(i)187 873 +y FG(are)g(accessed)g(by)f(a)h(structure)f(member)i(relationship,)e +(e.g.,)j Fl(D)1247 880 y Fk(i)1261 873 y Fw(:)p FG(num)p +1358 873 14 2 v 15 w(records.)31 b(Also,)16 b(let)f Fw(E)j +FG(be)e(an)75 935 y(e)o(xpression)10 b(and)h(let)g Fl(D)g +FG(be)h(its)e(descriptor)m(.)16 b(W)l(e)c(will)e(write)h(this)f(as)h +Fw(E)k Fj(:)d Fl(D)p FG(.)75 1047 y(E)p Fn(XAMPLE)h FG(2.)77 +b(The)11 b(e)o(xpression,)75 1142 y(SOR)m(T)p Fj(\()p +FG(JOIN)p Fj(\()p FG(RET)o Fj(\()p Fw(R)461 1149 y Ft(1)480 +1142 y Fj(\))h(:)h Fl(D)576 1149 y Fk(3)598 1142 y Fw(;)8 +b FG(RET)o Fj(\()p Fw(R)757 1149 y Ft(2)776 1142 y Fj(\))k(:)h +Fl(D)872 1149 y Fk(4)894 1142 y Fj(\))f(:)h Fl(D)990 +1149 y Fk(5)1012 1142 y Fj(\))f(:)h Fl(D)1108 1149 y +Fk(6)75 1238 y FG(corresponds)j(to)g(the)g(operator)h(tree)g(in)f +(Figure)h(1\(a\),)i(and)e(represents)f(the)g(join)g(of)h(two)f +(relations)f Fw(R)1773 1245 y Ft(1)1809 1238 y FG(and)75 +1300 y Fw(R)110 1307 y Ft(2)129 1300 y FG(.)24 b(The)13 +b(two)g(relations)f(are)i(\256rst)f(RET)n(rie)o(v)o(ed,)i(then)e +(JOINed)g(and)g(\256nally)g(SOR)m(T)m(ed.)24 b Fl(D)1559 +1307 y Fk(3)1595 1300 y FG(and)13 b Fl(D)1714 1307 y +Fk(4)1750 1300 y FG(are)h(the)75 1362 y(descriptors)9 +b(of)i(the)f(two)f(RETs)h(respecti)o(v)o(ely)m(,)g Fl(D)869 +1369 y Fk(5)902 1362 y FG(is)g(the)g(descriptor)g(of)g(the)g(JOIN,)h +(and)f Fl(D)1553 1369 y Fk(6)1586 1362 y FG(is)g(the)g(descriptor)75 +1424 y(of)i(the)g(SOR)m(T)m(.)h(Assuming)d(that)i(the)g(descriptor)f +(\256elds)g(for)i(this)e(e)o(xpression)g(are)h(those)g(gi)o(v)o(en)f +(in)h(T)l(able)g(2,)g(the)75 1486 y(selection)d(predicate)i(for)f(the)h +(\256rst)f(RET)h(is)f Fl(D)814 1493 y Fk(3)836 1486 y +Fw(:)p FG(selection)p 1015 1486 V 15 w(predicate,)h(and)f(that)g(for)h +(the)f(second)g(RET)h(is)f(gi)o(v)o(en)75 1548 y(by)h +Fl(D)172 1555 y Fk(4)194 1548 y Fw(:)p FG(selection)p +373 1548 V 15 w(predicate.)17 b(The)11 b(join)f(predicate)h(of)g(the)h +(JOIN)e(node)h(is)g(gi)o(v)o(en)g(by)g Fl(D)1498 1555 +y Fk(5)1520 1548 y Fw(:)p FG(join)p 1608 1548 V 15 w(predicate)o(,)h +(and)75 1610 y(the)d(attrib)o(utes)f(that)g(are)i(output)e(are)i(gi)o +(v)o(en)e(by)h Fl(D)854 1617 y Fk(5)877 1610 y Fw(:)p +FG(attrib)o(utes)n(.)16 b(The)9 b(order)g(in)g(which)f(SOR)m(T)i +(returns)f(the)g(output)75 1672 y(stream)j(is)e(gi)o(v)o(en)h(by)g +Fl(D)457 1679 y Fk(6)479 1672 y Fw(:)p FG(tuple)p 587 +1672 V 15 w(order.)1134 b Fm(\003)137 1768 y FG(A)11 +b(notational)e(simpli\256cation)g(can)i(be)g(made)g(here.)17 +b(Additional)9 b(parameters)i(of)g(operators)f(can)h(be)g(treated)75 +1830 y(the)i(same)g(way)g(as)g(other)f(properties)g(of)h(a)h(node;)f +(essential)e(parameters,)k(ho)o(we)o(v)o(er)n(,)e(are)h +FB(e)o(xpr)n(essions)p FG(.)21 b(Thus,)75 1892 y(the)8 +b(term)i(descriptor)d(in)i(the)f(remainder)i(of)e(this)g(paper)h(will)f +(refer)h(to)g(a)g(set)f(of)h(properties,)g(including)d(additional)75 +1954 y(parameters,)12 b(as)f(sho)o(wn)f(in)h(T)l(able)g(2.)137 +2016 y(Currently)m(,)g(descriptor)e(properties)h(are)h(de\256ned)g +(entirely)e(by)i(the)f(user;)g(ho)o(we)o(v)o(er)n(,)h(we)g(en)n(vision) +e(pro)o(viding)75 2078 y(a)j(hierarchy)e(of)i(pre-de\256ned)f +(descriptor)f(types)g(to)h(aid)g(this)f(process.)75 2207 +y Fx(Access)h(Plans.)45 b FG(An)11 b FB(access)g(plan)f +FG(is)h(an)g(operator)g(tree)g(in)g(which)g(all)f(interior)h(nodes)f +(are)i(algorithms.)75 2319 y(E)p Fn(XAMPLE)h FG(3.)75 +b(An)8 b(access)g(plan)g(for)h(the)f(operator)g(tree)h(in)f(Figure)g +(1\(a\))h(is)f(sho)o(wn)f(in)h(Figure)h(1\(b\).)15 b(Relations)75 +2381 y Fw(R)110 2388 y Ft(1)141 2381 y FG(and)d Fw(R)254 +2388 y Ft(2)286 2381 y FG(are)g(each)h(retrie)o(v)o(ed)f(using)e(the)i +(File)p 873 2381 V 16 w(scan)g(algorithm,)g(joined)e(using)h(Nested)p +1546 2381 V 16 w(loops,)g(and)h(\256nally)75 2443 y(sorted)e(using)g +(Mer)o(ge)p 427 2443 V 17 w(sort.)1319 b Fm(\003)964 +2793 y FG(5)p eop +%%Page: 6 6 +6 5 bop 85 -30 1773 2 v 85 388 2 418 v 122 15 a Fp(E)r +Fi(\()p Fp(x)189 19 y Fs(1)206 15 y Fp(;)6 b(:)g(:)g(:)g(;)g(x)313 +19 y Fh(n)334 15 y Fi(\))11 b(:)f Fg(D)415 19 y Ff(1)445 +15 y Fi(=)-6 b Fe(\))11 b Fp(E)548 -3 y FA(0)559 15 y +Fi(\()p Fp(x)596 19 y Fs(1)613 15 y Fp(;)6 b(:)g(:)g(:)g(;)g(x)720 +19 y Fh(n)741 15 y Fi(\))11 b(:)f Fg(D)822 19 y Ff(2)1788 +15 y Fz(\(1\))122 65 y Fe(ff)230 115 y Fz(pre-test)g(statements)122 +165 y Fe(gg)122 216 y Fz(test)122 266 y Fe(ff)230 316 +y Fz(post-test)f(statements)122 366 y Fe(gg)p 1855 388 +V 85 390 1773 2 v 1856 398 10 421 v 93 398 1773 10 v +662 502 a FG(Figure)i(2:)k(General)d(form)f(of)h(a)f(T)l(-rule)75 +682 y Fy(2.2)50 b(Prairie)13 b(optimization)e(paradigm)75 +775 y FG(Query)k(optimizers)f(map)i(operator)f(trees)g(to)g(access)g +(plans.)1063 758 y Ft(2)1111 775 y FG(Prairie)g(admits)g(two)f(rather)h +(dif)o(ferent)g(means)75 837 y(of)d(optimization:)k(top-do)o(wn)11 +b(and)h(bottom-up.)18 b(A)13 b(top-do)o(wn)d(query)i(optimizer)g +(optimizes)f(the)h(parents)g(of)g(a)75 899 y(node)h(prior)h(to)f +(optimizing)f(the)i(node)f(itself.)24 b(A)14 b(bottom-up)e(optimizer)h +(optimizes)g(the)h(children)f(of)g(a)i(node)75 961 y(prior)f(to)g +(optimizing)f(the)i(node.)26 b(The)15 b(earliest)f(optimizers)f +(\(System)i(R)g([17])g(and)f(R)1485 944 y Fd(\003)1520 +961 y FG([16]\))h(employed)e(the)75 1023 y(bottom-up)d(approach.)137 +1085 y(Our)k(research)h(concentrates)f(on)f(a)i(top-do)o(wn)d +(optimization)h(of)h(operator)g(trees.)25 b(W)l(e)15 +b(ha)o(v)o(e)g(chosen)e(this)75 1147 y(approach)e(because)g(we)h +(intend)e(to)h(translate)f(Prairie)i(rules)f(into)f(the)h(format)h +(required)f(by)g(the)g(V)-6 b(olcano)10 b(query)75 1209 +y(optimizer)16 b(generator)g([8].)31 b(V)-6 b(olcano)16 +b(is)f(based)h(on)g(a)g(top-do)o(wn)f(strate)o(gy)m(.)31 +b(Gi)o(v)o(en)15 b(an)i(appropriate)e(search)75 1271 +y(engine,)g(Prairie)g(can)g(potentially)e(also)h(be)h(used)f(with)g(a)h +(bottom-up)e(optimization)g(strate)o(gy;)i(ho)o(we)o(v)o(er)n(,)h(we)75 +1333 y(will)10 b(not)h(discuss)e(this)h(approach)h(in)g(this)f(paper)m +(.)137 1396 y(In)18 b(query)g(optimization,)g(there)g(are)g(certain)g +(annotations)e(\(such)i(as)g(additional)e(parameters\))i(that)f(are)75 +1458 y(kno)o(wn)12 b(before)i(an)o(y)g(optimization)e(is)h(be)o(gun.)24 +b(These)13 b(annotations)f(can)i(be)f(computed)h(at)f(the)h(time)f +(that)g(the)75 1520 y(operator)d(tree)i(is)e(initialized,)f(and)i(will) +f(not)g(change)h(with)f(application)f(of)h(rules.)17 +b(Our)10 b(follo)o(wing)f(discussions)75 1582 y(assume)i(operator)g +(trees)g(are)h(initialized.)75 1712 y Fy(2.3)50 b(T)l(ransf)o(ormation) +12 b(rules)137 1805 y FG(T)n(ransformation)f(rules,)h(or)f(T)l(-rules)g +(for)h(short,)f(de\256ne)h(equi)o(v)o(alences)e(among)i(pairs)f(of)g(e) +o(xpressions;)f(the)o(y)75 1867 y(de\256ne)j(mappings)e(from)i(one)g +(operator)f(tree)h(to)f(another)m(.)21 b(Let)12 b Fw(E)j +FG(and)d Fw(E)1264 1851 y Fd(0)1288 1867 y FG(be)g(e)o(xpressions)g +(that)f(in)n(v)o(olv)o(e)h(only)75 1929 y(abstract)d(operators.)15 +b(Equation)8 b(\(1\))i(\(sho)o(wn)e(in)i(Figure)f(2\))h(sho)o(ws)e(the) +h(general)h(form)g(of)f(a)h(T)l(-rule.)16 b(The)9 b(actions)75 +1991 y(of)j(a)g(T)l(-rule)g(de\256ne)g(the)f(equi)o(v)o(alences)g +(between)g(the)h(descriptors)e(of)i(nodes)f(of)h(the)g(original)e +(operator)i(tree)g Fw(E)75 2053 y FG(with)i(the)g(nodes)g(of)g(the)h +(output)e(tree)h Fw(E)735 2037 y Fd(0)746 2053 y FG(;)i(these)e +(actions)g(consist)f(of)i(a)g(series)f(of)g(\(C)i(or)e(C++\))h +(assignment)1857 2037 y Ft(3)75 2116 y FG(statements.)j(The)12 +b(left-hand)f(sides)g(of)h(these)f(statements)g(refer)i(to)f +(descriptors)e(of)i(e)o(xpressions)f(on)g(the)h(right-)75 +2178 y(hand)k(side)f(of)h(the)g(T)l(-rule;)i(the)e(right-hand)f(sides)g +(of)h(the)g(statements)f(can)i(refer)g(to)e(an)o(y)i(descriptor)e(in)g +(the)75 2240 y(T)l(-rule.)k(Function)11 b(\(called)i +FB(helper)f FG(functions\))f(calls)h(can)g(also)g(appear)g(on)g(the)g +(right)g(side)f(of)h(the)g(assignment)75 2302 y(statements.)j(Thus,)8 +b(descriptors)g(on)g(the)g FB(left-hand)f(side)i FG(of)f(a)h(T)l(-rule) +g(are)g FB(ne)o(ver)h FG(changed)e(in)h(the)f(rule')m(s)h(actions.)p +75 2342 720 2 v 125 2369 a Fs(2)142 2385 y Fz(Actually)n(,)j(query)e +(optimizers)h(operate)f(on)g(the)h(output)g(of)g(a)g(query)g(compiler)g +(which)f(translates)g(a)h(high-le)o(v)o(el)g(query)n(,)g(e.g.,)h(one)75 +2435 y(e)o(xpressed)t(in)7 b(SQL,)f(into)h(an)f(intermediate)g +(structure)h(called)e(a)h Fr(query)f(gr)o(aph)g Fz(and)h(then)g(into)g +(an)g(operator)g(tree.)13 b(The)6 b(query)f(compilation)75 +2486 y(process)i(is)j(well-kno)o(wn)f(and)f(we)h(assume)e(it)j(is)f +(carried)g(out)h(before)e(query)h(optimization)g(be)o(gins.)125 +2517 y Fs(3)142 2533 y Fz(The)e(actions)g(can)g(be)h(non-assignment)d +(statements)i(\(like)h(function)g(calls\),)h(b)o(ut)f(in)g(this)g +(case,)f(the)g(P2V)h(pre-processor)e(\(described)75 2583 +y(in)j(Section)e(3\))i(needs)d(some)i(hints)g(about)f(the)h(properties) +g(that)h(are)f(changed)e(by)i(the)g(statement)f(in)i(order)f(to)h +(correctly)f(cate)o(gorize)g(each)75 2633 y(property)n(.)13 +b(F)o(or)d(simplicity)n(,)f(in)h(this)f(paper)o(,)f(we)h(assume)e(all)j +(actions)e(consist)h(of)g(assignment)e(statements.)964 +2793 y FG(6)p eop +%%Page: 7 7 +7 6 bop 75 14 a FG(A)11 b FB(test)g FG(is)g(needed)g(to)g(determine)g +(if)g(the)g(transformations)f(of)h(the)g(T)l(-rule)g(are)h(in)e(fact)h +(applicable.)137 77 y(Purely)h(as)g(an)g(optimization,)e(it)h(is)g +(usually)f(the)i(case)g(that)f(not)g(all)h(statements)e(in)i(a)g(T)l +(-rule')m(s)f(actions)g(need)75 139 y(to)k(be)h(e)o(x)o(ecuted)h(prior) +e(to)h(a)g(T)l(-rule')m(s)g(test.)30 b(F)o(or)16 b(this)f(reason,)i +(the)f(actions)f(of)h(a)g(T)l(-rule)f(are)i(split)d(into)h(two)75 +201 y(groups;)j(those)d(that)h(need)g(to)g(be)h(e)o(x)o(ecuted)f(prior) +g(to)g(the)g(T)l(-rule')m(s)h(test,)g(and)f(those)g(that)g(can)g(be)h +(e)o(x)o(ecuted)75 263 y(after)12 b(a)g(successful)e(test.)16 +b(These)c(groups)e(of)h(statements)g(comprise,)g(respecti)o(v)o(ely)m +(,)g(the)g FB(pr)n(e-test)h FG(and)f FB(post-test)75 +325 y FG(statements)f(of)h(the)g(T)l(-rule.)515 308 y +Ft(4)137 387 y FG(W)l(e)j(no)o(w)f(de\256ne)g(the)g(actions)g(and)g +(tests)f(of)h(a)h(T)l(-rule)f(more)h(precisely)m(.)22 +b(Let)13 b Fw(O)1429 394 y Fv(i)1456 387 y FG(be)g(an)h(abstract)f +(operator)75 449 y(of)i Fw(E)165 433 y Fd(0)175 449 y +FG(,)h(and)f(let)f Fl(O)382 456 y Fk(i)410 449 y FG(be)h(its)f +(descriptor)m(.)26 b(Similarly)m(,)15 b(let)f Fw(I)1016 +456 y Fv(i)1045 449 y FG(be)h(an)f(abstract)g(operator)g(of)h +Fw(E)i FG(and)d(let)g Fl(I)1746 456 y Fk(i)1774 449 y +FG(be)h(its)75 511 y(descriptor)m(.)29 b(\()p Fw(I)330 +518 y Fv(i)360 511 y FG(is)15 b(an)g(operator)h(that)e(is)h(input)g(to) +g(the)g(rule)g(and)g Fw(O)1195 518 y Fv(i)1225 511 y +FG(is)g(an)g(operator)h(that)e(is)h(output)f(by)h(the)75 +573 y(rule\).)24 b(Let)14 b Fw(M)315 580 y Fv(i)343 573 +y FG(denote)f(the)g Fw(i)p FG(th)g(descriptor)g(property)m(.)23 +b(Thus,)14 b Fl(O)1150 580 y Fk(i)1164 573 y Fw(:M)1221 +580 y Fv(j)1253 573 y FG(is)f(the)g(v)o(alue)g(of)h(the)g +Fw(j)s FG(th)e(property)h(of)75 635 y(descriptor)d Fl(O)307 +642 y Fk(i)321 635 y FG(.)18 b(The)11 b(left-hand)g(side)f(of)i(an)f +(assignment)g(refers)h(to)f(an)g(output)f(descriptor)g(\()p +Fl(O)1604 642 y Fk(i)1618 635 y FG(\))i(or)f(a)h(member)75 +698 y(of)g(an)f(output)f(descriptor)h(\()p Fl(O)555 705 +y Fk(i)569 698 y Fw(:M)626 705 y Fv(j)644 698 y FG(\).)18 +b(The)11 b(right-hand)g(side)g(is)g(an)g(e)o(xpression)g(or)h(a)g +(helper)f(function)f(call)i(that)75 760 y(only)e(references)i(input)e +(descriptors)g(and/or)g(their)h(members.)17 b(Here)12 +b(are)g(a)g(fe)o(w)f(e)o(xamples:)181 850 y Fl(O)220 +857 y Fk(i)275 850 y Fj(=)42 b Fl(I)372 857 y Fk(k)407 +850 y Fj(;)416 b Fw(==)10 b FG(copy)h(descriptor)f Fl(I)1205 +857 y Fk(k)1240 850 y FG(to)g Fl(O)1325 857 y Fk(i)106 +912 y Fl(O)145 919 y Fk(i)159 912 y Fw(:M)216 919 y Fv(j)275 +912 y Fj(=)42 b Fl(I)372 919 y Fk(k)396 912 y Fw(:M)453 +919 y Fv(j)481 912 y Fj(+)10 b(4)h(;)263 b Fw(==)10 b +FG(e)o(xpression)h(de\256ning)f Fl(O)1297 919 y Fk(i)1311 +912 y Fw(:M)1368 919 y Fv(j)96 975 y Fl(O)135 982 y Fk(3)157 +975 y Fw(:M)214 982 y Ft(5)275 975 y Fj(=)42 b FG(helper)11 +b Fj(\()p Fl(I)515 982 y Fk(1)537 975 y Fw(:M)594 982 +y Ft(5)614 975 y Fw(;)d Fl(I)655 982 y Fk(2)676 975 y +Fw(:M)733 982 y Ft(5)752 975 y Fj(\))j(;)42 b Fw(==)10 +b FG(helper)h(function)f(that)h(computes)f Fl(O)1484 +982 y Fk(3)1507 975 y Fw(:M)1564 982 y Ft(5)836 1037 +y Fw(==)g FG(from)i(inputs)e Fl(I)1135 1044 y Fk(1)1157 +1037 y Fw(:M)1214 1044 y Ft(5)1245 1037 y FG(and)h Fl(I)1342 +1044 y Fk(2)1364 1037 y Fw(:M)1421 1044 y Ft(5)1440 1037 +y FG(.)137 1123 y(The)g(test)g(for)g(a)h(T)l(-rule')m(s)f +(applicability)d(is)j(a)h(boolean)e(e)o(xpression)g(and)h(normally)g +(in)n(v)o(olv)o(es)f(checks)h(on)f(the)75 1185 y(v)o(alues)g(of)i +(output)d(descriptors)h(\(e.g.,)i Fl(O)731 1192 y Fk(3)754 +1185 y Fw(:M)811 1192 y Ft(5)843 1185 y Fw(>)h Fj(6)p +FG(\);)e(occasionally)m(,)f(helper)h(functions)f(may)h(be)g(needed.)137 +1247 y(Again,)i(it)f(is)h(important)f(to)g(remember)j(that)d(the)h +(pre-test)f(actions)g(are)i(carried)f(out)f(prior)h(to)f(the)h(test;)f +(the)75 1310 y(post-test)c(actions)h(are)h(performed)h(only)e(if)h(a)g +(T)l(-rule')m(s)g(test)f(e)o(v)o(aluates)g(to)g(TR)n(UE,)h(and)g(all)g +(post-test)e(actions)g(are)75 1372 y(performed)14 b(immediately)m(,)g +(with)e(no)h(intermediate)g(optimization)e(of)i(an)o(y)h(descendant)e +(nodes)h(of)g(the)g(root)g(of)75 1434 y Fw(E)s FG(.)137 +1496 y(Note)h(that)g(there)h(are)g(no)f(actions)g(that)f(are)j(carried) +e(out)g FB(after)h FG(the)f(essential)f(parameters)i(of)g(the)f(root)g +(of)75 1558 y Fw(E)h FG(are)f(optimized.)20 b(This)12 +b(is)h(because)f(a)i(T)l(-rule)e(only)g(logically)f(transforms)i(a)g +(conceptual)f(tree)h(into)f(another)75 1620 y(conceptual)e(tree.)75 +1732 y(E)p Fn(XAMPLE)j FG(4.)79 b(The)14 b(associati)o(vity)c(of)k +(JOINs)e(is)h(e)o(xpressed)g(by)g(T)l(-rule)g(\(2\))g(in)g(Figure)g +(3\(a\).)24 b(It)13 b(re)o(writes)g(a)75 1794 y(two-way)e(join)i(into)f +(an)h(equi)o(v)o(alent)e(operator)i(tree.)23 b(The)13 +b(\(single\))f(pre-test)h(statement)g(computes)f(the)h(list)f(of)75 +1856 y(attrib)o(utes)h(of)i(the)f(ne)o(w)h(JOIN)f(node)h(on)f(the)g +(right)g(side.)27 b(The)14 b(test)g(of)h(the)g(T)l(-rule)f(consists)f +(of)i(a)g(call)f(to)g(the)75 1918 y(helper)f(function)g(\252is)p +422 1918 14 2 v 15 w(associati)o(v)o(e\272,)h(which)f(returns)g(TR)n +(UE)g(or)h(F)m(ALSE)f(depending)f(on)h(whether)g(the)h(T)l(-rule)75 +1980 y(is)j(applicable.)36 b(If)18 b(it)g(is)f(not,)i(then)f(the)f +(rule)h(is)f(rejected)h(\(e.g.,)j(because)d(it)f(generates)h(a)g +(cross-product\),)75 2042 y(otherwise)d(the)h(post-test)f(statements)g +(are)i(e)o(x)o(ecuted.)32 b(The)16 b(post-test)e(statements)i(compute)g +(v)o(arious)f(other)75 2105 y(annotations)f(of)i(the)g(ne)o(w)h(nodes)e +(that)h(are)h(generated)f(by)g(applying)e(the)j(T)l(-rule.)31 +b(Note)16 b(the)g(use)g(of)g(helper)75 2167 y(functions)10 +b(\252cardinality\272)g(and)h(\252union\272)f(to)h(compute)g +(descriptor)f(properties.)137 2229 y(Consider)g(three)g(relations)f +Fw(R)615 2236 y Ft(1)634 2229 y FG(,)i Fw(R)691 2236 +y Ft(2)721 2229 y FG(and)f Fw(R)832 2236 y Ft(3)851 2229 +y FG(,)h(and)f(let)g Fw(a)1029 2236 y Fv(i)1043 2229 +y FG(,)h Fw(b)1085 2236 y Fv(i)1109 2229 y FG(and)f Fw(c)1205 +2236 y Fv(i)1229 2229 y FG(be)g(their)g(respecti)o(v)o(e)g(sets)f(of)h +(attrib)o(utes.)75 2291 y(Figures)i(3\(b\))f(and)h(3\(c\))h(sho)o(w)m +(,)e(respecti)o(v)o(ely)m(,)h(e)o(xamples)g(of)g(the)f(applicability)f +(and)i(non-applicability)c(of)k(the)75 2353 y(join)e(associati)o(vity)f +(T)l(-rule.)1324 b Fm(\003)p 75 2427 720 2 v 125 2454 +a Fs(4)142 2470 y Fz(W)m(e)10 b(suspect)e(it)i(is)g(possible)f(to)h +(use)e(data-\257o)o(w)h(analysis)g(to)g(partition)i(the)e(assignment)f +(statements)h(automatically)n(,)g(b)o(ut)h(for)h(no)o(w)n(,)75 +2520 y(we)e(let)h(the)f(rule-writer)i(do)d(the)h(partitioning.)964 +2793 y FG(7)p eop +%%Page: 8 8 +8 7 bop 75 12 1796 2 v 75 1134 2 1122 v 123 52 a Fz(JOIN)p +Fi(\()p Fz(JOIN)p Fi(\()p Fp(S)338 56 y Fs(1)356 52 y +Fp(;)6 b(S)396 56 y Fs(2)413 52 y Fi(\))11 b(:)f Fg(D)494 +56 y Ff(4)514 52 y Fp(;)c(S)554 56 y Fs(3)571 52 y Fi(\))11 +b(:)f Fg(D)652 56 y Ff(5)682 52 y Fi(=)-6 b Fe(\))11 +b Fz(JOIN)p Fi(\()p Fp(S)874 56 y Fs(1)891 52 y Fp(;)6 +b Fz(JOIN)p Fi(\()p Fp(S)1027 56 y Fs(2)1045 52 y Fp(;)g(S)1085 +56 y Fs(3)1103 52 y Fi(\))k(:)h Fg(D)1184 56 y Ff(6)1203 +52 y Fi(\))g(:)f Fg(D)1284 56 y Ff(7)1790 52 y Fz(\(2\))123 +103 y Fe(ff)232 153 y Fg(D)266 157 y Ff(6)285 153 y Fp(:)p +Fz(attrib)o(utes)h Fi(=)g Fz(union)d Fi(\()p Fg(D)629 +157 y Ff(2)648 153 y Fp(:)p Fz(attrib)o(utes)p Fp(;)e +Fg(D)848 157 y Ff(3)867 153 y Fp(:)p Fz(attrib)o(utes)p +Fi(\))k(;)123 203 y Fe(gg)123 253 y Fz(is)p 150 253 12 +2 v 14 w(associati)o(v)o(e)d Fi(\()p Fg(D)382 257 y Ff(6)402 +253 y Fp(:)p Fz(join)p 473 253 V 13 w(predicate)o Fp(;)f +Fg(D)672 257 y Ff(6)691 253 y Fp(:)p Fz(attrib)o(utes)p +Fp(;)g Fg(D)891 257 y Ff(5)910 253 y Fp(:)p Fz(join)p +981 253 V 13 w(predicate)o Fi(\))123 304 y Fe(ff)232 +354 y Fg(D)266 358 y Ff(7)296 354 y Fi(=)11 b Fg(D)371 +358 y Ff(5)399 354 y Fi(;)232 404 y Fg(D)266 408 y Ff(7)285 +404 y Fp(:)p Fz(join)p 356 404 V 14 w(predicate)e Fi(=)i +Fg(D)590 408 y Ff(4)609 404 y Fp(:)p Fz(join)p 680 404 +V 13 w(predicate)d Fi(;)232 454 y Fg(D)266 458 y Ff(6)285 +454 y Fp(:)p Fz(tuple)p 373 454 V 13 w(size)i Fi(=)h +Fg(D)528 458 y Ff(2)547 454 y Fp(:)p Fz(tuple)p 635 454 +V 13 w(size)c Fi(+)i Fg(D)785 458 y Ff(3)804 454 y Fp(:)p +Fz(tuple)p 892 454 V 13 w(size)f Fi(;)232 504 y Fg(D)266 +508 y Ff(6)285 504 y Fp(:)p Fz(num)p 365 504 V 13 w(records)i +Fi(=)g Fz(cardinality)f Fi(\()p Fg(D)755 508 y Ff(2)774 +504 y Fp(;)d Fg(D)825 508 y Ff(3)845 504 y Fi(\))j(;)123 +555 y Fe(gg)764 631 y Fz(\(a\))g(Join)g(Associati)o(vity)g(T)m(-rule)p +100 682 1745 2 v 319 734 a + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 319 734 a Fo(JOIN)192 733 +y Fv(b)207 738 y Fs(2)234 733 y Ft(=)i Fv(c)287 738 y +Fs(1)248 805 y + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 248 805 a Fo(JOIN)120 804 y Fv(a)139 809 +y Fs(1)166 804 y Ft(=)f Fv(b)218 809 y Fs(1)181 876 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + +181 876 a Fo(RET)323 876 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 323 876 a Fo(RET)394 806 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + +394 806 a Fo(RET)191 945 y + tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 191 945 a Fv(R)218 950 y Fs(1)333 +945 y + tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 333 945 a Fv(R)360 950 y Fs(2)404 874 y + tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 404 874 +a Fv(R)431 879 y Fs(3)213 936 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 + 213 936 a 213 936 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 + 213 +936 a 213 936 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 + 213 936 a 213 936 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 + 213 936 a 213 936 +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 + 213 936 a 213 936 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 + 213 936 a 213 936 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 + 213 936 a 497 +836 a Ft(=)-6 b Fd(\))679 734 y + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 679 734 a Fo(JOIN)763 +733 y Fv(a)782 738 y Fs(1)809 733 y Ft(=)10 b Fv(b)861 +738 y Fs(1)750 805 y + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 750 805 a Fo(JOIN)836 804 y Fv(b)851 +809 y Fs(2)878 804 y Ft(=)g Fv(c)930 809 y Fs(1)613 806 +y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 613 806 a Fo(RET)683 876 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 683 876 a Fo(RET)825 876 +y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 825 876 a Fo(RET)622 874 y + tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 622 874 a Fv(R)649 879 y +Fs(1)693 945 y + tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 693 945 a Fv(R)720 950 y Fs(2)835 945 +y + tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 835 945 a Fv(R)862 950 y Fs(3)644 936 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 + 644 936 a 644 +936 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 + 644 936 a 644 936 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 + 644 936 a 644 936 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 + 644 936 +a 644 936 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 + 644 936 a 644 936 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 + 644 936 a 644 936 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 + 644 +936 a 142 1021 a Fz(\(b\))j(Example)d(of)j(the)e(associati)o(vity)g +(rule)h(applied)f(to)h(an)142 1072 y(operator)d(tree)p +951 1121 2 440 v 1191 734 a + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 1191 734 a Fo(JOIN)1063 729 +y Fv(a)1082 734 y Fs(2)1109 729 y Ft(=)h Fv(c)1161 734 +y Fs(1)1121 805 y + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 1121 805 a Fo(JOIN)993 804 y Fv(a)1012 +809 y Fs(1)1038 804 y Ft(=)h Fv(b)1091 809 y Fs(1)1054 +876 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 1054 876 a Fo(RET)1196 876 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 1196 876 a Fo(RET)1267 +806 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 1267 806 a Fo(RET)1064 945 y + tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1064 945 a Fv(R)1091 +950 y Fs(1)1206 945 y + tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1206 945 a Fv(R)1233 950 y Fs(2)1276 +874 y + tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1276 874 a Fv(R)1303 879 y Fs(3)1086 936 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 + 1086 +936 a 1086 936 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 + 1086 936 a 1086 936 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 + 1086 936 a 1086 +936 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 + 1086 936 a 1086 936 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 + 1086 936 a 1086 936 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 + 1086 +936 a 1086 936 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 + 1086 936 a 1370 836 a Ft(=)-6 b Fd(\))1390 +838 y Fv(=)1552 734 y + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr1r2r3 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 1552 734 a Fo(JOIN)1623 805 y + tx@Dict begin tx@NodeDict begin { } /TheNodejoinr2r3 16 { .5 5.384 +0.09999 false .5 17.328 InitRnode } NewNode end end + 1623 +805 a Fo(JOIN)1485 806 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr1 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 1485 806 a Fo(RET)1556 876 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr2 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + +1556 876 a Fo(RET)1698 876 y + tx@Dict begin tx@NodeDict begin { } /TheNoderetr3 16 { .5 5.384 0.0 +false .5 15.112 InitRnode } NewNode end end + 1698 876 a Fo(RET)1495 874 +y + tx@Dict begin tx@NodeDict begin { } /TheNoder1 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1495 874 a Fv(R)1522 879 y Fs(1)1566 945 y + tx@Dict begin tx@NodeDict begin { } /TheNoder2 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1566 945 +a Fv(R)1593 950 y Fs(2)1707 945 y + tx@Dict begin tx@NodeDict begin { } /TheNoder3 16 { .5 5.46666 1.1111 +false .5 10.56842 InitRnode } NewNode end end + 1707 945 a Fv(R)1734 +950 y Fs(3)1517 936 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 + 1517 936 a 1517 936 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 + 1517 936 +a 1517 936 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 + 1517 936 a 1517 936 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 + 1517 936 a 1517 936 +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 + 1517 936 a 1517 936 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 + 1517 936 a 1517 936 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 + 1517 936 +a 1015 1021 a Fz(\(c\))11 b(Example)f(of)i(an)e(operator)h(tree)g +(where)f(the)h(associa-)1015 1072 y(ti)o(vity)f(rule)g(does)d(not)j +(apply)p 1868 1134 2 1122 v 75 1136 1796 2 v 1869 1144 +10 1126 v 83 1144 1796 10 v 727 1247 a FG(Figure)i(3:)j(Join)10 +b(associati)o(vity)p 85 1392 1773 2 v 85 1806 2 414 v +122 1432 a Fp(E)r Fi(\()p Fp(x)189 1436 y Fs(1)206 1432 +y Fp(;)c(:)g(:)g(:)g(;)g(x)313 1436 y Fh(n)334 1432 y +Fi(\))11 b(:)f Fg(D)415 1436 y Ff(1)445 1432 y Fi(=)-6 +b Fe(\))11 b Fp(A)p Fi(\()p Fp(x)584 1436 y Fs(1)600 +1432 y Fp(;)6 b(:)h(:)f(:)g(;)g(x)708 1436 y Fh(n)729 +1432 y Fi(\))k(:)h Fg(D)810 1436 y Ff(2)1788 1432 y Fz(\(3\))122 +1482 y(test)122 1533 y Fe(ff)230 1583 y Fz(pre-opt)f(statements)122 +1633 y Fe(gg)122 1683 y(ff)230 1734 y Fz(post-opt)f(statements)122 +1784 y Fe(gg)p 1855 1806 V 85 1808 1773 2 v 1856 1816 +10 418 v 93 1816 1773 10 v 654 1919 a FG(Figure)i(4:)16 +b(General)11 b(form)h(of)f(an)h(I-rule)75 2099 y Fy(2.4)50 +b(Implementation)12 b(rules)75 2192 y FG(Implementation)d(rules,)i(or)f +(I-rules)g(for)h(short,)f(de\256ne)g(equi)o(v)o(alences)f(between)h(e)o +(xpressions)f(and)h(their)g(imple-)75 2254 y(menting)f(algorithms.)15 +b(Let)10 b Fw(E)i FG(be)e(an)g(e)o(xpression)f(and)h +Fw(A)g FG(be)g(an)g(algorithm)f(that)h(implements)f Fw(E)s +FG(.)15 b(The)10 b(general)75 2316 y(form)i(of)f(an)g(I-rule)h(is)e(gi) +o(v)o(en)h(by)g(Equation)e(\(3\))i(\(sho)o(wn)f(in)h(Figure)g(4\).)137 +2378 y(The)f(actions)e(associated)h(with)f(an)i(I-rule)f(are)i +(de\256ned)e(in)g(three)h(parts.)15 b(The)10 b(\256rst)f(part,)h(or)g +FB(test)p FG(,)f(is)g(a)h(boolean)75 2440 y(e)o(xpression)g(whose)h(v)o +(alue)f(determines)h(whether)g(or)g(not)g(the)f(rule)h(can)h(be)f +(applied.)137 2503 y(The)17 b(second)g(part,)i(or)e FB(pr)n(e-opt)f +(statements)p FG(,)h(is)g(a)g(set)g(of)g(descriptor)f(assignment)g +(statements)g(that)h(are)75 2565 y(e)o(x)o(ecuted)f(only)f(if)h(the)g +(test)f(is)g(true)h(and)g FB(befor)n(e)g FG(an)o(y)g(of)g(the)f(inputs) +g Fw(x)1249 2572 y Fv(i)1279 2565 y FG(of)h Fw(E)i FG(are)f(optimized.) +30 b(Additional)75 2627 y(parameters)12 b(of)f(nodes)g(are)h(usually)d +(assigned)h(in)h(the)g(pre-opt)g(section.)16 b(This)10 +b(is)h(necessary)g(before)h(an)o(y)f(of)g(the)964 2793 +y(8)p eop +%%Page: 9 9 +9 8 bop 85 12 1773 2 v 85 426 2 414 v 122 52 a Fz(SOR)n(T)o +Fi(\()p Fp(S)253 56 y Fs(1)270 52 y Fi(\))11 b(:)f Fg(D)351 +56 y Ff(2)381 52 y Fi(=)-6 b Fe(\))11 b Fz(Mer)o(ge)p +553 52 12 2 v 13 w(sort)p Fi(\()p Fp(S)658 56 y Fs(1)676 +52 y Fi(\))f(:)h Fg(D)757 56 y Ff(3)1788 52 y Fz(\(4\))122 +103 y Fi(\()p Fg(D)171 107 y Ff(2)190 103 y Fp(:)p Fz(tuple)p +278 103 V 13 w(order)e Fi(!)t(=)h Fz(DONT)p 538 103 V +14 w(CARE)o Fi(\))122 153 y Fe(ff)230 203 y Fg(D)264 +207 y Ff(3)294 203 y Fi(=)h Fg(D)369 207 y Ff(2)397 203 +y Fi(;)122 253 y Fe(gg)122 304 y(ff)230 354 y Fg(D)264 +358 y Ff(3)284 354 y Fp(:)p Fz(cost)e Fi(=)i Fg(D)440 +358 y Ff(1)459 354 y Fp(:)p Fz(cost)c Fi(+)i(\()p Fg(D)626 +358 y Ff(3)645 354 y Fp(:)p Fz(num)p 725 354 V 12 w(records)o +Fi(\))g Fe(\003)g Fi(log)q(\()p Fg(D)995 358 y Ff(3)1014 +354 y Fp(:)p Fz(num)p 1094 354 V 13 w(records)o Fi(\))g(;)122 +404 y Fe(gg)p 1855 426 2 414 v 85 428 1773 2 v 1856 436 +10 418 v 93 436 1773 10 v 650 539 a FG(Figure)i(5:)16 +b(Mer)o(ge-sort)11 b(sort)g(algorithm)75 719 y(nodes)f(on)h(the)g +(right)f(side)h(can)g(be)h(optimized.)137 782 y(The)19 +b(third)f(part,)i(or)f FB(post-opt)e(statements)p FG(,)i(is)f(a)h(set)g +(of)g(descriptor)e(assignment)h(statements)f(that)i(are)75 +844 y(e)o(x)o(ecuted)f FB(after)f FG(all)g Fw(x)446 851 +y Fv(i)477 844 y FG(are)h(optimized.)34 b(Normally)m(,)19 +b(the)e(post-opt)e(statements)i(compute)g(cost)f(properties)75 +906 y(that)f(can)g(only)g(be)g(determined)g(once)g(the)g(inputs)f(to)h +(the)g(algorithm)f(are)i(completely)e(optimized)h(and)g(their)75 +968 y(costs)e(kno)o(wn.)25 b(This)14 b FB(does)g(not)p +FG(,)g(ho)o(we)o(v)o(er)n(,)i(imply)e(a)g(bottom-up)f(optimization)g +(strate)o(gy)m(.)25 b(It)15 b(simply)e(means)75 1030 +y(that)f(although)g(I-rules)g(are)i(applied)e(to)g(parents)h(before)g +(their)f(children)g(are)i(optimized,)f(the)g FB(cost)g +FG(\(and)g(other)75 1092 y(properties)h(in)g(the)h(post-opt)e +(section\))h(of)h(the)g(parent)f(cannot)g(be)h(computed)g(until)e(the)i +(children)f(ha)o(v)o(e)h(been)75 1154 y(optimized.)75 +1266 y(E)p Fn(XAMPLE)e FG(5.)78 b(Equation)11 b(\(4\))h(\(in)g(Figure)g +(5\))g(sho)o(ws)e(the)i(I-rule)g(that)g(implements)f(the)h(SOR)m(T)h +(operator)f(by)75 1328 y(Mer)o(ge)p 195 1328 14 2 v 17 +w(sort.)21 b(I-rule)13 b(\(4\))g(re)o(writes)f(a)i(stream)f(such)f +(that)g(it)h(is)f(sorted)g(using)g(the)g(Mer)o(ge)p 1499 +1328 V 18 w(sort)g(algorithm.)20 b(The)75 1390 y(test)14 +b(for)h(this)f(I-rule)h(is)g(that)f(the)h(tuple)f(order)h(of)g(the)g +(sorted)f(stream)h(must)g(not)f(be)h(a)g(DONT)p 1621 +1390 V 16 w(CARE)g(order)m(.)75 1452 y(The)g(pre-opt)g(section)f +(consists)g(of)h(the)g(default)f(statement)h(that)g(copies)f(the)h +(descriptor)g(from)h(the)f(left)g(side)75 1515 y(to)g(the)f(e)o +(xpression)g(on)h(the)g(right.)27 b(The)15 b(post-opt)e(section)h +(consists)g(of)h(a)g(cost-assigning)d(statement)j(to)f(the)75 +1577 y(Mer)o(ge)p 195 1577 V 17 w(sort)d(node.)1451 b +Fm(\003)75 1722 y FG(E)p Fn(XAMPLE)13 b FG(6.)74 b(Equation)7 +b(\(5\))i(\(sho)o(wn)e(in)h(Figure)g(6\))h(is)e(the)i(I-rule)f(that)g +(selects)f(the)i(Nested)p 1579 1722 V 15 w(loops)e(algorithm)75 +1784 y(to)12 b(implement)g(the)h(JOIN)f(operator)m(.)20 +b(The)13 b(test)f(for)g(this)g(rule)g(is)g(TR)n(UE)h(since)f(Nested)p +1486 1784 V 16 w(loops)f(can)i(be)f(applied)75 1846 y(re)o(gardless)k +(of)h(an)o(y)h(property)e(v)o(alues.)33 b(The)17 b(pre-opt)f(section)g +(consists)f(of)i(three)g(assignment)f(statements.)75 +1908 y(The)11 b(\256rst)h(statement)e(sets)h(the)g(descriptor)g(of)g +(Nested)p 945 1908 V 16 w(loops)f(to)h(that)f(of)i(the)f(JOIN.)g(The)h +(ne)o(xt)f(two)f(statements)75 1970 y(e)o(xpress)i(the)f(fact)h(that)f +(the)g(tuple)g(order)h(of)g(Nested)p 908 1970 V 15 w(loops)f(is)g(the)h +(same)g(as)g(the)f(tuple)g(order)h(of)g(its)f(left)g(\(outer\))75 +2032 y(input;)h(all)g(other)g(properties)g(remain)h(the)f(same.)21 +b(The)13 b(third)f(statement)g(in)g(the)g(pre-opt)g(section)g(ensures)g +(that)75 2094 y(this)e(requirement)h(is)g(met)g(by)g(setting)f(the)h +(tuple)p 856 2094 V 15 w(order)g(of)g Fw(S)1052 2101 +y Ft(1)1083 2094 y FG(on)g(the)g(right)f(side.)1389 2078 +y Ft(5)p 75 2135 720 2 v 125 2162 a Fs(5)142 2178 y Fz(Actually)n(,)17 +b(it)f(is)f(not)g(enough)f(to)h(simply)g(set)g(the)g(desired)g(tuple)g +(order)g(of)g Fp(S)1216 2182 y Fs(1)1234 2178 y Fz(;)k(it)d(is)f(also)g +(necessary)e(to)i(ensure)f(that)h Fr(after)75 2228 y +Fz(optimization,)e Fp(S)309 2232 y Fs(1)339 2228 y Fz(does)d(indeed)h +(ha)o(v)o(e)g(the)h(required)f(property)n(.)21 b(One)12 +b(way)f(to)h(satisfy)f(this)h(is)g(to)g(insert)h(a)e(SOR)n(T)g(node)g +(in)h(front)h(of)75 2278 y Fp(S)98 2282 y Fs(1)126 2278 +y Fz(that)d(can)g(meet)g(the)g(sortedness)e(requirement)i(of)g +Fp(S)815 2282 y Fs(1)833 2278 y Fz(.)17 b(Thus,)9 b(in)i(this)f(case,)f +(we)h(would)g(need)e(a)i(T)m(-rule)h(\(which)f(introduces)f(a)h(ne)o(w) +75 2328 y(operator)f(JOPR\),)75 2412 y(JOIN)p Fi(\()p +Fp(S)194 2416 y Fs(1)212 2412 y Fp(;)d(S)252 2416 y Fs(2)269 +2412 y Fi(\))11 b(:)f Fg(D)350 2416 y Ff(3)380 2412 y +Fi(=)-6 b Fe(\))11 b Fz(JOPR)o Fi(\()p Fz(SOR)n(T)o Fi(\()p +Fp(S)686 2416 y Fs(1)704 2412 y Fi(\))f(:)h Fg(D)785 +2416 y Ff(4)804 2412 y Fp(;)6 b Fz(SOR)n(T)o Fi(\()p +Fp(S)952 2416 y Fs(2)970 2412 y Fi(\))11 b(:)f Fg(D)1051 +2416 y Ff(5)1070 2412 y Fi(\))h(:)f Fg(D)1151 2416 y +Ff(6)1170 2412 y Fp(;)75 2495 y Fz(and)e(an)h(I-rule,)75 +2579 y(JOPR)o Fi(\()p Fp(S)200 2583 y Fs(1)218 2579 y +Fp(;)d(S)258 2583 y Fs(2)276 2579 y Fi(\))k(:)h Fg(D)357 +2583 y Ff(3)387 2579 y Fi(=)-6 b Fe(\))10 b Fz(Nested)p +566 2579 12 2 v 12 w(loops)o Fi(\()p Fp(S)695 2583 y +Fs(1)724 2579 y Fi(:)g Fg(D)779 2583 y Ff(4)798 2579 +y Fp(;)c(S)838 2583 y Fs(2)856 2579 y Fi(\))11 b(:)f +Fg(D)937 2583 y Ff(5)956 2579 y Fp(:)75 2662 y Fz(In)f(our)h +(discussions,)c(this)k(additional)f(le)o(v)o(el)g(of)h(detail)f(will)h +(be)f(ignored)f(for)i(the)f(sake)f(of)h(simplicity)n(.)964 +2793 y FG(9)p eop +%%Page: 10 10 +10 9 bop 85 12 1773 2 v 85 526 2 515 v 122 52 a Fz(JOIN)o +Fi(\()p Fp(S)240 56 y Fs(1)258 52 y Fp(;)6 b(S)298 56 +y Fs(2)316 52 y Fi(\))11 b(:)f Fg(D)397 56 y Ff(3)427 +52 y Fi(=)-6 b Fe(\))10 b Fz(Nested)p 606 52 12 2 v 13 +w(loops)n Fi(\()p Fp(S)735 56 y Fs(1)764 52 y Fi(:)g +Fg(D)819 56 y Ff(4)838 52 y Fp(;)c(S)878 56 y Fs(2)896 +52 y Fi(\))11 b(:)f Fg(D)977 56 y Ff(5)1788 52 y Fz(\(5\))122 +103 y(TR)o(UE)122 153 y Fe(ff)230 203 y Fg(D)264 207 +y Ff(5)294 203 y Fi(=)h Fg(D)369 207 y Ff(3)397 203 y +Fi(;)230 253 y Fg(D)264 257 y Ff(4)294 253 y Fi(=)g Fg(D)369 +257 y Ff(1)397 253 y Fi(;)230 304 y Fg(D)264 308 y Ff(4)284 +304 y Fp(:)p Fz(tuple)p 372 304 V 13 w(order)f Fi(=)h +Fg(D)547 308 y Ff(3)566 304 y Fp(:)p Fz(tuple)p 654 304 +V 13 w(order)e Fi(;)122 354 y Fe(gg)122 404 y(ff)230 +454 y Fg(D)264 458 y Ff(5)284 454 y Fp(:)p Fz(cost)g +Fi(=)i Fg(D)440 458 y Ff(4)459 454 y Fp(:)p Fz(cost)c +Fi(+)i(\()p Fg(D)626 458 y Ff(4)645 454 y Fp(:)p Fz(num)p +725 454 V 12 w(records)o Fi(\))g Fe(\003)g Fg(D)931 458 +y Ff(2)950 454 y Fp(:)p Fz(cost)f Fi(;)122 504 y Fe(gg)p +1855 526 2 515 v 85 528 1773 2 v 1856 536 10 518 v 93 +536 1773 10 v 631 640 a FG(Figure)j(6:)16 b(Nested)10 +b(loops)g(join)g(algorithm)137 820 y(The)i(post-opt)e(section)h(is)h(e) +o(x)o(ecuted)g(after)g Fw(S)860 827 y Ft(1)892 820 y +FG(and)g Fw(S)998 827 y Ft(2)1030 820 y FG(are)g(optimized;)f(it)h +(consists)e(of)i(a)g(single)f(statement)75 882 y(that)d(assigns)f(the)i +(cost)f(of)h(the)f(Nested)p 680 882 14 2 v 16 w(loops)f(node.)16 +b(The)8 b(cost)g(is)h(indicati)o(v)o(e)e(of)i(the)f(fact)h(that)f(in)g +(this)g(algorithm,)75 944 y(each)k(tuple)e(of)h(the)g(stream)h +Fw(S)549 951 y Ft(1)580 944 y FG(in)n(v)o(olv)o(es)e(scanning)f(the)i +(entire)g(stream)h Fw(S)1257 951 y Ft(2)1276 944 y FG(;)f +Fw(S)1328 951 y Ft(1)1359 944 y FG(is)g(scanned)g(only)f(once.)92 +b Fm(\003)75 1108 y Fy(2.5)50 b(Null)12 b(algorithm)75 +1201 y FG(Recall)e(that,)g(in)g(Section)f(1,)i(we)f(mentioned)f(that)g +(Prairie)h(allo)o(ws)f(users)h(to)f(treat)h(all)g(operators)f(and)h +(algorithms)75 1263 y(as)f(\256rst-class)f(objects,)h(i.e.,)h(all)f +(operators)f(and)g(algorithms)g(are)h(e)o(xplicit,)g(in)f(contrast)g +(to)g(enforcers)i(in)e(V)-6 b(olcano)75 1325 y(or)13 +b(glue)f(in)g(Starb)o(urst.)21 b(This)12 b(requires)g(that)g(Prairie)h +(pro)o(vide)f(a)i(mechanism)f(where)g(users)f(can)h(also)f +(\252delete\272)75 1387 y(one)i(or)g(more)h(of)f(the)g(e)o(xplicit)f +(operators)g(from)i(e)o(xpressions.)23 b(This)14 b(is)f(done)h(by)f(ha) +o(ving)h(a)g(special)g(class)f(of)75 1449 y(I-rules)f(that)g(ha)o(v)o +(e)h(the)f(form)g(gi)o(v)o(en)g(by)g(Equation)f(\(6\))h(in)g(Figure)g +(7\(a\).)20 b(The)13 b(left)f(side)f(of)i(the)f(rule)g(is)g(a)g(single) +75 1511 y(abstract)k(operator)g Fw(O)i FG(with)d(one)h(stream)h(input)e +Fw(S)909 1518 y Ft(1)929 1511 y FG(.)33 b(The)16 b(right)g(side)f(of)i +(the)f(rule)g(is)g(an)h(algorithm)e(called)75 1573 y(\252Null\272)e +(with)f(the)h(same)h(stream)f(input)f(b)o(ut)h(with)f(a)h(dif)o(ferent) +g(descriptor)m(.)22 b(As)13 b(the)g(name)h(suggests,)e(the)h(Null)75 +1635 y(algorithm)d(is)g(supposed)g(to)g(pass)g(its)h(input)e(unchanged) +h(to)h(algorithms)e(abo)o(v)o(e)i(it)g(in)f(an)h(operator)g(tree.)17 +b(This)10 b(is)75 1697 y(accomplished)g(in)h(the)g(I-rule)g(as)g(follo) +o(ws.)137 1759 y(The)h(test)g(for)g(this)f(I-rule)h(is)g(always)e(TR)n +(UE,)j(i.e.,)g(an)o(y)f(node)g(in)g(an)g(operator)g(tree)g(with)f +Fw(O)i FG(as)f(its)g(operator)75 1822 y(can)j(be)g(implemented)g(by)f +(the)h(Null)f(algorithm.)27 b(The)15 b(actions)f(associated)g(with)g +(this)g(rule)g(ha)o(v)o(e)i(a)f(speci\256c)75 1884 y(pattern.)21 +b(The)13 b(pre-opt)f(section)g(consists)f(of)i(three)g(statements.)21 +b(The)12 b(\256rst)h(statement)f(copies)h(the)f(descriptor)75 +1946 y(of)g(the)g(operator)g Fw(O)i FG(to)e(the)g(algorithm)f(Null.)19 +b(The)13 b(second)e(statement)h(sets)g(the)g(descriptor)f(of)i(the)f +(stream)g Fw(S)1855 1953 y Ft(1)75 2008 y FG(on)g(the)g(right)g(side)f +(to)h(the)h(descriptor)e(of)h(the)g(stream)h Fw(S)976 +2015 y Ft(1)1008 2008 y FG(on)f(the)h(left)f(side.)19 +b(Why)12 b(is)g(it)g(necessary)g(to)g(do)g(this?)75 2070 +y(The)f(ke)o(y)f(lies)h(in)f(the)h(third)f(statement.)16 +b(This)10 b(statement)g(copies)g(the)h(property)f(\252property\272)h +(of)g(the)f(operator)h Fw(O)75 2132 y FG(node)g(on)g(the)g(left)g(side) +g(to)g(the)g(\252property\272)g(of)h(the)f(input)f(stream)i +Fw(S)1159 2139 y Ft(1)1190 2132 y FG(on)f(the)g(right)g(side.)16 +b(Since)c(left-hand)f(side)75 2194 y(descriptors)h(cannot)g(be)i +(changed)f(in)f(an)i(I-rule,)g(a)g(ne)o(w)f(descriptor)f +Fl(D)1232 2201 y Fk(3)1268 2194 y FG(is)h(necessary)g(for)g +Fw(S)1596 2201 y Ft(1)1629 2194 y FG(to)g(con)n(v)o(e)o(y)g(the)75 +2256 y(property)d(propagation)g(information.)137 2318 +y(The)h(post-opt)f(section)g(in)g(the)h(I-rule)g(has)g(only)f(a)i +(cost-assignment)d(statement;)h(this)g(simply)g(sets)h(the)g(cost)75 +2380 y(of)g(the)g(Null)f(node)h(to)g(the)g(cost)f(of)h(its)g(optimized) +f(input)g(stream.)137 2443 y(The)h(Null)f(algorithm,)h(therefore,)h +(serv)o(es)f(to)g(ef)o(fecti)o(v)o(ely)g(transform)g(a)g(single)f +(operator)h(to)g(a)g(no-op.)75 2554 y(E)p Fn(XAMPLE)i +FG(7.)80 b(Equation)12 b(\(7\))i(\(in)f(Figure)h(7\(b\)\))g(sho)o(ws)e +(the)i(I-rule)g(that)f(re)o(writes)g(the)h(SOR)m(T)g(operator)g(to)75 +2617 y(use)f(a)g(Null)e(algorithm.)21 b(The)12 b(third)g(pre-opt)g +(statement)g(sets)h(the)f(tuple)g(order)h(of)f Fw(S)1439 +2624 y Ft(1)1472 2617 y FG(on)g(the)h(right)f(side)g(to)g(be)952 +2793 y(10)p eop +%%Page: 11 11 +11 10 bop 75 12 1800 2 v 75 679 2 667 v 135 61 a Fp(O)q +Fi(\()p Fp(S)203 65 y Fs(1)221 61 y Fi(\))10 b(:)g Fg(D)301 +65 y Ff(2)331 61 y Fi(=)-6 b Fe(\))11 b Fz(Null)p Fi(\()p +Fp(S)508 65 y Fs(1)537 61 y Fi(:)f Fg(D)592 65 y Ff(3)611 +61 y Fi(\))h(:)f Fg(D)692 65 y Ff(4)919 61 y Fz(\(6\))135 +111 y(TR)o(UE)135 161 y Fe(ff)244 211 y Fg(D)278 215 +y Ff(4)307 211 y Fi(=)h Fg(D)382 215 y Ff(2)411 211 y +Fi(;)244 262 y Fg(D)278 266 y Ff(3)307 262 y Fi(=)g Fg(D)382 +266 y Ff(1)411 262 y Fi(;)244 312 y Fg(D)278 316 y Ff(3)297 +312 y Fp(:)p Fz(property)f Fi(=)g Fg(D)519 316 y Ff(2)538 +312 y Fp(:)p Fz(property)f Fi(;)135 362 y Fe(gg)135 412 +y(ff)244 463 y Fg(D)278 467 y Ff(4)297 463 y Fp(:)p Fz(cost)g +Fi(=)i Fg(D)453 467 y Ff(3)472 463 y Fp(:)p Fz(cost)d +Fi(;)135 513 y Fe(gg)284 616 y Fz(\(a\))h(General)g(form)h(of)f(a)g +(\252Null\272)g(I-rule)p 985 666 2 642 v 1010 52 a(SOR)n(T)o +Fi(\()p Fp(S)1141 56 y Fs(1)1159 52 y Fi(\))h(:)h Fg(D)1240 +56 y Ff(2)1269 52 y Fi(=)-6 b Fe(\))11 b Fz(Null)p Fi(\()p +Fp(S)1446 56 y Fs(1)1475 52 y Fi(:)f Fg(D)1530 56 y Ff(3)1549 +52 y Fi(\))h(:)f Fg(D)1630 56 y Ff(4)1794 52 y Fz(\(7\))1010 +111 y(TR)o(UE)1010 161 y Fe(ff)1119 211 y Fg(D)1153 215 +y Ff(4)1183 211 y Fi(=)g Fg(D)1257 215 y Ff(2)1286 211 +y Fi(;)1119 262 y Fg(D)1153 266 y Ff(3)1183 262 y Fi(=)g +Fg(D)1257 266 y Ff(1)1286 262 y Fi(;)1119 312 y Fg(D)1153 +316 y Ff(3)1172 312 y Fp(:)p Fz(tuple)p 1260 312 12 2 +v 13 w(order)g Fi(=)h Fg(D)1435 316 y Ff(2)1454 312 y +Fp(:)p Fz(tuple)p 1542 312 V 13 w(order)e Fi(;)1010 362 +y Fe(gg)1010 412 y(ff)1119 463 y Fg(D)1153 467 y Ff(4)1172 +463 y Fp(:)p Fz(cost)g Fi(=)i Fg(D)1328 467 y Ff(3)1347 +463 y Fp(:)p Fz(cost)d Fi(;)1010 513 y Fe(gg)1248 616 +y Fz(\(b\))i(Null)g(sort)f(algorithm)p 1873 679 2 667 +v 75 681 1800 2 v 1874 688 10 670 v 83 688 1800 10 v +612 792 a FG(Figure)i(7:)16 b(The)11 b(\252Null\272)f(algorithm)h +(concept)75 972 y(the)g(tuple)g(order)h(of)g(the)f(SOR)m(T)h(node,)g +(thus)e(ensuring)h(that)g(when)g Fw(S)1181 979 y Ft(1)1213 +972 y FG(is)g(optimized)f(on)i(the)f(right)g(side,)g(it)g(will)75 +1034 y(ha)o(v)o(e)h(the)e(same)i(tuple)f(order)g(as)g(the)g(SOR)m(T)h +(node.)947 b Fm(\003)75 1221 y FC(3)60 b(The)14 b(P2V)h(pr)o(e-pr)o +(ocessor)75 1330 y FG(In)i(Section)f(1,)j(we)e(enumerated)g(the)g(four) +f(primary)h(goals)f(of)h(Prairie,)i(viz.,)g(uniformity)c(in)i(operator) +f(and)75 1393 y(algorithms;)6 b(uniformity)h(in)g(properties;)e +(uniformity)i(in)g(property)o(-transformatio)o(ns;)e(and)i(ef)o +(\256cient)g(generation)75 1455 y(of)i(Prairie)g(optimizers.)15 +b(The)9 b(\256rst)g(three)g(goals)f(are)i(dri)o(v)o(en)f(by)f(the)h +(need)g(for)g(conceptual)f(simplicity;)g(ho)o(we)o(v)o(er)n(,)75 +1517 y(the)o(y)16 b(alone)g(do)f(not)h(necessarily)f(generate)h(ef)o +(\256cient)g(optimizers.)31 b(The)16 b(P2V)g(pre-processor)f(ensures)h +(that)75 1579 y(ef)o(\256cient)d(optimizers)g(can)g(be)g(realized)h +(from)f(Prairie)h(speci\256cations,)f(by)g(translating)e(them)i(to)g +(the)g(V)-6 b(olcano)75 1641 y(frame)o(work)15 b(and)f(then)g +(generating)g(an)h(optimizer)f(by)g(compiling)g(with)f(the)i(V)-6 +b(olcano)14 b(search)h(engine.)26 b(This)75 1703 y(Prairie)13 +b(optimizer)o(-generator)f(paradigm)h(is)g(sho)o(wn)e(schematically)h +(in)h(Figure)f(8.)22 b(The)13 b(pre-processor)f(itself)75 +1765 y(is)h(4500)g(lines)g(of)k Fc(flex)e FG(and)f Fc(bison)h +FG(code.)25 b(In)14 b(this)f(section,)h(we)g(describe)f(the)h +(pre-processor)f(steps)g(and)75 1827 y(e)o(xplain)d(why)h(the)g +(Prairie-to-V)-6 b(olcano)10 b(transformation)g(is)h(non-tri)o(vial.)75 +1958 y Fy(3.1)50 b(Corr)o(espondence)12 b(of)g(elements)h(in)f(Prairie) +h(and)f(V)-5 b(olcano)75 2050 y FG(T)l(able)14 b(3)g(sho)o(ws)e(the)i +(relationship)e(between)h(the)h(basic)f(elements)h(of)g(a)g(Prairie)h +(and)e(V)-6 b(olcano)14 b(speci\256cation;)75 2113 y(these)c +(correspondences)g(are)i(preserv)o(ed)f(by)g(the)f(P2V)h(pre-processor) +m(.)17 b(Operators)10 b(and)h(algorithms)e(in)i(Prairie)75 +2175 y(correspond)f(directly)h(to)f(operators)h(and)g(algorithms,)f +(respecti)o(v)o(ely)m(,)h(in)f(V)-6 b(olcano.)137 2237 +y(The)11 b(concept)f(of)h(enforcer)o(-operators)g(and)f(enforcer)o +(-algorithms)g(needs)h(some)g(e)o(xplanation.)k(In)c(a)g(Prairie)75 +2299 y(speci\256cation,)f(one)h(can)h(ha)o(v)o(e)g(a)f(set)g(of)g +(I-rules)g(of)g(the)g(form:)75 2394 y Fw(O)q Fj(\()p +Fw(S)157 2401 y Ft(1)176 2394 y Fj(\))i(:)f Fl(D)272 +2401 y Fk(2)336 2394 y Fj(=)-8 b Fu(\))43 b Fw(A)485 +2401 y Ft(1)504 2394 y Fj(\()p Fw(S)550 2401 y Ft(1)570 +2394 y Fj(\))12 b(:)g Fl(D)665 2401 y Fk(3)346 2470 y +Fu(\001)c(\001)g(\001)75 2546 y Fw(O)q Fj(\()p Fw(S)157 +2553 y Ft(1)176 2546 y Fj(\))13 b(:)f Fl(D)272 2553 y +Fk(2)336 2546 y Fj(=)-8 b Fu(\))43 b Fw(A)485 2553 y +Fv(n)508 2546 y Fj(\()p Fw(S)554 2553 y Ft(1)573 2546 +y Fj(\))13 b(:)f Fl(D)669 2553 y Fk(3)75 2621 y Fw(O)q +Fj(\()p Fw(S)157 2628 y Ft(1)176 2621 y Fj(\))h(:)f Fl(D)272 +2628 y Fk(2)336 2621 y Fj(=)-8 b Fu(\))43 b FG(Null)n +Fj(\()p Fw(S)577 2628 y Ft(1)609 2621 y Fj(:)12 b Fl(D)674 +2628 y Fk(3)697 2621 y Fj(\))g(:)h Fl(D)793 2628 y Fk(4)952 +2793 y FG(11)p eop +%%Page: 12 12 +12 11 bop 90 12 1761 2 v 90 982 2 970 v 498 922 a @beginspecial +@setspecial + tx@Dict begin STP newpath 2.6 SLW 0. setgray [ 22.76219 170.71643 +204.85973 170.71643 204.85973 34.14328 22.76219 34.14328 /Lineto /lineto +load def false Polygon 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 [ 45.52438 204.85973 +182.09753 204.85973 182.09753 182.09753 45.52438 182.09753 /Lineto +/lineto load def false Polygon gsave 1. setgray fill grestore gsave +0.8 SLW 0. setgray 0 setlinecap stroke grestore end + +@endspecial +827 134 a @beginspecial @setspecial + tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.13687 +neg 72.34619 10.36934 .5 Frame gsave 1. setgray fill grestore end + +@endspecial FG(Prairie)11 +b(Rule)h(Set)498 922 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 [ 113.81096 159.33534 113.81096 182.09753 + /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 [ 45.52438 159.33534 +182.09753 159.33534 182.09753 136.57315 45.52438 136.57315 /Lineto +/lineto load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap +stroke grestore gsave 1.0 SLW 1. setgray stroke grestore end + +@endspecial 800 318 a(P2V)f(Pre-processor) +498 922 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 [ 113.81096 113.81096 113.81096 136.57315 + /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 [ 45.52438 113.81096 +182.09753 113.81096 182.09753 91.04877 45.52438 91.04877 /Lineto /lineto +load def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 +SLW 0. setgray 0 setlinecap stroke grestore end + +@endspecial 813 512 a @beginspecial @setspecial + tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 3.13687 +neg 78.83955 10.36934 .5 Frame gsave 1. setgray fill grestore end + + +@endspecial(V)-6 b(olcano)11 b(Rule)g(Set)498 922 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 [ 113.81096 68.28658 113.81096 91.04877 + /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 [ 45.52438 68.28658 +182.09753 68.28658 182.09753 45.52438 45.52438 45.52438 /Lineto /lineto +load def false Polygon gsave 2.6 SLW 0. setgray 0 setlinecap stroke + grestore gsave 1.0 SLW 1. setgray stroke grestore end + +@endspecial 702 696 a(V)-6 b(olcano)11 b(Optimizer)g +(Generator)498 922 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 [ 113.81096 22.76219 113.81096 45.52438 + /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 [ 45.52438 22.76219 +182.09753 22.76219 182.09753 0.0 45.52438 0.0 /Lineto /lineto load +def false Polygon gsave 0.5 setgray fill grestore gsave 0.8 SLW 0. +setgray 0 setlinecap stroke grestore end + +@endspecial 816 885 a @beginspecial +@setspecial + tx@Dict begin STP newpath 0.0 SLW 1. setgray 0. true 3.0 neg 5.3871 +neg 77.5037 10.36934 .5 Frame gsave 1. setgray fill grestore end + +@endspecial(Query)g(Optimizer)-788 b(Operator)11 +b(T)n(ree)498 922 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 [ 45.52438 11.38109 22.76219 11.38109 + /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 /ArrowA { moveto } def +/ArrowB { /ArrowBc [ 6 2 roll ] cvx def ArrowBc BeginArrow false 0.4 +1.4 2.0 3. Arrow EndArrow } def [ 204.85973 11.38109 182.09753 11.38109 + /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 1349 890 a(Access)g(Plan)p +1850 982 V 90 984 1761 2 v 1850 992 10 974 v 99 992 1761 +10 v 75 1095 a(Figure)16 b(8:)26 b(The)17 b(Prairie)f(optimizer)o +(-generator)g(paradigm.)32 b(Double-box)o(ed)15 b(modules)h(represent)g +(software)75 1157 y(generators,)22 b(shaded)e(box)o(es)g(represent)f +(generated)h(programs.)44 b(The)20 b(outermost)f(double-box)o(ed)g +(portion)75 1220 y(denotes)10 b(the)h(Prairie)h(optimizer)e(generator)m +(.)p 549 1368 852 7 v 549 1419 2 51 v 664 1404 a Fq(Prairie)p +889 1419 V 304 w(V)l(olcano)p 1399 1419 V 549 1425 852 +7 v 549 1475 2 51 v 653 1460 a Fz(Operator)p 889 1475 +V 292 w(Operator)p 1399 1475 V 549 1477 852 2 v 549 1527 +2 51 v 642 1512 a(Algorithm)p 889 1527 V 270 w(Algorithm)p +1399 1527 V 549 1529 852 2 v 549 1579 2 51 v 586 1564 +a(Enforcer)o(-operator)p 889 1579 V 273 w(\320)p 1399 +1579 V 549 1581 852 2 v 549 1631 2 51 v 576 1616 a(Enforcer)o +(-algorithm)p 889 1631 V 216 w(Enforcer)p 1399 1631 V +549 1632 852 2 v 549 1683 2 51 v 587 1668 a(\252Null\272)f(Algorithm)p +889 1683 V 275 w(\320)p 1399 1683 V 549 1684 852 2 v +549 1735 2 51 v 615 1720 a(Operator)g(T)o(ree)p 889 1735 +V 175 w(Logical)f(Expression)p 1399 1735 V 549 1736 852 +2 v 549 1787 2 51 v 629 1771 a(Access)f(Plan)p 889 1787 +V 183 w(Physical)g(Expression)p 1399 1787 V 549 1788 +852 2 v 549 1838 2 51 v 636 1872 a(Descriptor)p 889 1838 +V 915 1823 a(Operator/Algorithm)j(Ar)o(gument)p 1399 +1838 V 890 1840 511 2 v 549 1889 2 51 v 889 1889 V 1013 +1874 a(Physical)e(property)p 1399 1889 V 890 1890 511 +2 v 549 1939 2 51 v 889 1939 V 1110 1924 a(Cost)p 1399 +1939 V 549 1941 852 2 v 549 1991 2 51 v 701 1976 a(\320)p +889 1991 V 281 w(Logical)g(Property)p 1399 1991 V 549 +1992 852 2 v 549 2043 2 51 v 701 2028 a(\320)p 889 2043 +V 283 w(System)g(Property)p 1399 2043 V 549 2049 852 +7 v 427 2125 a FG(T)l(able)j(3:)16 b(Correspondence)11 +b(of)g(elements)g(in)f(Prairie)i(and)f(V)-6 b(olcano)75 +2305 y(i.e.,)12 b(an)e(operator)g Fw(O)i FG(has)e(algorithms)f +Fw(A)725 2312 y Ft(1)756 2305 y FG(through)g Fw(A)942 +2312 y Fv(n)966 2305 y FG(,)i(and)f(Null,)g(as)h(implementations.)j +(The)d(pre-processor)75 2367 y(classi\256es)k Fw(O)h +FG(as)g(an)f FB(enfor)n(cer)o(-oper)o(ator)p FG(,)g(and)g(algorithms)f +Fw(A)1096 2374 y Ft(1)1132 2367 y FG(through)g Fw(A)1323 +2374 y Fv(n)1362 2367 y FG(as)h FB(enfor)n(cer)o(-algorithms)p +FG(.)26 b(An)75 2429 y(e)o(xample)12 b(of)f(an)h(enforcer)o(-operator)f +(is)g(the)g(SOR)m(T)h(operator)n(,)f(and)h(an)f(enforcer)o(-algorithm)g +(is)g(the)g(Mer)o(ge)p 1793 2429 14 2 v 17 w(sort)75 +2491 y(algorithm)e(\(sho)o(wn)g(in)h(T)l(able)g(1\).)17 +b(Enforcer)o(-algorithms)9 b(in)g(the)h(Prairie)h(model)f(are)h +(translated)e(into)g(enforcers)75 2554 y(in)e(the)g(V)-6 +b(olcano)7 b(model;)f(enforcer)o(-operators)h(disappear)g(in)g(V)-6 +b(olcano)7 b(when)g(th)o(e)g(P2V)g(pre-processor)g(combi)o(nes)75 +2616 y(se)o(v)o(eral)k(I-rules)g(to)g(generate)g(a)h(V)-6 +b(olcano)10 b(rule)h(\(this)g(is)f(described)h(in)g(Section)f(3.3\).) +952 2793 y(12)p eop +%%Page: 13 13 +13 12 bop 137 14 a FG(Another)12 b(major)i(responsibilit)o(y)c(of)j +(the)g(P2V)g(pre-processor)g(is)f(classifying)f(dif)o(ferent)i +(properties)f(in)g(the)75 77 y(descriptor)m(.)25 b(V)-6 +b(olcano)14 b(forces)g(users)g(to)g(classify)f(properties)g(\(as)i +(logical,)f(physical,)g(or)g(operator/algorithm)75 139 +y(ar)o(guments\))8 b(according)g(to)h(their)f(use.)15 +b(The)9 b(classi\256cation)e(of)h(properties)g(helps)g(optimize)f(the)i +(performance)g(of)75 201 y(V)-6 b(olcano.)20 b(Unfortunately)m(,)11 +b(property)h(classi\256cation)f(is)h(actually)f(rule-dependent.)20 +b(That)12 b(is,)g(adding)g(another)75 263 y(rule)f(to)g(a)h(V)-6 +b(olcano)10 b(rule)i(set)f(may)g(cause)h(a)g(property)e(that)h(was)f +(pre)o(viously)g(considered)g(\252logical\272)h(to)g(become)75 +325 y(\252physical\272,)d(or)h(vice)f(v)o(ersa.)16 b(Migrating)7 +b(properties)h(between)g(classi\256cations)e(entails)i(a)g +(considerable)g(amount)75 387 y(of)g(reprogramming)g(on)g(the)g(user')m +(s)g(part,)h(and)f(consequently)e(makes)i(V)-6 b(olcano)7 +b(rule)h(sets)g(rather)g(brittle.)14 b(Prairie,)75 449 +y(in)h(contrast,)i(does)e(not)g(ask)g(users)h(to)f(make)h(these)f +(distinctions;)g(the)g(P2V)h(pre-processor)f(determines)g(the)75 +511 y(classi\256cation)e(of)i(properties)f(automatically)f(and)i(thus)f +(signi\256cantly)f(facilitates)g(the)h(e)o(xtensibility)e(of)j(rule)75 +573 y(sets.)38 b(This)17 b(is)h(done)g(by)g(transforming)f(a)i(single)e +(descriptor)g(structure)h(into)f(three)h(parts)g(\(see)h(T)l(able)f +(3\):)75 635 y(an)i(operator/algorithm)e(ar)o(gument,)k(physical)d +(properties)g(and)g(cost.)42 b(Brie\257y)m(,)23 b(physical)c +(properties)g(are)75 698 y(properties)c(that)g(are)i(requested)e(by)h +(the)f(user)n(,)j(cost)d(represents)h(an)g(estimate)f(of)h(an)g +(algorithm')m(s)f(cost,)i(and)75 760 y(operator/algorithm)d(ar)o +(guments)h(are)h(all)f(remaining)h(properties)e(\(including)g +(additional)f(properties\).)29 b(The)75 822 y(pre-processor)7 +b(achie)o(v)o(es)g(the)g(classi\256cation)g(of)g(prop)o(erties)g(by)f +(e)o(xamining)h(t)o(he)g(action)o(s)g(of)g(all)f(rules:)11 +b(a)c(property)75 884 y(with)i(a)i(type)f(\252COST\272)h(is)f +(classi\256ed)f(as)i(a)f(cost)g(property)m(,)g(properties)f(changed)h +(in)g(pre-opt)g(sections)f(of)h(I-rules)75 946 y(\(e.g.,)h(tuple)p +272 946 14 2 v 15 w(order)e(in)f(I-rule)h(\(5\)\))g(are)h(physical)d +(properties,)h(and)h(all)g(other)f(properties)g(are)h +(operator/algorithm)75 1008 y(ar)o(guments.)137 1070 +y(Operator)g(trees)h(and)f(access)g(plans)g(in)g(Prairie)h(correspond)e +(to)h(logical)f(and)h(physical)f(e)o(xpressions,)h(respec-)75 +1132 y(ti)o(v)o(ely)m(,)h(in)h(V)-6 b(olcano;)10 b(the)h(notations)e +(are)j(v)o(ery)g(similar)m(.)75 1263 y Fy(3.2)50 b(Corr)o(espondence)12 +b(of)g(rules)75 1355 y Fx(3.2.1)45 b(T)l(-rules)75 1448 +y FG(T)l(-rules)7 b(in)g(Prairie)g(are)g(translated)g(to)g(trans)p +763 1448 V 14 w(rules)g(\(transformation)g(rules\))g(in)g(V)-6 +b(olcano;)5 b(e)o(xpressions)i(occurring)75 1510 y(on)14 +b(either)g(side)g(of)g(a)h(T)l(-rule)f(are)h(transformed)f(into)f(V)-6 +b(olcano)14 b(logical)f(e)o(xpressions.)24 b(T)l(able)15 +b(4\(a\))f(sho)o(ws)f(the)75 1572 y(correspondence)h(between)f(Prairie) +i(T)l(-rules)e(and)h(V)-6 b(olcano)14 b(trans)p 1152 +1572 V 15 w(rules.)25 b(The)14 b(join)f(associati)o(vity)f(trans)p +1792 1572 V 15 w(rule)75 1635 y(\(corresponding)e(to)g(the)h(T)l(-rule) +g(in)g(Figure)g(3\))g(in)g(V)-6 b(olcano)10 b(is)h(as)g(follo)o(ws)1256 +1618 y Ft(6)1274 1635 y FG(:)75 1730 y Fj(\()p FD(JOIN)g(?op)p +256 1730 13 2 v 15 w(ar)o(g5)g Fj(\(\()p FD(JOIN)g(?op)p +552 1730 V 15 w(ar)o(g4)g Fj(\(?1)g(?2\)\))g(?3\)\))41 +b Fu(\000)m Fw(>)i Fj(\()p FD(JOIN)11 b(?op)p 1225 1730 +V 15 w(ar)o(g7)g Fj(\(?1)g(\()p FD(JOIN)g(?op)p 1576 +1730 V 15 w(ar)o(g6)h Fj(\(?2)f(?3\)\)\)\))75 1825 y +FG(The)f(pre-test)f(and)h(test)f(portions)g(of)h(a)g(T)l(-rule)g(are)g +(mapped)g(to)g(the)g(cond)p 1232 1825 14 2 v 15 w(code)g(\(condition)e +(code\))i(of)h(a)f(V)-6 b(olcano)75 1887 y(trans)p 167 +1887 V 16 w(rule,)21 b(and)f(the)f(post-test)e(portion)h(is)h(mapped)h +(to)f(the)g(appl)p 1194 1887 V 15 w(code)h(\(application)d(code\).)42 +b(Ho)o(we)o(v)o(er)n(,)75 1949 y(e)o(xpressions)18 b(in)g(Prairie)i(T)l +(-rules)e(can)i(contain)e(enforcer)o(-operators.)40 b(According)18 +b(to)h(T)l(able)g(3,)i(enforcer)o(-)75 2011 y(operators)7 +b(are)h(deleted)f(by)g(the)h(P2V)f(pre-processor)n(,)i(so)e(T)l(-rules) +g(containing)f(enforcer)o(-operators)h(are)h(modi\256ed)75 +2074 y(before)g(being)g(translated)f(into)g(V)-6 b(olcano.)15 +b(Sometimes,)9 b(this)e(can)h(result)f(in)h(rules)g(that)f(can)i(be)f +(further)g(combined)75 2136 y(into)i(one)h(as)g(an)h(optimization)d +(measure;)i(this)f(is)h(discussed)f(in)g(Section)h(3.3.)75 +2264 y Fx(3.2.2)45 b(I-rules)75 2357 y FG(I-rules)10 +b(in)f(Prairie)i(correspond)e(to)h(impl)p 726 2357 V +15 w(rules)g(\(implementation)f(rules\))g(in)h(V)-6 b(olcano;)9 +b(the)h(complete)g(relation-)75 2419 y(ship)i(is)h(sho)o(wn)e(in)i(T)l +(able)g(4\(b\).)22 b(Ho)o(we)o(v)o(er)n(,)14 b(the)f(transformation)f +(is)g(complicated)h(by)f(se)o(v)o(eral)i(factors.)21 +b(First,)75 2481 y(Prairie)14 b(adopts)f(a)i(per)o(-rule)f(approach)g +(of)g(specifying)f(property)g(transformations,)h(i.e.,)h(properties)e +(of)i(algo-)75 2543 y(rithms)9 b(are)i(speci\256ed)f(in)f(an)h(I-rule,) +h(whereas)f(V)-6 b(olcano)9 b(adopts)g(a)h(per)o(-algorithm)f(approach) +h(where)g(properties)p 75 2584 720 2 v 125 2614 a Fs(6)142 +2630 y Fz(There)f(are)g(conditions)f(and)g(actions)g(associated)f(with) +j(V)-5 b(olcano)8 b(rules)h(that)g(are)g(not)g(sho)o(wn)f(here.)952 +2793 y FG(13)p eop +%%Page: 14 14 +14 13 bop 212 214 665 7 v 212 264 2 51 v 316 249 a Fq(Prairie)p +530 264 V 211 w(V)l(olcano)p 874 264 V 212 270 665 7 +v 212 320 2 51 v 327 305 a Fz(T)m(-rule)p 530 320 V 214 +w(trans)p 706 305 12 2 v 13 w(rule)p 874 320 2 51 v 212 +322 665 2 v 212 372 2 51 v 305 357 a(Operator)p 530 372 +V 199 w(Operator)p 874 372 V 212 374 665 2 v 212 424 +2 51 v 238 409 a(Enforcer)o(-operator)p 530 424 V 179 +w(\320)p 874 424 V 212 426 665 2 v 212 476 2 51 v 293 +461 a(Descriptor)p 530 476 V 106 w(Operator)9 b(Ar)o(gument)p +874 476 V 212 478 665 2 v 212 528 2 51 v 275 513 a(Pre-test)g(code)p +530 528 V 151 w(Cond)p 705 513 12 2 v 12 w(code)p 874 +528 2 51 v 212 530 665 2 v 212 580 2 51 v 341 565 a(T)m(est)p +530 580 V 218 w(Cond)p 705 565 12 2 v 12 w(code)p 874 +580 2 51 v 212 581 665 2 v 212 632 2 51 v 267 617 a(Post-test)g(code)p +530 632 V 147 w(Appl)p 701 617 12 2 v 13 w(code)p 874 +632 2 51 v 212 638 665 7 v 357 742 a(\(a\))h(T)o(ranslation)e(of)h(T)m +(-rules)p 1034 58 744 7 v 1034 108 2 51 v 1166 93 a Fq(Prairie)p +1409 108 V 251 w(V)l(olcano)p 1776 108 V 1034 114 744 +7 v 1034 165 2 51 v 1181 150 a Fz(I-rule)p 1409 165 V +260 w(impl)p 1593 150 12 2 v 14 w(rule)p 1776 165 2 51 +v 1034 166 744 2 v 1034 217 2 51 v 1156 202 a(Operator)p +1409 217 V 238 w(Operator)p 1776 217 V 1034 218 744 2 +v 1034 268 2 51 v 1145 253 a(Algorithm)p 1409 268 V 215 +w(Algorithm)p 1776 268 V 1034 270 744 2 v 1034 320 2 +51 v 1072 305 a(Operator)h(Descriptor)p 1409 320 V 74 +w(Operator)f(Ar)o(gument)p 1776 320 V 1034 322 744 2 +v 1034 372 2 51 v 1061 357 a(Algorithm)h(Descriptor)p +1409 372 V 51 w(Algorithm)g(Ar)o(gument)p 1776 372 V +1034 374 744 2 v 1034 424 2 51 v 1192 409 a(T)m(est)p +1409 424 V 257 w(Cond)p 1595 409 12 2 v 12 w(code)p 1776 +424 2 51 v 1034 426 744 2 v 1034 476 2 51 v 1127 461 +a(Pre-opt)g(code)p 1409 476 V 161 w(\252do)p 1537 461 +12 2 v 13 w(an)o(y)p 1604 461 V 13 w(good\272)p 1776 +476 2 51 v 1034 478 744 2 v 1034 528 2 51 v 1120 513 +a(Post-opt)f(code)p 1409 528 V 129 w(\252deri)o(v)o(e)p +1566 513 12 2 v 13 w(phy)p 1636 513 V 12 w(prop\272)p +1776 528 2 51 v 1034 530 744 2 v 1034 580 2 51 v 1204 +565 a(\320)p 1409 580 V 305 w(\252cost\272)p 1776 580 +V 1034 581 744 2 v 1034 632 2 51 v 1204 617 a(\320)p +1409 632 V 242 w(\252get)p 1548 617 12 2 v 13 w(input)p +1638 617 V 13 w(pv\272)p 1776 632 2 51 v 1034 638 744 +7 v 1022 742 a(\(b\))16 b(T)o(ranslation)e(of)i(I-rules.)32 +b(Quoted)14 b(strings)h(denote)1022 792 y(helper)9 b(functions.)463 +918 y FG(T)l(able)j(4:)j(Correspondence)c(of)g(rules)g(in)g(Prairie)g +(and)g(V)-6 b(olcano)75 1090 y(of)14 b(an)g(algorithm)f(are)i +(speci\256ed)f(in)g(a)g(helper)g(function)f(for)h(that)g(algorithm.)24 +b(W)l(e)15 b(belie)o(v)o(e)f(that)f(the)h(per)o(-rule)75 +1152 y(approach)e(is)h(more)g(general)f(and)h(intuiti)o(v)o(e.)19 +b(The)12 b(generality)g(arises)g(from)h(the)g(fact)f(that)g(the)h +(property)f(trans-)75 1214 y(formations)g(can)i(be)f(dif)o(ferent)g(in) +g(dif)o(ferent)f(I-rules)h(for)h(the)f(same)g(algorithm;)g(thus,)g(the) +g(per)o(-rule)g(approach)75 1277 y(is)i(a)h(superset)f(of)h(the)g(per)o +(-algorithm)f(approach.)30 b(The)16 b(per)o(-rule)g(approach)f(is)g +(intuiti)o(v)o(e)f(because)i(property)75 1339 y(mappings)10 +b(are)h(made)h(together)e(with)f(the)i(rule)g(in)n(v)o(ocation,)e +(instead)h(of)h(a)g(logically)e(disjoint)g(helper)h(function.)137 +1401 y(The)j(second)g(complicating)f(factor)h(in)f(V)-6 +b(olcano)13 b(in)n(v)o(olv)o(es)f(the)h(reliance)g(on)g(se)o(v)o(eral)g +(helper)g(functions)f(to)75 1463 y(achie)o(v)o(e)h(property)f +(transformations.)21 b(F)o(or)13 b(instance,)g(using)f(Prairie)h +(terminology)m(,)g(a)g(V)-6 b(olcano)12 b(implementa-)75 +1525 y(tion)h(rule)i(requires)f(an)g(additional)f(four)h(functions)f +(\(called)h(\252do)p 1142 1525 14 2 v 16 w(an)o(y)p 1223 +1525 V 17 w(good\272,)h(\252cost\272,)g(\252get)p 1594 +1525 V 16 w(input)p 1705 1525 V 15 w(pv\272,)g(and)75 +1587 y(\252deri)o(v)o(e)p 210 1587 V 16 w(phy)p 295 1587 +V 16 w(prop\272\).)30 b(Although)14 b(the)h(purpose)g(of)h(these)g +(functions)e(is)h(purportedly)f(to)i(enhance)g(V)-6 b(olcano)75 +1649 y(performance,)12 b(the)o(y)g(add)f(considerable)f(comple)o(xity)g +(to)h(the)g(design)f(of)h(rule)g(sets.)17 b(Prairie,)12 +b(in)e(contrast,)h(elim-)75 1711 y(inates)i(the)g(need)g(for)h(users)f +(to)g(specify)f(these)h(functions,)g(by)g(adopting)f(the)h(per)o(-rule) +g(approach)h(of)f(property)75 1773 y(transformations;)i(as)g(sho)o(wn)f +(in)h(T)l(able)g(4\(b\),)h(the)f(P2V)g(pre-processor)f(generates)h(two) +f(of)h(these)g(functions)75 1835 y(\(\252do)p 159 1835 +V 16 w(an)o(y)p 240 1835 V 16 w(good\272)h(and)h(\252deri)o(v)o(e)p +599 1835 V 16 w(phy)p 684 1835 V 15 w(prop\272\))g(automatically)e +(from)i(I-rule)f(speci\256cations.)32 b(The)16 b(other)g(two)75 +1898 y(helper)11 b(functions)e(are)j(short-circuited,)d(suggesting)g +(that)h(the)h(V)-6 b(olcano)10 b(model)h(and)f(implementation)g(is)g +(actu-)75 1960 y(ally)h(more)g(complicated)g(than)f(it)h(needs)g(to)g +(be.)75 2088 y Fy(3.3)50 b(Rule)12 b(merging)75 2181 +y FG(In)7 b(the)h(process)f(of)g(translating)f(Prairie)h +(speci\256cations)f(to)h(V)-6 b(olcano,)8 b(se)o(v)o(eral)g +(opportunities)t(arise)g(for)f(obtaining)75 2243 y(a)14 +b(compact)h(set)f(of)g(rules.)25 b(These)13 b(opportunities)f(arise)i +(either)f(because)i(the)e(user)h(speci\256es)g(a)h(non-compact)75 +2305 y(set)e(of)f(rules,)i(or)f(because)f(of)h(the)g(translation)e +(process)h(itself.)21 b(An)12 b(e)o(xample)i(of)f(the)f(latter)h(case)g +(arises)g(when)75 2367 y(enforcer)o(-operators)g(are)h(deleted)e(by)h +(the)f(P2V)h(pre-processor)m(.)22 b(Consider)n(,)14 b(for)f(e)o +(xample,)h(the)f(follo)o(wing)e(set)75 2429 y(of)g(rules)g(in)g +(Prairie:)83 2517 y(JOIN)o Fj(\()p Fw(S)227 2524 y Ft(1)246 +2517 y Fw(;)d(S)295 2524 y Ft(2)314 2517 y Fj(\))k(:)h +Fl(D)410 2524 y Fk(3)474 2517 y Fj(=)-8 b Fu(\))42 b +FG(JOPR)q Fj(\()p FG(SOR)m(T)p Fj(\()p Fw(S)872 2524 +y Ft(1)891 2517 y Fj(\))12 b(:)h Fl(D)987 2524 y Fk(4)1009 +2517 y Fw(;)8 b FG(SOR)m(T)p Fj(\()p Fw(S)1189 2524 y +Ft(2)1208 2517 y Fj(\))k(:)g Fl(D)1303 2524 y Fk(5)1326 +2517 y Fj(\))g(:)h Fl(D)1422 2524 y Fk(6)135 2593 y FG(SOR)m(T)q +Fj(\()p Fw(S)295 2600 y Ft(1)314 2593 y Fj(\))f(:)h Fl(D)410 +2600 y Fk(2)474 2593 y Fj(=)-8 b Fu(\))42 b FG(Null)o +Fj(\()p Fw(S)715 2600 y Ft(1)747 2593 y Fj(:)12 b Fl(D)812 +2600 y Fk(3)835 2593 y Fj(\))g(:)g Fl(D)930 2600 y Fk(4)75 +2669 y FG(JOPR)p Fj(\()p Fw(S)227 2676 y Ft(1)246 2669 +y Fw(;)c(S)295 2676 y Ft(2)314 2669 y Fj(\))k(:)h Fl(D)410 +2676 y Fk(3)474 2669 y Fj(=)-8 b Fu(\))42 b FG(Nested)p +718 2669 V 16 w(loops)o Fj(\()p Fw(S)876 2676 y Ft(1)907 +2669 y Fj(:)13 b Fl(D)973 2676 y Fk(4)995 2669 y Fw(;)8 +b(S)1044 2676 y Ft(2)1063 2669 y Fj(\))k(:)h Fl(D)1159 +2676 y Fk(5)952 2793 y FG(14)p eop +%%Page: 15 15 +15 14 bop 75 14 a FG(The)17 b(\256rst)f(rule)h(is)f(a)h(T)l(-rule,)h +(and)f(the)f(ne)o(xt)g(two)g(are)h(I-rules.)33 b(Note)17 +b(that)f(SOR)m(T)h(is)f(an)h(enforcer)o(-operator)75 +77 y(\(because)g(it)f(has)g(a)h(Null)e(implementation\),)i(so)f(it)g +(is)g(deleted)g(in)g(the)h(transformation)e(process.)32 +b(The)16 b(\256rst)75 139 y(rule)c(then)f(becomes)h(a)g(mapping)f(from) +h(one)g(operator)f(JOIN)h(to)f(another)g(JOPR)h(which)f(can)h(be)g(vie) +o(wed)f(as)h(an)75 201 y(idempotence)g(mapping;)f(the)h(resulting)f +(rule)h(set)g(can)g(be)g(optimized)g(by)f(deleting)g(this)g(idempotent) +g(rule)h(and)75 263 y(replacing)f(all)g(occurrences)g(of)h(JOPR)g(with) +e(JOIN.)h(Thus,)g(the)g(abo)o(v)o(e)h(set)f(of)h(Prairie)g(rules)f(can) +g(be)h(combined)75 325 y(into)e(a)i(single)e(I-rule,)75 +420 y(JOIN)o Fj(\()p Fw(S)219 427 y Ft(1)239 420 y Fw(;)e(S)288 +427 y Ft(2)307 420 y Fj(\))k(:)g Fl(D)402 427 y Fk(3)437 +420 y Fj(=)-8 b Fu(\))14 b FG(Nested)p 653 420 14 2 v +16 w(loops)n Fj(\()p Fw(S)810 427 y Ft(1)842 420 y Fj(:)e +Fl(D)907 427 y Fk(4)930 420 y Fw(;)c(S)979 427 y Ft(2)998 +420 y Fj(\))k(:)g Fl(D)1093 427 y Fk(5)75 516 y FG(which)e(can)h(then)f +(be)g(translated)g(into)f(a)i(V)-6 b(olcano)10 b(impl)p +959 516 V 16 w(rule.)16 b(In)11 b(general,)g(the)f(number)g(of)h(T)l +(-rules)f(in)g(a)h(Prairie)75 578 y(rule)g(set)g(is)g(equal)g(to)g(the) +g(number)g(of)g(trans)p 776 578 V 16 w(rules)g(in)g(a)h(V)-6 +b(olcano)10 b(rule)h(set)g(plus)g(an)g(additional)e(T)l(-rule)i(for)h +(each)75 640 y(operator)m(.)235 623 y Ft(7)279 640 y +FG(Also,)i(the)f(number)h(of)g(I-rules)g(is)f(the)g(same)i(as)f(the)f +(number)h(of)g(impl)p 1432 640 V 15 w(rules)g(plus)e(an)i(additional)75 +702 y(I-rule)j(for)f(each)h(enforcer)o(-operator)g(\(for)g(Null)e +(implementations,)i(as)f(described)g(in)g(Section)g(2.5\))h(and)f(an)75 +764 y(additional)f(I-rule)i(for)g(each)g(enforcer)g(\(since)g +(enforcers)g(appear)g(as)g(I-rules)f(in)h(Prairie,)h(instead)e(of)h +(being)75 826 y(implicit,)c(as)h(in)e(V)-6 b(olcano\).)23 +b(The)14 b(lar)o(ger)f(number)h(of)f(rules)g(represents)g(a)h +(conceptual)f(simpli\256cation)e(in)i(rule)75 888 y(writing.)23 +b(Ho)o(we)o(v)o(er)n(,)15 b(the)f(P2V)g(pre-processor)f(ensures)g(that) +h(the)f(transformation)g(from)h(Prairie)g(to)g(V)-6 b(olcano)75 +950 y(always)10 b(produces)g(a)i(compact)f(set)g(of)g(rules.)75 +1104 y FC(4)60 b(Experimental)12 b(r)o(esults)75 1213 +y FG(This)e(section)g(presents)g(e)o(xperimental)h(results)f(which)g +(demonstrate)h(the)f(v)o(alue)h(of)g(Prairie)g(in)g(specifying)e(rule) +75 1275 y(sets)14 b(of)h(rule-based)f(optimizers.)26 +b(Our)15 b(e)o(xperiments)f(consist)f(of)i(specifying)e(rule-based)i +(optimizers)f(using)75 1337 y(Prairie)9 b(and)f(generating)f +(optimizers)h(using)f(the)h(P2V)g(pre-processor)g(and)h(the)f +(optimizer)o(-generator)f(paradigm)75 1400 y(of)k(Figure)g(8.)137 +1462 y(In)g([5],)g(we)g(presented)f(an)h(implementation)f(of)g(a)i +(centralized)e(relational)f(query)i(optimizer)f(using)f(Prairie.)75 +1524 y(Using)i(the)g(P2V)h(translator)n(,)g(we)g(translated)f(this)f +(to)i(V)-6 b(olcano)11 b(format)h(and)g(optimized)f(se)o(v)o(eral)h +(queries)g(using)75 1586 y(the)j(resultant)f(optimizer)m(.)28 +b(F)o(or)16 b(comparison,)f(we)g(hand-coded)g(the)g(same)g(optimizer)g +(directly)f(in)h(V)-6 b(olcano.)75 1648 y(The)10 b(results)f(presented) +h(there)g(sho)o(wed)f(that,)h(using)f(Prairie)h(\(compared)h(to)e +(directly)h(using)e(V)-6 b(olcano\))10 b(resulted)75 +1710 y(in)16 b(approximately)f(50\045)i(sa)o(vings)e(in)h(lines)f(of)i +(code)g(with)e(ne)o(gligible)g(\(less)h(than)g(5\045\))h(increase)f(in) +h(query)75 1772 y(optimization)c(time.)29 b(Ho)o(we)o(v)o(er)n(,)16 +b(the)f(optimizer)f(was)h(quite)f(small)h(in)g(terms)g(of)g(the)g +(number)g(of)h(operators,)75 1834 y(algorithms)10 b(and)h(rules.)137 +1896 y(F)o(or)h(a)g(more)f(realistic)g(e)o(v)o(aluation)e(of)i +(Prairie,)h(we)g(needed)f(answers)f(to)h(the)g(follo)o(wing)e +(questions:)124 1992 y(1.)21 b(Is)11 b(Prairie)h(adequate)e(for)i(lar)o +(ge-scale)f(rule)g(sets?)124 2087 y(2.)21 b(Ho)o(w)10 +b(is)h(programmer)h(producti)o(vity)d(enhanced)i(by)f(the)h(high-le)o +(v)o(el)f(abstractions)g(of)h(Prairie?)124 2182 y(3.)21 +b(Can)11 b(Prairie)h(rule)f(sets)g(be)g(translated)f(automatically)g +(into)g(ef)o(\256cient)h(implementations?)137 2278 y(W)l(e)16 +b(addressed)e(the)g(\256rst)h(question)e(by)i(using)e(the)i(T)m(e)o +(xas)f(Instruments)g(Open)h(OODB)f(query)h(optimizer)75 +2340 y(rule)g(set,)h(which)e(has)h(the)g(lar)o(gest)f(publicly)g(a)o(v) +o(ailable)g(rule)h(set.)27 b(W)l(e)16 b(describe)f(this)f(optimizer)g +(in)h(the)f(ne)o(xt)75 2402 y(section,)c(and)h(then)g(gi)o(v)o(e)g(our) +g(assessments)f(to)h(the)g(last)f(two)g(questions)f(in)i(subsequent)e +(sections.)p 75 2442 720 2 v 125 2472 a Fs(7)142 2488 +y Fz(This)g(is)g(to)h(introduce)e(enforcer)o(-operators)h(in)g(e)o +(xpressions,)e(as)i(mentioned)f(in)h(footnote)g(5.)952 +2793 y FG(15)p eop +%%Page: 16 16 +16 15 bop 75 14 a Fy(4.1)50 b(The)13 b(T)-5 b(exas)13 +b(Instruments)g(Open)e(OODB)h(query)g(optimizer)75 107 +y FG(The)i(T)m(e)o(xas)g(Instruments)f(Open)h(Object-Oriented)e +(Database)i(Management)h(System)f([19])g(is)g(an)g(open,)h(e)o(x-)75 +169 y(tensible,)f(object-oriented)f(database)h(system)g(which)g(pro)o +(vides)g(users)g(an)g(architectural)g(frame)o(work)h(that)f(is)75 +231 y(con\256gurable)g(in)g(an)g(incremental)g(manner)m(.)27 +b(It)14 b(consists)f(of)h(three)g(sets)g(of)g(modules:)22 +b(a)14 b(core)h(set)f(pro)o(viding)75 294 y(lo)o(w-le)o(v)o(el)e +(primiti)o(v)o(es)f(for)i(creating)g(ne)o(w)f(en)n(vironments,)g(a)i +(set)e(of)h(functional)e(modules)h(that)g(facilitates)g(e)o(x-)75 +356 y(tensibility)d(using)i(functional)f(requirements,)j(and)f(a)g +(meta-architecture)g(module)g(housing)e(the)i(e)o(xtensibility)75 +418 y(concepts)f(of)h(Open)f(OODB.)h(Examples)f(of)h(the)f(core)h(set)f +(are)i(communication)d(and)i(address)f(space)h(manage-)75 +480 y(ment,)f(while)e(e)o(xamples)h(of)f(functional)g(modules)g(are)h +(persistence,)g(distrib)o(ution)c(and)k(query)g(processing.)k(The)75 +542 y(meta-architecture)d(module)g(consists)e(of)j(e)o(v)o(ents,)f +(sentries,)f(and)h(polic)o(y)g(manager)g(interfaces.)137 +604 y(The)g(query)g(processing)e(module)i(pro)o(vides)f(users)g(with)g +(a)h(query)g(language)f(\(OQL[C++]\))h(based)g(on)f(SQL)75 +666 y(and)f(C++.)16 b(A)9 b(query)f(e)o(xpressed)h(in)g(this)f(high-le) +o(v)o(el)f(format)j(is)e(parsed)h(and)g(transformed)g(into)f(an)h +(operator)g(tree)75 728 y(suitable)h(for)i(optimization.)17 +b(The)12 b(query)f(optimizer)h(generates)f(an)h(optimal)f(access)h +(plan)f(from)i(this)e(operator)75 790 y(tree)g(which)g(is)g(then)f +(transformed)h(into)f(a)i(C++)f(program)g(ready)h(for)f(e)o(x)o +(ecution.)137 852 y(The)h(query)f(optimizer)g(in)h(the)f(Open)g(OODB)h +([2])g(is)f(generated)h(using)e(V)-6 b(olcano.)17 b(It)12 +b(is)f(written)g(as)h(a)g(set)f(of)75 915 y(trans)p 167 +915 14 2 v 16 w(rules)g(and)h(impl)p 445 915 V 16 w(rules)f(that)g +(de\256ne)i(the)e(algebra)h(of)g(an)g(object-oriented)e(database)i +(system.)18 b(Currently)m(,)75 977 y(there)9 b(are)h(17)e +(transformation)g(rules)g(and)h(9)g(implementation)e(rules)i(together)f +(with)g(about)g Fj(13000)f FG(lines)h(of)h(code)75 1039 +y(for)14 b(support)f(functions;)g(this,)h(of)g(course,)g(can)h(be)f +(changed)f(by)h(an)g(Open)f(OODB)h(user)g(for)g(speci\256c)g(needs.)75 +1101 y(There)c(are)h(also)e FB(catalogs)f FG(which)h(contain)g +(information)g(about)g(base)h(classes)g(that)f(are)i(used)f(by)f(the)h +(optimizer)m(.)75 1231 y Fy(4.2)50 b(Pr)o(ogrammer)14 +b(pr)o(oductivity)75 1324 y FG(Programmer)e(producti)o(vity)c(can)j(be) +g(measured)g(in)g(dif)o(ferent)f(ways.)15 b(An)c(admittedly)e +(simplistic)g(metric)i(is)f(the)75 1386 y(number)i(of)f(lines)g(of)g +(code)h(that)f(must)g(be)h(written.)k(But)c(there)f(are)h(also)f(less)g +(tangible)g(measures,)h(such)f(as)g(the)75 1448 y(amount)i(of)g +(conceptual)g(ef)o(fort)g(needed)h(to)e(understand)g(a)i(particular)f +(programming)g(task.)23 b(Our)13 b(e)o(xperience)75 1510 +y(with)k(the)g(Open)g(OODB)h(query)g(optimizer)f(suggests)f(that)h +(Prairie)h(e)o(xcels)g(on)f(the)g(latter)n(,)j(while)d(of)o(fering)75 +1572 y(modest)11 b(reductions)e(in)i(the)g(v)o(olume)g(of)g(code)g +(that)g(needs)g(to)f(be)i(written.)137 1635 y(W)l(e)e(con)n(v)o(erted)g +(by)f(hand)g(the)g(Open)h(OODB)f(query)g(optimizer')m(s)h(V)-6 +b(olcano)8 b(speci\256cations)h(to)g(Prairie.)16 b(This)75 +1697 y(was)d(a)h(non-tri)o(vial)d(task)i(because)g(of)h(the)f(relati)o +(v)o(ely)f(lar)o(ge)i(size)f(of)h(the)f(rule)g(set)g(and)g(the)h +(comple)o(xity)e(of)h(the)75 1759 y(support)7 b(functions.)15 +b(This)7 b(was)i(where)g(we)g(found)f(Prairie)h(helped)f(in)h +(conceptually)e(simplifying)f(the)j(rules)f(and)75 1821 +y(actions.)16 b(W)l(e)c(then)f(used)f(our)h(P2V)h(pre-processor)f(to)f +(reconstitute)g(these)h(Prairie)h(speci\256cations)e(as)h(V)-6 +b(olcano)75 1883 y(speci\256cations.)18 b(As)12 b(described)f(in)h +(Section)f(3,)i(this)e(process)g(in)n(v)o(olv)o(ed)g(a)i(considerable)e +(le)o(v)o(el)h(of)g(comple)o(xity)m(,)75 1945 y(partly)j(because)h(the) +f(Prairie)h(speci\256cation)f(had)g(22)h(T)l(-rules)f(and)g(11)h +(I-rules)f(compared)h(to)g(17)f(trans)p 1774 1945 V 16 +w(rules)75 2007 y(and)d(9)g(impl)p 275 2007 V 16 w(rules)f(in)h(the)f +(V)-6 b(olcano)12 b(speci\256cation;)f(the)h(reconstituted)e(V)-6 +b(olcano)11 b(speci\256cation)g(had)h(the)g(same)75 2069 +y(number)f(of)g(trans)p 366 2069 V 16 w(rules)g(and)g(impl)p +643 2069 V 16 w(rules)f(as)i(the)e(original)g(hand-coded)h +(speci\256cation.)137 2131 y(Con)n(v)o(erting)i(the)h(Open)f(OODB)g +(optimizer)g(rule)h(set)f(into)g(Prairie)h(format)g(actually)f +(simpli\256ed)f(its)h(spec-)75 2193 y(i\256cation)g(as)i(the)e(comple)o +(xities)g(of)i(the)f(V)-6 b(olcano)13 b(model)h(were)h(remo)o(v)o(ed.) +26 b(The)14 b(reduction)f(in)h(lines)f(of)h(code)75 2256 +y(was)e(modest)f(\320)i(there)f(was)g(about)f(a)i(10\045)e(sa)o(vings.) +934 2239 y Ft(8)972 2256 y FG(Ho)o(we)o(v)o(er)n(,)i(as)f(mentioned)f +(abo)o(v)o(e,)i(sa)o(vings)e(in)h(lines)f(of)75 2318 +y(code)k(do)f(not)f(adequately)h(re\257ect)h(increases)g(in)f +(programmer)h(producti)o(vity)m(.)24 b(W)l(e)15 b(found)f(the)g +(encapsulated)75 2380 y(speci\256cations)7 b(of)i(Prairie)g(\320)g +(namely)m(,)h(the)e(use)g(of)h(a)g(single)e(descriptor)h(and)g(fe)o +(wer)h(e)o(xplicit)f(support)f(functions)75 2442 y(\320)12 +b(made)g(rule)f(programming)f FB(muc)o(h)i FG(easier)m(.)p +75 2482 720 2 v 125 2509 a Fs(8)142 2525 y Fz(The)d(original)g(V)-5 +b(olcano)8 b(speci\256cation)f(had)i(13400)e(lines,)i(the)g(Prairie)h +(speci\256cation)d(had)i(12100)e(lines,)i(and)g(the)g(P2V)l(-generated) +75 2575 y(V)-5 b(olcano)8 b(speci\256cation)f(had)i(15800)e(lines.)952 +2793 y FG(16)p eop +%%Page: 17 17 +17 16 bop 75 14 a Fy(4.3)50 b(P)o(erf)o(ormance)13 b(r)o(esults)g +(using)f(the)f(Open)h(OODB)g(optimizer)75 107 y FG(The)d(acid)g(test)g +(of)g(Prairie)h(was)f(whether)g(Prairie)g(speci\256cations)f(could)h +(be)g(translated)f(into)g(ef)o(\256cient)i(optimizer)75 +169 y(implementations.)k(Our)7 b(e)o(xperiments)g(using)f(the)h(Open)g +(OODB)h(consisted)d(of)j(optimizing)d(8)j(dif)o(ferent)f(queries)75 +231 y(using)j(the)h(two)f(query)h(optimizers)f(generated,)h(respecti)o +(v)o(ely)m(,)g(using)f(Prairie)h(and)g(using)f(V)-6 b(olcano)10 +b(directly)g(\(in)75 294 y(the)h(remainder)g(of)g(this)f(section,)g(we) +i(will)e(use)g(\252Prairie\272)i(and)f(\252V)-6 b(olcano\272)11 +b(to)f(denote)h(these)f(two)g(approaches\).)75 356 y(There)k(were)h(4)f +(distinct)e(e)o(xpressions)g(that)i(were)g(used)g(to)g(generate)g(the)f +(queries)h(used)g(in)f(the)h(e)o(xperiments;)75 418 y(these)d(are)h +(sho)o(wn)e(in)g(Figure)h(9.)17 b(Each)11 b(e)o(xpression)f(represents) +h(an)g Fw(N)5 b FG(-way)10 b(join)g(query)h(for)h(v)o(arying)e +Fw(N)5 b FG(.)137 480 y(The)15 b(\256rst)f(e)o(xpression)g(E1)g(is)g(a) +h(simple)f(retrie)o(v)o(al)g(and)g(join)g(of)h(base)f(classes.)26 +b(The)15 b(second,)g(E2,)h(is)e(also)75 542 y(a)h(join)e(of)h(base)g +(classes;)h(ho)o(we)o(v)o(er)n(,)g(after)g(each)g(class)f(retrie)o(v)o +(al,)g(an)h(attrib)o(ute)e(has)h(to)g(be)g(materialized)g(\(i.e.,)75 +604 y(brought)e(into)h(vie)o(w\))g(before)h(the)g(join.)23 +b(The)14 b(third)f(and)g(fourth)h(e)o(xpressions)e(\(E3)i(and)f(E4\))h +(are)g(the)g(same)g(as)75 666 y(the)d(\256rst)g(and)f(second)h(\(E1)f +(and)h(E2\))g(respecti)o(v)o(ely)m(,)f(e)o(xcept)h(that)g(there)g(is)f +(a)i(selection)d(of)i(attrib)o(utes)f(\(the)h(select)75 +728 y(operator)g(is)f(the)h(root)g(of)g(the)g(e)o(xpressions\).)786 +712 y Ft(9)137 790 y FG(The)i(algebra)h(that)f(was)f(used)h(in)g(the)g +(Prairie)h(and)f(V)-6 b(olcano)13 b(optimizers)f(for)i(our)f(e)o +(xperiments)g(consisted)75 852 y(of)f(5)g(relational)f(operators)h +(SELECT)m(,)g(PR)n(OJECT)m(,)g(JOIN,)g(RET)h(and)f(UNNEST)f(\(for)i +(set-v)o(alued)e(attrib)o(utes\))75 915 y(and)g(an)g(object-oriented)e +(operator)h(called)h(MA)-5 b(T)11 b(\(for)g(MA)-5 b(T)m(erialize;)11 +b(it)f(is)g(fundamentally)g(a)h(pointer)o(-chasing)75 +977 y(operator)g(for)g(attrib)o(utes)f(of)h(a)h(class\).)k(There)11 +b(were)h(8)f(algorithms.)137 1039 y(There)16 b(are)h(man)o(y)f +(parameters)h(that)e(can)h(be)g(v)o(aried)g(when)f(benchmarking)g(a)i +(query)e(optimizer)m(.)31 b(Since)75 1101 y(our)12 b(objecti)o(v)o(e)f +(was)h(to)g(v)o(erify)g(that)f(the)h(Prairie)h(approach)f(did)f(not)h +(sacri\256ce)h(ef)o(\256cienc)o(y)m(,)g(our)f(criteria)g(for)g(the)75 +1163 y(queries)e(was)g(that)g(the)o(y)g(test)g(a)h(majority)e(of)i(the) +f(rules,)h(with)e(v)o(arying)g(properties)h(of)g(the)h(base)f(classes.) +16 b(T)l(o)10 b(this)75 1225 y(end,)g(we)f(tested)f(our)h(optimizer)f +(\(and)h(the)g(V)-6 b(olcano)9 b(optimizer\))f(with)g(8)h(dif)o(ferent) +g(queries)f(\(sho)o(wn)g(in)h(T)l(able)g(5\).)75 1287 +y(The)k(eight)e(queries)h(Q1)h(through)e(Q8)i(are)g(deri)o(v)o(ed)f +(from)i(the)e(4)h(e)o(xpressions)e(in)h(Figure)h(9.)21 +b(Each)12 b(e)o(xpression)75 1349 y(E1)f(through)g(E4)g(is)g(used)g(to) +h(obtain)e(two)h(queries)g(for)h(a)g(\256x)o(ed)g(number)g +Fw(N)k FG(of)c(JOINs)f(in)g(the)g(e)o(xpression.)17 b(The)75 +1411 y(only)12 b(dif)o(ference)i(between)f(the)g(two)f(queries)h +(obtained)f(from)i(an)g(e)o(xpression)e(is)h(that)f(the)i(\256rst)f +(one)g(does)g(not)75 1473 y(contain)8 b(an)o(y)g(indices)g(on)g(an)o(y) +h(classes,)g(whereas)f(the)h(second)f(one)g(contains)f(a)i(single)f +(inde)o(x)g(on)g(each)h(base)g(class)75 1536 y(occurring)j(in)g(the)g +(e)o(xpression.)19 b(In)12 b(e)o(xpressions)f(where)i(a)f(SELECT)h(is)e +(present)h(\(E3)g(and)h(E4\),)f(the)g(selection)75 1598 +y(predicate)e(is)f(a)h(conjunction)e(of)i(equality)f(predicates)g +FB(bc)989 1605 y Fv(i)1016 1598 y Fj(==)k FB(const)1195 +1605 y Fv(i)1209 1598 y FG(,)e(where)f FB(bc)1395 1605 +y Fv(i)1419 1598 y FG(is)f(an)h(attrib)o(ute)f(of)h(class)f +FB(C)1850 1605 y Fv(i)1864 1598 y FG(,)75 1660 y(and)j +FB(const)249 1667 y Fv(i)276 1660 y FG(is)g(a)h(constant)e(\(we)h +(arbitrarily)g(set)g(this)f(to)h Fw(i)p FG(,)h(because)f(its)g(v)o +(alue)g(doesn')o(t)f(af)o(fect)i(the)g(correctness)75 +1722 y(or)g(performance)g(of)g(the)f(optimizer\).)20 +b(In)13 b(addition,)e(for)i(queries)f(with)g(a)h(SELECT)f(and)g(whose)g +(base)h(classes)75 1784 y(ha)o(v)o(e)j(indices)e(\(Q6)h(and)g(Q8)g(in)g +(T)l(able)h(5\),)g(the)f(\(single\))g(inde)o(x)g(of)g(each)h(base)f +(class)g(was)f(chosen)h(to)g(be)g(the)75 1846 y(attrib)o(ute)8 +b(referenced)j(in)e(the)g(selection)g(predicate.)15 b(F)o(or)c(e)o +(xample,)f(class)g FB(C)1288 1853 y Fv(i)1312 1846 y +FG(was)f(chosen)g(to)g(ha)o(v)o(e)h(an)f(inde)o(x)h(on)75 +1908 y(attrib)o(ute)h FB(bc)281 1915 y Fv(i)295 1908 +y FG(.)21 b(The)12 b(join)f(predicates)h(for)h(each)g(JOIN)f(were)h +(chosen)f(at)g(random,)h(and)g(were)g(always)e(equality)75 +1970 y(predicates.)23 b(The)13 b(choice)g(of)g(JOIN)g(predicates)g(was) +g(such)g(that)f(the)h(queries)g(corresponded)g(to)f(linear)h(query)75 +2032 y(graphs.)j(In)11 b(the)g(future,)g(we)h(will)e(e)o(xperiment)h +(with)f(non-linear)g(\(e.g.,)j(star\))e(query)g(graphs.)137 +2094 y(T)l(able)e(5)g(also)g(sho)o(ws)f(the)g(number)i(of)f(trans)p +835 2094 14 2 v 15 w(rules)g(and)g(impl)p 1107 2094 V +16 w(rules)f(that)h(are)g(matched)h(by)e(each)i(e)o(xpression.)75 +2157 y(These)i(are)i(the)e(rules)g(whose)g(left)g(hand)g(sides)g(match) +h(a)g(sub-e)o(xpression.)19 b(Ho)o(we)o(v)o(er)n(,)13 +b(not)f(all)g(the)h(rules)f(were)75 2219 y(necessarily)7 +b(applicable.)14 b(F)o(or)8 b(instance,)g(an)g(impl)p +875 2219 V 16 w(rule)f(with)g(an)g(inde)o(x)g(scan)h(would)e(not)h +(apply)f(to)i(Q3,)g(although)75 2281 y(it)j(might)f(apply)g(to)h(Q4.) +137 2343 y(Queries)g(Q1)g(through)f(Q8)h(were)h(optimized)e(for)h +(increasing)f(number)i Fw(N)k FG(of)11 b(JOINs.)16 b(F)o(or)c(a)f +(\256x)o(ed)h(number)p 75 2383 720 2 v 125 2410 a Fs(9)142 +2426 y Fz(The)c(most)g(comple)o(x)g(e)o(xpression)e(E4)i(consists)f(of) +i(all)g(operators)e(in)i(the)f(algebra,)g(e)o(xcept)f(PR)o(OJECT)g(and) +g(UNNEST)m(.)i(PR)o(OJECT)75 2476 y(was)e(not)h(considered)f(because)f +(it)j(appeared)d(in)j(only)f(one)f(impl)p 912 2476 12 +2 v 14 w(rule)i(and)e(no)h(trans)p 1174 2476 V 13 w(rules,)h(and)e +(thus,)i(would)e(not)h(af)o(fect)h(the)f(size)g(of)g(the)75 +2527 y(search)g(space)f(of)i(abstract)f(e)o(xpressions.)k(UNNEST)c(was) +g(not)h(considered)e(because)g(it)j(appeared)d(in)i(e)o(xactly)f(one)h +(trans)p 1680 2527 V 13 w(rule)g(and)f(one)75 2577 y(impl)p +145 2577 V 14 w(rule;)i(including)e(it)i(in)f(our)g(queries)f(would)g +(ha)o(v)o(e)g(increased)g(the)g(number)h(of)g(parameters)f(that)h +(could)f(af)o(fect)h(our)g(run-times.)14 b(W)m(e)75 2627 +y(preferred)9 b(to)h(concentrate)d(on)i(simple)g(JOIN)g(e)o +(xpressions.)952 2793 y FG(17)p eop +%%Page: 18 18 +18 17 bop 90 12 1761 2 v 90 655 2 644 v 164 500 a + tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + 164 +500 a Fb(C)186 505 y Fs(1)152 431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 152 431 a Fo(RET)183 +491 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 + 183 491 a 305 500 a + tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + 305 500 a Fb(C)328 505 y Fs(2)294 +431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 294 431 a Fo(RET)183 491 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 + 183 491 a 218 360 a + tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 { +.5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end + +218 360 a Fo(JOIN)183 491 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 + 183 491 a 183 491 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 + 183 491 +a 325 279 a + tx@Dict begin 45. Rot end + 325 279 a 304 281 a + tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 +0.0 false .5 9.91681 InitRnode } NewNode end end + 304 281 a Fv(:)6 b(:)g(:)325 +279 y + tx@Dict begin 45. neg Rot end + 325 279 a 183 491 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 + 183 491 a 436 290 a + tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 436 290 +a Fo(RET)445 359 y + tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0 +false .5 10.45403 InitRnode } NewNode end end + 445 359 a Fb(C)467 363 y Fh(n)183 +491 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 + 183 491 a 360 219 a + tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999 +false .5 17.328 InitRnode } NewNode end end + 360 219 a Fo(JOIN)183 491 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 + +183 491 a 183 491 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 + 183 491 a 279 595 a Fz(\(a\))k(E1)p +545 643 2 619 v 594 500 a + tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + 594 500 a Fb(C)616 505 y Fs(1)583 +431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 583 431 a Fo(RET)614 491 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 + 614 491 a 736 500 a + tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + +736 500 a Fb(C)758 505 y Fs(2)724 431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 724 431 a Fo(RET)614 +491 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 + 614 491 a 579 361 a + tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.384 +0.0 false .5 16.888 InitRnode } NewNode end end + 579 361 a Fo(MA)l(T)614 491 +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 + 614 491 a 721 361 a + tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.384 +0.0 false .5 16.888 InitRnode } NewNode end end + 721 361 a Fo(MA)l(T)614 491 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 + 614 +491 a 649 289 a + tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2 +16 { .5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end + 649 289 a Fo(JOIN)614 491 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 + 614 491 a +614 491 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 + 614 491 a 756 208 a + tx@Dict begin 45. Rot end + 756 208 a 735 210 a + tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 +0.0 false .5 9.91681 InitRnode } NewNode end end + 735 +210 a Fv(:)c(:)f(:)756 208 y + tx@Dict begin 45. neg Rot end + 756 208 a 614 491 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 + 614 +491 a 866 290 a + tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 866 290 a Fo(RET)876 359 y + tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0 +false .5 10.45403 InitRnode } NewNode end end + 876 359 a +Fb(C)898 363 y Fh(n)614 491 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 + 614 491 a 862 219 a + tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.384 +0.0 false .5 16.888 InitRnode } NewNode end end + 862 +219 a Fo(MA)l(T)614 491 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 + 614 491 a 791 148 a + tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999 +false .5 17.328 InitRnode } NewNode end end + 791 148 +a Fo(JOIN)614 491 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 + 614 491 a 614 491 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 + 614 491 a 708 +595 a Fz(\(b\))10 b(E2)p 975 643 2 619 v 1025 500 a + tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + 1025 +500 a Fb(C)1047 505 y Fs(1)1013 431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 1013 431 a Fo(RET)1044 +491 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 + 1044 491 a 1166 500 a + tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + 1166 500 a Fb(C)1188 505 +y Fs(2)1155 431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 1155 431 a Fo(RET)1044 491 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 + 1044 491 +a 1079 360 a + tx@Dict begin tx@NodeDict begin { } /TheNodejoingetcl1getcl2 16 { +.5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end + 1079 360 a Fo(JOIN)1044 491 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 + 1044 491 a +1044 491 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 + 1044 491 a 1186 279 a + tx@Dict begin 45. Rot end + 1186 279 a 1165 281 +a + tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 +0.0 false .5 9.91681 InitRnode } NewNode end end + 1165 281 a Fv(:)c(:)g(:)1186 279 y + tx@Dict begin 45. neg Rot end + 1186 279 a 1044 +491 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 + 1044 491 a 1296 290 a + tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 1296 290 a Fo(RET)1306 359 +y + tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0 +false .5 10.45403 InitRnode } NewNode end end + 1306 359 a Fb(C)1328 363 y Fh(n)1044 491 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 + 1044 491 +a 1221 219 a + tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999 +false .5 17.328 InitRnode } NewNode end end + 1221 219 a Fo(JOIN)1044 491 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 + 1044 491 a +1044 491 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 + 1044 491 a 1196 148 a + tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.384 +0.09999 false .5 29.336 InitRnode } NewNode end end + 1196 148 a Fo(SELECT)1044 +491 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 + 1044 491 a 1140 595 a Fz(\(c\))k(E3)p 1405 643 +2 619 v 1455 500 a + tx@Dict begin tx@NodeDict begin { } /TheNodecl1 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + 1455 500 a Fb(C)1477 505 y Fs(1)1443 +431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl1 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 1443 431 a Fo(RET)1475 491 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 + 1475 491 a 1597 500 +a + tx@Dict begin tx@NodeDict begin { } /TheNodecl2 16 { .5 5.40799 1.1111 +false .5 9.50261 InitRnode } NewNode end end + 1597 500 a Fb(C)1619 505 y Fs(2)1585 431 y + tx@Dict begin tx@NodeDict begin { } /TheNodegetcl2 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 1585 431 +a Fo(RET)1475 491 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 + 1475 491 a 1440 361 a + tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl1 16 { .5 5.384 +0.0 false .5 16.888 InitRnode } NewNode end end + 1440 361 a +Fo(MA)l(T)1475 491 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 + 1475 491 a 1581 361 a + tx@Dict begin tx@NodeDict begin { } /TheNodematgetcl2 16 { .5 5.384 +0.0 false .5 16.888 InitRnode } NewNode end end + 1581 361 a +Fo(MA)l(T)1475 491 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 + 1475 491 a 1510 289 a + tx@Dict begin tx@NodeDict begin { } /TheNodejoinmatgetcl1matgetcl2 +16 { .5 5.384 0.09999 false .5 17.328 InitRnode } NewNode end end + 1510 289 a +Fo(JOIN)1475 491 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 + 1475 491 a 1475 491 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 + 1475 491 a 1616 +208 a + tx@Dict begin 45. Rot end + 1616 208 a 1595 210 a + tx@Dict begin tx@NodeDict begin { } /TheNodedots 16 { .5 0.88889 +0.0 false .5 9.91681 InitRnode } NewNode end end + 1595 210 a Fv(:)d(:)e(:)1616 +208 y + tx@Dict begin 45. neg Rot end + 1616 208 a 1475 491 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 + 1475 491 a 1727 290 a + tx@Dict begin tx@NodeDict begin { } /TheNodegetcln 16 { .5 5.384 +0.0 false .5 15.112 InitRnode } NewNode end end + 1727 +290 a Fo(RET)1737 359 y + tx@Dict begin tx@NodeDict begin { } /TheNodecln 16 { .5 5.40799 1.0 +false .5 10.45403 InitRnode } NewNode end end + 1737 359 a Fb(C)1759 363 y Fh(n)1475 +491 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 + 1475 491 a 1723 219 a + tx@Dict begin tx@NodeDict begin { } /TheNodematgetcln 16 { .5 5.384 +0.0 false .5 16.888 InitRnode } NewNode end end + 1723 219 a Fo(MA)l(T)1475 +491 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 + 1475 491 a 1651 148 a + tx@Dict begin tx@NodeDict begin { } /TheNoderoot 16 { .5 5.384 0.09999 +false .5 17.328 InitRnode } NewNode end end + 1651 148 a Fo(JOIN)1475 491 +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 + 1475 491 a 1475 491 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 + 1475 491 a 1626 77 a + tx@Dict begin tx@NodeDict begin { } /TheNodeselect 16 { .5 5.384 +0.09999 false .5 29.336 InitRnode } NewNode end end + 1626 77 +a Fo(SELECT)1475 491 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 + 1475 491 a 1569 595 a Fz(\(d\))10 +b(E4)p 1850 655 2 644 v 90 657 1761 2 v 1850 665 10 647 +v 99 665 1761 10 v 382 769 a FG(Figure)h(9:)16 b(Expressions)9 +b(used)i(in)f(generating)g(queries)h(for)g(e)o(xperiments)p +484 918 983 7 v 484 968 2 51 v 510 977 a Fq(Query)p 637 +968 V 663 981 a(Indices?)p 821 968 V 848 977 a(Expr)o(ession)p +1048 968 V 1140 953 a(Rules)d(matched)p 1465 968 V 1050 +970 417 2 v 484 1018 2 51 v 637 1018 V 821 1018 V 1048 +1018 V 1075 1003 a Fz(trans)p 1150 1003 12 2 v 13 w(rules)p +1259 1018 2 51 v 51 w(impl)p 1355 1003 12 2 v 14 w(rules)p +1465 1018 2 51 v 484 1025 983 7 v 484 1075 2 51 v 538 +1060 a(Q1)p 637 1075 V 123 w(No)p 821 1075 V 915 1087 +a(E1)p 1048 1075 V 188 w(3)p 1259 1075 V 189 w(3)p 1465 +1075 V 484 1076 340 2 v 484 1125 2 51 v 538 1110 a(Q2)p +637 1125 V 119 w(Y)l(es)p 821 1125 V 1048 1125 V 1259 +1125 V 1465 1125 V 484 1127 983 2 v 484 1177 2 51 v 538 +1162 a(Q3)p 637 1177 V 123 w(No)p 821 1177 V 915 1190 +a(E2)p 1048 1177 V 1145 1189 a(8)p 1259 1177 V 1353 1190 +a(4)p 1465 1177 V 484 1179 340 2 v 484 1227 2 51 v 538 +1212 a(Q4)p 637 1227 V 119 w(Y)l(es)p 821 1227 V 1048 +1227 V 1259 1227 V 1465 1227 V 484 1229 983 2 v 484 1279 +2 51 v 538 1264 a(Q5)p 637 1279 V 123 w(No)p 821 1279 +V 915 1291 a(E3)p 1048 1279 V 188 w(9)p 1259 1279 V 1353 +1292 a(5)p 1465 1279 V 484 1281 340 2 v 484 1329 2 51 +v 538 1314 a(Q6)p 637 1329 V 119 w(Y)l(es)p 821 1329 +V 1048 1329 V 1259 1329 V 1465 1329 V 484 1331 983 2 +v 484 1381 2 51 v 538 1366 a(Q7)p 637 1381 V 123 w(No)p +821 1381 V 915 1394 a(E4)p 1048 1381 V 179 w(16)p 1259 +1381 V 179 w(7)p 1465 1381 V 484 1383 340 2 v 484 1431 +2 51 v 538 1416 a(Q8)p 637 1431 V 119 w(Y)l(es)p 821 +1431 V 1048 1431 V 1259 1431 V 1465 1431 V 484 1438 983 +7 v 636 1515 a FG(T)l(able)j(5:)16 b(Queries)10 b(used)h(in)g(e)o +(xperiments)75 1695 y(of)j(JOINs)g(in)g(a)g(query)m(,)h(we)g(v)o(aried) +f(the)f(cardinalities)g(of)h(the)g(base)g(classes)g(5)g(times,)h(each)g +(time)f(generating)75 1757 y(a)i(query)f(with)g(dif)o(ferent)g(class)g +(properties,)h(and)f(a)o(v)o(eraged)i(the)e(run-times)g(o)o(v)o(er)h +(the)f(5)h(query)f(instances)g(to)75 1819 y(generate)d(the)g(per)o +(-query)g(optimization)e(time.)20 b(Thus,)11 b(each)i(point)e(in)g(our) +h(graphs)g(represents)f(the)h(a)o(v)o(erage)h(of)75 1881 +y(5)f(queries.)18 b(The)12 b(run-times)f(were)h(measured)814 +1865 y Ft(10)864 1881 y FG(using)f(the)g(GNU)h Fc(time)h +FG(command.)19 b(All)11 b(e)o(xperiments)h(were)75 1944 +y(performed)g(on)e(a)i(lightly)d(loaded)i(DECstation)e(5000/200)g +(running)h(Ultrix)g(4.2.)137 2006 y(The)j(optimization)e(times)i(for)h +(each)f(query)g(for)h(both)e(approaches)h(\(Prairie)g(and)g(V)-6 +b(olcano\))13 b(are)h(sho)o(wn)e(in)75 2068 y(Figures)e(10)h(through)e +(13.)16 b(The)11 b(number)f(of)h(joins)e(in)i(each)g(set)f(of)h(graphs) +f(was)g(v)o(aried)h(to)f(a)h(maximum)g(of)g(8,)g(or)75 +2130 y(until)f(virtual)g(memory)i(was)e(e)o(xhausted.)137 +2192 y(The)f(\256rst)g(set)f(of)h(graphs,)g(in)f(Figure)h(10)g(sho)o +(ws)e(the)i(performance)g(of)g(a)g(simple)g(relational-type)e(query)m +(.)15 b(The)75 2254 y(optimization)d(times)h(are)h(almost)f(identical)g +(between)g(Prairie)h(and)f(V)-6 b(olcano,)14 b(and)g(the)f(notable)f +(point)h(is)g(that)75 2316 y(the)d(presence)h(of)g(an)f(inde)o(x)g +(does)g(not)g(change)g(the)h(optimizer')m(s)f(beha)o(vior)n(,)h(i.e.,)g +(the)g(two)e(graphs)h(are)h(identical.)75 2378 y(This)f(arises)h +(because)g(the)g(optimizer)f(algebra)h(had)g(only)f(two)g(join)g +(algorithms)f(\(pointer)h(join)g(and)h(hash)g(join\),)75 +2440 y(neither)g(of)g(which)f(makes)h(use)g(of)g(an)o(y)h(indices.)137 +2502 y(The)i(second)g(set)g(of)g(graphs)f(\(Figure)h(11\))g(sho)o(ws)f +(the)h(results)f(of)h(optimizing)e(Q3)i(and)g(Q4.)25 +b(Here,)15 b(as)g(in)p 75 2543 720 2 v 110 2570 a Fs(10)142 +2586 y Fz(Since)10 b(the)g(run-times)g(were)g(too)g(small)g(to)h(be)e +(measured)g(accurately)f(with)j Fa(time)p Fz(,)i(each)8 +b(query)i(instance)f(was)g(optimized)g(3000)75 2636 y(times)g(\(in)h(a) +f(loop\))g(and)g(the)g(total)g(time)h(was)e(di)o(vided)h(by)f(3000)g +(to)i(get)f(the)g(per)o(-query)g(optimization)g(time.)952 +2793 y FG(18)p eop +%%Page: 19 19 +19 18 bop 88 12 1766 2 v 88 909 2 898 v 149 744 a @beginspecial +18 @llx 18 @lly 552 @urx 482 @ury 1872 @rwi @setspecial +%%BeginDocument: runtime.Q1.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +621 376 m +621 396 l +822 376 m +822 396 l +1023 376 m +1023 396 l +1225 376 m +1225 396 l +1426 376 m +1426 396 l +1627 376 m +1627 396 l +1828 376 m +1828 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +621 1785 m +621 1765 l +822 1785 m +822 1765 l +1023 1785 m +1023 1765 l +1225 1785 m +1225 1765 l +1426 1785 m +1426 1765 l +1627 1785 m +1627 1765 l +1828 1785 m +1828 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +621 300 m +gsave +621 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +822 300 m +gsave +822 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +1023 300 m +gsave +1023 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +1225 300 m +gsave +1225 300 translate +0 rotate +0 -30 m +(4) CS +(4) show +grestore +newpath +1426 300 m +gsave +1426 300 translate +0 rotate +0 -30 m +(5) CS +(5) show +grestore +newpath +1627 300 m +gsave +1627 300 translate +0 rotate +0 -30 m +(6) CS +(6) show +grestore +newpath +1828 300 m +gsave +1828 300 translate +0 rotate +0 -30 m +(7) CS +(7) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(8) CS +(8) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +440 376 l +420 611 m +440 611 l +420 846 m +440 846 l +420 1081 m +440 1081 l +420 1315 m +440 1315 l +420 1550 m +440 1550 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 611 m +2010 611 l +2030 846 m +2010 846 l +2030 1081 m +2010 1081 l +2030 1315 m +2010 1315 l +2030 1550 m +2010 1550 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 611 m +gsave +366 611 translate +0 rotate +0 -30 m +(500) RJ +(500) show +grestore +newpath +366 846 m +gsave +366 846 translate +0 rotate +0 -30 m +(1000) RJ +(1000) show +grestore +newpath +366 1081 m +gsave +366 1081 translate +0 rotate +0 -30 m +(1500) RJ +(1500) show +grestore +newpath +366 1315 m +gsave +366 1315 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 1550 m +gsave +366 1550 translate +0 rotate +0 -30 m +(2500) RJ +(2500) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(3000) RJ +(3000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +100 1080 m +gsave +100 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 1) CS +(Average CPU Time for Query 1) show +grestore +newpath +420 418 m +621 537 l +822 661 l +1023 789 l +1225 909 l +1426 1046 l +1627 1183 l +1828 1320 l +2030 1449 l +stroke +420 418 30 0 360 arc +gsave fill grestore +stroke +621 537 30 0 360 arc +gsave fill grestore +stroke +822 661 30 0 360 arc +gsave fill grestore +stroke +1023 789 30 0 360 arc +gsave fill grestore +stroke +1225 909 30 0 360 arc +gsave fill grestore +stroke +1426 1046 30 0 360 arc +gsave fill grestore +stroke +1627 1183 30 0 360 arc +gsave fill grestore +stroke +1828 1320 30 0 360 arc +gsave fill grestore +stroke +2030 1449 30 0 360 arc +gsave fill grestore +stroke +420 421 m +621 541 l +822 670 l +1023 801 l +1225 935 l +1426 1066 l +1627 1229 l +1828 1355 l +2030 1504 l +stroke +420 451 m +390 421 l +420 391 l +450 421 l +closepath +gsave eofill grestore +stroke +621 571 m +591 541 l +621 511 l +651 541 l +closepath +gsave eofill grestore +stroke +822 700 m +792 670 l +822 640 l +852 670 l +closepath +gsave eofill grestore +stroke +1023 831 m +993 801 l +1023 771 l +1053 801 l +closepath +gsave eofill grestore +stroke +1225 965 m +1195 935 l +1225 905 l +1255 935 l +closepath +gsave eofill grestore +stroke +1426 1096 m +1396 1066 l +1426 1036 l +1456 1066 l +closepath +gsave eofill grestore +stroke +1627 1259 m +1597 1229 l +1627 1199 l +1657 1229 l +closepath +gsave eofill grestore +stroke +1828 1385 m +1798 1355 l +1828 1325 l +1858 1355 l +closepath +gsave eofill grestore +stroke +2030 1534 m +2000 1504 l +2030 1474 l +2060 1504 l +closepath +gsave eofill grestore +stroke +420 418 m +621 537 l +822 661 l +1023 789 l +1225 909 l +1426 1046 l +1627 1183 l +1828 1320 l +2030 1449 l +stroke +420 421 m +621 541 l +822 670 l +1023 801 l +1225 935 l +1426 1066 l +1627 1229 l +1828 1355 l +2030 1504 l +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 453 847 a Fz(\(a\))10 b(Query)e(1)p 976 +897 2 873 v 1013 744 a @beginspecial 18 @llx 18 @lly +552 @urx 482 @ury 1872 @rwi @setspecial +%%BeginDocument: runtime.Q2.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +621 376 m +621 396 l +822 376 m +822 396 l +1023 376 m +1023 396 l +1225 376 m +1225 396 l +1426 376 m +1426 396 l +1627 376 m +1627 396 l +1828 376 m +1828 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +621 1785 m +621 1765 l +822 1785 m +822 1765 l +1023 1785 m +1023 1765 l +1225 1785 m +1225 1765 l +1426 1785 m +1426 1765 l +1627 1785 m +1627 1765 l +1828 1785 m +1828 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +621 300 m +gsave +621 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +822 300 m +gsave +822 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +1023 300 m +gsave +1023 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +1225 300 m +gsave +1225 300 translate +0 rotate +0 -30 m +(4) CS +(4) show +grestore +newpath +1426 300 m +gsave +1426 300 translate +0 rotate +0 -30 m +(5) CS +(5) show +grestore +newpath +1627 300 m +gsave +1627 300 translate +0 rotate +0 -30 m +(6) CS +(6) show +grestore +newpath +1828 300 m +gsave +1828 300 translate +0 rotate +0 -30 m +(7) CS +(7) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(8) CS +(8) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +440 376 l +420 611 m +440 611 l +420 846 m +440 846 l +420 1081 m +440 1081 l +420 1315 m +440 1315 l +420 1550 m +440 1550 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 611 m +2010 611 l +2030 846 m +2010 846 l +2030 1081 m +2010 1081 l +2030 1315 m +2010 1315 l +2030 1550 m +2010 1550 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 611 m +gsave +366 611 translate +0 rotate +0 -30 m +(500) RJ +(500) show +grestore +newpath +366 846 m +gsave +366 846 translate +0 rotate +0 -30 m +(1000) RJ +(1000) show +grestore +newpath +366 1081 m +gsave +366 1081 translate +0 rotate +0 -30 m +(1500) RJ +(1500) show +grestore +newpath +366 1315 m +gsave +366 1315 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 1550 m +gsave +366 1550 translate +0 rotate +0 -30 m +(2500) RJ +(2500) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(3000) RJ +(3000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +100 1080 m +gsave +100 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 2) CS +(Average CPU Time for Query 2) show +grestore +newpath +420 418 m +621 539 l +822 664 l +1023 783 l +1225 906 l +1426 1037 l +1627 1176 l +1828 1304 l +2030 1451 l +stroke +420 418 30 0 360 arc +gsave fill grestore +stroke +621 539 30 0 360 arc +gsave fill grestore +stroke +822 664 30 0 360 arc +gsave fill grestore +stroke +1023 783 30 0 360 arc +gsave fill grestore +stroke +1225 906 30 0 360 arc +gsave fill grestore +stroke +1426 1037 30 0 360 arc +gsave fill grestore +stroke +1627 1176 30 0 360 arc +gsave fill grestore +stroke +1828 1304 30 0 360 arc +gsave fill grestore +stroke +2030 1451 30 0 360 arc +gsave fill grestore +stroke +420 412 m +621 533 l +822 661 l +1023 796 l +1225 926 l +1426 1063 l +1627 1212 l +1828 1355 l +2030 1504 l +stroke +420 442 m +390 412 l +420 382 l +450 412 l +closepath +gsave eofill grestore +stroke +621 563 m +591 533 l +621 503 l +651 533 l +closepath +gsave eofill grestore +stroke +822 691 m +792 661 l +822 631 l +852 661 l +closepath +gsave eofill grestore +stroke +1023 826 m +993 796 l +1023 766 l +1053 796 l +closepath +gsave eofill grestore +stroke +1225 956 m +1195 926 l +1225 896 l +1255 926 l +closepath +gsave eofill grestore +stroke +1426 1093 m +1396 1063 l +1426 1033 l +1456 1063 l +closepath +gsave eofill grestore +stroke +1627 1242 m +1597 1212 l +1627 1182 l +1657 1212 l +closepath +gsave eofill grestore +stroke +1828 1385 m +1798 1355 l +1828 1325 l +1858 1355 l +closepath +gsave eofill grestore +stroke +2030 1534 m +2000 1504 l +2030 1474 l +2060 1504 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 1316 847 a(\(b\))h(Query)g(2)p 1852 909 +2 898 v 88 911 1766 2 v 1853 919 10 901 v 96 919 1766 +10 v 503 1023 a FG(Figure)i(10:)k(Query)c(optimization)e(times)i(for)h +(Q1)f(and)g(Q2)75 1203 y(Figure)h(10,)h(the)f(presence)h(\(or)f +(absence\))h(of)f(indices)g(makes)g(no)g(dif)o(ference.)21 +b(Both)12 b(the)g(Prairie)h(and)f(V)-6 b(olcano)75 1265 +y(approaches)13 b(ha)o(v)o(e)h(comparable)g(run-times.)22 +b(The)14 b(sharp)f(jump)g(in)g(the)g(graphs)g(from)h(7-way)f(to)g +(8-way)g(joins)75 1327 y(is)g(due)g(to)g(the)g(fact)g(that)g(since)g +(all)g(optimization)e(is)i(done)g(in)f(main)i(memory)m(,)h(dynamic)e +(memory)h(allocation)75 1389 y(\(caused)g(by)f Fc(malloc)i +FG(calls\))f(results)e(in)h(a)h(lot)f(of)h(thrashing)e(at)i(this)e +(point.)23 b(W)l(e)14 b(speculate)f(that)g(in)g(systems)75 +1451 y(with)d(more)i(virtual)e(memory)m(,)i(the)f(graphs)g(will)f(be)h +(smoother)m(.)137 1514 y(The)16 b(third)f(and)h(fourth)f(sets)h(of)g +(graphs)f(in)h(Figures)g(12)f(and)h(13)g(are)g(optimizations)e(of)i +(queries)g(with)f(a)75 1576 y(selection)h(predicate.)34 +b(In)17 b(these)f(cases,)j(the)e(presence)g(of)g(an)g(inde)o(x)g(makes) +g(a)g(dif)o(ference)g(if)g(the)g(inde)o(x)g(is)75 1638 +y(referenced)c(in)f(the)g(selection)f(predicate)h(\(as)g(we)h +(designed\).)18 b(Also,)12 b(in)g(these)g(two)f(\256gures,)h(the)g +(performance)75 1700 y(of)g(both)f(Prairie)h(and)g(V)-6 +b(olcano)12 b(was)f(almost)g(identical,)h(e)o(xcept)g(that)f(Prairie)i +(does)e(slightly)f(worse)h(due)h(to)f(the)75 1762 y(lar)o(ger)j(number) +f(of)j Fc(malloc)f FG(calls)e(that)g(the)g(P2V)g(translator)f +(introduces.)22 b(Also,)13 b(note)g(that)g(we)h(could)e(only)75 +1824 y(go)i(up)g(to)g(3-way)g(joins)g(before)g(virtual)g(memory)h(was)f +(e)o(xhausted.)26 b(As)14 b(the)g(a)o(v)o(ailable)g(memory)i +(decreases,)75 1886 y(there)10 b(is)f(increased)h(thrashing)e(\(as)i +(sho)o(wn)f(by)g(the)h(sharp)f(changes)h(in)f(slope)g(in)g(the)h +(plots\))e(resulting)g(in)i(a)g(much)75 1948 y(slo)o(wer)g +(optimization)g(process.)137 2010 y(In)15 b(all)e(four)h(sets)g(of)g +(plots,)g(we)h(can)f(see)h(that)e(Prairie)i(performs)f(with)f(almost)h +(\(less)g(than)f Fj(5\045)h FG(v)o(ariation\))75 2072 +y(the)c(same)i(ef)o(\256cienc)o(y)f(as)f(V)-6 b(olcano.)16 +b(In)11 b(e)o(xtreme)g(cases,)g(when)g(memory)g(is)f(scarce,)i(Prairie) +f(runs)f(more)h(slo)o(wly)75 2135 y(\(about)17 b Fj(15\045)p +FG(\))g(\(e.g.,)k(Figure)c(12\(b\)\),)j(b)o(ut)d(we)g(belie)o(v)o(e)h +(that)f(this)f(situation)g(already)h(represents)g(a)h(serious)75 +2197 y(bottleneck)10 b(for)h(both)f(V)-6 b(olcano)11 +b(and)g(Prairie.)137 2259 y(Figure)g(14)g(sho)o(ws)f(the)g(v)o +(ariation)g(of)h(the)g(number)g(of)g(equi)o(v)o(alence)f(classes)h +(\(the)o(y)g(are)h(the)f(same)g(in)g(Prairie)75 2321 +y(and)i(V)-6 b(olcano\))13 b(as)g(a)h(function)d(of)j(the)f(number)g +(of)g(joins)f(in)h(the)g(query)m(.)22 b(The)13 b(gro)o(wth)f(rate)i(of) +f(the)g(number)g(of)75 2383 y(equi)o(v)o(alence)f(classes)g(increases)g +(with)g(the)g(increase)h(in)f(the)g(comple)o(xity)g(of)h(the)f(e)o +(xpressions.)20 b(In)12 b(particular)n(,)75 2445 y(for)f(E3)g(and)g +(E4,)g(the)g(introduction)d(of)j(the)g(SELECT)g(operator)f(results)g +(in)h(a)g(dramatic)g(increase)h(in)e(the)h(search)75 +2507 y(space,)i(since)e(this)g(operator)h(has)g(man)o(y)g(interactions) +f(with)g(the)g(other)h(operators)f(of)i(the)e(algebra;)h(this)f(is)h +(also)75 2569 y(re\257ected)e(in)e(T)l(able)h(5)g(where)g(E3)g(matches) +g(three)g(times)g(as)g(man)o(y)g(trans)p 1220 2569 14 +2 v 16 w(rules)f(as)h(E1)g(and)g(E4)f(matches)i(twice)e(as)75 +2631 y(man)o(y)i(trans)p 277 2631 V 16 w(rules)f(as)h(E2.)16 +b(The)10 b(lesson)e(to)i(be)g(learnt)f(here)h(is)g(that)f(e)o(xtending) +g(an)h(e)o(xisting)e(query)h(optimizer)h(by)952 2793 +y(19)p eop +%%Page: 20 20 +20 19 bop 88 12 1766 2 v 88 909 2 898 v 149 744 a @beginspecial +18 @llx 18 @lly 552 @urx 482 @ury 1872 @rwi @setspecial +%%BeginDocument: runtime.Q3.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +621 376 m +621 396 l +822 376 m +822 396 l +1023 376 m +1023 396 l +1225 376 m +1225 396 l +1426 376 m +1426 396 l +1627 376 m +1627 396 l +1828 376 m +1828 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +621 1785 m +621 1765 l +822 1785 m +822 1765 l +1023 1785 m +1023 1765 l +1225 1785 m +1225 1765 l +1426 1785 m +1426 1765 l +1627 1785 m +1627 1765 l +1828 1785 m +1828 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +621 300 m +gsave +621 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +822 300 m +gsave +822 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +1023 300 m +gsave +1023 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +1225 300 m +gsave +1225 300 translate +0 rotate +0 -30 m +(4) CS +(4) show +grestore +newpath +1426 300 m +gsave +1426 300 translate +0 rotate +0 -30 m +(5) CS +(5) show +grestore +newpath +1627 300 m +gsave +1627 300 translate +0 rotate +0 -30 m +(6) CS +(6) show +grestore +newpath +1828 300 m +gsave +1828 300 translate +0 rotate +0 -30 m +(7) CS +(7) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(8) CS +(8) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +440 376 l +420 517 m +440 517 l +420 658 m +440 658 l +420 799 m +440 799 l +420 940 m +440 940 l +420 1081 m +440 1081 l +420 1221 m +440 1221 l +420 1362 m +440 1362 l +420 1503 m +440 1503 l +420 1644 m +440 1644 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 517 m +2010 517 l +2030 658 m +2010 658 l +2030 799 m +2010 799 l +2030 940 m +2010 940 l +2030 1081 m +2010 1081 l +2030 1221 m +2010 1221 l +2030 1362 m +2010 1362 l +2030 1503 m +2010 1503 l +2030 1644 m +2010 1644 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 517 m +gsave +366 517 translate +0 rotate +0 -30 m +(500) RJ +(500) show +grestore +newpath +366 658 m +gsave +366 658 translate +0 rotate +0 -30 m +(1000) RJ +(1000) show +grestore +newpath +366 799 m +gsave +366 799 translate +0 rotate +0 -30 m +(1500) RJ +(1500) show +grestore +newpath +366 940 m +gsave +366 940 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 1081 m +gsave +366 1081 translate +0 rotate +0 -30 m +(2500) RJ +(2500) show +grestore +newpath +366 1221 m +gsave +366 1221 translate +0 rotate +0 -30 m +(3000) RJ +(3000) show +grestore +newpath +366 1362 m +gsave +366 1362 translate +0 rotate +0 -30 m +(3500) RJ +(3500) show +grestore +newpath +366 1503 m +gsave +366 1503 translate +0 rotate +0 -30 m +(4000) RJ +(4000) show +grestore +newpath +366 1644 m +gsave +366 1644 translate +0 rotate +0 -30 m +(4500) RJ +(4500) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(5000) RJ +(5000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +100 1080 m +gsave +100 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 3) CS +(Average CPU Time for Query 3) show +grestore +newpath +420 401 m +621 489 l +822 578 l +1023 672 l +1225 762 l +1426 865 l +1627 969 l +1828 1076 l +2030 1574 l +stroke +420 401 30 0 360 arc +gsave fill grestore +stroke +621 489 30 0 360 arc +gsave fill grestore +stroke +822 578 30 0 360 arc +gsave fill grestore +stroke +1023 672 30 0 360 arc +gsave fill grestore +stroke +1225 762 30 0 360 arc +gsave fill grestore +stroke +1426 865 30 0 360 arc +gsave fill grestore +stroke +1627 969 30 0 360 arc +gsave fill grestore +stroke +1828 1076 30 0 360 arc +gsave fill grestore +stroke +2030 1574 30 0 360 arc +gsave fill grestore +stroke +420 402 m +621 485 l +822 568 l +1023 644 l +1225 736 l +1426 821 l +1627 918 l +1828 1019 l +2030 1511 l +stroke +420 432 m +390 402 l +420 372 l +450 402 l +closepath +gsave eofill grestore +stroke +621 515 m +591 485 l +621 455 l +651 485 l +closepath +gsave eofill grestore +stroke +822 598 m +792 568 l +822 538 l +852 568 l +closepath +gsave eofill grestore +stroke +1023 674 m +993 644 l +1023 614 l +1053 644 l +closepath +gsave eofill grestore +stroke +1225 766 m +1195 736 l +1225 706 l +1255 736 l +closepath +gsave eofill grestore +stroke +1426 851 m +1396 821 l +1426 791 l +1456 821 l +closepath +gsave eofill grestore +stroke +1627 948 m +1597 918 l +1627 888 l +1657 918 l +closepath +gsave eofill grestore +stroke +1828 1049 m +1798 1019 l +1828 989 l +1858 1019 l +closepath +gsave eofill grestore +stroke +2030 1541 m +2000 1511 l +2030 1481 l +2060 1511 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 453 847 a Fz(\(a\))10 b(Query)e(3)p 976 +897 2 873 v 1013 744 a @beginspecial 18 @llx 18 @lly +552 @urx 482 @ury 1872 @rwi @setspecial +%%BeginDocument: runtime.Q4.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +621 376 m +621 396 l +822 376 m +822 396 l +1023 376 m +1023 396 l +1225 376 m +1225 396 l +1426 376 m +1426 396 l +1627 376 m +1627 396 l +1828 376 m +1828 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +621 1785 m +621 1765 l +822 1785 m +822 1765 l +1023 1785 m +1023 1765 l +1225 1785 m +1225 1765 l +1426 1785 m +1426 1765 l +1627 1785 m +1627 1765 l +1828 1785 m +1828 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +621 300 m +gsave +621 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +822 300 m +gsave +822 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +1023 300 m +gsave +1023 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +1225 300 m +gsave +1225 300 translate +0 rotate +0 -30 m +(4) CS +(4) show +grestore +newpath +1426 300 m +gsave +1426 300 translate +0 rotate +0 -30 m +(5) CS +(5) show +grestore +newpath +1627 300 m +gsave +1627 300 translate +0 rotate +0 -30 m +(6) CS +(6) show +grestore +newpath +1828 300 m +gsave +1828 300 translate +0 rotate +0 -30 m +(7) CS +(7) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(8) CS +(8) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +440 376 l +420 517 m +440 517 l +420 658 m +440 658 l +420 799 m +440 799 l +420 940 m +440 940 l +420 1081 m +440 1081 l +420 1221 m +440 1221 l +420 1362 m +440 1362 l +420 1503 m +440 1503 l +420 1644 m +440 1644 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 517 m +2010 517 l +2030 658 m +2010 658 l +2030 799 m +2010 799 l +2030 940 m +2010 940 l +2030 1081 m +2010 1081 l +2030 1221 m +2010 1221 l +2030 1362 m +2010 1362 l +2030 1503 m +2010 1503 l +2030 1644 m +2010 1644 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 517 m +gsave +366 517 translate +0 rotate +0 -30 m +(500) RJ +(500) show +grestore +newpath +366 658 m +gsave +366 658 translate +0 rotate +0 -30 m +(1000) RJ +(1000) show +grestore +newpath +366 799 m +gsave +366 799 translate +0 rotate +0 -30 m +(1500) RJ +(1500) show +grestore +newpath +366 940 m +gsave +366 940 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 1081 m +gsave +366 1081 translate +0 rotate +0 -30 m +(2500) RJ +(2500) show +grestore +newpath +366 1221 m +gsave +366 1221 translate +0 rotate +0 -30 m +(3000) RJ +(3000) show +grestore +newpath +366 1362 m +gsave +366 1362 translate +0 rotate +0 -30 m +(3500) RJ +(3500) show +grestore +newpath +366 1503 m +gsave +366 1503 translate +0 rotate +0 -30 m +(4000) RJ +(4000) show +grestore +newpath +366 1644 m +gsave +366 1644 translate +0 rotate +0 -30 m +(4500) RJ +(4500) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(5000) RJ +(5000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +100 1080 m +gsave +100 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 4) CS +(Average CPU Time for Query 4) show +grestore +newpath +420 400 m +621 492 l +822 575 l +1023 669 l +1225 759 l +1426 866 l +1627 962 l +1828 1069 l +2030 1578 l +stroke +420 400 30 0 360 arc +gsave fill grestore +stroke +621 492 30 0 360 arc +gsave fill grestore +stroke +822 575 30 0 360 arc +gsave fill grestore +stroke +1023 669 30 0 360 arc +gsave fill grestore +stroke +1225 759 30 0 360 arc +gsave fill grestore +stroke +1426 866 30 0 360 arc +gsave fill grestore +stroke +1627 962 30 0 360 arc +gsave fill grestore +stroke +1828 1069 30 0 360 arc +gsave fill grestore +stroke +2030 1578 30 0 360 arc +gsave fill grestore +stroke +420 400 m +621 484 l +822 567 l +1023 645 l +1225 735 l +1426 823 l +1627 915 l +1828 1024 l +2030 1517 l +stroke +420 430 m +390 400 l +420 370 l +450 400 l +closepath +gsave eofill grestore +stroke +621 514 m +591 484 l +621 454 l +651 484 l +closepath +gsave eofill grestore +stroke +822 597 m +792 567 l +822 537 l +852 567 l +closepath +gsave eofill grestore +stroke +1023 675 m +993 645 l +1023 615 l +1053 645 l +closepath +gsave eofill grestore +stroke +1225 765 m +1195 735 l +1225 705 l +1255 735 l +closepath +gsave eofill grestore +stroke +1426 853 m +1396 823 l +1426 793 l +1456 823 l +closepath +gsave eofill grestore +stroke +1627 945 m +1597 915 l +1627 885 l +1657 915 l +closepath +gsave eofill grestore +stroke +1828 1054 m +1798 1024 l +1828 994 l +1858 1024 l +closepath +gsave eofill grestore +stroke +2030 1547 m +2000 1517 l +2030 1487 l +2060 1517 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 1316 847 a(\(b\))h(Query)g(4)p 1852 909 +2 898 v 88 911 1766 2 v 1853 919 10 901 v 96 919 1766 +10 v 503 1023 a FG(Figure)i(11:)k(Query)c(optimization)e(times)i(for)h +(Q3)f(and)g(Q4)p 88 1167 1766 2 v 88 2065 2 898 v 149 +1899 a @beginspecial 18 @llx 18 @lly 552 @urx 482 @ury +1872 @rwi @setspecial +%%BeginDocument: runtime.Q5.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +956 376 m +956 396 l +1493 376 m +1493 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +956 1785 m +956 1765 l +1493 1785 m +1493 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +956 300 m +gsave +956 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +1493 300 m +gsave +1493 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +430 376 l +420 552 m +430 552 l +420 728 m +430 728 l +420 904 m +430 904 l +420 1081 m +430 1081 l +420 1257 m +430 1257 l +420 1433 m +430 1433 l +420 1609 m +430 1609 l +420 1785 m +430 1785 l +2030 376 m +2020 376 l +2030 552 m +2020 552 l +2030 728 m +2020 728 l +2030 904 m +2020 904 l +2030 1081 m +2020 1081 l +2030 1257 m +2020 1257 l +2030 1433 m +2020 1433 l +2030 1609 m +2020 1609 l +2030 1785 m +2020 1785 l +stroke +420 376 m +440 376 l +420 728 m +440 728 l +420 1081 m +440 1081 l +420 1433 m +440 1433 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 728 m +2010 728 l +2030 1081 m +2010 1081 l +2030 1433 m +2010 1433 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 728 m +gsave +366 728 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 1081 m +gsave +366 1081 translate +0 rotate +0 -30 m +(4000) RJ +(4000) show +grestore +newpath +366 1433 m +gsave +366 1433 translate +0 rotate +0 -30 m +(6000) RJ +(6000) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(8000) RJ +(8000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +100 1080 m +gsave +100 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 5) CS +(Average CPU Time for Query 5) show +grestore +newpath +420 424 m +956 511 l +1493 671 l +2030 1778 l +stroke +420 424 30 0 360 arc +gsave fill grestore +stroke +956 511 30 0 360 arc +gsave fill grestore +stroke +1493 671 30 0 360 arc +gsave fill grestore +stroke +2030 1778 30 0 360 arc +gsave fill grestore +stroke +420 426 m +956 522 l +1493 688 l +2030 1737 l +stroke +420 456 m +390 426 l +420 396 l +450 426 l +closepath +gsave eofill grestore +stroke +956 552 m +926 522 l +956 492 l +986 522 l +closepath +gsave eofill grestore +stroke +1493 718 m +1463 688 l +1493 658 l +1523 688 l +closepath +gsave eofill grestore +stroke +2030 1767 m +2000 1737 l +2030 1707 l +2060 1737 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 453 2003 a Fz(\(a\))f(Query)e(5)p 976 2052 +2 873 v 1013 1899 a @beginspecial 18 @llx 18 @lly 552 +@urx 482 @ury 1872 @rwi @setspecial +%%BeginDocument: runtime.Q6.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 386 l +688 376 m +688 386 l +956 376 m +956 386 l +1225 376 m +1225 386 l +1493 376 m +1493 386 l +1761 376 m +1761 386 l +2030 376 m +2030 386 l +420 1785 m +420 1775 l +688 1785 m +688 1775 l +956 1785 m +956 1775 l +1225 1785 m +1225 1775 l +1493 1785 m +1493 1775 l +1761 1785 m +1761 1775 l +2030 1785 m +2030 1775 l +stroke +420 376 m +420 396 l +956 376 m +956 396 l +1493 376 m +1493 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +956 1785 m +956 1765 l +1493 1785 m +1493 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +956 300 m +gsave +956 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +1493 300 m +gsave +1493 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +430 376 l +420 517 m +430 517 l +420 658 m +430 658 l +420 799 m +430 799 l +420 940 m +430 940 l +420 1081 m +430 1081 l +420 1221 m +430 1221 l +420 1362 m +430 1362 l +420 1503 m +430 1503 l +420 1644 m +430 1644 l +420 1785 m +430 1785 l +2030 376 m +2020 376 l +2030 517 m +2020 517 l +2030 658 m +2020 658 l +2030 799 m +2020 799 l +2030 940 m +2020 940 l +2030 1081 m +2020 1081 l +2030 1221 m +2020 1221 l +2030 1362 m +2020 1362 l +2030 1503 m +2020 1503 l +2030 1644 m +2020 1644 l +2030 1785 m +2020 1785 l +stroke +420 376 m +440 376 l +420 658 m +440 658 l +420 940 m +440 940 l +420 1221 m +440 1221 l +420 1503 m +440 1503 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 658 m +2010 658 l +2030 940 m +2010 940 l +2030 1221 m +2010 1221 l +2030 1503 m +2010 1503 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 658 m +gsave +366 658 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 940 m +gsave +366 940 translate +0 rotate +0 -30 m +(4000) RJ +(4000) show +grestore +newpath +366 1221 m +gsave +366 1221 translate +0 rotate +0 -30 m +(6000) RJ +(6000) show +grestore +newpath +366 1503 m +gsave +366 1503 translate +0 rotate +0 -30 m +(8000) RJ +(8000) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(10000) RJ +(10000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +40 1080 m +gsave +40 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 6) CS +(Average CPU Time for Query 6) show +grestore +newpath +420 415 m +956 490 l +1493 633 l +2030 1651 l +stroke +420 415 30 0 360 arc +gsave fill grestore +stroke +956 490 30 0 360 arc +gsave fill grestore +stroke +1493 633 30 0 360 arc +gsave fill grestore +stroke +2030 1651 30 0 360 arc +gsave fill grestore +stroke +420 416 m +956 493 l +1493 631 l +2030 1462 l +stroke +420 446 m +390 416 l +420 386 l +450 416 l +closepath +gsave eofill grestore +stroke +956 523 m +926 493 l +956 463 l +986 493 l +closepath +gsave eofill grestore +stroke +1493 661 m +1463 631 l +1493 601 l +1523 631 l +closepath +gsave eofill grestore +stroke +2030 1492 m +2000 1462 l +2030 1432 l +2060 1462 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 1316 2003 a(\(b\))h(Query)g(6)p 1852 2065 +2 898 v 88 2067 1766 2 v 1853 2075 10 901 v 96 2075 1766 +10 v 503 2178 a FG(Figure)i(12:)k(Query)c(optimization)e(times)i(for)h +(Q5)f(and)g(Q6)75 2358 y(adding)d(operators,)i(algorithms)e(or)i(rules) +f(can)h(result)f(in)g(an)g(enormous)g(increase)h(in)f(optimization)f +(comple)o(xity)m(,)75 2421 y(especially)15 b(if)h(the)f(additions)f +(impact)i(a)g(signi\256cant)e(fraction)i(of)g(the)f(equi)o(v)o(alence)g +(classes.)30 b(Extensibility)m(,)75 2483 y(thus,)10 b(must)h(be)h +(judiciously)c(coupled)i(with)g(user)h(heuristics)f(to)h(a)o(v)o(oid)f +(unpleasant)g(surprises.)137 2545 y(The)g(results)f(presented)g(in)h +(this)f(section)g(sho)o(w)g(that)g(Prairie)h(optimizers)g(need)g(not)f +(sacri\256ce)h(ef)o(\256cienc)o(y)h(for)75 2607 y(clarity)m(,)f(e)o(v)o +(en)h(for)g(lar)o(ge)g(rule)f(sets.)16 b(More)11 b(research)h(and)e(v)o +(alidation)f(is)h(necessary)g(to)g(v)o(erify)h(that)f(Prairie)h(is)f +(an)952 2793 y(20)p eop +%%Page: 21 21 +21 20 bop 88 12 1766 2 v 88 909 2 898 v 149 744 a @beginspecial +18 @llx 18 @lly 552 @urx 482 @ury 1872 @rwi @setspecial +%%BeginDocument: runtime.Q7.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +956 376 m +956 396 l +1493 376 m +1493 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +956 1785 m +956 1765 l +1493 1785 m +1493 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +956 300 m +gsave +956 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +1493 300 m +gsave +1493 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +430 376 l +420 517 m +430 517 l +420 658 m +430 658 l +420 799 m +430 799 l +420 940 m +430 940 l +420 1081 m +430 1081 l +420 1221 m +430 1221 l +420 1362 m +430 1362 l +420 1503 m +430 1503 l +420 1644 m +430 1644 l +420 1785 m +430 1785 l +2030 376 m +2020 376 l +2030 517 m +2020 517 l +2030 658 m +2020 658 l +2030 799 m +2020 799 l +2030 940 m +2020 940 l +2030 1081 m +2020 1081 l +2030 1221 m +2020 1221 l +2030 1362 m +2020 1362 l +2030 1503 m +2020 1503 l +2030 1644 m +2020 1644 l +2030 1785 m +2020 1785 l +stroke +420 376 m +440 376 l +420 658 m +440 658 l +420 940 m +440 940 l +420 1221 m +440 1221 l +420 1503 m +440 1503 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 658 m +2010 658 l +2030 940 m +2010 940 l +2030 1221 m +2010 1221 l +2030 1503 m +2010 1503 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 658 m +gsave +366 658 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 940 m +gsave +366 940 translate +0 rotate +0 -30 m +(4000) RJ +(4000) show +grestore +newpath +366 1221 m +gsave +366 1221 translate +0 rotate +0 -30 m +(6000) RJ +(6000) show +grestore +newpath +366 1503 m +gsave +366 1503 translate +0 rotate +0 -30 m +(8000) RJ +(8000) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(10000) RJ +(10000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +40 1080 m +gsave +40 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 7) CS +(Average CPU Time for Query 7) show +grestore +newpath +420 425 m +956 510 l +1493 670 l +2030 1637 l +stroke +420 425 30 0 360 arc +gsave fill grestore +stroke +956 510 30 0 360 arc +gsave fill grestore +stroke +1493 670 30 0 360 arc +gsave fill grestore +stroke +2030 1637 30 0 360 arc +gsave fill grestore +stroke +420 420 m +956 501 l +1493 648 l +2030 1470 l +stroke +420 450 m +390 420 l +420 390 l +450 420 l +closepath +gsave eofill grestore +stroke +956 531 m +926 501 l +956 471 l +986 501 l +closepath +gsave eofill grestore +stroke +1493 678 m +1463 648 l +1493 618 l +1523 648 l +closepath +gsave eofill grestore +stroke +2030 1500 m +2000 1470 l +2030 1440 l +2060 1470 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 453 847 a Fz(\(a\))10 b(Query)e(7)p 976 +897 2 873 v 1013 744 a @beginspecial 18 @llx 18 @lly +552 @urx 482 @ury 1872 @rwi @setspecial +%%BeginDocument: runtime.Q8.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 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +956 376 m +956 396 l +1493 376 m +1493 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +956 1785 m +956 1765 l +1493 1785 m +1493 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +956 300 m +gsave +956 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +1493 300 m +gsave +1493 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +430 376 l +420 517 m +430 517 l +420 658 m +430 658 l +420 799 m +430 799 l +420 940 m +430 940 l +420 1081 m +430 1081 l +420 1221 m +430 1221 l +420 1362 m +430 1362 l +420 1503 m +430 1503 l +420 1644 m +430 1644 l +420 1785 m +430 1785 l +2030 376 m +2020 376 l +2030 517 m +2020 517 l +2030 658 m +2020 658 l +2030 799 m +2020 799 l +2030 940 m +2020 940 l +2030 1081 m +2020 1081 l +2030 1221 m +2020 1221 l +2030 1362 m +2020 1362 l +2030 1503 m +2020 1503 l +2030 1644 m +2020 1644 l +2030 1785 m +2020 1785 l +stroke +420 376 m +440 376 l +420 658 m +440 658 l +420 940 m +440 940 l +420 1221 m +440 1221 l +420 1503 m +440 1503 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 658 m +2010 658 l +2030 940 m +2010 940 l +2030 1221 m +2010 1221 l +2030 1503 m +2010 1503 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 translate +0 rotate +0 -30 m +(0) RJ +(0) show +grestore +newpath +366 658 m +gsave +366 658 translate +0 rotate +0 -30 m +(2000) RJ +(2000) show +grestore +newpath +366 940 m +gsave +366 940 translate +0 rotate +0 -30 m +(4000) RJ +(4000) show +grestore +newpath +366 1221 m +gsave +366 1221 translate +0 rotate +0 -30 m +(6000) RJ +(6000) show +grestore +newpath +366 1503 m +gsave +366 1503 translate +0 rotate +0 -30 m +(8000) RJ +(8000) show +grestore +newpath +366 1785 m +gsave +366 1785 translate +0 rotate +0 -30 m +(10000) RJ +(10000) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +40 1080 m +gsave +40 1080 translate +90 rotate +0 0 m +(CPU time \(microseconds\)) CS +(CPU time \(microseconds\)) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Average CPU Time for Query 8) CS +(Average CPU Time for Query 8) show +grestore +newpath +420 421 m +956 504 l +1493 650 l +2030 1549 l +stroke +420 421 30 0 360 arc +gsave fill grestore +stroke +956 504 30 0 360 arc +gsave fill grestore +stroke +1493 650 30 0 360 arc +gsave fill grestore +stroke +2030 1549 30 0 360 arc +gsave fill grestore +stroke +420 420 m +956 502 l +1493 647 l +2030 1475 l +stroke +420 450 m +390 420 l +420 390 l +450 420 l +closepath +gsave eofill grestore +stroke +956 532 m +926 502 l +956 472 l +986 502 l +closepath +gsave eofill grestore +stroke +1493 677 m +1463 647 l +1493 617 l +1523 647 l +closepath +gsave eofill grestore +stroke +2030 1505 m +2000 1475 l +2030 1445 l +2060 1475 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +90 scalefont + setfont +946 1516 m +946 1740 l +1574 1740 l +1574 1516 l +946 1516 l +stroke +/Times-Roman findfont +90 scalefont + setfont +995 1684 m +1191 1684 l +stroke +995 1684 30 0 360 arc +gsave fill grestore +stroke +1191 1684 30 0 360 arc +gsave fill grestore +stroke +1240 1684 m +gsave +1240 1684 translate +0 rotate +0 -30 m +(Prairie) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +995 1572 m +1191 1572 l +stroke +995 1602 m +965 1572 l +995 1542 l +1025 1572 l +closepath +gsave eofill grestore +stroke +1191 1602 m +1161 1572 l +1191 1542 l +1221 1572 l +closepath +gsave eofill grestore +stroke +1240 1572 m +gsave +1240 1572 translate +0 rotate +0 -30 m +(Volcano) show +grestore +newpath +showpage +%%EndDocument + @endspecial 1316 847 a(\(b\))h(Query)g(8)p 1852 909 +2 898 v 88 911 1766 2 v 1853 919 10 901 v 96 919 1766 +10 v 503 1023 a FG(Figure)i(13:)k(Query)c(optimization)e(times)i(for)h +(Q7)f(and)g(Q8)p 90 1167 1761 2 v 90 2298 2 1131 v 371 +2285 a @beginspecial 18 @llx 18 @lly 552 @urx 510 @ury +2880 @rwi @setspecial +%%BeginDocument: eqlogexp.Q1-8.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 +72 scalefont + setfont +[] 0 setdash +420 376 m +420 1785 l +2030 1785 l +2030 376 l +420 376 l +stroke +[] 0 setdash +420 376 m +420 396 l +621 376 m +621 396 l +822 376 m +822 396 l +1023 376 m +1023 396 l +1225 376 m +1225 396 l +1426 376 m +1426 396 l +1627 376 m +1627 396 l +1828 376 m +1828 396 l +2030 376 m +2030 396 l +420 1785 m +420 1765 l +621 1785 m +621 1765 l +822 1785 m +822 1765 l +1023 1785 m +1023 1765 l +1225 1785 m +1225 1765 l +1426 1785 m +1426 1765 l +1627 1785 m +1627 1765 l +1828 1785 m +1828 1765 l +2030 1785 m +2030 1765 l +/Times-Italic findfont +91 scalefont + setfont +/Times-Roman findfont +91 scalefont + setfont +stroke +420 300 m +gsave +420 300 translate +0 rotate +0 -30 m +(0) CS +(0) show +grestore +newpath +621 300 m +gsave +621 300 translate +0 rotate +0 -30 m +(1) CS +(1) show +grestore +newpath +822 300 m +gsave +822 300 translate +0 rotate +0 -30 m +(2) CS +(2) show +grestore +newpath +1023 300 m +gsave +1023 300 translate +0 rotate +0 -30 m +(3) CS +(3) show +grestore +newpath +1225 300 m +gsave +1225 300 translate +0 rotate +0 -30 m +(4) CS +(4) show +grestore +newpath +1426 300 m +gsave +1426 300 translate +0 rotate +0 -30 m +(5) CS +(5) show +grestore +newpath +1627 300 m +gsave +1627 300 translate +0 rotate +0 -30 m +(6) CS +(6) show +grestore +newpath +1828 300 m +gsave +1828 300 translate +0 rotate +0 -30 m +(7) CS +(7) show +grestore +newpath +2030 300 m +gsave +2030 300 translate +0 rotate +0 -30 m +(8) CS +(8) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +1225 148 m +gsave +1225 148 translate +0 rotate +0 0 m +(Number of joins) CS +(Number of joins) show +grestore +newpath +420 376 m +440 376 l +420 728 m +440 728 l +420 1081 m +440 1081 l +420 1433 m +440 1433 l +420 1785 m +440 1785 l +2030 376 m +2010 376 l +2030 728 m +2010 728 l +2030 1081 m +2010 1081 l +2030 1433 m +2010 1433 l +2030 1785 m +2010 1785 l +/Times-Roman findfont +91 scalefont + setfont +stroke +366 376 m +gsave +366 376 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 728 m +gsave +366 728 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 1081 m +gsave +366 1081 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 1433 m +gsave +366 1433 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 1785 m +gsave +366 1785 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 1080 m +gsave +187 1080 translate +90 rotate +0 0 m +(Equivalence classes) CS +(Equivalence classes) show +grestore +newpath +/Times-Roman findfont +90 scalefont + setfont +/Times-Bold findfont +90 scalefont + setfont +1225 1953 m +gsave +1225 1953 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 1855 m +gsave +1225 1855 translate +0 rotate +0 0 m +(Number of Equivalence Classes) CS +(Number of Equivalence Classes) show +grestore +newpath +420 376 m +621 429 l +822 482 l +1023 535 l +1225 588 l +1426 641 l +1627 694 l +1828 747 l +2030 800 l +stroke +420 376 30 0 360 arc +gsave fill grestore +stroke +621 429 30 0 360 arc +gsave fill grestore +stroke +822 482 30 0 360 arc +gsave fill grestore +stroke +1023 535 30 0 360 arc +gsave fill grestore +stroke +1225 588 30 0 360 arc +gsave fill grestore +stroke +1426 641 30 0 360 arc +gsave fill grestore +stroke +1627 694 30 0 360 arc +gsave fill grestore +stroke +1828 747 30 0 360 arc +gsave fill grestore +stroke +2030 800 30 0 360 arc +gsave fill grestore +stroke +420 376 m +621 597 l +822 734 l +1023 871 l +1225 1008 l +1426 1145 l +1627 1282 l +1828 1419 l +2030 1556 l +stroke +420 406 m +390 376 l +420 346 l +450 376 l +closepath +gsave eofill grestore +stroke +621 627 m +591 597 l +621 567 l +651 597 l +closepath +gsave eofill grestore +stroke +822 764 m +792 734 l +822 704 l +852 734 l +closepath +gsave eofill grestore +stroke +1023 901 m +993 871 l +1023 841 l +1053 871 l +closepath +gsave eofill grestore +stroke +1225 1038 m +1195 1008 l +1225 978 l +1255 1008 l +closepath +gsave eofill grestore +stroke +1426 1175 m +1396 1145 l +1426 1115 l +1456 1145 l +closepath +gsave eofill grestore +stroke +1627 1312 m +1597 1282 l +1627 1252 l +1657 1282 l +closepath +gsave eofill grestore +stroke +1828 1449 m +1798 1419 l +1828 1389 l +1858 1419 l +closepath +gsave eofill grestore +stroke +2030 1586 m +2000 1556 l +2030 1526 l +2060 1556 l +closepath +gsave eofill grestore +stroke +420 376 m +621 578 l +822 805 l +1023 1059 l +stroke +420 406 m +390 346 l +450 346 l +closepath +gsave eofill grestore +stroke +621 608 m +591 548 l +651 548 l +closepath +gsave eofill grestore +stroke +822 835 m +792 775 l +852 775 l +closepath +gsave eofill grestore +stroke +1023 1089 m +993 1029 l +1053 1029 l +closepath +gsave eofill grestore +stroke +420 513 m +621 787 l +822 1094 l +1023 1428 l +stroke +390 543 m +420 483 l +450 543 l +closepath +gsave eofill grestore +stroke +591 817 m +621 757 l +651 817 l +closepath +gsave eofill grestore +stroke +792 1124 m +822 1064 l +852 1124 l +closepath +gsave eofill grestore +stroke +993 1458 m +1023 1398 l +1053 1458 l +closepath +gsave eofill grestore +stroke +/Times-Roman findfont +72 scalefont + setfont +1070 1369 m +1070 1729 l +1665 1729 l +1665 1369 l +1070 1369 l +stroke +/Times-Roman findfont +72 scalefont + setfont +1110 1684 m +1270 1684 l +stroke +1110 1684 30 0 360 arc +gsave fill grestore +stroke +1270 1684 30 0 360 arc +gsave fill grestore +stroke +1310 1684 m +gsave +1310 1684 translate +0 rotate +0 -24 m +(Query 1, 2) show +grestore +newpath +/Times-Roman findfont +72 scalefont + setfont +1110 1594 m +1270 1594 l +stroke +1110 1624 m +1080 1594 l +1110 1564 l +1140 1594 l +closepath +gsave eofill grestore +stroke +1270 1624 m +1240 1594 l +1270 1564 l +1300 1594 l +closepath +gsave eofill grestore +stroke +1310 1594 m +gsave +1310 1594 translate +0 rotate +0 -24 m +(Query 3, 4) show +grestore +newpath +/Times-Roman findfont +72 scalefont + setfont +1110 1504 m +1270 1504 l +stroke +1110 1534 m +1080 1474 l +1140 1474 l +closepath +gsave eofill grestore +stroke +1270 1534 m +1240 1474 l +1300 1474 l +closepath +gsave eofill grestore +stroke +1310 1504 m +gsave +1310 1504 translate +0 rotate +0 -24 m +(Query 5, 6) show +grestore +newpath +/Times-Roman findfont +72 scalefont + setfont +1110 1414 m +1270 1414 l +stroke +1080 1444 m +1110 1384 l +1140 1444 l +closepath +gsave eofill grestore +stroke +1240 1444 m +1270 1384 l +1300 1444 l +closepath +gsave eofill grestore +stroke +1310 1414 m +gsave +1310 1414 translate +0 rotate +0 -24 m +(Query 7, 8) show +grestore +newpath +showpage +%%EndDocument + @endspecial 1850 2298 V 90 2300 1761 2 v 1850 2308 10 +1134 v 99 2308 1761 10 v 411 2411 a(Figure)g(14:)k(Number)c(of)h(equi)o +(v)o(alence)e(classes)g(vs.)i(number)f(of)g(joins)75 +2592 y(ef)o(\256cient)g(tool)f(for)i(optimizer)e(speci\256cation.)952 +2793 y(21)p eop +%%Page: 22 22 +22 21 bop 75 14 a FC(5)60 b(Related)13 b(r)o(esear)o(ch)75 +124 y FG(The)c(System)f(R)i(optimizer)e([17])h(was)f(the)g(most)h +(important)e(de)o(v)o(elopment)h(in)h(query)f(optimization)f(research.) +16 b(It)75 186 y(was)9 b(a)h(cost-based)e(centralized)h(relational)f +(query)h(optimizer)g(and)h(introduced)e(a)h(v)o(ariety)g(of)h(ke)o(y)f +(concepts)f(like)75 248 y(\252interesting\272)g(e)o(xpressions,)g +(cardinality)g(estimation)f(using)h(selecti)o(vity)f(factors)i(and)g +(dynamic)g(programming)75 310 y(with)h(pruning)f(of)h(search)h(space.) +17 b(These)10 b(concepts)g(continue)f(to)i(be)f(important)g(in)g(query) +g(optimizer)g(research.)137 372 y(The)15 b(query)g(optimizer)f(in)g(R) +611 355 y Fd(\003)646 372 y FG([4,)8 b(14,)f(16])15 b(works)f(in)g +(essentially)f(the)i(same)g(way)f(as)h(that)g(of)f(System)h(R,)75 +434 y(e)o(xcept)f(that)g(R)320 418 y Fd(\003)354 434 +y FG(is)f(a)i(distrib)o(uted)c(database)j(system)g(which)f(introduces)f +(some)i(subtle)f(complications)f(in)i(its)75 496 y(query)d(optimizer)m +(.)137 558 y(The)f(Starb)o(urst)f(query)g(optimizer)g([11,)e(13,)h(15]) +h(uses)g(rules)g(for)h(all)f(decisions)f(that)h(need)h(to)f(be)g(taken) +g(by)g(the)75 620 y(query)h(optimizer)m(.)17 b(The)10 +b(rules)g(are)i(functional)d(in)h(nature)h(and)f(transform)h(a)g(gi)o +(v)o(en)f(operator)g(tree)h(into)f(another)m(.)75 682 +y(The)h(rules)f(are)h(commonly)g(those)f(that)g(re\257ect)h(relational) +f(calculus)g(facts.)16 b(In)11 b(Starb)o(urst,)g(the)f(query)h(re)o +(writing)75 745 y(phase)g(is)g(dif)o(ferent)g(from)h(the)f +(optimization)e(phase.)17 b(The)11 b(re)o(writing)g(phase)g(transforms) +g(the)g(query)g(itself)f(into)75 807 y(equi)o(v)o(alent)k(operator)h +(trees)h(based)f(on)g(relational)g(calculus)f(rules.)30 +b(The)15 b(plan)g(optimization)f(phase)h(selects)75 869 +y(algorithms)c(for)i(each)g(operator)f(in)g(the)g(operator)g(tree)h +(that)f(is)g(obtained)f(after)i(re)o(writing.)19 b(The)13 +b(disadv)o(antage)75 931 y(of)d(separating)g(the)g(query)g(re)o(write)g +(and)g(the)g(optimization)e(phases)i(is)f(that)h(pruning)f(of)h(the)g +(search)h(space)f(is)g(not)75 993 y(possible)f(during)h(query)h(re)o +(write,)h(since)e(the)h(re)o(write)g(phase)g(is)g(non-cost-based.)137 +1055 y(Fre)o(ytag)i([6])g(describes)g(a)g(rule-based)f(query)h +(optimizer)f(similar)g(to)h(Starb)o(urst.)20 b(The)13 +b(rules)g(are)g(based)g(on)75 1117 y(LISP-like)f(representations)f(of)h +(access)h(plans.)19 b(The)12 b(rules)g(themselv)o(es)g(are)h(recursi)o +(v)o(ely)f(de\256ned)g(on)g(smaller)75 1179 y(e)o(xpressions)g +(\(operator)g(trees\).)22 b(Although)11 b(se)o(v)o(eral)i(e)o +(xpressions)f(can)h(contain)f(a)h(common)h(sub-e)o(xpression,)75 +1241 y(Fre)o(ytag)h(doesn')o(t)f(consider)f(the)h(possibility)e(of)i +(sharing.)26 b(Expressions)12 b(are)j(e)o(v)o(aluated)f(each)h(time)f +(the)o(y)g(are)75 1304 y(encountered.)j(This)11 b(is)g(ob)o(viously)e +(inef)o(\256cient.)18 b(In)11 b(addition,)g(as)g(in)h(Starb)o(urst,)f +(he)h(doesn')o(t)f(consider)f(the)i(cost)75 1366 y(transformations)e +(inherent)g(in)h(an)o(y)g(query)g(optimizer;)f(rules)h(are)h(syntactic) +e(transformation)g(rules.)137 1428 y(EXODUS)15 b([7,)8 +b(10])15 b(pro)o(vides)f(an)h(optimizer)g(generator)g(which)f(accepts)i +(a)f(rule-based)g(speci\256cation)f(of)75 1490 y(the)g(data)g(model)h +(as)f(input.)25 b(The)14 b(optimizer)g(generator)g(compiles)g(these)g +(rules,)h(together)f(with)f(pre-de\256ned)75 1552 y(rules,)h(to)f +(generate)g(an)h(optimizer)f(for)g(the)h(particular)e(data)i(model)f +(and)g(set)g(of)h(operators.)23 b(Unlike)11 b(Fre)o(ytag,)75 +1614 y(the)i(optimizer)f(generator)h(for)g(EXODUS)g(allo)o(ws)f(for)h +(C)h(code)f(along)f(with)g(de\256nitions)f(of)i(ne)o(w)g(rules.)22 +b(This)75 1676 y(allo)o(ws)8 b(the)h(database)g(implementor)f(the)h +(freedom)h(to)e(associate)h(an)o(y)g(action)g(with)f(a)h(particular)g +(rule.)15 b(Operator)75 1738 y(trees)c(in)g(EXODUS)g(are)g(constructed) +f(bottom-up)g(from)i(pre)o(viously)d(constructed)h(trees.)137 +1800 y(The)j(V)-6 b(olcano)12 b(optimizer)g(generator)g(project)g([8])h +(e)o(v)o(olv)o(ed)f(from)h(the)f(EXODUS)g(project.)20 +b(It)13 b(is)f(dif)o(ferent)75 1862 y(from)k(all)g(the)f(abo)o(v)o(e)i +(optimizers)e(in)g(one)h(signi\256cant)e(way:)25 b(it)15 +b(is)g(a)i(top-do)o(wn)d(optimizer)h(compared)h(with)75 +1925 y(the)h(bottom-up)e(strate)o(gy)i(of)g(the)f(others.)34 +b(Operator)16 b(trees)h(are)h(optimized)e(starting)f(from)j(the)f(root) +f(while)75 1987 y(sub-trees)e(are)h(not)g(yet)f(optimized.)26 +b(This)14 b(leads)g(to)h(a)g(constraint-dri)o(v)o(en)e(generation)g(of) +i(the)g(search)g(space.)75 2049 y(While)f(this)f(method)h(results)f(in) +h(a)h(tight)d(control)i(of)g(the)g(search)h(space,)g(it)f(is)g(uncon)n +(v)o(entional)e(and)j(requires)75 2111 y(careful)d(attention)d(on)i +(the)g(part)g(of)g(the)g(optimizer)g(implementor)g(to)f(ensure)h(that)g +(le)o(gal)g(operator)g(trees)g(are)h(not)75 2173 y(accidently)e(left)h +(out)g(of)g(the)g(search)g(space.)17 b(W)l(e)12 b(ha)o(v)o(e)f(used)g +(V)-6 b(olcano)10 b(as)i(our)f(back-end)g(search)g(engine.)75 +2327 y FC(6)60 b(Conclusion)14 b(and)i(futur)o(e)e(w)o(ork)75 +2436 y FG(Current)g(rule-based)g(query)g(optimizers)g(do)g(not)f(pro)o +(vide)h(a)h(v)o(ery)g(intuiti)o(v)o(e)d(and)i(conceptually)f +(streamlined)75 2498 y(frame)o(work)8 b(to)f(de\256ne)h(rules)f(and)h +(actions.)14 b(Our)8 b(e)o(xperiences)g(with)e(the)i(V)-6 +b(olcano)7 b(optimizer)g(generator)h(suggest)75 2560 +y(that)h(its)h(model)g(of)g(rules)f(and)h(the)g(e)o(xpression)f(of)h +(these)g(rules)g(is)f(much)i(more)f(complicated)g(and)g(too)f(lo)o +(w-le)o(v)o(el)75 2622 y(than)14 b(it)f(needs)h(to)g(be.)26 +b(As)14 b(a)g(consequence,)h(rule)f(sets)g(in)g(V)-6 +b(olcano)13 b(are)i(fragile,)g(hard)g(to)e(write,)i(and)f(deb)o(ug.)952 +2793 y(22)p eop +%%Page: 23 23 +23 22 bop 75 14 a FG(Similar)11 b(problems)g(may)g(e)o(xist)g(in)g +(other)f(contemporary)h(rule-based)g(query)g(optimizers.)137 +77 y(W)l(e)k(belie)o(v)o(e)e(that)g(rule-based)h(query)f(optimizers)g +(will)g(be)h(standard)e(tools)h(of)h(future)f(database)h(systems.)75 +139 y(The)k(pragmatic)h(dif)o(\256culties)e(of)h(using)f(e)o(xisting)g +(rule-based)h(optimizers)g(led)g(us)g(to)g(de)o(v)o(elop)g(Prairie,)j +(an)75 201 y(e)o(xtensible)15 b(and)g(structured)g(algebraic)h(frame)o +(work)f(for)h(specifying)f(rules.)30 b(Prairie)16 b(is)f(similar)g(to)h +(e)o(xisting)75 263 y(optimizers)10 b(in)h(that)g(it)g(supports)e(both) +i(transformation)f(rules)h(and)g(implementation)f(rules.)16 +b(Ho)o(we)o(v)o(er)n(,)c(Prairie)75 325 y(makes)f(se)o(v)o(eral)g +(impro)o(v)o(ements:)124 420 y(1.)21 b(it)10 b(of)o(fers)i(a)f +(conceptually)f(more)i(streamlined)e(model)h(for)g(rule)g +(speci\256cation;)124 516 y(2.)21 b(rules)11 b(are)g(encapsulated,)g +(there)g(are)h(no)f(\252hidden\272)f(operators)h(or)g(\252hidden\272)f +(algorithms;)124 611 y(3.)21 b(implementation)10 b(hints)f(\(e.g.,)k +(enforcers\))e(are)h(deduced)f(automatically;)124 706 +y(4.)21 b(and)11 b(it)f(has)h(ef)o(\256cient)h(implementations.)137 +801 y(W)l(e)k(ha)o(v)o(e)g(e)o(xplained)e(ho)o(w)h(the)f(\256rst)i +(three)f(points)e(are)j(important)e(for)i(simplifying)d(rule)i +(speci\256cations)75 864 y(and)f(making)g(rule)h(sets)f(less)f(brittle) +h(for)g(e)o(xtensibility)m(.)24 b(A)15 b(consequence)f(is)g(that)g +(Prairie)g(rules)g(are)i(simpler)75 926 y(and)11 b(more)h(rob)o(ust)e +(than)h(rules)g(of)g(e)o(xisting)f(optimizers)g(\(e.g.,)j(V)-6 +b(olcano\).)16 b(W)l(e)c(addressed)f(the)g(fourth)g(point)f(by)75 +988 y(b)o(uilding)d(a)j(P2V)f(pre-processor)f(which)h(uses)g +(sophisticated)d(algorithms)i(to)h(compose)g(and)g(compact)g(a)h +(Prairie)75 1050 y(rule)j(set)f(into)g(a)h(V)-6 b(olcano)12 +b(rule)h(set.)21 b(T)l(o)13 b(demonstrate)f(the)h(scalability)e(of)i +(our)f(approach,)i(we)f(re)o(wrote)g(the)f(TI)75 1112 +y(Open)i(OODB)f(rule)h(set)g(as)g(a)g(Prairie)g(rule)g(set,)h +(generated)e(its)g(V)-6 b(olcano)14 b(counterpart,)g(and)f(sho)o(wed)g +(that)g(the)75 1174 y(performance)f(of)f(the)f(synthesized)f(V)-6 +b(olcano)10 b(rule)h(set)f(closely)g(matches)h(that)f(of)h(the)g +(hand-designed)e(V)-6 b(olcano)75 1236 y(rule)11 b(set.)137 +1298 y(Our)e(future)g(work)f(will)g(concentrate)h(on)g(de)o(v)o +(eloping)f(higher)o(-le)o(v)o(el)g(abstractions)f(using)h(Prairie,)i +(including)75 1360 y(automatically)g(generating)g(Prairie)h(rule)g +(sets,)g(and)g(combining)e(multiple)h(Prairie)i(rule)f(sets)f(to)h +(automatically)75 1423 y(generate)g(ef)o(\256cient)g(optimizers.)75 +1576 y FC(Ackno)o(wledgments)75 1685 y FG(W)l(e)17 b(wish)e(to)g(thank) +g(T)m(e)o(xas)h(Instruments,)h(Inc.)f(for)h(making)e(the)h(Open)g(OODB) +g(source)f(code)h(a)o(v)o(ailable)g(to)75 1748 y(us.)i(Comments)12 +b(by)f(Jos)s(\302)-18 b(e)11 b(Blakele)o(y)m(,)h(Anne)g(Ngu,)g(V)m(i)o +(v)o(ek)f(Singhal)g(and)g(Thomas)h(W)l(oo)f(greatly)h(impro)o(v)o(ed)f +(the)75 1810 y(quality)f(of)h(the)g(paper)m(.)75 1963 +y FC(Refer)o(ences)98 2073 y FG([1])20 b(D.)11 b(S.)g(Batory)m(.)16 +b(Building)8 b(blocks)i(of)g(database)g(management)h(systems.)j(T)m +(echnical)c(Report)g(TR\26187\26123,)171 2135 y(The)i(Uni)o(v)o(ersity) +d(of)i(T)m(e)o(xas)g(at)g(Austin,)f(February)i(1988.)98 +2230 y([2])20 b(Jos)s(\302)-18 b(e)16 b(A.)g(Blakele)o(y)m(,)i(W)n +(illiam)d(J.)i(McK)o(enna,)g(and)f(Goetz)g(Graefe.)30 +b(Experiences)16 b(b)o(uilding)e(the)i(Open)171 2292 +y(OODB)g(query)g(optimizer)m(.)28 b(In)16 b FB(Pr)n(oceedings)e(1993)h +(A)o(CM)h(SIGMOD)f(International)e(Confer)n(ence)j(on)171 +2354 y(Management)9 b(of)i(Data)p FG(,)g(pages)f(287\261296,)g(W)l +(ashington,)g(May)i(1993.)98 2449 y([3])20 b(Michael)c(J.)g(Care)o(y)m +(,)i(Da)o(vid)d(J.)h(DeW)n(itt,)h(Daniel)e(Frank,)i(Goetz)e(Graefe,)j +(M.)f(Muralikrishna,)f(Joel)f(E.)171 2512 y(Richardson,)20 +b(and)e(Eugene)g(J.)g(Shekita.)34 b(The)18 b(architecture)g(of)g(the)g +(EXODUS)g(e)o(xtensible)f(DBMS.)171 2574 y(In)d FB(Pr)n(oceedings)d +(International)f(W)l(orkshop)h(on)i(Object-Oriented)e(Database)g +(Systems)p FG(,)i(pages)g(52\26165,)171 2636 y(Asilomar)n(,)f +(September)f(1986.)952 2793 y(23)p eop +%%Page: 24 24 +24 23 bop 98 14 a FG([4])20 b(Dean)15 b(Daniels,)f(P)o(atricia)g +(Selinger)n(,)h(Laura)f(Haas,)h(Bruce)g(Lindsay)m(,)e(C.)i(Mohan,)g +(Adrian)e(W)l(alker)n(,)i(and)171 77 y(P)o(aul)j(W)n(ilms.)32 +b(An)17 b(introduction)d(to)j(distrib)o(uted)e(query)i(compilation)e +(in)i(R)1446 60 y Fd(\003)1466 77 y FG(.)32 b(In)17 b +FB(Pr)n(oceedings)f(2nd)171 139 y(International)9 b(Confer)n(ence)i(on) +g(Distrib)o(uted)d(Databases)p FG(,)i(pages)h(291\261309,)f(Berlin,)h +(September)h(1982.)98 233 y([5])20 b(Dinesh)12 b(Das)h(and)f(Don)g +(Batory)m(.)21 b(Prairie:)e(An)13 b(algebraic)f(frame)o(work)h(for)g +(rule)g(speci\256cation)e(in)h(query)171 295 y(optimizers.)26 +b(In)15 b FB(Pr)n(oceedings)e(of)i(the)f(W)l(orkshop)f(on)i(Database)e +(Query)i(Optimizer)e(Gener)o(ators)g(and)171 357 y(Rule-Based)d +(Optimizers)p FG(,)f(pages)i(139\261154,)f(Dallas,)h(September)g(1993.) +98 451 y([6])20 b(Johann)8 b(Christoph)e(Fre)o(ytag.)12 +b(A)c(rule-based)g(vie)o(w)f(of)h(query)g(optimization.)i(In)e +FB(Pr)n(oceedings)e(1987)h(A)o(CM)171 514 y(SIGMOD)13 +b(International)d(Confer)n(ence)j(on)f(Management)f(of)h(Data)p +FG(,)h(pages)g(173\261180,)f(San)h(Francisco,)171 576 +y(May)f(1987.)98 670 y([7])20 b(Goetz)13 b(Graefe.)23 +b FB(Rule-Based)12 b(Query)h(Optimizatio)o(n)d(in)j(Extensible)f +(Database)f(Systems)p FG(.)21 b(PhD)13 b(thesis,)171 +732 y(Uni)o(v)o(ersity)d(of)h(W)n(isconsin\261Madison,)e(1987.)98 +826 y([8])20 b(Goetz)12 b(Graefe.)19 b(V)-6 b(olcano,)12 +b(an)g(e)o(xtensible)e(and)i(parallel)f(query)h(e)o(v)o(aluation)e +(system.)17 b(T)m(echnical)11 b(Report)171 888 y +(CU\261CS\261481\26190,)g(Uni)o(v)o(ersity)e(of)i(Colorado)g(at)g +(Boulder)n(,)h(July)e(1990.)98 983 y([9])20 b(Goetz)c(Graefe.)31 +b(Query)15 b(e)o(v)o(aluation)g(techniques)f(for)i(lar)o(ge)h +(databases.)29 b FB(A)o(CM)15 b(Computing)g(Surve)o(ys)p +FG(,)171 1045 y(25\(2\):73\261170,)10 b(June)g(1993.)75 +1139 y([10])20 b(Goetz)f(Graefe)i(and)e(Da)o(vid)f(J.)i(DeW)n(itt.)37 +b(The)19 b(EXODUS)g(optimizer)f(generator)m(.)39 b(In)19 +b FB(Pr)n(oceedings)171 1201 y(1987)12 b(A)o(CM)f(SIGMOD)h +(International)d(Confer)n(ence)j(on)f(Management)f(of)i(Data)p +FG(,)f(pages)h(387\261394,)f(San)171 1263 y(Francisco,)h(May)g(1987.)75 +1358 y([11])20 b(L.)15 b(M.)g(Haas,)h(J.)e(C.)h(Fre)o(ytag,)h(G.)e(M.)i +(Lohman,)f(and)f(H.)g(Pirahesh.)25 b(Extensible)12 b(query)i +(processing)f(in)171 1420 y(Starb)o(urst.)j(Research)c(Report)f(RJ)h +(6610,)e(IBM)j(Almaden)e(Research)h(Center)n(,)g(December)g(1988.)75 +1514 y([12])20 b(W)l(on)9 b(Kim,)g(Da)o(vid)e(S.)j(Reiner)n(,)f(and)f +(Don)g(S.)h(Batory)m(,)g(editors.)i FB(Query)d(Pr)n(ocessing)e(in)i +(Database)f(Systems)p FG(.)171 1576 y(Springer)o(-V)-5 +b(erlag,)12 b(1985.)75 1671 y([13])20 b(Guy)12 b(M.)i(Lohman.)19 +b(Grammar)o(-like)12 b(functional)f(rules)h(for)h(representing)e(query) +h(optimization)e(alterna-)171 1733 y(ti)o(v)o(es.)15 +b(In)10 b FB(Pr)n(oceedings)e(1988)i(A)o(CM)f(SIGMOD)h(International)d +(Confer)n(ence)j(on)g(Management)e(of)i(Data)p FG(,)171 +1795 y(pages)h(18\26127,)g(Chicago,)g(June)g(1988.)75 +1889 y([14])20 b(Guy)13 b(M.)h(Lohman,)g(C.)g(Mohan,)h(Laura)e(M.)h +(Haas,)h(Bruce)f(G.)f(Lindsay)m(,)g(P)o(atricia)h(G.)f(Selinger)n(,)h +(P)o(aul)g(F)l(.)171 1951 y(W)n(ilms,)e(and)f(Dean)h(Daniels.)k(Query)c +(processing)e(in)h(R)1075 1935 y Fd(\003)1095 1951 y +FG(.)17 b(Research)c(Report)e(RJ)h(4272,)f(IBM)h(Research)171 +2013 y(Laboratory)m(,)f(San)h(Jose,)f(April)f(1984.)75 +2108 y([15])20 b(P)-5 b(.)14 b(Schwarz,)f(W)l(.)g(Chang,)f(J.)h(C.)g +(Fre)o(ytag,)h(G.)e(Lohman,)h(J.)g(McPherson,)g(C.)g(Mohan,)g(and)f(H.) +h(Pirahesh.)171 2170 y(Extensibility)i(in)i(the)g(Starb)o(urst)g +(database)h(system.)33 b(In)18 b FB(Pr)n(oceedings)e(International)f(W) +l(orkshop)h(on)171 2232 y(Object-Oriented)10 b(Database)f(Systems)p +FG(,)i(pages)g(85\26192,)f(Asilomar)n(,)h(September)h(1986.)75 +2326 y([16])20 b(P)-5 b(.)13 b(G.)g(Selinger)e(and)h(M.)h(Adiba.)18 +b(Access)12 b(path)f(selection)g(in)h(distrib)o(uted)d(data)j(base)g +(management)h(sys-)171 2388 y(tems.)19 b(In)13 b(Deen)f(and)g +(Hammersly)m(,)h(editors,)e FB(Pr)n(oceedings)g(International)e(Confer) +n(ence)j(on)g(Databases)p FG(,)171 2450 y(pages)f(204\261215,)f(Uni)o +(v)o(ersity)g(of)h(Aberdeen,)g(July)f(1980.)75 2545 y([17])20 +b(P)-5 b(.)14 b(G.)e(Selinger)n(,)h(M.)g(M.)h(Astrahan,)e(D.)g(D.)h +(Chamberlin,)g(R.)g(A.)g(Lorie,)f(and)g(T)m(.)h(G.)f(Price.)21 +b(Access)12 b(path)171 2607 y(selection)h(in)h(a)g(relational)f +(database)h(management)g(system.)24 b(In)14 b FB(Pr)n(oceedings)e(1979) +h(A)o(CM)h(SIGMOD)171 2669 y(International)9 b(Confer)n(ence)i(on)g +(Management)e(of)h(Data)p FG(,)h(pages)g(23\26134,)f(Boston,)h(May)g +(1979.)952 2793 y(24)p eop +%%Page: 25 25 +25 24 bop 75 14 a FG([18])20 b(Michael)14 b(Stonebraker)f(and)h(La)o +(wrence)g(A.)g(Ro)o(we.)23 b(The)14 b(design)e(of)i(Postgres.)22 +b(In)14 b FB(Pr)n(oceedings)e(1986)171 77 y(A)o(CM)g(SIGMOD)f +(International)e(Confer)n(ence)j(on)g(Management)d(of)i(Data)p +FG(,)h(pages)f(340\261355,)g(W)l(ashing-)171 139 y(ton,)g(May)h(1986.) +75 234 y([19])20 b(Da)o(vid)14 b(L.)f(W)l(ells,)i(Jos)s(\302)-18 +b(e)13 b(A.)h(Blakele)o(y)m(,)g(and)g(Craig)f(W)l(.)h(Thompson.)22 +b(Architecture)13 b(of)h(an)g(open)f(object-)171 296 +y(oriented)e(database)g(management)g(system.)16 b FB(IEEE)11 +b(Computer)p FG(,)g(25\(10\):74\26182,)e(October)i(1992.)75 +391 y([20])20 b(C.)11 b(T)m(.)e(Y)-5 b(u)9 b(and)h(C.)g(C.)g(Chang.)k +(Distrib)o(uted)7 b(query)i(processing.)k FB(A)o(CM)c(Computing)f +(Surve)o(ys)p FG(,)h(16\(4\):399\261)171 453 y(433,)i(December)i(1984.) +952 2793 y(25)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF |