PostgreSQL: Up and Running Guide
PostgreSQL: Up and Running Guide
DQLPDOVRUHLOO\FRP
3RVWJUH64/8SDQG5XQQLQJ 7KHFRYHULPDJHLVIURP0H\HUV.OHLQHV/H[LFRQ7KHFRYHUIRQWVDUH85:
7\SHZULWHUDQG*XDUGLDQ6DQV7KHWH[WIRQWLV$GREH0LQLRQ3URWKHKHDGLQJ
IRQWLV$GREH0\ULDG&RQGHQVHGDQGWKHFRGHIRQWLV'DOWRQ0DDJߞV8EXQWX
7+,5'(',7,21 0RQR
$3UDFWLFDO*XLGHWRWKH$GYDQFHG2SHQ6RXUFH
'DWDEDVH
5HJLQD22EHDQG/HR6+VX
&RORSKRQ 3RVWJUH64/8SDQG5XQQLQJ
7KHDQLPDORQWKHFRYHURI3RVWJUH64/8SDQG5XQQLQJLVDQHOHSKDQWVKUHZ E\5HJLQD22EHDQG/HR6+VX
0DFURVFHOLGHVSURERVFLGHXVDQLQVHFWLYRURXVPDPPDOQDWLYHWR$IULFDQDPHG
&RS\ULJKWj5HJLQD2EH/HR+VX$OOULJKWVUHVHUYHG
IRULWVOHQJWK\WUXQNZKLFKUHVHPEOHVWKDWRIDQHOHSKDQW7KH\DUHGLVWULEXWHG
DFURVVVRXWKHUQ$IULFDLQPDQ\W\SHVRIKDELWDWIURPWKH1DPLE'HVHUWWR 3ULQWHGLQWKH8QLWHG6WDWHVRI$PHULFD
ERXOGHUFRYHUHGWHUUDLQLQ6RXWK$IULFDDQGWKLFNIRUHVWV 3XEOLVKHGE\2ߞ5HLOO\0HGLD,QF*UDYHQVWHLQ+LJKZD\1RUWK
7KHHOHSKDQWVKUHZLVVPDOODQGTXDGUXSHGDOWKH\UHVHPEOHURGHQWVDQG 6HEDVWRSRO&$
RSRVVXPVZLWKWKHLUVFDO\WDLOV7KHLUOHJVDUHORQJIRUWKHLUVL]HDOORZLQJWKHP 2ߞ5HLOO\ERRNVPD\EHSXUFKDVHGIRUHGXFDWLRQDOEXVLQHVVRUVDOHVSURPRWLRQDO
WRPRYHDURXQGLQDKRSSLQJIDVKLRQVLPLODUWRDUDEELW7KHWUXQNYDULHVLQVL]H XVH2QOLQHHGLWLRQVDUHDOVRDYDLODEOHIRUPRVWWLWOHVKWWSRUHLOO\FRPVDIDUL
GHSHQGLQJRQVSHFLHVEXWDUHDOODEOHWRWZLVWDURXQGLQVHDUFKRIIRRG )RUPRUHLQIRUPDWLRQFRQWDFWRXUFRUSRUDWHLQVWLWXWLRQDOVDOHVGHSDUWPHQW
7KH\DUHGLXUQDODQGDFWLYHWKRXJKWKH\DUHKDUGO\VHHQGXHWREHLQJZDU\ RUFRUSRUDWH#RUHLOO\FRP
DQLPDOVZKLFKPDNHVWKHPGLIILFXOWWRWUDS7KH\DUHZHOOFDPRXIODJHGDQG
(GLWRU$QG\2UDP
TXLFNDWGDVKLQJDZD\IURPWKUHDWV
7KRXJKHOHSKDQWVKUHZVDUHQRWYHU\VRFLDOPDQ\RIWKHPOLYHLQPRQRJDPRXV 3URGXFWLRQ(GLWRU0HODQLH<DUEURXJK
SDLUVVKDULQJDQGGHIHQGLQJWKHLUKRPHWHUULWRU\)HPDOHHOHSKDQWVKUHZV
H[SHULHQFHDPHQVWUXDOF\FOHVLPLODUWRWKDWRIKXPDQIHPDOHVWKHLUPDWLQJ &RS\HGLWRU.LP&RIHU
SHULRGODVWVIRUVHYHUDOGD\V*HVWDWLRQODVWVIURPWRGD\VDQGWKHIHPDOH
JLYHVELUWKWROLWWHUVRIRQHWRWKUHH\RXQJZKLFKDUHERUQIDLUO\GHYHORSHGDQG 3URRIUHDGHU&KULVWLQD(GZDUGV
UHPDLQLQWKHQHVWIRUVHYHUDOGD\VEHIRUHYHQWXULQJRXW7KLVFDQKDSSHQVHYHUDO
WLPHVD\HDU ,QGH[HU/XFLH+DVNLQV
)LYHGD\VDIWHUELUWK\RXQJHOHSKDQWVKUHZVDGGPDVKHGLQVHFWVߚZKLFKWKHLU
,QWHULRU'HVLJQHU'DYLG)XWDWR
PRWKHUFROOHFWVDQGWUDQVSRUWVLQKHUFKHHNVߚWRWKHLUPLONGLHW7KH\RXQJ
EHJLQWKHLUPLJUDWRU\SKDVHDIWHUDERXWGD\VOHVVHQLQJWKHLUGHSHQGHQF\RQ &RYHU'HVLJQHU.DUHQ0RQWJRPHU\
WKHPRWKHU7KH\VXEVHTXHQWO\HVWDEOLVKWKHLURZQKRPHUDQJHDQGEHFRPH
VH[XDOO\DFWLYHZLWKLQWRGD\V ,OOXVWUDWRU5HEHFFD'HPDUHVW
$GXOWHOHSKDQWVKUHZVIHHGRQLQYHUWHEUDWHVVXFKDVLQVHFWVVSLGHUVFHQWLSHGHV
PLOOLSHGHVDQGHDUWKZRUPV(DWLQJODUJHUSUH\FDQEHVRPHZKDWPHVV\7KH 2FWREHU7KLUG(GLWLRQ
HOHSKDQWVKUHZPXVWSLQGRZQWKHSUH\XVLQJLWVIHHWWKHQFKHZVSLHFHVZLWKLWV 5HYLVLRQ+LVWRU\IRUWKH7KLUG(GLWLRQ
FKHHNWHHWKZKLFKFDQUHVXOWLQPDQ\GURSSHGELWV7KHHOHSKDQWVKUHZWKHQ
XVHVLWVWRQJXHWRIOLFNVPDOOIRRGLQWRLWVPRXWKVLPLODUWRDQDQWHDWHU:KHQ )LUVW5HOHDVH
DYDLODEOHVRPHDOVRHDWVPDOODPRXQWVRISODQWPDWWHUVXFKDVQHZOHDYHV 6HHKWWSRUHLOO\FRPFDWDORJHUUDWDFVS"LVEQ IRUUHOHDVH
VHHGVDQGVPDOOIUXLWV GHWDLOV
0DQ\RIWKHDQLPDOVRQ2ߞ5HLOO\FRYHUVDUHHQGDQJHUHGDOORIWKHPDUH
7KH2ߞ5HLOO\ORJRLVDUHJLVWHUHGWUDGHPDUNRI2ߞ5HLOO\0HGLD,QF $ERXWWKH$XWKRUV
3RVWJUH64/8SDQG5XQQLQJWKHFRYHULPDJHDQGUHODWHGWUDGHGUHVVDUH 5HJLQD2EHLVDFRSULQFLSDORI3DUDJRQ&RUSRUDWLRQDGDWDEDVHFRQVXOWLQJ
WUDGHPDUNVRI2ߞ5HLOO\0HGLD,QF FRPSDQ\EDVHGLQ%RVWRQ6KHKDVPRUHWKDQ\HDUVRISURIHVVLRQDO
:KLOHWKHSXEOLVKHUDQGWKHDXWKRUVKDYHXVHGJRRGIDLWKHIIRUWVWRHQVXUHWKDW H[SHULHQFHLQYDULRXVSURJUDPPLQJODQJXDJHVDQGGDWDEDVHV\VWHPVZLWK
WKHLQIRUPDWLRQDQGLQVWUXFWLRQVFRQWDLQHGLQWKLVZRUNDUHDFFXUDWHWKH VSHFLDOIRFXVRQVSDWLDOGDWDEDVHV6KHLVDPHPEHURIWKH3RVW*,6VWHHULQJ
SXEOLVKHUDQGWKHDXWKRUVGLVFODLPDOOUHVSRQVLELOLW\IRUHUURUVRURPLVVLRQV FRPPLWWHHDQGWKH3RVW*,6FRUHGHYHORSPHQWWHDPDVZHOODVWKHSJ5RXWLQJDQG
LQFOXGLQJZLWKRXWOLPLWDWLRQUHVSRQVLELOLW\IRUGDPDJHVUHVXOWLQJIURPWKHXVHRI *(26GHYHORSPHQWWHDPV5HJLQDKROGVD%6GHJUHHLQPHFKDQLFDOHQJLQHHULQJ
RUUHOLDQFHRQWKLVZRUN8VHRIWKHLQIRUPDWLRQDQGLQVWUXFWLRQVFRQWDLQHGLQ IURPWKH0DVVDFKXVHWWV,QVWLWXWHRI7HFKQRORJ\6KHFRDXWKRUHG3RVW*,6LQ
WKLVZRUNLVDW\RXURZQULVN,IDQ\FRGHVDPSOHVRURWKHUWHFKQRORJ\WKLVZRUN $FWLRQ0DQQLQJDQGSJ5RXWLQJ$3UDFWLFDO*XLGH/RFDWH3UHVV
FRQWDLQVRUGHVFULEHVLVVXEMHFWWRRSHQVRXUFHOLFHQVHVRUWKHLQWHOOHFWXDO /HR+VXLVDFRSULQFLSDORI3DUDJRQ&RUSRUDWLRQDGDWDEDVHFRQVXOWLQJ
SURSHUW\ULJKWVRIRWKHUVLWLV\RXUUHVSRQVLELOLW\WRHQVXUHWKDW\RXUXVHWKHUHRI FRPSDQ\EDVHGLQ%RVWRQ+HKDVPRUHWKDQ\HDUVRISURIHVVLRQDOH[SHULHQFH
FRPSOLHVZLWKVXFKOLFHQVHVDQGRUULJKWV GHYHORSLQJDQGWKLQNLQJDERXWGDWDEDVHVIRURUJDQL]DWLRQVODUJHDQGVPDOO/HR
KROGVDQ06GHJUHHLQHQJLQHHULQJRIHFRQRPLFV\VWHPVIURP6WDQIRUG
8QLYHUVLW\DQG%6GHJUHHVLQPHFKDQLFDOHQJLQHHULQJDQGHFRQRPLFVIURPWKH
>/6,@
0DVVDFKXVHWWV,QVWLWXWHRI7HFKQRORJ\+HFRDXWKRUHG3RVW*,6LQ$FWLRQ
0DQQLQJDQGSJ5RXWLQJ$3UDFWLFDO*XLGH/RFDWH3UHVV
ZZZBIGZZUDSSHU4XHU\LQJ1RQFRQYHQWLRQDO'DWD6RXUFHV
3UHIDFH
;
[OVWBSURFHVVIXQFWLRQ&ODVVLFH[WHQVLRQV
3RVWJUH64/ELOOVLWVHOIDVWKHZRUOGߞVPRVWDGYDQFHGRSHQVRXUFHGDWDEDVH:H
[POGDWDW\SH FRXOGQߞWDJUHHPRUH
DERXW;0/ :KDWZHKRSHWRDFFRPSOLVKLQWKLVERRNLVWRJLYH\RXDILUPJURXQGLQJLQWKH
FRQFHSWVDQGIHDWXUHVWKDWPDNH3RVWJUH64/VRLPSUHVVLYH$ORQJWKHZD\ZH
LQVHUWLQJGDWD,QVHUWLQJ;0/'DWD
VKRXOGFRQYLQFH\RXWKDW3RVWJUH64/GRHVLQGHHGVWDQGXSWRLWVFODLPWRIDPH
TXHU\LQJGDWD4XHU\LQJ;0/'DWD4XHU\LQJ;0/'DWD %HFDXVHWKHGDWDEDVHLVDGYDQFHGQRERRNVKRUWRIWKHSDJHVRI
GRFXPHQWDWLRQFDQEULQJRXWDOOLWVJORU\%XWWKHQDJDLQPRVWXVHUVGRQߞWQHHG
[POH[WHQVLRQ&ODVVLFH[WHQVLRQV WRGHOYHLQWRWKHPRVWDEVWUXVHIHDWXUHVWKDW3RVWJUH64/KDVWRRIIHU6RLQRXU
VKRUWHUSDJHUZHKRSHWRJHW\RXDVWKHVXEWLWOHSURFODLPV8SDQG
;0/IRUPDW([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ
5XQQLQJ
;0/6FKHPD'HILQLWLRQ;6',QVHUWLQJ;0/'DWD (DFKWRSLFLVSUHVHQWHGZLWKVRPHFRQWH[WVR\RXXQGHUVWDQGZKHQWRXVHLWDQG
ZKDWLWRIIHUV:HDVVXPH\RXKDYHSULRUH[SHULHQFHZLWKVRPHRWKHUGDWDEDVHVR
;0/7$%/(FODXVH)HDWXUHV,QWURGXFHGLQ3RVWJUH64/4XHU\LQJ;0/
WKDWZHFDQMXPSULJKWWRWKHNH\SRLQWVRI3RVWJUH64/:HJHQHURXVO\OLWWHUWKH
'DWD
SDJHVRIWKLVERRNZLWKOLQNVWRUHIHUHQFHVVR\RXFDQGLJGHHSHULQWRWRSLFVRI
[SDWKIXQFWLRQ4XHU\LQJ;0/'DWD LQWHUHVW7KHVHOLQNVOHDGWRVHFWLRQVLQWKHPDQXDOWRKHOSIXODUWLFOHVWREORJ
SRVWVRI3RVWJUH64/YDQJXDUGV:HDOVROLQNWRRXURZQVLWHDW3RVWJUHV2Q/LQH
;6';0/6FKHPD'HILQLWLRQ,QVHUWLQJ;0/'DWD -RXUQDOZKHUHZHKDYHFROOHFWHGPDQ\SLHFHVWKDWZHKDYHZULWWHQRQ
3RVWJUH64/DQGLWVLQWHURSHUDELOLW\ZLWKRWKHUDSSOLFDWLRQV
<
7KLVERRNIRFXVHVRQ3RVWJUH64/YHUVLRQVDQGEXWZHZLOOFRYHU
<XPUHSRVLWRU\&HQW26)HGRUD5HG+DW6FLHQWLILF/LQX[ VRPHXQLTXHDQGDGYDQFHGIHDWXUHVWKDWDUHDOVRSUHVHQWLQSULRUYHUVLRQV
\\\\PPGGIRUPDW'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
= $XGLHQFH
]HURLQGH[HGDUUD\V4XHU\LQJ-621 )RUPLJUDQWVIURPRWKHUGDWDEDVHHQJLQHVZHߞOOSRLQWRXWSDUDOOHOVWKDW
3RVWJUH64/VKDUHVZLWKRWKHUOHDGLQJSURGXFWV3HUKDSVPRUHLPSRUWDQWO\ZH
KLJKOLJKWIHDWV\RXFDQDFKLHYHZLWK3RVWJUH64/WKDWDUHGLIILFXOWRULPSRVVLEOH
WRGRLQRWKHUGDWDEDVHV
:HVWRSVKRUWRIWHDFKLQJ\RX64/DV\RXߞOOILQGPDQ\H[FHOOHQWVRXUFHVIRU
WKDW64/LVPXFKOLNHFKHVVߚDIHZKRXUVWROHDUQDOLIHWLPHWRPDVWHU<RX
KDYHZLVHO\FKRVHQ3RVWJUH64/<RXߞOOEHJUHDWO\UHZDUGHG ZULWDEOH&7(V:ULWDEOH&7(V
,I\RXߞUHFXUUHQWO\DVDYY\3RVWJUH64/XVHURUDZHDWKHUEHDWHQ'%$PXFKRI ZULWHDKHDGORJ:$/5HSOLFDWLRQ-DUJRQ
WKHPDWHULDOLQWKLVERRNVKRXOGEHIDPLOLDUWHUUDLQEXW\RXߞOOEHVXUHWRSLFNXS
VRPHSRLQWHUVDQGVKRUWFXWVLQWURGXFHGLQQHZHUYHUVLRQVRI3RVWJUH64/ ZULWLQJEHWWHUTXHULHV
3HUKDSV\RXߞOOHYHQILQGWKHKLGGHQJHPWKDWHOXGHG\RX,IQRWKLQJHOVHWKLV
ERRNLVDWOHDVWWHQWLPHVOLJKWHUWKDQWKH3RVWJUH64/PDQXDO DERXW:ULWLQJ%HWWHU4XHULHV
)RU0RUH,QIRUPDWLRQRQ3RVWJUH64/ DERXW:ULWLQJ)XQFWLRQV
3RVWJUH64/KDVDZHOOPDLQWDLQHGVHWRIRQOLQHGRFXPHQWDWLRQ3RVWJUH64/ DQDWRP\RIIXQFWLRQV$QDWRP\RI3RVWJUH64/)XQFWLRQV7UXVWHGDQG
PDQXDOV:HHQFRXUDJH\RXWRERRNPDUNLW7KHPDQXDOLVDYDLODEOHERWKDV
8QWUXVWHG/DQJXDJHV
+70/DQGDVD3')+DUGFRS\FROOHFWRUHGLWLRQVDUHDYDLODEOHIRUSXUFKDVH
2WKHU3RVWJUH64/UHVRXUFHVLQFOXGH LQ3/&RIIHH6FULSW:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW
)XQFWLRQV:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
3ODQHW3RVWJUH64/LVDQDJJUHJDWRURI3RVWJUH64/EORJV<RXߞOOILQG
3RVWJUH64/FRUHGHYHORSHUVDQGJHQHUDOXVHUVVKRZFDVLQJQHZIHDWXUHV LQ3//LYH6FULSW:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW
QRYHOZD\VWRXVHH[LVWLQJRQHVDQGUHSRUWLQJRIEXJVWKDWKDYH\HWWREH )XQFWLRQV:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
SDWFKHG
LQ3/SJ64/:ULWLQJ3/SJ64/)XQFWLRQV:ULWLQJ7ULJJHU)XQFWLRQVLQ
3RVWJUH64/:LNLSURYLGHVWLSVDQGWULFNVIRUPDQDJLQJYDULRXVIDFHWVRIWKH 3/SJ64/
GDWDEDVHDQGPLJUDWLQJIURPRWKHUGDWDEDVHV
LQ3/3\WKRQ:ULWLQJ3/3\WKRQ)XQFWLRQV%DVLF3\WKRQ)XQFWLRQ
3RVWJUH64/%RRNVLVDOLVWRIERRNVDERXW3RVWJUH64/
LQ3/9:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW)XQFWLRQV
3RVW*,6LQ$FWLRQ%RRNVLVWKHZHEVLWHIRUWKHERRNVZHߞYHZULWWHQRQ
:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
3RVW*,6WKHVSDWLDOH[WHQGHUIRU3RVWJUH64/DQGPRUHUHFHQWO\SJ5RXWLQJ
DQRWKHU3RVWJUH64/H[WHQVLRQWKDWSURYLGHVQHWZRUNURXWLQJFDSDELOLWLHV LQ64/:ULWLQJ)XQFWLRQVZLWK64/:ULWLQJ64/$JJUHJDWH)XQFWLRQV
XVHIXOIRUEXLOGLQJGULYLQJDSSV
DJJUHJDWHIXQFWLRQVDQG$JJUHJDWHV &RGHDQG2XWSXW)RUPDWWLQJ
25'(5%<FODXVH25'(5%<25'(5%< )RUHOHPHQWVLQSDUHQWKHVHVZHJUDYLWDWHWRZDUGSODFLQJWKHRSHQSDUHQWKHVLVRQ
WKHVDPHOLQHDVWKHSUHFHGLQJHOHPHQWDQGWKHFORVLQJSDUHQWKHVLVRQDOLQHE\
3$57,7,21%<FODXVH3$57,7,21%< LWVHOI7KLVLVDFODVVLF&IRUPDWWLQJVW\OHWKDWZHOLNHEHFDXVHLWFXWVGRZQRQ
ZULWLQJLQ3/9:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9:ULWLQJ:LQGRZ WKHQXPEHURIEODQNOLQHV
)XQFWLRQVLQ3/9
function(
Welcome to PostgreSQL
:LQGRZVSODWIRUP );
DUFKLYHBFRPPDQGGLUHFWLYHDQG&RQILJXULQJWKH0DVWHU :HDOVRUHPRYHJUDWXLWRXVVSDFHVLQVFUHHQRXWSXWVRLIWKHIRUPDWWLQJRI\RXU
LQVWDOOLQJ3RVWJUH64/:LQGRZVDQG'HVNWRS/LQX[ UHVXOWVGRHVQߞWPDWFKRXUVH[DFWO\GRQߞWIUHW
:HRPLWWKHVSDFHDIWHUDVHULDOFRPPDIRUVKRUWHOHPHQWV)RUH[DPSOH
SJ$JHQWYHUVLRQVDQG+HOSIXOSJ$JHQW4XHULHV
D
E
F
SVTOWRRODQGSVTO&XVWRPL]DWLRQV 7KH64/LQWHUSUHWHUWUHDWVWDEVQHZOLQHVDQGFDUULDJHUHWXUQVDVZKLWHVSDFH,Q
RXUFRGHZHJHQHUDOO\XVHZKLWHVSDFHVIRULQGHQWDWLRQQRWWDEV0DNHVXUHWKDW
UHVWRUHBFRPPDQGGLUHFWLYHDQG&RQILJXULQJWKH6ODYHVIRU)XOO6HUYHU
\RXUHGLWRUGRHVQߞWDXWRPDWLFDOO\UHPRYHWDEVQHZOLQHVDQGFDUULDJHUHWXUQVRU
&OXVWHU5HSOLFDWLRQ
FRQYHUWWKHPWRVRPHWKLQJRWKHUWKDQVSDFHV
UHWULHYLQJFRPPDQGKLVWRU\5HWULHYLQJ3ULRU&RPPDQGV $IWHUFRS\LQJDQGSDVWLQJLI\RXILQG\RXUFRGHQRWZRUNLQJFKHFNWKHFRSLHG
FRGHWRPDNHVXUHLWORRNVOLNHZKDWZHKDYHLQWKHOLVWLQJ
ZLQGRZBREMHFWKHOSHUIXQFWLRQ:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
:HXVHH[DPSOHVEDVHGRQERWK/LQX[DQG:LQGRZV3DWKQRWDWLRQVGLIIHU
:,7+&+(&.237,21PRGLILHU)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ EHWZHHQWKHWZRQDPHO\WKHXVHRIVROLGXV/YHUVXVUHYHUVHVROLGXV\:KLOH
9LHZV RQ:LQGRZVXVHWKH/LQX[VROLGXVDOZD\V/QRW\<RXPD\VHHDSDWKVXFKDV
:,7+FODXVH3RVWJUH64/'DWDEDVH2EMHFWV SRVWJUHVTOBERRNVRPHILOHFVY7KHVHDUHDOZD\VUHODWLYHWRWKHURRWRI\RXU
VHUYHU,I\RXDUHRQ:LQGRZV\RXPXVWLQFOXGHWKHGULYHOHWWHU
:,7+*5$17237,21PRGLILHU*5$17 &SRVWJUHVTOBERRNVRPHILOHFVY
:,7+25',1$/,7<FODXVH4XHU\LQJ;0/'DWD:,7+25',1$/,7<
:,7+25',1$/,7< &RQYHQWLRQV8VHGLQ7KLV%RRN
:,7+,1*5283PRGLILHU)HDWXUHV,QWURGXFHGLQ3RVWJUH64/3HUFHQWLOHV 7KHIROORZLQJW\SRJUDSKLFDOFRQYHQWLRQVDUHXVHGLQWKLVERRN
DQG0RGH ,WDOLF
ZRUNBPHPQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV ,QGLFDWHVQHZWHUPV85/VHPDLODGGUHVVHVILOHQDPHVDQGILOHH[WHQVLRQV
Constant width XSJUDGHUHFRPPHQGDWLRQV:K\8SJUDGH"
8VHGIRUSURJUDPOLVWLQJV8VHGZLWKLQSDUDJUDSKVZKHUHQHHGHGIRUFODULW\ YLHZV3RVWJUH64/'DWDEDVH2EMHFWV
WRUHIHUWRSURJUDPPLQJHOHPHQWVVXFKDVYDULDEOHVIXQFWLRQVGDWDEDVHV
GDWDW\SHVHQYLURQPHQWYDULDEOHVVWDWHPHQWVDQGNH\ZRUGV VHHDOVRVSHFLILFYLHZV
VLQJOHWDEOH6LQJOH7DEOH9LHZV
7,3
7KLVLFRQVLJQLILHVDWLSVXJJHVWLRQRUJHQHUDOQRWH XSGDWLQJZLWKWULJJHUV8VLQJ7ULJJHUVWR8SGDWH9LHZV8VLQJ7ULJJHUVWR
8SGDWH9LHZV
YLHZVYLHZ3RVWJUH64/'DWDEDVH2EMHFWV
:$51,1*
92'.$LQGH[PHWKRGW\SH3RVWJUH64/6WRFN,QGH[HV
7KLVLFRQLQGLFDWHVDZDUQLQJRUFDXWLRQ
92/$7,/,7<VHWWLQJ)XQFWLRQ%DVLFV
:
8VLQJ&RGH([DPSOHV
:$/ZULWHDKHDGORJ5HSOLFDWLRQ-DUJRQ
&RGHDQGGDWDH[DPSOHVDUHDYDLODEOHIRUGRZQORDGDW
KWWSZZZSRVWJUHVRQOLQHFRPGRZQORDGVSRVWJUHVTOBERRNBH]LS ?ZDWFKFRPPDQG:DWFKLQJ6WDWHPHQWV
7KLVERRNLVKHUHWRKHOS\RXJHW\RXUMREGRQH,QJHQHUDO\RXPD\XVHWKH :+(1WULJJHUFRQGLWLRQ7ULJJHUVDQG7ULJJHU)XQFWLRQV
FRGHLQWKLVERRNLQ\RXUSURJUDPVDQGGRFXPHQWDWLRQ<RXGRQRWQHHGWR
FRQWDFWXVIRUSHUPLVVLRQXQOHVV\RXߞUHUHSURGXFLQJDVLJQLILFDQWSRUWLRQRIWKH :+(5(FODXVH6LQJOH7DEOH9LHZV
FRGH)RUH[DPSOHZULWLQJDSURJUDPWKDWXVHVVHYHUDOFKXQNVRIFRGHIURPWKLV
ZKLWHVSDFHWULPLPLQJ6WULQJ)XQFWLRQV
ERRNGRHVQRWUHTXLUHSHUPLVVLRQ6HOOLQJRUGLVWULEXWLQJD&'520RI
H[DPSOHVIURP2ߞ5HLOO\ERRNVGRHVUHTXLUHSHUPLVVLRQ$QVZHULQJDTXHVWLRQ ZLQGRZIXQFWLRQV
E\FLWLQJWKLVERRNDQGTXRWLQJH[DPSOHFRGHGRHVQRWUHTXLUHSHUPLVVLRQ
,QFRUSRUDWLQJDVLJQLILFDQWDPRXQWRIH[DPSOHFRGHIURPWKLVERRNLQWR\RXU DERXW:LQGRZ)XQFWLRQV
SURGXFWߞVGRFXPHQWDWLRQGRHVUHTXLUHSHUPLVVLRQ
9 :HDSSUHFLDWHEXWGRQRWUHTXLUHDWWULEXWLRQ$QDWWULEXWLRQXVXDOO\LQFOXGHVWKH
WLWOHDXWKRUSXEOLVKHUDQG,6%1)RUH[DPSOHߡ3RVWJUH64/8SDQG5XQQLQJ
9$&880$1$/<=(FRPPDQG7DEOH6WDWLVWLFV 7KLUG(GLWLRQE\5HJLQD2EHDQG/HR+VX2ߞ5HLOO\&RS\ULJKW5HJLQD
9$/,'817,/FODXVH&UHDWLQJ/RJLQ5ROHV 2EHDQG/HR+VXߢ
,I\RXIHHO\RXUXVHRIFRGHH[DPSOHVIDOOVRXWVLGHIDLUXVHRUWKHSHUPLVVLRQ
9$/8(6NH\ZRUG0XOWLURZ,QVHUW
JLYHQDERYHIHHOIUHHWRFRQWDFWXVDWSHUPLVVLRQV#RUHLOO\FRP
YDOXHVOLVW0XOWLURZ,QVHUW
YDUFKDUGDWDW\SH7H[WXDOV%DVLF7DEOH&UHDWLRQ 2ߞ5HLOO\6DIDUL
YDULDEOHV 6DIDULIRUPHUO\6DIDUL%RRNV2QOLQHLVDPHPEHUVKLSEDVHGWUDLQLQJDQG
UHIHUHQFHSODWIRUPIRUHQWHUSULVHJRYHUQPHQWHGXFDWRUVDQGLQGLYLGXDOV
FRQILJXUDWLRQ5HSOLFDWLRQ-DUJRQ
0HPEHUVKDYHDFFHVVWRWKRXVDQGVRIERRNVWUDLQLQJYLGHRV/HDUQLQJ3DWKV
HQYLURQPHQW(QYLURQPHQW9DULDEOHV LQWHUDFWLYHWXWRULDOVDQGFXUDWHGSOD\OLVWVIURPRYHUSXEOLVKHUVLQFOXGLQJ
2ߞ5HLOO\0HGLD+DUYDUG%XVLQHVV5HYLHZ3UHQWLFH+DOO3URIHVVLRQDO$GGLVRQ
JOREDO&UHDWLQJ*URXS5ROHV :HVOH\3URIHVVLRQDO0LFURVRIW3UHVV6DPV4XH3HDFKSLW3UHVV$GREH)RFDO
ORFDO:ULWLQJ3/SJ64/)XQFWLRQV 3UHVV&LVFR3UHVV-RKQ:LOH\ 6RQV6\QJUHVV0RUJDQ.DXIPDQQ,%0
5HGERRNV3DFNW$GREH3UHVV)73UHVV$SUHVV0DQQLQJ1HZ5LGHUV
SVTOVKRUWFXWVDQG6KRUWFXWV 0F*UDZ+LOO-RQHV %DUWOHWWDQG&RXUVH7HFKQRORJ\DPRQJRWKHUV
YHUVLRQV )RUPRUHLQIRUPDWLRQSOHDVHYLVLWKWWSRUHLOO\FRPVDIDUL
SJ$GPLQWRRO8VLQJSJ$GPLQ
+RZWR&RQWDFW8V
SJ$JHQWWRRO+HOSIXOSJ$JHQW4XHULHV
3OHDVHDGGUHVVFRPPHQWVDQGTXHVWLRQVFRQFHUQLQJWKLVERRNWRWKHSXEOLVKHU
SJBGXPSWRRO%DFNXSDQG5HVWRUH
2ߞ5HLOO\0HGLD,QF
SJBUHVWRUHWRRO%DFNXSDQG5HVWRUH
*UDYHQVWHLQ+LJKZD\1RUWK
3RVWJUH64/)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
3RVWJUH64/)HDWXUHV,QWURGXFHGLQ3RVWJUH64/)HDWXUHV,QWURGXFHG 6HEDVWRSRO&$
LQ3RVWJUH64/
LQWKH8QLWHG6WDWHVRU&DQDGD
3RVWJUH64/)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
LQWHUQDWLRQDORUORFDO
3RVWJUH64/)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
ID[ 81/2**('PRGLILHU8QORJJHG7DEOHV
3OHDVHVXEPLWHUUDWDXVLQJWKHERRNߞVHUUDWDSDJH XQORJJHGWDEOHV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/8QORJJHG7DEOHV
7KHFRPSDQLRQVLWHIRUWKLVERRNLVDWKWWSELWO\SRVWJUHVTOXSDQGUXQQLQJH XQQHVWIXQFWLRQ
7RFRQWDFWWKHDXWKRUVVHQGHPDLOWROU#SFRUSXV LPSURYHGIXQFWLRQDOLW\)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
7RFRPPHQWRUDVNWHFKQLFDOTXHVWLRQVWRWKHSXEOLVKHUVHQGHPDLOWR
VWULQJBWRBDUUD\IXQFWLRQDQG6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU
ERRNTXHVWLRQV#RUHLOO\FRP
6XEVWULQJV
)RUPRUHLQIRUPDWLRQDERXWRXUERRNVFRXUVHVFRQIHUHQFHVDQGQHZVVHHRXU
ZHEVLWHDWKWWSZZZRUHLOO\FRP XQQHVWLQJDUUD\VLQWRURZV5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
8QQHVWLQJ$UUD\VWR5RZV
)LQGXVRQ)DFHERRNKWWSIDFHERRNFRPRUHLOO\
)ROORZXVRQ7ZLWWHUKWWSWZLWWHUFRPRUHLOO\PHGLD [SDWKIXQFWLRQDQG4XHU\LQJ;0/'DWD
:DWFKXVRQ<RX7XEHKWWSZZZ\RXWXEHFRPRUHLOO\PHGLD ?XQVHWFRPPDQGSVTO&XVWRPL]DWLRQV
XQWUXVWHGODQJXDJHV7UXVWHGDQG8QWUXVWHG/DQJXDJHV%DVLF3\WKRQ)XQFWLRQ
XSGDWDEOHVHWWLQJ4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
83'$7(FRPPDQG7HPSODWH'DWDEDVHV6LQJOH7DEOH9LHZV5HVWULFWLQJ
'(/(7(83'$7(DQG6(/(&7IURP,QKHULWHG7DEOHV
83'$7(2)FODXVH3RVWJUH64/'DWDEDVH2EMHFWV7ULJJHUVDQG7ULJJHU
)XQFWLRQV
XSGDWHV
FRQIOLFWKDQGOLQJ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
ORFNIDLOXUHV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
SURWHFWLQJDJDLQVWLQYLHZV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
XSSHUIXQFWLRQ,/,.(IRU&DVH,QVHQVLWLYH6HDUFK
836(57FRQVWUXFW836(57V,16(5721&21)/,&783'$7(
WVUDQJHGDWDW\SH7HPSRUDOV%XLOWLQ5DQJH7\SHV
3RVWJUH64/LVDQH[WUHPHO\SRZHUIXOSLHFHRIVRIWZDUHWKDWLQWURGXFHVIHDWXUHV
WVW]UDQJHGDWDW\SH7HPSRUDOV%XLOWLQ5DQJH7\SHV \RXPD\QRWKDYHVHHQEHIRUH6RPHRIWKHIHDWXUHVDUHDOVRSUHVHQWLQRWKHU
WVYHFWRUGDWDW\SH769HFWRUV769HFWRUV ZHOONQRZQGDWDEDVHHQJLQHVEXWXQGHUGLIIHUHQWQDPHV7KLVFKDSWHUOD\VRXW
WKHPDLQFRQFHSWV\RXVKRXOGNQRZZKHQVWDUWLQJWRDWWDFN3RVWJUH64/
WVYHFWRUBXSGDWHBWULJJHUIXQFWLRQ769HFWRUV GRFXPHQWDWLRQDQGPHQWLRQVVRPHUHODWHGWHUPVLQRWKHUGDWDEDVHV
WVBKHDGOLQHIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/)XOO7H[W6XSSRUW :HEHJLQE\SRLQWLQJ\RXWRUHVRXUFHVIRUGRZQORDGLQJDQGLQVWDOOLQJ
IRU-621DQG-621% 3RVWJUH64/1H[WZHSURYLGHDQRYHUYLHZRILQGLVSHQVDEOHDGPLQLVWUDWLRQWRROV
IROORZHGE\DUHYLHZRI3RVWJUH64/QRPHQFODWXUH3RVWJUH64/ZDVUHFHQWO\
WVBUDQNIXQFWLRQ5DQNLQJ5HVXOWV UHOHDVHG:HߞOOKLJKOLJKWVRPHRIWKHQHZIHDWXUHVWKHUHLQ:HFORVHZLWK
UHVRXUFHVWRWXUQWRZKHQ\RXQHHGDGGLWLRQDOJXLGDQFHDQGWRVXEPLWEXJ
WVBUDQNBFGIXQFWLRQ5DQNLQJ5HVXOWV
UHSRUWV
W\SHVGDWDVHHGDWDW\SHV
8 :K\3RVWJUH64/"
8EXQWXSODWIRUP'HELDQ8EXQWX 3RVWJUH64/LVDQHQWHUSULVHFODVVUHODWLRQDOGDWDEDVHPDQDJHPHQWV\VWHPRQ
SDUZLWKWKHYHU\EHVWSURSULHWDU\GDWDEDVHV\VWHPV2UDFOH0LFURVRIW64/
XQLTXHFRQVWUDLQWV8QLTXH&RQVWUDLQWV3DUWLDO,QGH[HV 6HUYHUDQG,%0'%MXVWWRQDPHDIHZ3RVWJUH64/LVVSHFLDOEHFDXVHLWߞVQRW
MXVWDGDWDEDVHLWߞVDOVRDQDSSOLFDWLRQSODWIRUPDQGDQLPSUHVVLYHRQHDWWKDW
8QL[SODWIRUP
3RVWJUH64/LVIDVW,QEHQFKPDUNV3RVWJUH64/HLWKHUH[FHHGVRUPDWFKHVWKH
DUFKLYHBFRPPDQGGLUHFWLYHDQG&RQILJXULQJWKH0DVWHU SHUIRUPDQFHRIPDQ\RWKHUGDWDEDVHVERWKRSHQVRXUFHDQGSURSULHWDU\
FURQWDEFRPPDQG-RE6FKHGXOLQJZLWKSJ$JHQW 3RVWJUH64/LQYLWHV\RXWRZULWHVWRUHGSURFHGXUHVDQGIXQFWLRQVLQQXPHURXV
SURJUDPPLQJODQJXDJHV,QDGGLWLRQWRWKHSUHSDFNDJHGODQJXDJHVRI&64/
LQVWDOOLQJ3RVWJUH64/&HQW26)HGRUD5HG+DW6FLHQWLILF/LQX[ DQG3/SJ64/\RXFDQHDVLO\HQDEOHVXSSRUWIRUDGGLWLRQDOODQJXDJHVVXFKDV
SVTOWRRODQGSVTO&XVWRPL]DWLRQV 3/3HUO3/3\WKRQ3/9DND3/-DYD6FULSW3/5XE\DQG3/57KLV
VXSSRUWIRUDZLGHYDULHW\RIODQJXDJHVDOORZV\RXWRFKRRVHWKHODQJXDJHZLWK
UHVWRUHBFRPPDQGGLUHFWLYHDQG&RQILJXULQJWKH6ODYHVIRU)XOO6HUYHU FRQVWUXFWVWKDWFDQEHVWVROYHWKHSUREOHPDWKDQG)RULQVWDQFHXVH5IRU
&OXVWHU5HSOLFDWLRQ VWDWLVWLFVDQGJUDSKLQJ3\WKRQIRUFDOOLQJZHEVHUYLFHVWKH3\WKRQ6FL3\OLEUDU\
IRUVFLHQWLILFFRPSXWLQJDQG3/9IRUYDOLGDWLQJGDWDSURFHVVLQJVWULQJVDQG
UHWULHYLQJFRPPDQGKLVWRU\5HWULHYLQJ3ULRU&RPPDQGV ZUDQJOLQJZLWK-621GDWD(DVLHU\HWILQGDIUHHO\DYDLODEOHIXQFWLRQWKDW\RX
QHHGILQGRXWWKHODQJXDJHWKDWLWߞVZULWWHQLQHQDEOHWKDWVSHFLILFODQJXDJHLQ
3RVWJUH64/DQGFRS\WKHFRGH1RRQHZLOOWKLQNOHVVRI\RX WRBFKDUIXQFWLRQ'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
0RVWGDWDEDVHSURGXFWVOLPLW\RXWRDSUHGHILQHGVHWRIGDWDW\SHVLQWHJHUV WRBWVTXHU\IXQFWLRQ764XHULHV
WH[WV%RROHDQVHWF1RWRQO\GRHV3RVWJUH64/FRPHZLWKDODUJHUEXLOWLQVHW
WKDQPRVWEXW\RXFDQGHILQHDGGLWLRQDOGDWDW\SHVWRVXLW\RXUQHHGV1HHG WRBWVYHFWRUIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/769HFWRUV)XOO
FRPSOH[QXPEHUV"&UHDWHDFRPSRVLWHW\SHPDGHXSRIWZRIORDWV+DYHD 7H[W6XSSRUWIRU-621DQG-621%
WULDQJOHIHWLVK"&UHDWHDFRRUGLQDWHW\SHWKHQFUHDWHDWULDQJOHW\SHPDGHXSRI
WKUHHFRRUGLQDWHSDLUV$GR]HQDODFWLYLVW"&UHDWH\RXURZQGXRGHFLPDOW\SH WUDQVDFWLRQORJ5HSOLFDWLRQ-DUJRQ
,QQRYDWLYHW\SHVDUHXVHIXOLQVRIDUDVWKHRSHUDWRUVDQGIXQFWLRQVWKDWVXSSRUW WULJJHUIXQFWLRQV
WKHP6RRQFH\RXߞYHFUHDWHG\RXUVSHFLDOQXPEHUW\SHVGRQߞWIRUJHWWRGHILQH
EDVLFDULWKPHWLFRSHUDWLRQVIRUWKHP<HV3RVWJUH64/ZLOOOHW\RXFXVWRPL]HWKH DERXW3RVWJUH64/'DWDEDVH2EMHFWV7ULJJHUVDQG7ULJJHU)XQFWLRQV7ULJJHUV
PHDQLQJRIWKHV\PEROV
:KHQHYHU\RXFUHDWHDW\SH3RVWJUH64/ DQG7ULJJHU)XQFWLRQV
DXWRPDWLFDOO\FUHDWHVDFRPSDQLRQDUUD\W\SHIRU\RX,I\RXFUHDWHGDFRPSOH[
QXPEHUW\SHDUUD\VRIFRPSOH[QXPEHUVDUHDYDLODEOHWR\RXZLWKRXWDGGLWLRQDO ZULWLQJLQ3/SJ64/:ULWLQJ7ULJJHU)XQFWLRQVLQ3/SJ64/
ZRUN
WULJJHUV
3RVWJUH64/DOVRDXWRPDWLFDOO\FUHDWHVW\SHVIURPDQ\WDEOHV\RXGHILQH)RU
LQVWDQFHFUHDWHDWDEOHRIGRJVZLWKFROXPQVVXFKDVEUHHGFXWHQHVVDQG DERXW3RVWJUH64/'DWDEDVH2EMHFWV7ULJJHUVDQG7ULJJHU)XQFWLRQV7ULJJHUV
EDUNLQHVV%HKLQGWKHVFHQHV3RVWJUH64/PDLQWDLQVDGRJVGDWDW\SHIRU\RX DQG7ULJJHU)XQFWLRQV
7KLVDPD]LQJO\XVHIXOEULGJHEHWZHHQWKHUHODWLRQDOZRUOGDQGWKHREMHFWZRUOG
PHDQVWKDW\RXFDQWUHDWGDWDHOHPHQWVLQDZD\WKDWߞVFRQYHQLHQWIRUWKHWDVNDW ,167($'2)8VLQJ7ULJJHUVWR8SGDWH9LHZV8VLQJ7ULJJHUVWR8SGDWH
KDQG<RXFDQFUHDWHIXQFWLRQVWKDWZRUNRQRQHREMHFWDWDWLPHRUIXQFWLRQVWKDW 9LHZV7ULJJHUVDQG7ULJJHU)XQFWLRQV:ULWLQJ7ULJJHU)XQFWLRQVLQ
ZRUNRQVHWVRIREMHFWVDWDWLPH0DQ\WKLUGSDUW\H[WHQVLRQVIRU3RVWJUH64/ 3/SJ64/
OHYHUDJHFXVWRPW\SHVWRDFKLHYHSHUIRUPDQFHJDLQVSURYLGHGRPDLQVSHFLILF
SODFLQJRQIRUHLJQWDEOHV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
FRQVWUXFWVIRUVKRUWHUDQGPRUHPDLQWDLQDEOHFRGHDQGDFFRPSOLVKIHDWV\RXFDQ
RQO\IDQWDVL]HDERXWZLWKRWKHUGDWDEDVHSURGXFWV 3/SJ64/DQG:ULWLQJ7ULJJHU)XQFWLRQVLQ3/SJ64/
2XUSULQFLSDODGYLFHLVWKLVGRQߞWWUHDWGDWDEDVHVDVGXPEVWRUDJH$GDWDEDVH XSGDWLQJYLHZV8VLQJ7ULJJHUVWR8SGDWH9LHZV8VLQJ7ULJJHUVWR8SGDWH
VXFKDV3RVWJUH64/FDQEHDIXOOIOHGJHGDSSOLFDWLRQSODWIRUP:LWKDUREXVW
9LHZV
GDWDEDVHHYHU\WKLQJHOVHLVH\HFDQG\2QFH\RXߞUHYHUVDQWLQ64/\RXߞOOEH
DEOHWRDFFRPSOLVKLQVHFRQGVZKDWZRXOGWDNHDFDVXDOSURJUDPPHUKRXUVERWK WULPIXQFWLRQ6WULQJ)XQFWLRQV
LQFRGLQJDQGUXQQLQJWLPH
7581&$7(HYHQW8VLQJ7ULJJHUVWR8SGDWH9LHZV
,QUHFHQW\HDUVZHߞYHZLWQHVVHGDQXSVXUJHRI1R64/PRYHPHQWVWKRXJK
PXFKRILWFRXOGEHK\SH$OWKRXJK3RVWJUH64/LVIXQGDPHQWDOO\UHODWLRQDO WUXVWDXWKHQWLFDWLRQPHWKRG$XWKHQWLFDWLRQPHWKRGV
\RXߞOOILQGSOHQW\RIIDFLOLWLHVWRKDQGOHQRQUHODWLRQDOGDWD7KHOWUHHH[WHQVLRQWR
3RVWJUH64/KDVEHHQDURXQGVLQFHWLPHLPPHPRULDODQGSURYLGHVVXSSRUWIRU WUXVWHGODQJXDJHV7UXVWHGDQG8QWUXVWHG/DQJXDJHV
JUDSKV7KHKVWRUHH[WHQVLRQVOHW\RXVWRUHNH\YDOXHSDLUV-621DQG-621%
WDEXODUH[SODLQSODQ*UDSKLFDO2XWSXWV W\SHVDOORZVWRUDJHRIGRFXPHQWVVLPLODUWR0RQJR'E,QPDQ\ZD\V
3RVWJUH64/DFFRPPRGDWHG1R64/EHIRUHWKHWHUPZDVHYHQFRLQHG
WHPSODWHGDWDEDVHV7HPSODWH'DWDEDVHV
3RVWJUH64/MXVWFHOHEUDWHGLWVWKELUWKGD\GDWLQJIURPLWVFKULVWHQLQJWR
WHPSRUDOGDWDW\SHV 3RVWJUH64/IURP3RVWJUHV7KHEHJLQQLQJVRIWKH3RVWJUH64/FRGHEDVH
EHJDQZHOOEHIRUHWKDWLQ3RVWJUH64/LVVXSSRUWHGRQDOOPDMRURSHUDWLQJ
DERXW7HPSRUDOV7HPSRUDOV V\VWHPV/LQX[8QL[:LQGRZVDQG0DF(YHU\\HDUEULQJVDQHZPDMRU
DGGLQJLQWHUYDOV'DWHWLPH2SHUDWRUVDQG)XQFWLRQV UHOHDVHRIIHULQJHQKDQFHGSHUIRUPDQFHDORQJZLWKIHDWXUHVWKDWSXVKWKH
HQYHORSHRIZKDWߞVSRVVLEOHLQDGDWDEDVHRIIHULQJ
GDWHWLPHRSHUDWRUVDQGIXQFWLRQV'DWHWLPH2SHUDWRUVDQG)XQFWLRQV'DWHWLPH
)LQDOO\3RVWJUH64/LVRSHQVRXUFHZLWKDJHQHURXVOLFHQVLQJSROLF\
2SHUDWRUVDQG)XQFWLRQV 3RVWJUH64/LVVXSSRUWHGE\DFRPPXQLW\RIGHYHORSHUVDQGXVHUVZKHUHSURILW
VXEWUDFWLQJLQWHUYDOV'DWHWLPH2SHUDWRUVDQG)XQFWLRQV PD[LPL]DWLRQLVQRWWKHXOWLPDWHSXUVXLW,I\RXZDQWIHDWXUHV\RXߞUHIUHHWR
FRQWULEXWHRUDWOHDVWYRFDOL]H,I\RXZDQWWRFXVWRPL]HDQGH[SHULPHQWQRRQH
WH[WGDWDW\SH7H[WXDOV%DVLF7DEOH&UHDWLRQ LVJRLQJWRVXH\RX<RXWKHPLJKW\XVHUPDNH3RVWJUH64/ZKDWLWLV
DERXW7LPH=RQHV:KDW7KH\$UHDQG$UH1RW7LPH=RQHV:KDW7KH\$UH
DQG$UH1RW :K\1RW3RVWJUH64/"
WHPSRUDOVDQG7HPSRUDOV *LYHQDOOWKHSURVHO\WL]LQJWKXVIDULWߞVRQO\IDLUWKDWZHSRLQWRXWVLWXDWLRQV
ZKHQ3RVWJUH64/PLJKWQRWEHVXLWDEOH
WLPHVWDPSGDWDW\SH7HPSRUDOV'DWHWLPH2SHUDWRUVDQG)XQFWLRQV'DWHWLPH 7KHW\SLFDOLQVWDOODWLRQVL]HRI3RVWJUH64/ZLWKRXWDQ\H[WHQVLRQVLVPRUHWKDQ
2SHUDWRUVDQG)XQFWLRQV 0%7KLVUXOHVRXW3RVWJUH64/IRUDGDWDEDVHRQDVPDOOGHYLFHRUDVD
VLPSOHFDFKHVWRUH0DQ\OLJKWZHLJKWGDWDEDVHVDERXQGWKDWFRXOGEHWWHUVHUYH
WLPHVWDPSW]GDWDW\SH7HPSRUDOV%DVLF7DEOH&UHDWLRQ
\RXUQHHGVZLWKRXWWKHODUJHUIRRWSULQW
WLPHW]GDWDW\SH7HPSRUDOV *LYHQLWVHQWHUSULVHVWDWXUH3RVWJUH64/GRHVQߞWWDNHVHFXULW\OLJKWO\,I\RXߞUH
?WLPLQJFRPPDQG7LPLQJ([HFXWLRQV GHYHORSLQJOLJKWZHLJKWDSSOLFDWLRQVZKHUH\RXߞUHPDQDJLQJVHFXULW\DWWKH
DSSOLFDWLRQOHYHO3RVWJUH64/VHFXULW\ZLWKLWVVRSKLVWLFDWHGUROHDQGSHUPLVVLRQ
WLPLQJH[HFXWLRQVSVTO7LPLQJ([HFXWLRQV PDQDJHPHQWFRXOGEHRYHUNLOO<RXPLJKWFRQVLGHUDVLQJOHXVHUGDWDEDVHVXFK
DV64/LWHRUDGDWDEDVHVXFKDV)LUHELUGWKDWFDQEHUXQHLWKHUDVDFOLHQWVHUYHU
72$677KH2YHUVL]HG$WWULEXWH6WRUDJH7HFKQLTXH$YRLG6(/(&7
RULQVLQJOHXVHUHPEHGGHGPRGH LQVHUWLQJGDWDLQWR%LQDU\-621MVRQE
$OOWKDWVDLGLWLVDFRPPRQSUDFWLFHWRFRPELQH3RVWJUH64/ZLWKRWKHU ODWHUDOMRLQV/DWHUDO-RLQV/DWHUDO-RLQV
GDWDEDVHW\SHV2QHFRPPRQFRPELQDWLRQ\RXZLOOILQGLVXVLQJ5HGLVRU
0HPFDFKHWRFDFKH3RVWJUH64/TXHU\UHVXOWV$VDQRWKHUH[DPSOH64/LWHFDQ ORJLFDOUHSOLFDWLRQDQG5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHVZLWK
EHXVHGWRVWRUHDGLVFRQQHFWHGVHWRIGDWDIRURIIOLQHTXHU\LQJZKHQ3RVWJUH64/ /RJLFDO5HSOLFDWLRQ5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHVZLWK/RJLFDO
LVWKHPDLQGDWDEDVHEDFNHQGIRUDQDSSOLFDWLRQ 5HSOLFDWLRQ
)LQDOO\PDQ\KRVWLQJFRPSDQLHVGRQߞWRIIHU3RVWJUH64/RQDVKDUHGKRVWLQJ
PRYLQJ0RYLQJ2EMHFWV$PRQJ7DEOHVSDFHV
HQYLURQPHQWRUWKH\RIIHUDQRXWGDWHGYHUVLRQ0RVWVWLOOJUDYLWDWHWRZDUGWKH
LPSRWHQW0\64/7RDZHEGHVLJQHUIRUZKRPWKHGDWDEDVHLVDQDIWHUWKRXJKW SDUWLWLRQHG3DUWLWLRQHG7DEOHV3DUWLWLRQHG7DEOHV
0\64/PLJKWVXIILFH%XWDVVRRQDV\RXOHDUQWRZULWHDQ\64/EH\RQGD
VLQJOHWDEOHVHOHFWDQGVLPSOHMRLQV\RXߞOOEHJLQWRVHQVHWKHVKRUWFRPLQJVRI SRSXODWLQJ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
0\64/6LQFHWKHILUVWHGLWLRQRIWKLVERRNYLUWXDOL]DWLRQKDVUHVRZQWKH SRSXODWLQJZLWKSJ6FULSWSJ6FULSW
ODQGVFDSHRIFRPPHULFDOKRVWLQJVRKDYLQJ\RXURZQGHGLFDWHGVHUYHULVQR
ORQJHUDOX[XU\EXWWKHQRUP$QGZKHQ\RXKDYH\RXURZQVHUYHU\RXߞUHIUHH TXHU\LQJ4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ4XHU\LQJ2WKHU
WRFKRRVHZKDW\RXZLVKWRKDYHLQVWDOOHG3RVWJUH64/ERGHVZHOOZLWKWKH 7DEXODU)RUPDWVZLWKRJUBIGZ
SRSXODULW\RIFORXGFRPSXWLQJVXFKDV3ODWIRUPDVD6HUYLFH3DD6DQG
'DWDEDVHDVD6HUYLFH'EDD60RVWRIWKHPDMRU3DD6DQG'EDD6SURYLGHUV VLQJOHYLHZV6LQJOH7DEOH9LHZV
RIIHU3RVWJUH64/QRWDEO\+HURNX(QJLQH<DUG5HG+DW2SHQ6KLIW$PD]RQ VSOLWWLQJVWULQJVLQWR6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU6XEVWULQJV
5'6IRU3RVWJUH64/*RRJOH&ORXG64/IRU3RVWJUH64/$PD]RQ$XURUDIRU
3RVWJUH64/DQG0LFURVRIW$]XUHIRU3RVWJUH64/ VWDWLVWLFVDQG7DEOH6WDWLVWLFV7DEOH6WDWLVWLFV
W\SHVVXSSRUWHG7DEOHV
:KHUHWR*HW3RVWJUH64/ XQORJJHG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/8QORJJHG7DEOHV
<HDUVDJRLI\RXZDQWHG3RVWJUH64/\RXKDGWRFRPSLOHLWIURPVRXUFH
7KDQNIXOO\WKRVHGD\VDUHORQJJRQH*UDQWHG\RXFDQVWLOOFRPSLOHIURP WDEOHVYLHZ3RVWJUH64/'DWDEDVH2EMHFWV
VRXUFHEXWXVLQJSDFNDJHGLQVWDOOHUVZRQߞWPDNH\RXDQ\OHVVFRRO$IHZFOLFNV WDEOHVSDFHV
RUNH\VWURNHVDQG\RXߞUHRQ\RXUZD\
,I\RXߞUHLQVWDOOLQJ3RVWJUH64/IRUWKHILUVWWLPHDQGKDYHQRH[LVWLQJGDWDEDVH EDFNLQJXS6\VWHPZLGH%DFNXS8VLQJSJBGXPSDOO
WRXSJUDGH\RXVKRXOGLQVWDOOWKHODWHVWVWDEOHUHOHDVHYHUVLRQIRU\RXU267KH FUHDWLQJ&UHDWLQJ7DEOHVSDFHV
GRZQORDGVSDJHIRUWKH3RVWJUH64/FRUHGLVWULEXWLRQPDLQWDLQVDOLVWLQJRI
SODFHVZKHUH\RXFDQGRZQORDG3RVWJUH64/ELQDULHVIRUYDULRXV26HV,Q H[SHGLWHGPRYHVEHWZHHQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
$SSHQGL[$\RXߞOOILQGXVHIXOLQVWDOODWLRQLQVWUXFWLRQVDQGOLQNVWRDGGLWLRQDO
PDQDJLQJGLVNVWRUDJHZLWK0DQDJLQJ'LVN6WRUDJHZLWK7DEOHVSDFHV
FXVWRPGLVWULEXWLRQV
PRYLQJREMHFWVDPRQJ0RYLQJ2EMHFWV$PRQJ7DEOHVSDFHV
V\QFKURQRXVUHSOLFDWLRQ5HSOLFDWLRQ-DUJRQ $GPLQLVWUDWLRQ7RROV
V\QFKURQRXVBVWDQGE\BQDPHFRQILJXUDWLRQYDULDEOH5HSOLFDWLRQ-DUJRQ )RXUWRROVZLGHO\XVHGZLWK3RVWJUH64/DUHSVTOSJ$GPLQSKS3J$GPLQDQG
$GPLQHU3RVWJUH64/FRUHGHYHORSHUVDFWLYHO\PDLQWDLQWKHILUVWWKUHH
7 WKHUHIRUHWKH\WHQGWRVWD\LQV\QFZLWK3RVWJUH64/UHOHDVHV$GPLQHUZKLOH
WDEGHOLPLWHGILOHVSVTO([SRUW QRWVSHFLILFWR3RVWJUH64/LVXVHIXOLI\RXDOVRQHHGWRPDQDJHRWKHUUHODWLRQDO
GDWDEDVHV64/LWH0\64/64/6HUYHURU2UDFOH%H\RQGWKHIRXUWKDWZH
WDEOHV PHQWLRQHG\RXFDQILQGSOHQW\RIRWKHUH[FHOOHQWDGPLQLVWUDWLRQWRROVERWKRSHQ
VRXUFHDQGSURSULHWDU\
DERXW3RVWJUH64/'DWDEDVH2EMHFWV7DEOHV&RQVWUDLQWVDQG,QGH[HV
DVFXVWRPGDWDW\SHV$OO7DEOHV$UH&XVWRP'DWD7\SHV SVTO
DXWRJHQHUDWLQJTXHULHVIURPGHILQLWLRQV$XWRJHQHUDWLQJ4XHULHVIURP7DEOH SVTOLVDFRPPDQGOLQHLQWHUIDFHIRUUXQQLQJTXHULHVDQGLVLQFOXGHGLQDOO
'HILQLWLRQV GLVWULEXWLRQVRI3RVWJUH64/VHHߡSVTO,QWHUDFWLYH&RPPDQGVߢSVTOKDVVRPH
XQXVXDOIHDWXUHVVXFKDVDQLPSRUWDQGH[SRUWFRPPDQGIRUGHOLPLWHGILOHV
DXWRPDWLFW\SHFUHDWLRQ3RVWJUH64/'DWDEDVH2EMHFWV &69RUWDEDQGDPLQLPDOLVWLFUHSRUWZULWHUWKDWFDQJHQHUDWH+70/RXWSXW
SVTOKDVEHHQDURXQGVLQFHWKHLQWURGXFWLRQRI3RVWJUH64/DQGLVWKHWRRORI
FRPSRVLWHGDWDW\SHDQG7<3(2) FKRLFHIRUPDQ\H[SHUWXVHUVIRUSHRSOHZRUNLQJLQFRQVROHVZLWKRXWD*8,RU
FUHDWLQJ%DVLF7DEOH&UHDWLRQ%DVLF7DEOH&UHDWLRQ IRUUXQQLQJFRPPRQWDVNVLQVKHOOVFULSWV1HZHUFRQYHUWVIDYRU*8,WRROVDQG
ZRQGHUZK\WKHROGHUJHQHUDWLRQVWLOOFOLQJVWRWKHFRPPDQGOLQH
FUHDWLQJFROXPQVLQ6HULDOV
FUHDWLQJWRVWRUHMVRQGDWD,QVHUWLQJ-621'DWD SJ$GPLQ
SJ$GPLQLVDSRSXODUIUHH*8,WRROIRU3RVWJUH64/'RZQORDGLWVHSDUDWHO\
FUHDWLQJXVLQJSJ6FULSWSJ6FULSW
IURP3RVWJUH64/LILWLVQߞWDOUHDG\SDFNDJHGZLWK\RXULQVWDOOHUSJ$GPLQUXQV
GHILQLQJZLWKUDQJHV'HILQLQJ7DEOHVZLWK5DQJHV RQDOO26HVVXSSRUWHGE\3RVWJUH64/
GURSSLQJSULPDU\NH\VIURP6DPSOH5XQVDQG2XWSXW (YHQLI\RXUGDWDEDVHOLYHVRQDFRQVROHRQO\/LQX[VHUYHUJRDKHDGDQGLQVWDOO
SJ$GPLQRQ\RXUZRUNVWDWLRQDQG\RXߞOOILQG\RXUVHOIDUPHGZLWKDIDQWDVWLF
IRUHLJQ3RVWJUH64/'DWDEDVH2EMHFWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ *8,WRRO
,QKHULWHG7DEOHV)RUHLJQ'DWD:UDSSHUV4XHU\LQJ2WKHU3RVWJUH64/ SJ$GPLQUHFHQWO\HQWHUHGLWVIRXUWKUHOHDVHGXEEHGSJ$GPLQSJ$GPLQLVD
6HUYHUV FRPSOHWHUHZULWHRISJ$GPLQWKDWVSRUWVDGHVNWRSDVZHOODVDZHEVHUYHU
DSSOLFDWLRQYHUVLRQXWLOL]LQJ3\WKRQSJ$GPLQLVFXUUHQWO\DWYHUVLRQ,W
,'(17,7<TXDOLILHU)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
PDGHLWVGHEXWDWWKHVDPHWLPHDV3RVWJUH64/DQGLVDYDLODEOHDVSDUWRI
LQKHULWHG3RVWJUH64/'DWDEDVH2EMHFWV,QKHULWHG7DEOHV5HVWULFWLQJ VHYHUDO3RVWJUH64/GLVWULEXWLRQV<RXFDQUXQSJ$GPLQDVDGHVNWRS
'(/(7(83'$7(DQG6(/(&7IURP,QKHULWHG7DEOHV DSSOLFDWLRQRUYLDDEURZVHULQWHUIDFH
$QH[DPSOHRISJ$GPLQDSSHDUVLQ)LJXUH WDEOH7DEOH6WDWLVWLFV7DEOH6WDWLVWLFV
,I\RXߞUHXQIDPLOLDUZLWK3RVWJUH64/\RXVKRXOGGHILQLWHO\VWDUWZLWKSJ$GPLQ VWRUDJH
<RXߞOOJHWDELUGߞVH\HYLHZDQGDSSUHFLDWHWKHULFKQHVVRI3RVWJUH64/MXVWE\
H[SORULQJHYHU\WKLQJ\RXVHHLQWKHPDLQLQWHUIDFH,I\RXߞUHGHVHUWLQJ0LFURVRIW FRPPDQGKLVWRU\5HWULHYLQJ3ULRU&RPPDQGV
64/6HUYHUDQGDUHDFFXVWRPHGWR0DQDJHPHQW6WXGLR\RXߞOOIHHOULJKWDW
KRPH PDQDJLQJZLWKWDEOHVSDFHV0DQDJLQJ'LVN6WRUDJHZLWK7DEOHVSDFHV
SJ$GPLQVWLOOKDVDFRXSOHRISDLQSRLQWVFRPSDUHGWRSJ$GPLQEXWLWV VWUHDPLQJUHSOLFDWLRQ5HSOLFDWLRQ-DUJRQ,QLWLDWLQJWKH6WUHDPLQJ5HSOLFDWLRQ
IHDWXUHVHWLVUDPSLQJXSTXLFNO\DQGLQVRPHZD\VDOUHDG\VXUSDVVHV 3URFHVV
SJ$GPLQ7KDWVDLGLI\RXDUHDORQJWLPHXVHURISJ$GPLQ\RXPLJKWZDQW
WRJRIRUWKHSJ$GPLQ/RQJ7LPHVXSSRUW/76YHUVLRQVXSSRUWHGDQG 675,&7TXDOLILHU)XQFWLRQ%DVLFV
GLVWULEXWHGE\%LJ64/DQGVSHQGDOLWWOHWLPHWHVWGULYLQJSJ$GPLQEHIRUH\RX
VWULQJVVHHFKDUDFWHUVDQGVWULQJV
IXOO\FRPPLWWRLW%XWNHHSLQPLQGWKDWWKHSJ$GPLQSURMHFWLVIXOO\FRPPLWWHG
WRSJ$GPLQDQGQRORQJHUZLOOPDNHFKDQJHVWRSJ$GPLQ VWULQJBDJJIXQFWLRQ%DVLF5HSRUWLQJ6WULQJ)XQFWLRQV2YHUODSRSHUDWRU'2
VWULQJBWRBDUUD\IXQFWLRQ6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU6XEVWULQJV
$UUD\&RQVWUXFWRUV
VWULSIXQFWLRQ)XOO7H[W6WULSSLQJ
VWULSSLQJIXOOWH[W)XOO7H[W6WULSSLQJ
VXETXHULHV2YHUXVLQJ6XETXHULHVLQ6(/(&72YHUXVLQJ6XETXHULHVLQ
6(/(&70DNH*RRG8VHRI&$6(
VXEVWULQJIXQFWLRQ6WULQJ)XQFWLRQV
VXEVWULQJV
H[WUDFWLQJ6WULQJ)XQFWLRQV
VSOLWWLQJVWULQJVLQWR6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU6XEVWULQJV
VXEWUDFWLRQRSHUDWRU(GLWLQJ-621%GDWD(GLWLQJ-621%GDWD
VXEWUDFWLRQRSHUDWRU'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
VXSHUXVHUUROHV5ROHV&UHDWLQJ*URXS5ROHV
VKRUWKDQGFDVWLQJ6KRUWKDQG&DVWLQJ
6+2:$//FRPPDQG&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV
6+2:FRPPDQG&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV
VLPLODUWRRSHUDWRUa5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
VLQJOHWDEOHYLHZV6LQJOH7DEOH9LHZV
6.,3/2&.('FODXVH0DQDJLQJ&RQQHFWLRQV
VODYHVHUYHUV5HSOLFDWLRQ-DUJRQ&RQILJXULQJWKH6ODYHVIRU)XOO6HUYHU&OXVWHU
5HSOLFDWLRQ
VRUWRSHUDWRU$JJUHJDWHV
63*,67LQGH[HV3RVWJUH64/6WRFN,QGH[HV
VSOLWBSDUWIXQFWLRQ6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU6XEVWULQJV
64/ODQJXDJH
DERXW:ULWLQJ)XQFWLRQVZLWK64/
EDVLFIXQFWLRQV%DVLF64/)XQFWLRQ%DVLF64/)XQFWLRQ
G\QDPLFH[HFXWLRQ'\QDPLF64/([HFXWLRQ'\QDPLF64/([HFXWLRQ
ZULWLQJDJJUHJDWHIXQFWLRQV:ULWLQJ64/$JJUHJDWH)XQFWLRQV:ULWLQJ64/
$JJUHJDWH)XQFWLRQV
VWDWHIXQFWLRQ$JJUHJDWHV
VWDWHPHQWBWLPHRXWVHWWLQJ0DQDJLQJ&RQQHFWLRQV
VWDWLVWLFV
FRPSXWLQJSHUFHQWLOHVPHGLDQPRGH3HUFHQWLOHVDQG0RGH3HUFHQWLOHVDQG
0RGH
JDWKHULQJRQVWDWHPHQWV*DWKHULQJ6WDWLVWLFVRQ6WDWHPHQWV )LJXUHSJ$GPLQWUHHEURZVHU
SKS3J$GPLQ 6(/(&7IURP,QKHULWHG7DEOHV
SKS3J$GPLQSLFWXUHGLQ)LJXUHLVDIUHHZHEEDVHGDGPLQLVWUDWLRQWRRO VHWUHWXUQLQJIXQFWLRQVLQ6HW5HWXUQLQJ)XQFWLRQVLQ6(/(&7
SDWWHUQHGDIWHUWKHSRSXODUSKS0\$GPLQSKS3J$GPLQGLIIHUVIURP
SKS0\$GPLQE\LQFOXGLQJZD\VWRPDQDJH3RVWJUH64/REMHFWVVXFKDV VHTXHQFHV
VFKHPDVSURFHGXUDOODQJXDJHVFDVWVRSHUDWRUVDQGVRRQ,I\RXߞYHXVHG
SKS0\$GPLQ\RXߞOOILQGSKS3J$GPLQWRKDYHWKHVDPHORRNDQGIHHO DERXW3RVWJUH64/'DWDEDVH2EMHFWV
VHULDOGDWDW\SHVDQG6HULDOV
VHULDOGDWDW\SH6HULDOV%DVLF7DEOH&UHDWLRQ
VHVVLRQBXVHUJOREDOYDULDEOH&UHDWLQJ*URXS5ROHV
?VHWFRPPDQGSVTO&XVWRPL]DWLRQV$XWRFRPPLW&RPPDQGV
VHWIRUFHBSDUDOOHOBPRGHVHWWLQJ:KDW'RHVD3DUDOOHO4XHU\3ODQ/RRN/LNH"
6(752/(FRPPDQG&UHDWLQJ*URXS5ROHV&UHDWLQJ*URXS5ROHV
6(76(66,21$87+25,=$7,21FRPPDQG&UHDWLQJ*URXS5ROHV&UHDWLQJ
)LJXUHSKS3J$GPLQ
*URXS5ROHV
$GPLQHU VHWUHWXUQLQJIXQFWLRQV6HW5HWXUQLQJ)XQFWLRQVLQ6(/(&7:,7+
,I\RXPDQDJHRWKHUGDWDEDVHVEHVLGHV3RVWJUH64/DQGDUHORRNLQJIRUDXQLILHG 25',1$/,7<%DVLF64/)XQFWLRQ
WRRO$GPLQHUPLJKWILWWKHELOO$GPLQHULVDOLJKWZHLJKWRSHQVRXUFH3+3 VHWV
DSSOLFDWLRQZLWKRSWLRQVIRU3RVWJUH64/0\64/64/LWH64/6HUYHUDQG
2UDFOHDOOGHOLYHUHGWKURXJKDVLQJOHLQWHUIDFH JURXSLQJ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/*5283,1*6(76&8%(
2QHXQLTXHIHDWXUHRI$GPLQHUZHߞUHLPSUHVVHGZLWKLVWKHUHODWLRQDO 52//83*5283,1*6(76&8%(52//83
GLDJUDPPHUWKDWFDQSURGXFHDVFKHPDWLFOD\RXWRI\RXUGDWDEDVHVFKHPDDORQJ URZQXPEHUVLQUHWXUQHG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
ZLWKDOLQHDUUHSUHVHQWDWLRQRIIRUHLJQNH\UHODWLRQVKLSV$QRWKHUKDVVOHUHGXFLQJ
IHDWXUHLVWKDW\RXFDQGHSOR\$GPLQHUDVDVLQJOH3+3ILOH VHWZHLJKWIXQFWLRQ769HFWRUV
)LJXUHLVDVFUHHQVKRWRIWKHORJLQVFUHHQDQGDVQLSSHWIURPWKHGLDJUDPPHU VKDUHGBEXIIHUVQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJVߡ,HGLWHGP\
RXWSXW0DQ\XVHUVVWXPEOHLQWKHORJLQVFUHHQRI$GPLQHUEHFDXVHLWGRHVQߞW
SRVWJUHVTOFRQIDQGQRZP\VHUYHUZRQߞWVWDUWߢ'RQߞW6HWVKDUHGBEXIIHUV7RR
LQFOXGHDVHSDUDWHWH[WER[IRULQGLFDWLQJWKHSRUWQXPEHU,I3RVWJUH64/LV
+LJK
OLVWHQLQJRQWKHVWDQGDUGSRUW\RXQHHGQRWZRUU\%XWLI\RXXVHVRPH
RWKHUSRUWDSSHQGWKHSRUWQXPEHUWRWKHVHUYHUQDPHZLWKDFRORQDVVKRZQLQ VKHOOFRPPDQGVH[HFXWLQJ([HFXWLQJ6KHOO&RPPDQGV
)LJXUH
6 $GPLQHULVVXIILFLHQWIRUVWUDLJKWIRUZDUGTXHU\LQJDQGHGLWLQJEXWEHFDXVHLWߞV
WDLORUHGWRWKHORZHVWFRPPRQGHQRPLQDWRUDPRQJGDWDEDVHSURGXFWV\RXZRQߞW
VFDQVSDUDOOHO3DUDOOHO6FDQV ILQGPDQDJHPHQWDSSOHWVWKDWDUHVSHFLILFWR3RVWJUH64/IRUVXFKWDVNVDV
VFKHGXOLQJMREV-RE6FKHGXOLQJZLWKSJ$JHQW+HOSIXOSJ$JHQW4XHULHV FUHDWLQJQHZXVHUVJUDQWLQJULJKWVRUGLVSOD\LQJSHUPLVVLRQV$GPLQHUDOVR
WUHDWVHDFKVFKHPDDVDVHSDUDWHGDWDEDVHZKLFKVHYHUHO\UHGXFHVWKHXVHIXOQHVV
VFKHPDV RIWKHUHODWLRQDOGLDJUDPPHULI\RXUUHODWLRQVKLSVFURVVVFKHPDERXQGDULHV,I
\RXߞUHD'%$VWLFNWRSJ$GPLQRUSVTO
DERXW3RVWJUH64/'DWDEDVH2EMHFWV
FUHDWLQJWRKRXVHH[WHQVLRQV3RVWJUH64/'DWDEDVH2EMHFWV8VLQJ6FKHPDV
6WHS,QVWDOOLQJLQWRDGDWDEDVH
LQGH[QDPHVDQG,QGH[HV
RJUBDOO4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ
XVDJHFRQVLGHUDWLRQV8VLQJ6FKHPDV8VLQJ6FKHPDV
VHDUFKHV
$1<RSHUDWRUDQG$1<$UUD\6HDUFK )LJXUH$GPLQHU
FDVHLQVHQVLWLYH,/,.(IRU&DVH,QVHQVLWLYH6HDUFK
IXOOWH[W3RVWJUH64/'DWDEDVH2EMHFWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ 3RVWJUH64/'DWDEDVH2EMHFWV
)XOO7H[W6HDUFK)XOO7H[W6XSSRUWIRU-621DQG-621% 6R\RXLQVWDOOHG3RVWJUH64/ILUHGXSSJ$GPLQDQGH[SDQGHGLWVEURZVHWUHH
%HIRUH\RXLVDEHZLOGHULQJGLVSOD\RIGDWDEDVHREMHFWVVRPHIDPLOLDUDQGVRPH
6(&85,7<'(),1(5TXDOLILHU)XQFWLRQ%DVLFV FRPSOHWHO\IRUHLJQ3RVWJUH64/KDVPRUHGDWDEDVHREMHFWVWKDQPRVWRWKHU
VHFXULW\URZOHYHO)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ UHODWLRQDOGDWDEDVHSURGXFWVDQGWKDWߞVEHIRUHDGGRQV<RXߞOOSUREDEO\QHYHU
WRXFKPDQ\RIWKHVHREMHFWVEXWLI\RXGUHDPXSVRPHWKLQJQHZPRUHOLNHO\
6(/(&7FRPPDQG WKDQQRWLWߞVDOUHDG\LPSOHPHQWHGXVLQJRQHRIWKRVHHVRWHULFREMHFWV7KLVERRN
LVQRWHYHQJRLQJWRDWWHPSWWRGHVFULEHDOOWKDW\RXߞOOILQGLQDVWDQGDUG
DYRLGLQJ
$YRLG6(/(&7
3RVWJUH64/LQVWDOO:LWK3RVWJUH64/FKXUQLQJRXWIHDWXUHVDWEUHDNQHFNVSHHG
HPEHGGLQJIXQFWLRQVZLWKLQ0DQDJLQJ&RQQHFWLRQV ZHFDQߞWLPDJLQHDQ\ERRNWKDWFRXOGSRVVLEO\GRWKLV:HOLPLWRXUTXLFN
RYHUYLHZWRWKRVHREMHFWVWKDW\RXVKRXOGEHIDPLOLDUZLWK
RYHUXVLQJVXETXHULHVLQ2YHUXVLQJ6XETXHULHVLQ6(/(&72YHUXVLQJ 'DWDEDVHV
6XETXHULHVLQ6(/(&7
(DFK3RVWJUH64/VHUYLFHKRXVHVPDQ\LQGLYLGXDOGDWDEDVHV
UHVWULFWLQJIURPLQKHULWHGWDEOHV5HVWULFWLQJ'(/(7(83'$7(DQG
6FKHPDV JURXS5ROHV&UHDWLQJ*URXS5ROHV
6FKHPDVDUHSDUWRIWKH$16,64/VWDQGDUG7KH\DUHWKHLPPHGLDWHQH[W ORJLQ5ROHV&UHDWLQJ/RJLQ5ROHV
OHYHORIRUJDQL]DWLRQZLWKLQHDFKGDWDEDVH,I\RXWKLQNRIWKHGDWDEDVHDVD
RUJDQL]LQJVFKHPDVE\8VLQJ6FKHPDV
FRXQWU\VFKHPDVZRXOGEHWKHLQGLYLGXDOVWDWHVRUSURYLQFHVSUHIHFWXUHVRU
GHSDUWPHQWVGHSHQGLQJRQWKHFRXQWU\0RVWGDWDEDVHREMHFWVILUVWEHORQJ 52//83RSHUDWRU)HDWXUHV,QWURGXFHGLQ3RVWJUH64/*5283,1*6(76
WRDVFKHPDZKLFKEHORQJVWRDGDWDEDVH:KHQ\RXFUHDWHDQHZGDWDEDVH
&8%(52//83
3RVWJUH64/DXWRPDWLFDOO\FUHDWHVDVFKHPDQDPHGSXEOLFWRVWRUHREMHFWV
WKDW\RXFUHDWH,I\RXKDYHIHZWDEOHVXVLQJSXEOLFZRXOGEHILQH%XWLI\RX URZOHYHOVHFXULW\)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
KDYHWKRXVDQGVRIWDEOHV\RXVKRXOGRUJDQL]HWKHPLQWRGLIIHUHQWVFKHPDV
URZVUHFRUGV
7DEOHV
FRQYHUWLQJWR-621REMHFWV2XWSXWWLQJ-621
7DEOHVDUHWKHZRUNKRUVHVRIDQ\GDWDEDVH,Q3RVWJUH64/WDEOHVDUHILUVW
FLWL]HQVRIWKHLUUHVSHFWLYHVFKHPDVZKLFKLQWXUQDUHFLWL]HQVRIWKH SDUWLWLRQHGWDEOHVDQG3DUWLWLRQHG7DEOHV
GDWDEDVH
UHWXUQLQJDIIHFWHGUHFRUGVWRXVHUV5HWXUQLQJ$IIHFWHG5HFRUGVWRWKH8VHU
3RVWJUH64/WDEOHVKDYHWZRUHPDUNDEOHWDOHQWVILUVWWKH\DUHLQKHULWDEOH
7DEOHLQKHULWDQFHVWUHDPOLQHV\RXUGDWDEDVHGHVLJQDQGFDQVDYH\RXHQGOHVV URZQXPEHUVLQUHWXUQHGVHWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
OLQHVRIORRSLQJFRGHZKHQTXHU\LQJWDEOHVZLWKQHDUO\LGHQWLFDOVWUXFWXUHV
6HFRQGZKHQHYHU\RXFUHDWHDWDEOH3RVWJUH64/DXWRPDWLFDOO\FUHDWHVDQ XQQHVWLQJDUUD\VWR8QQHVWLQJ$UUD\VWR5RZV
DFFRPSDQ\LQJFXVWRPGDWDW\SH 52:6)520FODXVH)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
9LHZV
52:6TXDOLILHU)XQFWLRQ%DVLFV
$OPRVWDOOUHODWLRQDOGDWDEDVHSURGXFWVRIIHUYLHZVDVDOHYHORIDEVWUDFWLRQ
IURPWDEOHV,QDYLHZ\RXFDQTXHU\PXOWLSOHWDEOHVDQGSUHVHQWDGGLWLRQDO URZBQXPEHUIXQFWLRQ:LQGRZ)XQFWLRQV25'(5%<
GHULYHGFROXPQVEDVHGRQFRPSOH[FDOFXODWLRQV9LHZVDUHJHQHUDOO\UHDG URZBWRBMVRQIXQFWLRQ2XWSXWWLQJ-621
RQO\EXW3RVWJUH64/DOORZV\RXWRXSGDWHWKHXQGHUO\LQJGDWDE\XSGDWLQJ
WKHYLHZSURYLGHGWKDWWKHYLHZGUDZVIURPDVLQJOHWDEOH7RXSGDWHGDWD USDGIXQFWLRQ6WULQJ)XQFWLRQV
IURPYLHZVWKDWMRLQPXOWLSOHWDEOHV\RXQHHGWRFUHDWHDWULJJHUDJDLQVWWKH
53&UDQGRPSDJHFRVWUDWLR5DQGRP3DJH&RVWDQG4XDOLW\RI'ULYHV
YLHZ9HUVLRQLQWURGXFHGPDWHULDOL]HGYLHZVZKLFKFDFKHGDWDWRVSHHG
XSFRPPRQO\XVHGTXHULHVDWWKHVDFULILFHRIKDYLQJWKHPRVWXSWRGDWH UWULPIXQFWLRQ6WULQJ)XQFWLRQV
GDWD6HHߡ0DWHULDOL]HG9LHZVߢ
5XE\ODQJXDJH'DWDEDVH'ULYHUV
([WHQVLRQ
UXOHV3RVWJUH64/'DWDEDVH2EMHFWV8VLQJ7ULJJHUVWR8SGDWH9LHZV
([WHQVLRQVDOORZGHYHORSHUVWRSDFNDJHIXQFWLRQVGDWDW\SHVFDVWVFXVWRP
LQGH[W\SHVWDEOHVDWWULEXWHYDULDEOHVHWFIRULQVWDOODWLRQRUUHPRYDODVD 580LQGH[PHWKRGW\SH3RVWJUH64/6WRFN,QGH[HV
5HSOLFDWLRQ XQLW([WHQVLRQVDUHVLPLODULQFRQFHSWWR2UDFOHSDFNDJHVDQGKDYHEHHQWKH
SUHIHUUHGPHWKRGIRUGLVWULEXWLQJDGGRQVVLQFH3RVWJUH64/<RXVKRXOG
VHWWLQJXS6HWWLQJ8S)XOO6HUYHU5HSOLFDWLRQ5HSOLFDWLQJ2QO\6RPH7DEOHV IROORZWKHGHYHORSHUߞVLQVWUXFWLRQVRQKRZWRLQVWDOOWKHH[WHQVLRQILOHVRQWR
RU'DWDEDVHVZLWK/RJLFDO5HSOLFDWLRQ \RXUVHUYHUZKLFKXVXDOO\LQYROYHVFRS\LQJELQDULHVLQWR\RXU3RVWJUH64/
LQVWDOODWLRQIROGHUVDQGWKHQUXQQLQJDVHWRIVFULSWV2QFHGRQH\RXPXVW
VWUHDPLQJ5HSOLFDWLRQ-DUJRQ,QLWLDWLQJWKH6WUHDPLQJ5HSOLFDWLRQ3URFHVV
HQDEOHWKHH[WHQVLRQIRUHDFKGDWDEDVHVHSDUDWHO\<RXVKRXOGQߞWHQDEOHDQ
V\QFKURQRXV5HSOLFDWLRQ-DUJRQ H[WHQVLRQLQ\RXUGDWDEDVHXQOHVV\RXQHHGLW)RUH[DPSOHLI\RXQHHG
DGYDQFHGWH[WVHDUFKLQRQO\RQHGDWDEDVHHQDEOHfuzzystrmatchIRUWKDW
WKLUGSDUW\RSWLRQV7KLUG3DUW\5HSOLFDWLRQ2SWLRQV RQHRQO\
UHSOLFDWLRQVORWV5HSOLFDWLRQ-DUJRQ :KHQ\RXHQDEOHH[WHQVLRQV\RXFKRRVHWKHVFKHPDVZKHUHDOOFRQVWLWXHQW
REMHFWVZLOOUHVLGH$FFHSWLQJWKHGHIDXOWZLOOSODFHHYHU\WKLQJIURPWKH
UHSRUWV H[WHQVLRQLQWRWKHSXEOLFVFKHPDOLWWHULQJLWZLWKSRWHQWLDOO\WKRXVDQGVRI
H[SRUWRSWLRQV([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ QHZREMHFWV:HUHFRPPHQGWKDW\RXFUHDWHDVHSDUDWHVFKHPDWKDWZLOO
KRXVHDOOH[WHQVLRQV)RUDQH[WHQVLRQZLWKPDQ\REMHFWVZHVXJJHVWWKDW
SVTODQG%DVLF5HSRUWLQJ%DVLF5HSRUWLQJ \RXFUHDWHDVHSDUDWHVFKHPDGHYRWHGHQWLUHO\WRLW2SWLRQDOO\\RXFDQ
DSSHQGWKHQDPHRIDQ\VFKHPDV\RXDGGWRWKHVHDUFKBSDWKYDULDEOHRIWKH
UHVWDUWLQJ3RVWJUH64/5HVWDUWLQJ GDWDEDVHVR\RXFDQUHIHUWRWKHIXQFWLRQZLWKRXWKDYLQJWRSUHSHQGWKH
UHVWRUHVHHEDFNXSDQGUHVWRUH VFKHPDQDPH6RPHH[WHQVLRQVHVSHFLDOO\RQHVWKDWLQVWDOODQHZSURFHGXUDO
ODQJXDJH3/ZLOOGLFWDWHWKHLQVWDOODWLRQVFKHPD)RUH[DPSOH3/9PXVW
UHVWRUHBFRPPDQGFRQILJXUDWLRQGLUHFWLYH&RQILJXULQJWKH6ODYHVIRU)XOO6HUYHU EHLQVWDOOHGWKHSJBFDWDORJVFKHPD
&OXVWHU5HSOLFDWLRQ ([WHQVLRQVPD\GHSHQGRQRWKHUH[WHQVLRQV3ULRUWR3RVWJUH64/\RX
5(7851,1*FODXVH(GLWLQJ-621%GDWD$OO7DEOHV$UH&XVWRP'DWD7\SHV KDGWRNQRZDOOGHSHQGHQWH[WHQVLRQVDQGLQVWDOOWKHPILUVW:LWK\RX
VLPSO\QHHGWRDGGWKHCASCADERSWLRQDQG3RVWJUH64/ZLOOWDNHFDUHRIWKH
5(7851,1*SUHGLFDWH5HWXUQLQJ$IIHFWHG5HFRUGVWRWKH8VHU:ULWDEOH UHVW)RUH[DPSOH
&7(V
CREATE EXTENSION postgis_tiger_geocoder CASCADE;
5(785167$%/(FODXVH%DVLF64/)XQFWLRQ
ILUVWLQVWDOOVWKHGHSHQGHQWH[WHQVLRQVSRVWJLVDQGIX]]\VWUPDWFKLIQRW
5(92.(FRPPDQG*5$17
SUHVHQW
ULJKWVVHHSULYLOHJHV )XQFWLRQV
UROHV <RXFDQSURJUDP\RXURZQFXVWRPIXQFWLRQVWRKDQGOHGDWDPDQLSXODWLRQ
SHUIRUPFRPSOH[FDOFXODWLRQVRUZUDSVLPLODUIXQFWLRQDOLW\&UHDWHIXQFWLRQV
DERXW&RQILJXUDWLRQ)LOHV5ROHV XVLQJ3/V3RVWJUH64/FRPHVVWRFNHGZLWKWKRXVDQGVRIIXQFWLRQVZKLFK
EDFNLQJXS6\VWHPZLGH%DFNXS8VLQJSJBGXPSDOO \RXFDQYLHZLQWKHSRVWJUHVGDWDEDVHWKDWLVSDUWRIHYHU\LQVWDOO
3RVWJUH64/IXQFWLRQVFDQUHWXUQVFDODUYDOXHVDUUD\VVLQJOHUHFRUGVRUVHWV URZQXPEHUVLQUHWXUQHGVHWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
RIUHFRUGV2WKHUGDWDEDVHSURGXFWVUHIHUWRIXQFWLRQVWKDWPDQLSXODWHGDWDDV
VWRUHGSURFHGXUHV3RVWJUH64/GRHVQRWPDNHWKLVGLVWLQFWLRQ XQQHVWLQJDUUD\VWR8QQHVWLQJ$UUD\VWR5RZV
/DQJXDJHV UHFXUVLYH&7(V5HFXUVLYH&7(
&UHDWHIXQFWLRQVXVLQJD3/3RVWJUH64/LQVWDOOVWKUHHE\GHIDXOW64/ 5HG+DWSODWIRUP&HQW26)HGRUD5HG+DW6FLHQWLILF/LQX[
3/SJ64/DQG&<RXFDQHDVLO\LQVWDOODGGLWLRQDOODQJXDJHVXVLQJWKH
H[WHQVLRQIUDPHZRUNRUWKHCREATE PRODCEDURAL LANGUAGEFRPPDQG 5()5(6+FRPPDQG9LHZV
/DQJXDJHVFXUUHQWO\LQYRJXHDUH3/3\WKRQ3/9-DYD6FULSWDQG3/5 5()5(6+0$7(5,$/,=('9,(:FRPPDQG0DWHULDOL]HG9LHZV
:HߞOOVKRZ\RXSOHQW\RIH[DPSOHVLQ&KDSWHU
0DWHULDOL]HG9LHZV
2SHUDWRUV
UHJH[SBPDWFKHVIXQFWLRQ5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
2SHUDWRUVDUHQRWKLQJPRUHWKDQV\PEROLFDOO\QDPHGDOLDVHVVXFKDV RU
IRUIXQFWLRQV,Q3RVWJUH64/\RXFDQLQYHQW\RXURZQ7KLVLVRIWHQWKH UHJH[SBUHSODFHIXQFWLRQ5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
FDVHZKHQ\RXFUHDWHFXVWRPGDWDW\SHV)RUH[DPSOHLI\RXFUHDWHDFXVWRP UHJXODUH[SUHVVLRQV5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ5HJXODU
GDWDW\SHRIFRPSOH[QXPEHUV\RXߞGSUREDEO\ZDQWWRDOVRFUHDWHDGGLWLRQ
([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
RSHUDWRUV
WRKDQGOHDULWKPHWLFRQWKHP
UHORDGLQJ3RVWJUH64/5HORDGLQJ
)RUHLJQWDEOHVDQGIRUHLJQGDWDZUDSSHUV
)RUHLJQWDEOHVDUHYLUWXDOWDEOHVOLQNHGWRGDWDRXWVLGHD3RVWJUH64/ UHPDVWHULQJSURFHVV5HSOLFDWLRQ-DUJRQ
GDWDEDVH2QFH\RXߞYHFRQILJXUHGWKHOLQN\RXFDQTXHU\WKHPOLNHDQ\
UHSOLFDWLRQ
RWKHUWDEOHV)RUHLJQWDEOHVFDQOLQNWR&69ILOHVD3RVWJUH64/WDEOHRQ
DQRWKHUVHUYHUDWDEOHLQDGLIIHUHQWSURGXFWVXFKDV64/6HUYHURU2UDFOHD DERXW5HSOLFDWLRQDQG([WHUQDO'DWD
1R64/GDWDEDVHVXFKDV5HGLVRUHYHQDZHEVHUYLFHVXFKDV7ZLWWHURU
6DOHVIRUFH DV\QFKURQRXV5HSOLFDWLRQ-DUJRQ
)RUHLJQGDWDZUDSSHUV)':VIDFLOLWDWHWKHPDJLFKDQGVKDNHEHWZHHQ FDVFDGLQJ5HSOLFDWLRQ-DUJRQ
3RVWJUH64/DQGH[WHUQDOGDWDVRXUFHV)':LPSOHPHQWDWLRQVLQ3RVWJUH64/
IROORZWKH64/0DQDJHPHQWRI([WHUQDO'DWD0('VWDQGDUG FRPPRQWHUPLQRORJ\5HSOLFDWLRQ-DUJRQ5HSOLFDWLRQ-DUJRQ
0DQ\FKDULWDEOHSURJUDPPHUVKDYHDOUHDG\GHYHORSHG)':VIRUSRSXODU HYROXWLRQRI(YROXWLRQRI3RVWJUH64/5HSOLFDWLRQ
GDWDVRXUFHV<RXFDQWU\\RXUKDQGDWFUHDWLQJ\RXURZQ)':VDVZHOO%H
IHDWXUHLPSURYHPHQWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
VXUHWRSXEOLFL]H\RXUVXFFHVVVRWKHFRPPXQLW\FDQUHDSWKHIUXLWVRI\RXU
WRLO,QVWDOO)':VXVLQJWKHH[WHQVLRQIUDPHZRUN2QFHLQVWDOOHGSJ$GPLQ LQLWLDWLQJSURFHVV,QLWLDWLQJWKH6WUHDPLQJ5HSOLFDWLRQ3URFHVV
OLVWVWKHPXQGHUDQRGHFDOOHG)RUHLJQ'DWD:UDSSHUV
ORJLFDO5HSOLFDWLRQ-DUJRQ5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHVZLWK
7ULJJHUVDQGWULJJHUIXQFWLRQV
/RJLFDO5HSOLFDWLRQ5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHVZLWK/RJLFDO
D3DUDOOHO4XHU\3ODQ/RRN/LNH" <RXZLOOILQGWULJJHUVLQDOOHQWHUSULVHOHYHOGDWDEDVHVWULJJHUVGHWHFWGDWD
FKDQJHHYHQWV:KHQ3RVWJUH64/ILUHVDWULJJHU\RXKDYHWKHRSSRUWXQLW\WR
TXDOLW\RIGULYHV5DQGRP3DJH&RVWDQG4XDOLW\RI'ULYHV H[HFXWHWULJJHUIXQFWLRQVLQUHVSRQVH$WULJJHUFDQUXQLQUHVSRQVHWR
UDQGRPSDJHFRVWDQG5DQGRP3DJH&RVWDQG4XDOLW\RI'ULYHV SDUWLFXODUW\SHVRIVWDWHPHQWVRULQUHVSRQVHWRFKDQJHVWRSDUWLFXODUURZV
DQGFDQILUHEHIRUHRUDIWHUDGDWDFKDQJHHYHQW
VWUDWHJ\VHWWLQJV6WUDWHJ\6HWWLQJV
,QSJ$GPLQWRVHHZKLFKWDEOHWULJJHUVGULOOGRZQWRWKHWDEOHOHYHO3LFN
WDEOHVWDWLVWLFV7DEOH6WDWLVWLFV7DEOH6WDWLVWLFV WKHWDEOHRILQWHUHVWDQGORRNXQGHUWULJJHUV
&UHDWHWULJJHUIXQFWLRQVWRUHVSRQGWRILULQJRIWULJJHUV7ULJJHUIXQFWLRQV
TXRWHVHVFDSLQJLQVWULQJV'ROODU4XRWLQJ'2
GLIIHUIURPUHJXODUIXQFWLRQVLQWKDWWKH\KDYHDFFHVVWRVSHFLDOYDULDEOHVWKDW
5 VWRUHWKHGDWDERWKEHIRUHDQGDIWHUWKHWULJJHULQJHYHQW7KLVDOORZV\RXWR
UHYHUVHGDWDFKDQJHVPDGHE\WKHHYHQWGXULQJWKHH[HFXWLRQRIWKHWULJJHU
UDQGRPSDJHFRVW53&UDWLR5DQGRP3DJH&RVWDQG4XDOLW\RI'ULYHV IXQFWLRQ%HFDXVHRIWKLVWULJJHUIXQFWLRQVDUHRIWHQXVHGWRZULWHFRPSOH[
YDOLGDWLRQURXWLQHVWKDWDUHEH\RQGZKDWFDQEHLPSOHPHQWHGXVLQJFKHFN
UDQJHFRQVWUXFWRUIXQFWLRQV'HILQLQJ5DQJHV
FRQVWUDLQWV
UDQJHGDWDW\SHV 7ULJJHUWHFKQRORJ\LVHYROYLQJUDSLGO\LQ3RVWJUH64/6WDUWLQJLQD
:,7+FODXVHOHWV\RXVSHFLI\DERROHDQ:+(1FRQGLWLRQZKLFKLVWHVWHGWR
DERXW5DQJH7\SHV
VHHZKHWKHUWKHWULJJHUVKRXOGEHILUHG9HUVLRQDOVRLQWURGXFHGWKH
EXLOWLQ%XLOWLQ5DQJH7\SHV 83'$7(2)FODXVHZKLFKDOORZV\RXWRVSHFLI\ZKLFKFROXPQVWR
PRQLWRUIRUFKDQJHV:KHQGDWDLQPRQLWRUHGFROXPQVFKDQJHVWKHWULJJHU
GHILQLQJUDQJHV'HILQLQJ5DQJHV ILUHV,QDGDWDFKDQJHLQDYLHZFDQILUHDWULJJHU6LQFHGDWD
GHILQLQJWDEOHVZLWK'HILQLQJ7DEOHVZLWK5DQJHV GHILQLWLRQODQJXDJH''/HYHQWVFDQILUHWULJJHUV)RUDOLVWRIWULJJHUDEOH
''/HYHQWVUHIHUWRWKH(YHQW7ULJJHU)LULQJ0DWUL[SJ$GPLQOLVWV''/
GLVFUHWHYHUVXVFRQWLQXRXV'LVFUHWH9HUVXV&RQWLQXRXV5DQJHV WULJJHUVXQGHUWKH(YHQW7ULJJHUVEUDQFK)LQDOO\DVRIYHUVLRQ\RXPD\
SODFHWULJJHUVDJDLQVWIRUHLJQWDEOHV
WHPSRUDOVDQG7HPSRUDOV
&DWDORJV
UDQJHRSHUDWRUV5DQJH2SHUDWRUV
&DWDORJVDUHV\VWHPVFKHPDVWKDWVWRUH3RVWJUH64/EXLOWLQIXQFWLRQVDQG
UDQNIXQFWLRQ:LQGRZ)XQFWLRQV PHWDGDWD(YHU\GDWDEDVHFRQWDLQVWZRFDWDORJVSJBFDWDORJZKLFKKROGVDOO
IXQFWLRQVWDEOHVV\VWHPYLHZVFDVWVDQGW\SHVSDFNDJHGZLWK3RVWJUH64/
UHFRUGVURZV DQGLQIRUPDWLRQBVFKHPDZKLFKRIIHUVYLHZVH[SRVLQJPHWDGDWDLQDIRUPDW
FRQYHUWLQJWR-621REMHFWV2XWSXWWLQJ-621 GLFWDWHGE\WKH$16,64/VWDQGDUG
3RVWJUH64/SUDFWLFHVZKDWLWSUHDFKHV<RXZLOOILQGWKDW3RVWJUH64/LWVHOI
SDUWLWLRQHGWDEOHVDQG3DUWLWLRQHG7DEOHV LVEXLOWDWRSDVHOIUHSOLFDWLQJVWUXFWXUH$OOVHWWLQJVWRILQHWXQHVHUYHUVDUH
UHWXUQLQJDIIHFWHGUHFRUGVWRXVHUV5HWXUQLQJ$IIHFWHG5HFRUGVWRWKH8VHU NHSWLQV\VWHPWDEOHVWKDW\RXߞUHIUHHWRTXHU\DQGPRGLI\7KLVJLYHV
3RVWJUH64/DOHYHORIH[WHQVLELOLW\UHDGKDFNDELOLW\LPSRVVLEOHWRDWWDLQE\ QRQFRQYHQWLRQDOGDWDVRXUFHV4XHU\LQJ1RQFRQYHQWLRQDO'DWD6RXUFHV
SURSULHWDU\GDWDEDVHSURGXFWV*RDKHDGDQGWDNHDFORVHORRNLQVLGHWKH 4XHU\LQJ1RQFRQYHQWLRQDO'DWD6RXUFHV
SJBFDWDORJVFKHPD<RXߞOOJHWDVHQVHRIKRZ3RVWJUH64/LVSXWWRJHWKHU,I
\RXKDYHVXSHUXVHUSULYLOHJHV\RXDUHDWOLEHUW\WRPDNHXSGDWHVWRWKH RWKHUWDEXODUIRUPDWV4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ
SJBFDWDORJGLUHFWO\DQGVFUHZWKLQJVXSUR\DOO\ 4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ
7KHLQIRUPDWLRQBVFKHPDFDWDORJLVRQH\RXߞOOILQGLQ0\64/DQG64/ SDUDOOHOL]HG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/)HDWXUHV,QWURGXFHGLQ
6HUYHUDVZHOO7KHPRVWFRPPRQO\XVHGYLHZVLQWKH3RVWJUH64/ 3RVWJUH64/3DUDOOHOL]HG4XHULHV3DUDOOHO-RLQV
LQIRUPDWLRQBVFKHPDDUHFROXPQVZKLFKOLVWDOOWDEOHFROXPQVLQDGDWDEDVH
WDEOHVZKLFKOLVWDOOWDEOHVLQFOXGLQJYLHZVLQDGDWDEDVHDQGYLHZVZKLFK SJ$JHQWDQG+HOSIXOSJ$JHQW4XHULHV
OLVWDOOYLHZVDQGWKHDVVRFLDWHG64/WRUHEXLOGWKHYLHZ
WVTXHULHV764XHULHV764XHULHV
7\SHV
ZULWLQJEHWWHU:ULWLQJ%HWWHU4XHULHV8VLQJ),/7(5,QVWHDGRI&$6(
7\SHLVVKRUWIRUGDWDW\SH(YHU\GDWDEDVHSURGXFWDQGHYHU\SURJUDPPLQJ
ODQJXDJHKDVDVHWRIW\SHVWKDWLWXQGHUVWDQGVLQWHJHUVFKDUDFWHUVDUUD\V [POGDWDW\SHDQG4XHU\LQJ;0/'DWD4XHU\LQJ;0/'DWD
EOREVHWF3RVWJUH64/KDVFRPSRVLWHW\SHVZKLFKDUHPDGHXSRIRWKHU
TXHU\SHUIRUPDQFHWXQLQJ
W\SHV7KLQNRIFRPSOH[QXPEHUVSRODUFRRUGLQDWHVYHFWRUVRUWHQVRUVDV
H[DPSOHV DERXW4XHU\3HUIRUPDQFH7XQLQJ
:KHQHYHU\RXFUHDWHDQHZWDEOH3RVWJUH64/DXWRPDWLFDOO\FUHDWHVD
FDFKLQJDQG&DFKLQJ&DFKLQJ
FRPSRVLWHW\SHEDVHGRQWKHVWUXFWXUHRIWKHWDEOH7KLVDOORZV\RXWRWUHDW
WDEOHURZVDVREMHFWVLQWKHLURZQULJKW<RXߞOODSSUHFLDWHWKLVDXWRPDWLFW\SH (;3/$,1FRPPDQGDQG(;3/$,1*UDSKLFDO2XWSXWV
FUHDWLRQZKHQ\RXZULWHIXQFWLRQVWKDWORRSWKURXJKWDEOHVSJ$GPLQGRHVQߞW
PDNHWKHDXWRPDWLFW\SHFUHDWLRQREYLRXVEHFDXVHLWGRHVQRWOLVWWKHPXQGHU JDWKHULQJVWDWLVWLFVRQVWDWHPHQWV*DWKHULQJ6WDWLVWLFVRQ6WDWHPHQWV
WKHW\SHVQRGHEXWUHVWDVVXUHGWKDWWKH\DUHWKHUH
JXLGLQJWKHTXHU\SODQQHU*XLGLQJWKH4XHU\3ODQQHU5DQGRP3DJH&RVWDQG
)XOOWH[WVHDUFK 4XDOLW\RI'ULYHV
)XOOWH[WVHDUFK)76LVDQDWXUDOODQJXDJHߙEDVHGVHDUFK7KLVNLQGRI SDUDOOHOL]HGTXHULHV3DUDOOHOL]HG4XHULHV3DUDOOHO-RLQV
VHDUFKKDVVRPHߡLQWHOOLJHQFHߢEXLOWLQ8QOLNHUHJXODUH[SUHVVLRQVHDUFK
)76FDQPDWFKEDVHGRQWKHVHPDQWLFVRIDQH[SUHVVLRQQRWMXVWLWV ZULWLQJEHWWHUTXHULHV:ULWLQJ%HWWHU4XHULHV8VLQJ),/7(5,QVWHDGRI&$6(
V\QWDFWLFDOPDNHXS)RUH[DPSOHLI\RXߞUHVHDUFKLQJIRUWKHZRUGUXQQLQJLQ
DORQJSLHFHRIWH[W\RXPD\HQGXSZLWKUXQUXQQLQJUDQUXQQHUMRJ TXHU\SODQQHU
VSULQWGDVKDQGVRRQ7KUHHREMHFWVLQ3RVWJUH64/WRJHWKHUVXSSRUW)76 DERXW*XLGLQJWKH4XHU\3ODQQHU
)76FRQILJXUDWLRQV)76GLFWLRQDULHVDQG)76SDUVHUV7KHVHREMHFWVH[LVW
WRVXSSRUWWKHEXLOWLQ)XOO7H[W6HDUFKHQJLQHSDFNDJHGZLWK3RVWJUH64/ LQGH[XVHIXOQHVV+RZ8VHIXO,V<RXU,QGH["+RZ8VHIXO,V<RXU,QGH["
)RUJHQHUDOXVHFDVHVWKHFRQILJXUDWLRQVGLFWLRQDULHVDQGSDUVHUVSDFNDJHG
ZLWK3RVWJUH64/DUHVXIILFLHQW%XWVKRXOG\RXEHZRUNLQJLQDVSHFLILF SDUDOOHOTXHU\SODQV:KDW'RHVD3DUDOOHO4XHU\3ODQ/RRN/LNH":KDW'RHV
WLPLQJH[HFXWLRQV7LPLQJ([HFXWLRQV LQGXVWU\ZLWKVSHFLDOL]HGYRFDEXODU\DQGV\QWD[UXOHVVXFKDVSKDUPDFRORJ\
RURUJDQL]HGFULPH\RXFDQVZDSRXWWKHSDFNDJHG)76REMHFWVZLWK\RXU
ZDWFKLQJVWDWHPHQWV:DWFKLQJ6WDWHPHQWV RZQ:HFRYHU)76LQGHWDLOLQߡ)XOO7H[W6HDUFKߢ
364/5&HQYLURQPHQWYDULDEOH(QYLURQPHQW9DULDEOHV &DVWV
SVTOUFFRQIILOHSVTO&XVWRPL]DWLRQV5HWULHYLQJ3ULRU&RPPDQGV &DVWVSUHVFULEHKRZWRFRQYHUWIURPRQHGDWDW\SHWRDQRWKHU7KH\DUH
EDFNHGE\IXQFWLRQVWKDWDFWXDOO\SHUIRUPWKHFRQYHUVLRQ,Q3RVWJUH64/
364/B+,6725<HQYLURQPHQWYDULDEOH(QYLURQPHQW9DULDEOHV \RXFDQFUHDWH\RXURZQFDVWVDQGRYHUULGHRUHQKDQFHWKHGHIDXOWFDVWLQJ
3\WKRQODQJXDJH EHKDYLRU)RUH[DPSOHLPDJLQH\RXߞUHFRQYHUWLQJ]LSFRGHVZKLFKDUHILYH
GLJLWVORQJLQWKH86WRFKDUDFWHUIURPLQWHJHU<RXFDQGHILQHDFXVWRPFDVW
GDWDEDVHGULYHUV'DWDEDVH'ULYHUV WKDWDXWRPDWLFDOO\SUHSHQGVD]HURZKHQWKH]LSLVEHWZHHQDQG
ZULWLQJ3/3\WKRQIXQFWLRQV:ULWLQJ3/3\WKRQ)XQFWLRQV%DVLF3\WKRQ &DVWLQJFDQEHLPSOLFLWRUH[SOLFLW,PSOLFLWFDVWVDUHDXWRPDWLFDQGXVXDOO\
H[SDQGIURPDPRUHVSHFLILFWRDPRUHJHQHULFW\SH:KHQDQLPSOLFLWFDVWLV
)XQFWLRQ
QRWRIIHUHG\RXPXVWFDVWH[SOLFLWO\
4
6HTXHQFHV
TXDOLW\RIGULYHV5DQGRP3DJH&RVWDQG4XDOLW\RI'ULYHV $VHTXHQFHFRQWUROVWKHDXWRLQFUHPHQWDWLRQRIDVHULDOGDWDW\SH
3RVWJUHV64/DXWRPDWLFDOO\FUHDWHVVHTXHQFHVZKHQ\RXGHILQHDVHULDO
TXHULHV
FROXPQEXW\RXFDQHDVLO\FKDQJHWKHLQLWLDOYDOXHVWHSDQGQH[WDYDLODEOH
DXWRJHQHUDWLQJIURPWDEOHGHILQLWLRQV$XWRJHQHUDWLQJ4XHULHVIURP7DEOH YDOXH%HFDXVHVHTXHQFHVDUHREMHFWVLQWKHLURZQULJKWPRUHWKDQRQHWDEOH
'HILQLWLRQV FDQVKDUHWKHVDPHVHTXHQFHREMHFW7KLVDOORZV\RXWRFUHDWHDXQLTXHNH\
YDOXHWKDWFDQVSDQWDEOHV%RWK64/6HUYHUDQG2UDFOHKDYHVHTXHQFH
FKHFNLQJIRUEORFNHG&KHFNIRU4XHULHV%HLQJ%ORFNHG REMHFWVEXW\RXPXVWFUHDWHWKHPPDQXDOO\
FRPSRVLWHW\SHVLQ&RPSRVLWH7\SHVLQ4XHULHV 5XOHV
FURVVWDE&URVVWDEV 5XOHVDUHLQVWUXFWLRQVWRUHZULWHDQ64/SULRUWRH[HFXWLRQ:HߞUHQRWJRLQJ
WRFRYHUUXOHVDVWKH\ߞYHIDOOHQRXWRIIDYRUEHFDXVHWULJJHUVFDQDFFRPSOLVK
IODWILOHV4XHU\LQJ)ODW)LOHV4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V WKHVDPHWKLQJV
IRUHLJQVHUYHUV4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV4XHU\LQJ2WKHU )RUHDFKREMHFW3RVWJUH64/PDNHVDYDLODEOHPDQ\DWWULEXWHYDULDEOHVWKDW\RX
3RVWJUH64/6HUYHUV FDQVHW<RXFDQVHWYDULDEOHVDWWKHVHUYHUOHYHODWWKHGDWDEDVHOHYHODWWKH
IXQFWLRQOHYHODQGVRRQ<RXPD\HQFRXQWHUWKHIDQF\WHUP*8&ZKLFKVWDQGV
MVRQGDWDW\SHDQG4XHU\LQJ-621 IRUJUDQGXQLILHGFRQILJXUDWLRQEXWLWPHDQVQRWKLQJPRUHWKDQFRQILJXUDWLRQ
VHWWLQJVLQ3RVWJUH64/
ODWHUDOMRLQV/DWHUDO-RLQV/DWHUDO-RLQV
PDQDJLQJFRQQHFWLRQVIRU0DQDJLQJ&RQQHFWLRQV0DQDJLQJ&RQQHFWLRQV
:KDWߞV1HZLQ/DWHVW9HUVLRQVRI3RVWJUH64/" DFFHVVLQJIURPSJ$GPLQ$FFHVVLQJSVTOIURPSJ$GPLQ
(YHU\6HSWHPEHUDQHZ3RVWJUH64/LVUHOHDVHG:LWKHDFKQHZUHOHDVHFRPHV DXWRFRPPLWFRPPDQGV$XWRFRPPLW&RPPDQGV
JUHDWHUVWDELOLW\KHLJKWHQHGVHFXULW\EHWWHUSHUIRUPDQFHߚDQGDYDQWJDUGH
IHDWXUHV7KHXSJUDGHSURFHVVLWVHOIJHWVHDVLHUZLWKHDFKQHZYHUVLRQ7KH EDVLFUHSRUWLQJ%DVLF5HSRUWLQJ%DVLF5HSRUWLQJ
OHVVRQKHUH"8SJUDGH8SJUDGHRIWHQ)RUDVXPPDU\FKDUWRINH\IHDWXUHVDGGHG FURVVWDETXHULHV&URVVWDEV
LQHDFKUHOHDVHUHIHUWRWKH3RVWJUH64/)HDWXUH0DWUL[
FXVWRPSURPSWV&XVWRP3URPSWV
:K\8SJUDGH" FXVWRPL]DWLRQVSVTO&XVWRPL]DWLRQV5HWULHYLQJ3ULRU&RPPDQGV
,I\RXߞUHXVLQJ3RVWJUH64/RUEHORZXSJUDGHQRZ9HUVLRQUHWLUHGWR
G\QDPLF64/H[HFXWLRQ'\QDPLF64/([HFXWLRQ'\QDPLF64/([HFXWLRQ
HQGRIOLIH(2/VWDWXVLQ6HSWHPEHU'HWDLOVDERXW3RVWJUH64/(2/
SROLF\FDQEHIRXQGKHUH3RVWJUH64/5HOHDVH6XSSRUW3ROLF\(2/LVQRWZKHUH HQYLURQPHQWYDULDEOHVDQG(QYLURQPHQW9DULDEOHV
\RXZDQWWREH1HZVHFXULW\XSGDWHVDQGIL[HVWRVHULRXVEXJVZLOOQRORQJHUEH
DYDLODEOH<RXߞOOQHHGWRKLUHVSHFLDOL]HG3RVWJUH64/FRUHFRQVXOWDQWVWRSDWFK H[HFXWLQJVKHOOFRPPDQGV([HFXWLQJ6KHOO&RPPDQGV
SUREOHPVRUWRLPSOHPHQWZRUNDURXQGVߚSUREDEO\QRWDFKHDSSURSRVLWLRQ
H[SRUWLQJGDWD,PSRUWLQJDQG([SRUWLQJ'DWDSVTO([SRUW
DVVXPLQJ\RXFDQHYHQORFDWHVRPHRQHZLOOLQJWRXQGHUWDNHWKHZRUN
5HJDUGOHVVRIZKLFKPDMRUYHUVLRQ\RXDUHUXQQLQJ\RXVKRXOGDOZD\VNHHSXS IHDWXUHHQKDQFHPHQWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
ZLWKWKHODWHVWPLFURYHUVLRQV$QXSJUDGHIURPVD\WRUHTXLUHVQR LPSRUWLQJGDWD,PSRUWLQJDQG([SRUWLQJ'DWDSVTO,PSRUW
PRUHWKDQDILOHUHSODFHPHQWDQGDUHVWDUW0LFURYHUVLRQVRQO\SDWFKEXJV
1RWKLQJZLOOVWRSZRUNLQJDIWHUDPLFURXSJUDGH3HUIRUPLQJDPLFURXSJUDGH LQWHUDFWLYHFRPPDQGV,QWHUDFWLYHYHUVXV1RQLQWHUDFWLYHSVTOSVTO,QWHUDFWLYH
FDQLQIDFWVDYH\RXPXFKJULHIGRZQWKHURDG &RPPDQGVSVTO,QWHUDFWLYH&RPPDQGV
OLVWVDQG5HWULHYLQJ'HWDLOVRI'DWDEDVH2EMHFWV
)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
3RVWJUH64/LVWKHODWHVWVWDEOHUHOHDVHDQGZDVUHOHDVHGLQ2FWREHU QRQLQWHUDFWLYHFRPPDQGV,QWHUDFWLYHYHUVXV1RQLQWHUDFWLYHSVTOSVTO
6WDUWLQJZLWK3RVWJUH64/WKH3RVWJUH64/SURMHFWDGRSWHGDQHZYHUVLRQLQJ 1RQLQWHUDFWLYH&RPPDQGV
FRQYHQWLRQ,QSULRUYHUVLRQVPDMRUYHUVLRQVJRWDPLQRUYHUVLRQQXPEHUEXPS
SDUWLWLRQHGWDEOHVDQG3DUWLWLRQHG7DEOHV
)RUH[DPSOH3RVWJUH64/LQWURGXFHGVRPHPDMRUQHZIHDWXUHVWKDWZHUHQRW
LQLWV3RVWJUH64/SUHGHFHVVRU,QFRQWUDVWVWDUWLQJZLWK3RVWJUH64/ UHVWRULQJGDWD5HVWRULQJ'DWD
PDMRUUHOHDVHVZLOOKDYHWKHILUVWGLJLWEXPSHG6RPDMRUFKDQJHVWR3RVWJUH64/
ZLOOEHFDOOHG3RVWJUH64/7KLVLVPRUHLQOLQHZLWKZKDWRWKHUGDWDEDVH UHWULHYLQJGHWDLOVRIGDWDEDVHREMHFWV5HWULHYLQJ'HWDLOVRI'DWDEDVH2EMHFWV
YHQGRUVIROORZVXFKDV64/LWH64/6HUYHUDQG2UDFOH UHWULHYLQJSULRUFRPPDQGV5HWULHYLQJ3ULRU&RPPDQGV
+HUHDUHWKHNH\QHZIHDWXUHVLQ
VKRUWFXWVIRU6KRUWFXWV
4XHU\SDUDOOHOL]DWLRQLPSURYHPHQWV
GURSSLQJIURPWDEOHV6DPSOH5XQVDQG2XWSXW 7KHUHDUHQHZSODQQHUVWUDWHJLHVIRUSDUDOOHOTXHULHV3DUDOOHO%LWPDS+HDS
6FDQ3DUDOOHO,QGH[6FDQDQGRWKHUV7KHVHFKDQJHVDOORZDZLGHUUDQJHRI
LQKHULWDQFHDQG,QKHULWHG7DEOHV TXHULHVWREHSDUDOOHOL]HGIRU6HHߡ3DUDOOHOL]HG4XHULHVߢ
QDPLQJFRQVLGHUDWLRQV&RQVWUDLQWV /RJLFDOUHSOLFDWLRQ
VHULDOGDWDW\SHDQG6HULDOV%DVLF7DEOH&UHDWLRQ 3ULRUYHUVLRQVRI3RVWJUH64/KDGVWUHDPLQJUHSOLFDWLRQWKDWUHSOLFDWHVWKH
ZKROHVHUYHUFOXVWHU6ODYHVLQVWUHDPLQJUHSOLFDWLRQZHUHUHDGRQO\DQG
WDEOHFRQVWUDLQWV8QLTXH&RQVWUDLQWV FRXOGEHXVHGRQO\IRUTXHULHVWKDWGRQߞWFKDQJHGDWD1RUFRXOGWKH\KDYH
SULYLOHJHV WDEOHVRIWKHLURZQ/RJLFDOUHSOLFDWLRQSURYLGHVWZRIHDWXUHVWKDWVWUHDPLQJ
UHSOLFDWLRQGLGQRWKDYH<RXFDQQRZUHSOLFDWHMXVWDWDEOHRUDGDWDEDVHQR
DERXW3ULYLOHJHV QHHGIRUWKHZKROHFOXVWHUVLQFH\RXDUHUHSOLFDWLQJRQO\SDUWRIWKHGDWD
WKHVODYHVFDQKDYHWKHLURZQVHWRIGDWDWKDWLVQRWLQYROYHGLQUHSOLFDWLRQ
EDWFKMREVDQG,QVWDOOLQJSJ$JHQW
)XOOWH[WVXSSRUWIRU-621DQG-621%
GHIDXOW'HIDXOW3ULYLOHJHV'HIDXOW3ULYLOHJHV
,QSULRUYHUVLRQVWRBWVYHFWRUZRXOGZRUNRQO\ZLWKSODLQWH[WZKHQ
JHWWLQJVWDUWHG*HWWLQJ6WDUWHG JHQHUDWLQJDIXOOWH[WYHFWRU1RZWRBWVYHFWRUFDQXQGHUVWDQGWKHMVRQDQG
MVRQEW\SHVLJQRULQJWKHNH\VLQ-621DQGLQFOXGLQJRQO\WKHYDOXHVLQWKH
*5$17FRPPDQG*5$17 YHFWRU7KHWVBKHDGOLQHIXQFWLRQIRUMVRQDQGMVRQEZDVDOVRLQWURGXFHG,W
LGLRV\QFUDVLHVRI3ULYLOHJH,GLRV\QFUDVLHV KLJKOLJKWVPDWFKHVLQDMVRQGRFXPHQWGXULQJDWVTXHU\5HIHUWRߡ)XOO7H[W
6XSSRUWIRU-621DQG-621%ߢ
LQKHULWLQJIURPJURXSUROHV&UHDWLQJ*URXS5ROHV
$16,VWDQGDUG;0/7$%/(FRQVWUXFW
SRVWJUHVVXSHUXVHUDFFRXQW'RQߞW*UDQW)XOO26$GPLQLVWUDWLYH3ULYLOHJHVWR ;0/7$%/(SURYLGHVDVLPSOHUZD\RIGHFRQVWUXFWLQJ;0/LQWRDVWDQGDUG
WKH3RVWJUHV6\VWHP$FFRXQWSRVWJUHV WDEOHVWUXFWXUH7KLVIHDWXUHKDVH[LVWHGIRUVRPHWLPHLQ2UDFOHDQG,%0
'%GDWDEDVHV5HIHUWR([DPSOH
VHWWLQJ&UHDWLQJ'DWDEDVH$VVHWVDQG6HWWLQJ3ULYLOHJHV3ULYLOHJH
PDQDJHPHQW )':SXVKGRZQDJJUHJDWHVWRUHPRWHVHUYHUV
W\SHVRI7\SHVRI3ULYLOHJHV 7KH)':$3,FDQQRZUXQDJJUHJDWLRQVVXFKDV&2817
RU680
RQ
UHPRWHTXHULHVSRVWJUHVBIGZWDNHVDGYDQWDJHRIWKLVQHZIHDWXUH3ULRUWR
SURFHGXUDOODQJXDJHV3/V3RVWJUH64/'DWDEDVH2EMHFWV:ULWLQJ)XQFWLRQV SRVWJUHVBIGZDQ\DJJUHJDWLRQZRXOGUHTXLUHWKHORFDOVHUYHUWRUHTXHVWDOO
7UXVWHGDQG8QWUXVWHG/DQJXDJHV WKHGDWDWKDWQHHGHGDJJUHJDWLRQDQGGRWKHDJJUHJDWLRQORFDOO\
352037V\VWHPVHWWLQJSVTO&XVWRPL]DWLRQV 'HFODUDWLYHWDEOHSDUWLWLRQLQJ
SVTOWRRO ,QSULRUYHUVLRQVLI\RXKDGDWDEOH\RXQHHGHGWRSDUWLWLRQEXWTXHU\DVD
VLQJOHXQLW\RXZRXOGXWLOL]H3RVWJUH64/WDEOHLQKHULWDQFHVXSSRUW8VLQJ
DERXWSVTOSVTO LQKHULWDQFHZDVFXPEHUVRPHLQWKDW\RXKDGWRZULWHWULJJHUVWRUHURXWHGDWD
WRDWDEOH3$57,7,21LIDGGLQJWRWKHSDUHQWWDEOH3RVWJUH64/ UHVWDUWLQJ5HVWDUWLQJ
LQWURGXFHVWKH3$57,7,21%<FRQVWUXFW3$57,7,21%<DOORZV\RXWR
FUHDWHDSDUHQWWDEOHZLWKQRGDWDEXWZLWKDGHILQHG3$57,7,21IRUPXOD YHUVLRQHQKDQFHPHQWV:KDWߞV1HZLQ/DWHVW9HUVLRQVRI3RVWJUH64/"
1RZ\RXFDQLQVHUWGDWDLQWRWKHSDUHQWWDEOHZLWKRXWWKHQHHGWRGHILQH )HDWXUHV,QWURGXFHGLQ3RVWJUH64/
WULJJHUV5HIHUWRߡ3DUWLWLRQHG7DEOHVߢ
SRVWJUHVTOGHYSDFNDJH4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V4XHU\LQJ
4XHU\H[HFXWLRQ 1RQFRQYHQWLRQDO'DWD6RXUFHV
9DULRXVVSHHGXSVKDYHEHHQDGGHG SRVWJUHVTOVHUYHUGHYSDFNDJH'HELDQ8EXQWX
&5($7(67$7,67,&6 SRVWJUHVTODXWRFRQIILOH7KHSRVWJUHVTOFRQI)LOH
1HZFRQVWUXFWIRUFUHDWLQJVWDWLVWLFVRQPXOWLSOHFROXPQV5HIHUWR
([DPSOH SRVWJUHVTOFRQIILOH
,'(17,7< DERXW&RQILJXUDWLRQ)LOHV7KHSRVWJUHVTOFRQI)LOH
$QHZ,'(17,7<TXDOLILHULQ''/WDEOHFUHDWLRQDQG$/7(5VWDWHPHQWV FKDQJLQJVHWWLQJV&KDQJLQJWKHSRVWJUHVTOFRQIVHWWLQJV
SURYLGHVDPRUHVWDQGDUGVFRPSOLDQWZD\WRGHVLJQDWHDWDEOHFROXPQDVDQ
DXWRLQFUHPHQW5HIHUWR([DPSOH FKHFNLQJVHWWLQJV&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV&KHFNLQJSRVWJUHVTOFRQI
VHWWLQJV
)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ HGLWLQJ(GLWLQJSRVWJUHVTOFRQIDQGSJBKEDFRQIIURPSJ$GPLQ
3RVWJUH64/ZDVUHOHDVHGLQ6HSWHPEHU3RVWJUH64/LVWKHODVWRI
JOREDOV\VWHPVHWWLQJVDQG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
WKH3RVWJUH64/VHULHV
4XHU\SDUDOOHOL]DWLRQ SRVWJUHVBIGZZUDSSHU
8SWRQRZ3RVWJUH64/FRXOGQRWWDNHDGYDQWDJHRIPXOWLSOHSURFHVVRU DERXW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/4XHU\LQJ2WKHU3RVWJUH64/
FRUHV,QWKH3RVWJUH64/HQJLQHFDQGLVWULEXWHFHUWDLQW\SHVRITXHULHV 6HUYHUV
DFURVVPXOWLSOHFRUHVDQGSURFHVVHUV4XDOLILHGTXHULHVLQFOXGHWKRVHZLWK
VHTXHQWLDOVFDQVVRPHMRLQVDQGVRPHDJJUHJDWHV+RZHYHUTXHULHVWKDW LQVWDOOLQJ)RUHLJQ'DWD:UDSSHUV
LQYROYHFKDQJLQJGDWDVXFKDVGHOHWHVLQVHUWVDQGXSGDWHVDUHQRW
RSWLRQVVXSSRUWHG4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
SDUDOOHOL]DEOH3DUDOOHOL]DWLRQLVDZRUNLQSURJUHVVZLWKWKHHYHQWXDOKRSH
WKDWDOOTXHULHVZLOOWDNHDGYDQWDJHRIPXOWLSOHSURFHVVRUFRUHV6HH XSGDWLQJDQG5HSOLFDWLRQDQG([WHUQDO'DWD
ߡ3DUDOOHOL]HG4XHULHVߢ
SRVWPDVWHUSLGILOHߡ,HGLWHGP\SRVWJUHVTOFRQIDQGQRZP\VHUYHUZRQߞWVWDUWߢ
3KUDVHIXOOWH[WVHDUFK
SULPDU\NH\V
8VHWKHGLVWDQFHRSHUDWRU<->LQDIXOOWH[WVHDUFKTXHU\WRLQGLFDWHKRZIDU
WZRZRUGVFDQEHDSDUWIURPHDFKRWKHUDQGVWLOOEHFRQVLGHUHGDPDWFK,Q %7UHHDQG3RVWJUH64/6WRFN,QGH[HV
SRUWQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV SULRUYHUVLRQV\RXFRXOGLQGLFDWHRQO\ZKLFKZRUGVVKRXOGEHVHDUFKHGQRZ
\RXFDQFRQWUROWKHVHTXHQFHRIWKHZRUGV6HHߡ)XOO7H[W6HDUFKߢ
SRVLWLRQDOQRWDWLRQ)XQFWLRQ%DVLFV
SVTO\gexecRSWLRQV
SRVWJLVH[WHQVLRQ3RSXODUH[WHQVLRQV
7KHVHUHDGDQ64/VWDWHPHQWIURPDTXHU\DQGH[HFXWHLW6HHߡ'\QDPLF
SRVWJUHVVHUYLFH'RQߞW7U\WR6WDUW3RVWJUH64/RQD3RUW$OUHDG\LQ8VH 64/([HFXWLRQߢ
SRVWJUHVVXSHUXVHUDFFRXQW SRVWJUHVBIGZ
DGPLQLVWUDWLYHSULYLOHJHVDQG'RQߞW*UDQW)XOO26$GPLQLVWUDWLYH3ULYLOHJHV 8SGDWHVLQVHUWVDQGGHOHWHVDUHDOOPXFKIDVWHUIRUVLPSOHFDVHV6HH
'HSHV]'LUHFWO\0RGLI\)RUHLJQ7DEOHIRUGHWDLOV
WRWKH3RVWJUHV6\VWHP$FFRXQWSRVWJUHV
3XVKHGGRZQ)':MRLQV
FUHDWLQJORJLQUROHV&UHDWLQJ/RJLQ5ROHV
7KLVLVQRZVXSSRUWHGE\VRPH)':VSRVWJUHVBIGZVXSSRUWVWKLVIHDWXUH
PDSSLQJ26URRWDFFRXQWWR&RQILJXUDWLRQ)LOHV :KHQ\RXMRLQIRUHLJQWDEOHVLQVWHDGRIUHWULHYLQJWKHGDWDIURPWKHIRUHLJQ
3/3\WKRQIXQFWLRQVDQG%DVLF3\WKRQ)XQFWLRQ VHUYHUDQGSHUIRUPLQJWKHMRLQORFDOO\)':ZLOOSHUIRUPWKHMRLQUHPRWHO\LI
IRUHLJQWDEOHVLQYROYHGLQWKHMRLQDUHIURPWKHVDPHIRUHLJQVHUYHUDQGWKHQ
3RVWJUHV;GDWDEDVH1RWDEOH3RVWJUH64/)RUNV UHWULHYHWKHUHVXOWVHW7KLVFRXOGORZHUWKHQXPEHURIURZVWKDWKDYHWR
FRPHRYHUIURPWKHIRUHLJQVHUYHUGUDPDWLFDOO\LPSURYLQJSHUIRUPDQFH
3RVWJUHV;/GDWDEDVH1RWDEOH3RVWJUH64/)RUNV ZKHQMRLQVHOLPLQDWHPDQ\URZV
3RVWJUHVDSSGLVWULEXWLRQPDF26
)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
3RVWJUH64/
9HUVLRQFDPHRXWLQ-DQXDU\RI1RWDEOHQHZIHDWXUHVDUHDVIROORZV
DGGLWLRQDOUHVRXUFHV)RU0RUH,QIRUPDWLRQRQ3RVWJUH64/ ,PSURYHPHQWVWRIRUHLJQWDEOHDUFKLWHFWXUH
DGPLQLVWUDWLRQWRROV$GPLQLVWUDWLRQ7RROV$GPLQHU $QHZIMPORT FOREIGN SCHEMAFRPPDQGDOORZVIRUEXONFUHDWLRQRI
IRUHLJQWDEOHVIURPDIRUHLJQVHUYHU)RUHLJQWDEOHLQKHULWDQFHPHDQVWKDWD
GRZQORDGLQJ:KHUHWR*HW3RVWJUH64/
ORFDOWDEOHFDQLQKHULWIURPIRUHLJQWDEOHVIRUHLJQWDEOHVFDQLQKHULWIURP
KHOSUHVRXUFHV:KHUHWR*HW+HOS ORFDOWDEOHVDQGIRUHLJQWDEOHVFDQLQKHULWIURPRWKHUIRUHLJQWDEOHV<RXFDQ
DOVRDGGFRQVWUDLQWVWRIRUHLJQWDEOHV6HHߡ)RUHLJQ'DWD:UDSSHUVߢDQG
LQVWDOOLQJ:LQGRZVDQG'HVNWRS/LQX[PDF26 ߡ4XHU\LQJ2WKHU3RVWJUH64/6HUYHUVߢ
UHDVRQVIRUQRWXVLQJ:K\1RW3RVWJUH64/" 8VLQJXQORJJHGWDEOHVDVDIDVWZD\WRSRSXODWHQHZWDEOHV
UHDVRQVIRUXVLQJ:K\3RVWJUH64/":K\3RVWJUH64/" 7KHGRZQVLGHLVWKDWXQORJJHGWDEOHVZRXOGJHWWUXQFDWHGGXULQJDFUDVK,Q
SULRUYHUVLRQVSURPRWLQJDQXQORJJHGWDEOHWRDORJJHGWDEOHFRXOGQRWEH
UHORDGLQJ5HORDGLQJ GRQHZLWKRXWFUHDWLQJDQHZWDEOHDQGUHSRSXODWLQJWKHUHFRUGV,QMXVW
XVHWKHALTER TABLE ... SET UNLOGGEDFRPPDQG SJBZDOIROGHU'RQߞW'HOHWH3RVWJUH64/&RUH6\VWHP)LOHVDQG%LQDULHV
$UUD\VLQDUUD\BDJJ SJB[DFWIROGHU'RQߞW'HOHWH3RVWJUH64/&RUH6\VWHP)LOHVDQG%LQDULHV
7KHDUUD\BDJJIXQFWLRQDFFHSWVDVHWRIYDOXHVDQGFRPELQHVWKHPLQWRD SJB[ORJIROGHU'RQߞW'HOHWH3RVWJUH64/&RUH6\VWHP)LOHVDQG%LQDULHV
VLQJOHDUUD\3ULRUWRSDVVLQJLQDUUD\VZRXOGWKURZDQHUURU:LWK
DUUD\BDJJLVVPDUWHQRXJKWRDXWRPDWLFDOO\FRQVWUXFWPXOWLGLPHQVLRQDO 3+3ODQJXDJH'DWDEDVH'ULYHUV
DUUD\VIRU\RX6HH([DPSOH
SKS3J$GPLQWRROSKS3J$GPLQ
%ORFNUDQJHLQGH[HV%5,1
SKUDVHWRBWVTXHU\IXQFWLRQ764XHULHV
$QHZNLQGRILQGH[ZLWKVPDOOHUIRRWSULQWWKDQ%7UHHDQG*,18QGHU
VRPHFLUFXPVWDQFHV%5,1FDQRXWSHUIRUPWKHIRUPHUWZR6HHߡ,QGH[HVߢ 3/&RIIHH6FULSWODQJXDJH:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW
)XQFWLRQV:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
*URXSLQJVHWV52//83$1'&8%(64/SUHGLFDWHV
7KLVIHDWXUHLVXVHGLQFRQMXQFWLRQZLWKDJJUHJDWHTXHULHVWRUHWXUQ 3//LYH6FULSWODQJXDJH:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW
DGGLWLRQDOVXEWRWDOURZV6HHߡ*5283,1*6(76&8%(52//83ߢIRU )XQFWLRQV:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
H[DPSOHV
3/SJ64/ODQJXDJH:ULWLQJ3/SJ64/)XQFWLRQV:ULWLQJ7ULJJHU)XQFWLRQVLQ
,QGH[RQO\VFDQV 3/SJ64/
7KHVHQRZVXSSRUW*L67LQGH[HV 3/3\WKRQODQJXDJH:ULWLQJ3/3\WKRQ)XQFWLRQV%DVLF3\WKRQ)XQFWLRQ
,QVHUWDQGXSGDWHFRQIOLFWKDQGOLQJ 3/9ODQJXDJH:ULWLQJ)XQFWLRQV:ULWLQJ3/93/&RIIHH6FULSWDQG
3ULRUWRDQ\LQVHUWVRUXSGDWHVWKDWFRQIOLFWHGZLWKSULPDU\NH\DQG 3//LYH6FULSW)XQFWLRQV:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
FKHFNFRQVWUDLQWVZRXOGDXWRPDWLFDOO\IDLO1RZ\RXKDYHDQRSSRUWXQLW\WR
FDWFKWKHH[FHSWLRQDQGRIIHUDQDOWHUQDWLYHFRXUVHRUWRVNLSWKHUHFRUGV SODLQWRBWVTXHU\IXQFWLRQ764XHULHV
FDXVLQJWKHFRQIOLFW6HHߡ836(57V,16(5721&21)/,&783'$7(ߢ SOS\WKRQXH[WHQVLRQ:ULWLQJ3/3\WKRQ)XQFWLRQV
8SGDWHORFNIDLOXUHV SOS\WKRQXH[WHQVLRQ:ULWLQJ3/3\WKRQ)XQFWLRQV
,I\RXZDQWWRVHOHFWDQGORFNURZVZLWKWKHLQWHQWRIXSGDWLQJWKHGDWD\RX
SOS\WKRQXH[WHQVLRQ:ULWLQJ3/3\WKRQ)XQFWLRQV
FDQXVHSELECT ... FOR UPDATE,I\RXߞUHXQDEOHWRREWDLQWKHORFNSULRU
WR\RXߞGUHFHLYHDQHUURU:LWK\RXFDQDGGWKHSKIP LOCKEDRSWLRQ 3/VSURFHGXUDOODQJXDJHV3RVWJUH64/'DWDEDVH2EMHFWV:ULWLQJ)XQFWLRQV
WRE\SDVVURZVIRUZKLFK\RXߞUHXQDEOHWRREWDLQORFNV 7UXVWHGDQG8QWUXVWHG/DQJXDJHV
5RZOHYHOVHFXULW\ SOY[H[WHQVLRQ:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW)XQFWLRQV
<RXQRZKDYHWKHDELOLW\WRVHWYLVLELOLW\DQGXSGDWDELOLW\RQURZVRIDWDEOH
SRLQWHUV\PEROV4XHU\LQJ-621
XVLQJSROLFLHV7KLVLVHVSHFLDOO\XVHIXOIRUPXOWLWHQDQWGDWDEDVHVRU
VLWXDWLRQVZKHUHVHFXULW\FDQQRWEHHDVLO\LVRODWHGE\VHJPHQWLQJGDWDLQWR
HGLWHGP\SJBKEDFRQIDQGQRZP\VHUYHULVEURNHQߢ'RQߞW'HOHWH3RVWJUH64/ GLIIHUHQWWDEOHV
&RUH6\VWHP)LOHVDQG%LQDULHV
)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
SJBRSFODVVV\VWHPWDEOH2SHUDWRU&ODVVHV
9HUVLRQFDPHRXWLQ6HSWHPEHU1RWDEOHQHZIHDWXUHVDUHDVIROORZV
SJBSUHZDUPH[WHQVLRQ&DFKLQJ
0DWHULDOL]HGYLHZHQKDQFHPHQWV
SJBUHFHLYHZDOGDHPRQ&RQILJXULQJWKH0DVWHU ,QPDWHULDOL]HGYLHZVDUHLQDFFHVVLEOHGXULQJDUHIUHVKZKLFKFRXOGEHD
SJBUHFHLYH[ORJGDHPRQ&RQILJXULQJWKH0DVWHU ORQJWLPH7KLVPDNHVWKHLUGHSOR\PHQWLQDSURGXFWLRQXQGHVLUDEOH
HOLPLQDWHGWKHORFNSURYLGHGIRUPDWHUL]DOL]HGYLHZVZLWKDXQLTXHLQGH[
SJBUHVWRUHWRRO
1HZDQDO\WLFIXQFWLRQVWRFRPSXWHSHUFHQWLOHV
DERXW5HVWRULQJ'DWD8VLQJSJBUHVWRUH SHUFHQWLOHBGLVFSHUFHQWLOHGLVFUHWHDQGSHUFHQWLOHBFRQWSHUFHQWLOH
GDWDEDVHUHVWRUHDQG'DWDEDVH5HVWRUHSJBUHVWRUH FRQWLQXRXVZHUHDGGHG7KH\PXVWEHXVHGZLWKWKHVSHFLDOWITHIN GROUP
(ORDER BY ...)FRQVWUXFW3RVWJUH64/YDQJXDUG+XEHUW/XEDF]HZVNL
SDUDOOHOUHVWRUHDQG6HOHFWLYH%DFNXS8VLQJSJBGXPS GHVFULEHGWKHLUXVHLQ2UGHUHG6HW:LWKLQ*URXS$JJUHJDWHV,I\RXߞYHHYHU
ORRNHGIRUDQDJJUHJDWHPHGLDQIXQFWLRQLQ3RVWJUH64/\RXGLGQߞWILQGLW
YHUVLRQFRQVLGHUDWLRQV%DFNXSDQG5HVWRUH
5HFDOOIURP\RXULQWURGXFWLRQWRPHGLDQVWKDWWKHDOJRULWKPKDVDQH[WUDWLH
SJBVHWWLQJVYLHZ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV EUHDNHUVWHSDWWKHHQGPDNLQJLWGLIILFXOWWRSURJUDPDVDQDJJUHJDWH
IXQFWLRQ7KHQHZSHUFHQWLOHIXQFWLRQVDSSUR[LPDWHWKHWUXHPHGLDQZLWKD
SJBVWDWBDFWLYLW\YLHZ0DQDJLQJ&RQQHFWLRQV&KHFNIRU4XHULHV%HLQJ%ORFNHG ߡIDVWߢPHGLDQ:HFRYHUWKHVHWZRIXQFWLRQVLQPRUHGHWDLOLQߡ3HUFHQWLOHV
DQG0RGHߢ
SJBVWDWBVWDWHPHQWVH[WHQVLRQ*DWKHULQJ6WDWLVWLFVRQ6WDWHPHQWV+RZ8VHIXO,V
<RXU,QGH[" 3URWHFWLRQDJDLQVWXSGDWHVLQYLHZV
SJBJOREDOWDEOHVSDFH0DQDJLQJ'LVN6WRUDJHZLWK7DEOHVSDFHV
8VLQJ64/WRDOWHUV\VWHPFRQILJXUDWLRQVHWWLQJV
SJBKEDFRQIILOH
7KHALTER system SET ...FRQVWUXFWDOORZV\RXWRVHWJOREDOV\VWHP
VHWWLQJVZLWKRXWHGLWLQJWKHSRVWJUHVTOFRQIDVGHWDLOHGLQߡ7KH DERXW&RQILJXUDWLRQ)LOHV7KHSJBKEDFRQI)LOH$XWKHQWLFDWLRQPHWKRGV
SRVWJUHVTOFRQI)LOHߢ7KLVDOVRPHDQV\RXFDQQRZSURJUDPPDWLFDOO\
FKDQJHV\VWHPVHWWLQJVEXWNHHSLQPLQGWKDW3RVWJUH64/PD\UHTXLUHD DXWKHQWLFDWLRQPHWKRGV7KHSJBKEDFRQI)LOH$XWKHQWLFDWLRQPHWKRGV
UHVWDUWIRUQHZVHWWLQJVWRWDNHHIIHFW
HGLWLQJ(GLWLQJSRVWJUHVTOFRQIDQGSJBKEDFRQIIURPSJ$GPLQ
7ULJJHUV
UHSOLFDWLQJVODYHV&RQILJXULQJWKH0DVWHU
9HUVLRQOHWV\RXSODFHWULJJHUVRQIRUHLJQWDEOHV
SJBKEDBILOHBUXOHVYLHZ7KHSJBKEDFRQI)LOH
%HWWHUKDQGOLQJRIXQQHVWLQJ
SJBLGHQWFRQIILOH&RQILJXUDWLRQ)LOHV$XWKHQWLFDWLRQPHWKRGV
7KHXQQHVWIXQFWLRQSUHGLFWDEO\DOORFDWHVDUUD\VRIGLIIHUHQWVL]HVLQWR
FROXPQV3ULRUWRXQQHVWLQJDUUD\VRIGLIIHUHQWVL]HVUHVXOWHGLQVKXIIOLQJ SJBORJIROGHUߡ,HGLWHGP\SRVWJUHVTOFRQIDQGQRZP\VHUYHUZRQߞWVWDUWߢߡ,
SJ%DFN5HVWWRRO%DFNXSDQG5HVWRUH RIFROXPQVLQXQH[SHFWHGZD\V
SJFU\SWRH[WHQVLRQ3RSXODUH[WHQVLRQV 7KLVFRQVWUXFWDOORZVWKHXVHRIPXOWLSOHVHWUHWXUQLQJIXQFWLRQVLQDVHULHV
HYHQLIWKH\KDYHDQXQEDODQFHGQXPEHURIHOHPHQWVLQHDFKVHW
SJGHYRSVSDFNDJH:LQGRZVDQG'HVNWRS/LQX[
SELECT *
3*+267HQYLURQPHQWYDULDEOH(QYLURQPHQW9DULDEOHV FROM ROWS FROM ( jsonb_each('{"a":"foo1","b":"bar"}'::jsonb),
jsonb_each('{"c":"foo2"}'::jsonb) )
SJORJLFDOH[WHQVLRQ(YROXWLRQRI3RVWJUH64/5HSOLFDWLRQ x (a1,a1_val,a2,a2_val);
3*3$66:25'HQYLURQPHQWYDULDEOH%DFNXSDQG5HVWRUH '\QDPLFEDFNJURXQGZRUNHUV
3*3257HQYLURQPHQWYDULDEOH(QYLURQPHQW9DULDEOHV <RXFDQFRGHWKHVHLQ&WRGRZRUNWKDWLVQRWDYDLODEOHWKURXJK64/RU
IXQFWLRQV$WULYLDOH[DPSOHLVDYDLODEOHLQWKHVRXUFHFRGHLQWKH
SJUHSXVHUDFFRXQW&RQILJXULQJWKH0DVWHU
FRQWULEZRUNHUBVSLGLUHFWRU\
SJURRQJDH[WHQVLRQ3RVWJUH64/6WRFN,QGH[HV
SJ6FULSWWRROSJ6FULSWSJ6FULSW 'DWDEDVH'ULYHUV
SJ764/ODQJXDJH:LQGRZVDQG'HVNWRS/LQX[ &KDQFHVDUHWKDW\RXߞUHQRWXVLQJ3RVWJUH64/LQDYDFXXP<RXQHHGDGDWDEDVH
GULYHUWRLQWHUDFWZLWKDSSOLFDWLRQVDQGRWKHUGDWDEDVHV3RVWJUH64/ZRUNVZLWK
3*86(5HQYLURQPHQWYDULDEOH(QYLURQPHQW9DULDEOHV IUHHGULYHUVIRUPDQ\SURJUDPPLQJODQJXDJHVDQGWRROV0RUHRYHUYDULRXV
FRPPHUFLDORUJDQL]DWLRQVSURYLGHGULYHUVZLWKH[WUDEHOOVDQGZKLVWOHVDWPRGHVW
SJBDYDLODEOHBH[WHQVLRQVYLHZ6WHS,QVWDOOLQJRQWKHVHUYHU8SJUDGLQJWRWKH
SULFHV+HUHDUHVRPHRIWKHQRWDEOHRSHQVRXUFHGULYHUV
QHZH[WHQVLRQPRGHO
3+3LVDSRSXODUODQJXDJHIRUZHEGHYHORSPHQWDQGPRVW3+3GLVWULEXWLRQV
SJBEDVHEDFNXSWRRO%DFNXSDQG5HVWRUH&RQILJXULQJWKH0DVWHU LQFOXGHDWOHDVWRQH3RVWJUH64/GULYHUWKHROGSJVTOGULYHURUWKHQHZHU
SJBEXIIHUFDFKHH[WHQVLRQ&DFKLQJ SGRBSJVTO<RXPD\QHHGWRHQDEOHWKHPLQ\RXUSKSLQL
SJBFDQFHOBEDFNHQGIXQFWLRQ0DQDJLQJ&RQQHFWLRQV )RU-DYDGHYHORSHUVWKH-'%&GULYHUNHHSVXSZLWKODWHVW3RVWJUH64/
YHUVLRQV'RZQORDGLWIURP3RVWJUH64/
SJBFDWDORJFDWDORJ3RVWJUH64/'DWDEDVH2EMHFWV1DYLJDWLQJSJ$GPLQ
)RU1(7ERWK0LFURVRIWRU0RQR\RXFDQXVHWKH1SJVTOGULYHU%RWKWKH
SJBFORJIROGHU'RQߞW'HOHWH3RVWJUH64/&RUH6\VWHP)LOHVDQG%LQDULHV VRXUFHFRGHDQGWKHELQDU\DUHDYDLODEOHIRU1(7)UDPHZRUN0LFURVRIW
(QWLW\)UDPHZRUNDQG0RQR1(7
SJBFWOUHORDGFRPPDQG5HORDGLQJ
,I\RXQHHGWRFRQQHFWIURP0LFURVRIW$FFHVV([FHORUDQ\RWKHUSURGXFWV
SJBGHIDXOWWDEOHVSDFH0DQDJLQJ'LVN6WRUDJHZLWK7DEOHVSDFHV WKDWVXSSRUW2SHQ'DWDEDVH&RQQHFWLYLW\2'%&GRZQORDGGULYHUVIURP
WKH3RVWJUH64/2'%&GULYHUVVLWH<RXߞOOKDYH\RXUFKRLFHRIELWRU EDFNXSDQGUHVWRUH%DFNXSDQG5HVWRUH6HOHFWLYHEDFNXSRIGDWDEDVHDVVHWV
ELW
FRQQHFWLQJWRVHUYHUV&RQQHFWLQJWRD3RVWJUH64/6HUYHU
/LEUH2IILFHDQGODWHUFRPHVSDFNDJHGZLWKDQDWLYH3RVWJUH64/GULYHU
)RU2SHQ2IILFHDQGROGHUYHUVLRQVRI/LEUH2IILFH\RXFDQXVHWKH-'%& GRZQORDGLQJ*HWWLQJ6WDUWHG
GULYHURUWKH6'%&GULYHU/HDUQPRUHGHWDLOVIURPRXUDUWLFOH22%DVHDQG
HGLWLQJFRQILJXUDWLRQILOHV(GLWLQJSRVWJUHVTOFRQIDQGSJBKEDFRQIIURP
3RVWJUH64/
SJ$GPLQ
3\WKRQKDVVXSSRUWIRU3RVWJUH64/YLDPDQ\GDWDEDVHGULYHUV$WWKH
PRPHQWSV\FRSJLVWKHPRVWSRSXODU5LFKVXSSRUWIRU3RVWJUH64/LVDOVR H[SRUWLQJGDWDDQG([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQ
DYDLODEOHLQWKH'MDQJRZHEIUDPHZRUN,I\RXDUHORRNLQJIRUDQREMHFW SJ$GPLQ([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ
UHODWLRQDOPDSSHU64/$OFKHP\LVWKHPRVWSRSXODUDQGLVXVHGLQWHUQDOO\E\
IHDWXUHVRYHUYLHZ2YHUYLHZRI)HDWXUHV2YHUYLHZRI)HDWXUHVSJ$GPLQ
WKH0XOWLFRUQ)RUHLJQ'DWD:UDSSHU
)HDWXUHV6HOHFWLYHEDFNXSRIGDWDEDVHDVVHWV
,I\RXXVH5XE\FRQQHFWWR3RVWJUH64/XVLQJUXE\JHPVSJ
JUDSKLFDOH[SODLQ*UDSKLFDO([SODLQ*UDSKLFDO([SODLQ
<RXߞOOILQG3HUOߞVFRQQHFWLYLW\WR3RVWJUH64/LQWKH'%,DQGWKH'%'3J
GULYHUV$OWHUQDWLYHO\WKHUHߞVWKHSXUH3HUO'%'3J33GULYHUIURP&3$1 LPSRUWLQJGDWDDQG,PSRUWDQG([SRUW
1RGHMVLVD-DYD6FULSWIUDPHZRUNIRUUXQQLQJVFDODEOHQHWZRUNSURJUDPV MREVFKHGXOLQJDQG-RE6FKHGXOLQJZLWKSJ$JHQW+HOSIXOSJ$JHQW4XHULHV
7KHUHDUHWZR3RVWJUH64/GULYHUVFXUUHQWO\1RGH3RVWJUHVZLWKRSWLRQDO
OLVWLQJ''/WULJJHUV3RVWJUH64/'DWDEDVH2EMHFWV
QDWLYHOLESTELQGLQJVDQGSXUH-6QRFRPSLODWLRQUHTXLUHGDQG1RGH'%,
QDYLJDWLQJ1DYLJDWLQJSJ$GPLQ1DYLJDWLQJSJ$GPLQ
:KHUHWR*HW+HOS SJ6FULSWDQGSJ6FULSWSJ6FULSW
7KHUHZLOOFRPHDGD\ZKHQ\RXQHHGKHOS7KDWGD\DOZD\VDUULYHVHDUO\ZH SULYLOHJHVHWWLQJVDQG3ULYLOHJHV
ZDQWWRSRLQW\RXWRVRPHUHVRXUFHVQRZUDWKHUWKDQODWHU2XUIDYRULWHLVWKH
OLYHO\PDLOLQJOLVWGHVLJQHGIRUKHOSLQJQHZDQGROGXVHUVZLWKWHFKQLFDOLVVXHV YHUVLRQFRQVLGHUDWLRQV8VLQJSJ$GPLQ
)LUVWYLVLW3RVWJUH64/+HOS0DLOLQJ/LVWV,I\RXDUHQHZWR3RVWJUH64/WKH
SJ$JHQWWRRO
EHVWOLVWWRVWDUWZLWKLVWKH3*64/*HQHUDO0DLOLQJ/LVW,I\RXUXQLQWRZKDW
DSSHDUVWREHDEXJLQ3RVWJUH64/UHSRUWLWDW3RVWJUH64/%XJ5HSRUWLQJ DERXW-RE6FKHGXOLQJZLWKSJ$JHQW
EDWFKMREVDQG,QVWDOOLQJSJ$JHQW
1RWDEOH3RVWJUH64/)RUNV
LQVWDOOLQJ,QVWDOOLQJSJ$JHQW
7KH0,7%6'VW\OHOLFHQVLQJRI3RVWJUH64/PDNHVLWDJUHDWFDQGLGDWHIRU
IRUNLQJ9DULRXVJURXSVKDYHGRQHH[DFWO\WKDWRYHUWKH\HDUV6RPHKDYH TXHU\H[DPSOHV+HOSIXOSJ$JHQW4XHULHV
FRQWULEXWHGWKHLUFKDQJHVEDFNWRWKHRULJLQDOSURMHFWRUIXQGHG3RVWJUH64/
VFKHGXOLQJMREV6FKHGXOLQJ-REV6FKHGXOLQJ-REV
SDUWLDOLQGH[HV8QLTXH&RQVWUDLQWV3DUWLDO,QGH[HV ZRUN)RUOLVWRIIRUNVUHIHUWR3RVWJUH64/GHULYHGGDWDEDVHV
3$57,7,21%<FODXVH)HDWXUHV,QWURGXFHGLQ3RVWJUH64/3DUWLWLRQHG 0DQ\SRSXODUIRUNVDUHSURSULHWDU\DQGFORVHGVRXUFH1HWH]]DDSRSXODU
7DEOHV3$57,7,21%< GDWDEDVHFKRLFHIRUGDWDZDUHKRXVLQJZDVD3RVWJUH64/IRUNDWLQFHSWLRQ
6LPLODUO\WKH$PD]RQ5HGVKLIWGDWDZDUHKRXVHLVDIRUNRIDIRUNRI
3$57,7,21%<5$1*(PRGLILHU3DUWLWLRQHG7DEOHV 3RVWJUH64/$PD]RQKDVWZRRWKHURIIHULQJVWKDWDUHFORVHUWRVWDQGDUG
3RVWJUH64/$PD]RQ5'6IRU3RVWJUH64/DQG$PD]RQ$XURUDIRU
SDUWLWLRQHGWDEOHV3DUWLWLRQHG7DEOHV3DUWLWLRQHG7DEOHV 3RVWJUH64/7KHVHVWD\LQOLQHZLWK3RVWJUH64/YHUVLRQVLQ64/V\QWD[EXW
3$66,1*PRGLILHU4XHU\LQJ;0/'DWD ZLWKPRUHPDQDJHPHQWDQGVSHHGIHDWXUHV
3RVWJUH64/$GYDQFHG3OXVE\(QWHUSULVH'%LVDIRUNWKDWDGGV2UDFOHV\QWD[
SDVVZRUGDXWKHQWLFDWLRQPHWKRG$XWKHQWLFDWLRQPHWKRGV
DQGFRPSDWLELOLW\IHDWXUHVWRZRR2UDFOHXVHUV(QWHUSULVH'%SORXJKVIXQGLQJ
3$7+FODXVH4XHU\LQJ;0/'DWD DQGGHYHORSPHQWVXSSRUWEDFNWRWKH3RVWJUH64/FRPPXQLW\)RUWKLVZHߞUH
JUDWHIXO,WV3RVWJUHV3OXV$GYDQFHG6HUYHULVIDLUO\FORVHWRWKHPRVWUHFHQW
SDWWHUQPDWFKLQJ5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ5HJXODU VWDEOHYHUVLRQRI3RVWJUH64/
([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
3RVWJUHV;3RVWJUHV;/DQG*UHHQ3OXPDUHWKUHHEXGGLQJIRUNVZLWKRSHQ
SHHUDXWKHQWLFDWLRQPHWKRG$XWKHQWLFDWLRQPHWKRGV VRXUFHOLFHQVLQJDOWKRXJK*UHHQ3OXPZDVFORVHGVRXUFHIRUDSHULRG7KHVH
WKUHHWDUJHWODUJHVFDOHGDWDDQDO\WLFVDQGUHSOLFDWLRQ
SHUFHQWLOHBFRQWIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/3HUFHQWLOHVDQG
3DUWRIWKHUHDVRQIRUIRUNLQJLVWRDGYDQFHDKHDGRIWKH3RVWJUH64/UHOHDVH
0RGH
F\FOHDQGWU\RXWQHZIHDWXUHVWKDWPD\RUPD\QRWEHRIJHQHUDOLQWHUHVW0DQ\
SHUFHQWLOHBGLVFIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/3HUFHQWLOHVDQG RIWKHQHZIHDWXUHVGHYHORSHGWKLVZD\GRILQGWKHLUZD\EDFNLQWRDODWHU
0RGH 3RVWJUH64/FRUHUHOHDVH6XFKLVWKHFDVHZLWKWKHPXOWLPDVWHUELGLUHFWLRQDO
UHSOLFDWLRQ%'5IRUNGHYHORSHGE\QG4XDGUDQW3LHFHVRI%'5VXFKDVWKH
SHUIRUPDQFHWXQLQJVHHTXHU\SHUIRUPDQFHWXQLQJ ORJLFDOUHSOLFDWLRQVXSSRUWDUHEHHILQJXSWKHEXLOWLQUHSOLFDWLRQIXQFWLRQDOLW\LQ
3RVWJUH64/SURSHU6RPHRIWKHSDUDOOHOL]DWLRQZRUNRI3RVWJUHV;/ZLOODOVR
3HUOODQJXDJH'DWDEDVH'ULYHUV OLNHO\PDNHLWLQWRIXWXUHYHUVLRQVRI3RVWJUH64/
SHUPLVVLRQVVHHSULYLOHJHV &LWXVLVDSURMHFWWKDWVWDUWHGDVDIRUNRI3RVWJUH64/WRVXSSRUWUHDOWLPHELJ
GDWDDQGSDUDOOHOTXHULHV,WKDVVLQFHEHHQLQFRUSRUDWHGEDFNDQGFDQEHLQVWDOOHG
SJ$GPLQWRRO
LQ3RVWJUH64/DVDQH[WHQVLRQ
DERXWSJ$GPLQSJ$GPLQ8VLQJSJ$GPLQ *RRJOH&ORXG64/IRU3RVWJUH64/LVDIDLUO\UHFHQWDGGLWLRQE\*RRJOHDQGLV
FXUUHQWO\LQEHWD
DFFHVVLQJSTVTOIURP$FFHVVLQJSVTOIURPSJ$GPLQ
DXWRJHQHUDWLQJTXHULHVIURPWDEOHGHILQLWLRQV$XWRJHQHUDWLQJ4XHULHVIURP
7DEOH'HILQLWLRQV
RYHUULGLQJIRUFDVHVHQVLWLYLW\7H[WXDOV
&KDSWHU'DWDEDVH
UDQJH5DQJH2SHUDWRUV
$GPLQLVWUDWLRQ VRUW$JJUHJDWHV
VWULQJ6WULQJ)XQFWLRQV
7KLVFKDSWHUFRYHUVZKDWZHFRQVLGHUEDVLFDGPLQLVWUDWLRQRID3RVWJUH64/
RURSHUDWRU_764XHULHV
VHUYHUPDQDJLQJUROHVDQGSHUPLVVLRQVFUHDWLQJGDWDEDVHVLQVWDOOLQJ
H[WHQVLRQVDQGEDFNLQJXSDQGUHVWRULQJGDWD%HIRUHFRQWLQXLQJ\RXVKRXOG RURSHUDWRU__764XHULHV
KDYHDOUHDG\LQVWDOOHG3RVWJUH64/DQGKDYHDGPLQLVWUDWLRQWRROVDW\RXU
GLVSRVDO 25'(5%<FODXVH0DWHULDOL]HG9LHZV/,0,7DQG2))6(73HUFHQWLOHVDQG
0RGH25'(5%<25'(5%<
RYHUODSRSHUDWRU $UUD\&RQWDLQPHQW&KHFNV2YHUODSRSHUDWRU([FOXVLRQ
&RQILJXUDWLRQ)LOHV
&RQVWUDLQWV
7KUHHPDLQFRQILJXUDWLRQILOHVFRQWURORSHUDWLRQVRID3RVWJUH64/VHUYHU
RYHUODSVIXQFWLRQ'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
SRVWJUHVTOFRQI
&RQWUROVJHQHUDOVHWWLQJVVXFKDVPHPRU\DOORFDWLRQGHIDXOWVWRUDJH 29(5/$36RSHUDWRU$16,64/'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
ORFDWLRQIRUQHZGDWDEDVHVWKH,3DGGUHVVHVWKDW3RVWJUH64/OLVWHQVRQ
3
ORFDWLRQRIORJVDQGSOHQW\PRUH
3DTXLHU0LFKDHO%LQDU\-621MVRQE
SJBKEDFRQI
&RQWUROVDFFHVVWRWKHVHUYHUGLFWDWLQJZKLFKXVHUVFDQORJLQWRZKLFK 3$5$//(/TXDOLILHU)XQFWLRQ%DVLFV
GDWDEDVHVZKLFK,3DGGUHVVHVFDQFRQQHFWDQGZKLFKDXWKHQWLFDWLRQVFKHPH SDUDOOHOL]HGTXHULHV
WRDFFHSW
DERXW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/3DUDOOHOL]HG4XHULHV
SJBLGHQWFRQI
,ISUHVHQWWKLVILOHPDSVDQDXWKHQWLFDWHG26ORJLQWRD3RVWJUH64/XVHU IHDWXUHLPSURYHPHQWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
3HRSOHVRPHWLPHVPDSWKH26URRWDFFRXQWWRWKH3RVWJUHV64/VXSHUXVHU
SDUDOOHOMRLQV3DUDOOHO-RLQV
DFFRXQWSRVWJUHV
SDUDOOHOTXHU\SODQV:KDW'RHVD3DUDOOHO4XHU\3ODQ/RRN/LNH":KDW'RHV
D3DUDOOHO4XHU\3ODQ/RRN/LNH"
127(
3RVWJUH64/RIILFLDOO\UHIHUVWRXVHUVDVUROHV1RWDOOUROHVQHHGWRKDYHORJLQSULYLOHJHV)RU SDUDOOHOVFDQV3DUDOOHO6FDQV
H[DPSOHJURXSUROHVRIWHQGRQRW:HXVHWKHWHUPXVHUWRUHIHUWRDUROHZLWKORJLQSULYLOHJHV
SDUHQWKHVHV%XLOGLQJ&XVWRP'DWD7\SHV
QXPUDQJHGDWDW\SH%XLOWLQ5DQJH7\SHV ,I\RXDFFHSWHGGHIDXOWLQVWDOODWLRQRSWLRQV\RXZLOOILQGWKHVHFRQILJXUDWLRQ
ILOHVLQWKHPDLQ3RVWJUH64/GDWDIROGHU<RXFDQHGLWWKHPXVLQJDQ\WH[WHGLWRU
2 RUWKH$GPLQ3DFNLQSJ$GPLQ,QVWUXFWLRQVIRUHGLWLQJZLWKSJ$GPLQDUHLQ
2'%&2SHQ'DWDEDVH&RQQHFWLYLW\'DWDEDVH'ULYHUV ߡ(GLWLQJSRVWJUHVTOFRQIDQGSJBKEDFRQIIURPSJ$GPLQߢ,I\RXDUHXQDEOHWR
ILQGWKHSK\VLFDOORFDWLRQRIWKHVHILOHVUXQWKH([DPSOHTXHU\DVD
2))6(7FODXVH/,0,7DQG2))6(7 VXSHUXVHUZKLOHFRQQHFWHGWRDQ\GDWDEDVH
RJUBDOOVFKHPD4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ ([DPSOH/RFDWLRQRIFRQILJXUDWLRQILOHV
SELECT name, setting FROM pg_settings WHERE category = 'File Locations';
RJUBIGZH[WHQVLRQ4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ name | setting
-------------------+------------------------------------------
RJUBIGZZUDSSHU5HSOLFDWLRQDQG([WHUQDO'DWD4XHU\LQJ2WKHU7DEXODU config_file | /etc/postgresql/9.6/main/[Link]
data_directory | /var/lib/postgresql/9.6/main
)RUPDWVZLWKRJUBIGZ4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ external_pid_file | /var/run/postgresql/[Link]
hba_file | /etc/postgresql/9.6/main/pg_hba.conf
2/$3RQOLQHDQDO\WLFDOSURFHVVLQJDSSOLFDWLRQV0DWHULDOL]HG9LHZV ident_file | /etc/postgresql/9.6/main/pg_ident.conf
(5 rows)
21&21)/,&7'2FODXVH836(57V,16(5721&21)/,&783'$7(
0DNLQJ&RQILJXUDWLRQV7DNH(IIHFW
21/<PRGLILHU5HVWULFWLQJ'(/(7(83'$7(DQG6(/(&7IURP,QKHULWHG
7DEOHV:ULWDEOH&7(V 6RPHFRQILJXUDWLRQFKDQJHVUHTXLUHD3RVWJUH64/VHUYLFHUHVWDUWZKLFKFORVHV
DQ\DFWLYHFRQQHFWLRQVIURPFOLHQWV2WKHUFKDQJHVUHTXLUHMXVWDUHORDG1HZ
2SHQ'DWDEDVH&RQQHFWLYLW\2'%&'DWDEDVH'ULYHUV XVHUVFRQQHFWLQJDIWHUDUHORDGZLOOUHFHLYHWKHQHZVHWWLQJ([WDQWXVHUVZLWK
DFWLYHFRQQHFWLRQVZLOOQRWEHDIIHFWHGGXULQJDUHORDG,I\RXߞUHQRWVXUH
2SHQ6&*FRPSDQ\:LQGRZVDQG'HVNWRS/LQX[
ZKHWKHUDFRQILJXUDWLRQFKDQJHUHTXLUHVDUHORDGRUUHVWDUWORRNXQGHUWKH
RSHUDWRUFODVVHV2SHUDWRU&ODVVHV2SHUDWRU&ODVVHV FRQWH[WVHWWLQJDVVRFLDWHGZLWKDFRQILJXUDWLRQ,IWKHFRQWH[WLVpostmaster
\RXߞOOQHHGDUHVWDUW,IWKHFRQWH[WLVuserDUHORDGZLOOVXIILFH
RSHUDWRUV
5HORDGLQJ
DERXW3RVWJUH64/'DWDEDVH2EMHFWV'DWD7\SHV
$UHORDGFDQEHGRQHLQVHYHUDOZD\V2QHZD\LVWRRSHQDFRQVROHZLQGRZDQG
EXLOGLQJIRUFXVWRPGDWDW\SHV%XLOGLQJ2SHUDWRUVDQG)XQFWLRQVIRU&XVWRP UXQWKLVFRPPDQG
7\SHV
pg_ctl reload -D your_data_directory_here
GDWHWLPH'DWHWLPH2SHUDWRUVDQG)XQFWLRQV'DWHWLPH2SHUDWRUVDQG
)XQFWLRQV ,I\RXKDYH3RVWJUH64/LQVWDOOHGDVDVHUYLFHLQ5HG+DW(QWHUSULVH/LQX[
&HQW26RU8EXQWXHQWHULQVWHDG
MVRQGDWDW\SH4XHU\LQJ-621
service postgresql-9.5 reload
MVRQEGDWDW\SH%LQDU\-621MVRQE
postgresql-9.5LVWKHQDPHRI\RXUVHUYLFH)RUROGHUYHUVLRQVRI PGDXWKHQWLFDWLRQPHWKRG$XWKHQWLFDWLRQPHWKRGV
3RVWJUH64/WKHVHUYLFHLVVRPHWLPHVFDOOHGSRVWJUHVTOVDQVYHUVLRQQXPEHU
PHGLDQVWDWLVWLF3HUFHQWLOHVDQG0RGH
<RXFDQDOVRORJLQDVDVXSHUXVHUWRDQ\GDWDEDVHDQGH[HFXWHWKHIROORZLQJ
64/ PRGHIXQFWLRQ3HUFHQWLOHVDQG0RGH
SELECT pg_reload_conf();
PXOWLFROXPQLQGH[HV0XOWLFROXPQ,QGH[HV
PXOWLURZFRQVWUXFWRU0XOWLURZ,QVHUW
)LQDOO\\RXFDQUHORDGIURPSJ$GPLQVHHߡ(GLWLQJSRVWJUHVTOFRQIDQG
SJBKEDFRQIIURPSJ$GPLQߢ 1
5HVWDUWLQJ QDPHGGROODUTXRWLQJ'ROODU4XRWLQJ'2
0RUHIXQGDPHQWDOFRQILJXUDWLRQFKDQJHVUHTXLUHDUHVWDUW<RXFDQSHUIRUPD QDPHGQRWDWLRQ)XQFWLRQ%DVLFV
UHVWDUWE\VWRSSLQJDQGUHVWDUWLQJWKHSRVWJUHVVHUYLFHGDHPRQ<HVSRZHU
F\FOLQJZLOOGRWKHWULFNDVZHOO QDPLQJFRQVLGHUDWLRQV
<RXFDQߞWUHVWDUWZLWKD3RVWJUH64/FRPPDQGEXW\RXFDQWULJJHUDUHVWDUWIURP IXQFWLRQDUJXPHQWV)XQFWLRQ%DVLFV
WKHRSHUDWLQJV\VWHPVKHOO2Q/LQX[8QL[ZLWKDVHUYLFHHQWHU
SULPDU\NH\V&RQVWUDLQWV
service postgresql-9.6 restart
QDYLJDWLQJSJ$GPLQWRRO1DYLJDWLQJSJ$GPLQ1DYLJDWLQJSJ$GPLQ
)RUDQ\3RVWJUH64/LQVWDQFHQRWLQVWDOOHGDVDVHUYLFH
QGLVWLQFWVWDWLVWLF7DEOH6WDWLVWLFV
pg_ctl restart -D your_data_directory_here 1(7)UDPHZRUN'DWDEDVH'ULYHUV
2Q:LQGRZV\RXFDQDOVRMXVWFOLFN5HVWDUWRQWKH3RVWJUH64/VHUYLFHLQWKH 1HWH]]DGDWDEDVH1RWDEOH3RVWJUH64/)RUNV
6HUYLFHV0DQDJHU
QH[WYDOIXQFWLRQ6HULDOV
7KHSRVWJUHVTOFRQI)LOH 1RGHMVIUDPHZRUN'DWDEDVH'ULYHUV:ULWLQJ3/93/&RIIHH6FULSWDQG
SRVWJUHVTOFRQIFRQWUROVWKHOLIHVXVWDLQLQJVHWWLQJVRIWKH3RVWJUH64/VHUYHU 3//LYH6FULSW)XQFWLRQV
<RXFDQRYHUULGHPDQ\VHWWLQJVDWWKHGDWDEDVHUROHVHVVLRQDQGHYHQIXQFWLRQ 12,1+(5,7PRGLILHU&UHDWLQJ*URXS5ROHV
OHYHOV<RXߞOOILQGPDQ\GHWDLOVRQKRZWRILQHWXQH\RXUVHUYHUE\WZHDNLQJ
VHWWLQJVLQWKHDUWLFOH7XQLQJ<RXU3RVWJUH64/6HUYHU 12:$,7FODXVH0DQDJLQJ&RQQHFWLRQV
9HUVLRQLQWURGXFHGDQLPSRUWDQWFKDQJHLQVWHDGRIHGLWLQJSRVWJUHVTOFRQI 18//YDOXH&RPSRVLWHVDQG18//V
GLUHFWO\\RXVKRXOGRYHUULGHVHWWLQJVXVLQJDQDGGLWLRQDOILOHFDOOHG
SRVWJUHVTODXWRFRQI:HIXUWKHUUHFRPPHQGWKDW\RXGRQߞWWRXFKWKH QXPHULFGDWDW\SHV6HULDOV
ORJLFDOUHSOLFDWLRQ5HSOLFDWLRQ-DUJRQ5HSOLFDWLQJ2QO\6RPH7DEOHVRU SRVWJUHVTOFRQIDQGSODFHDQ\FXVWRPVHWWLQJVLQSRVWJUHVTODXWRFRQI
'DWDEDVHVZLWK/RJLFDO5HSOLFDWLRQ5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHV
&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV
ZLWK/RJLFDO5HSOLFDWLRQ
$QHDV\ZD\WRUHDGWKHFXUUHQWVHWWLQJVZLWKRXWRSHQLQJWKHFRQILJXUDWLRQILOHV
/2*,13$66:25'FODXVH&UHDWLQJ/RJLQ5ROHV LVWRTXHU\WKHYLHZQDPHGSJBVHWWLQJV:HGHPRQVWUDWHLQ([DPSOH
ORJLQUROHV5ROHV&UHDWLQJ/RJLQ5ROHV ([DPSOH.H\VHWWLQJV
SELECT
ORJBGHVWLQDWLRQQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV name,
context ,
OSDGIXQFWLRQ6WULQJ)XQFWLRQV unit ,
setting, boot_val, reset_val
OWULPIXQFWLRQ6WULQJ)XQFWLRQV FROM pg_settings
WHERE name IN ('listen_addresses','deadlock_timeout','shared_buffers',
'effective_cache_size','work_mem','maintenance_work_mem')
/XEDF]HZVNL+XEHUW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/&RS\LQJIURPRU ORDER BY context, name;
WR3URJUDP*UDSKLFDO2XWSXWV name | context | unit | setting | boot_val | reset_val
---------------------+------------+------+-------- +-----------+----------
listen_addresses | postmaster | | * | localhost | *
0 shared_buffers | postmaster | 8kB | 131584 | 1024 | 131584
deadlock_timeout | superuser | ms | 1000 | 1000 | 1000
0DF26;SODWIRUPPDF26 effective_cache_size | user | 8kB | 16384 | 16384 | 16384
maintenance_work_mem | user | kB | 16384 | 16384 | 16384
0DF3RUWVSDFNDJHGLVWULEXWLRQPDF26 work_mem | user | kB | 5120 | 1024 | 5120
PDLQWHQDQFHBZRUNBPHPQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV 7KHFRQWH[WLVWKHVFRSHRIWKHVHWWLQJ6RPHVHWWLQJVKDYHDZLGHUHIIHFW
WKDQRWKHUVGHSHQGLQJRQWKHLUFRQWH[W
PDVWHUVHUYHUV5HSOLFDWLRQ-DUJRQ&RQILJXULQJWKH0DVWHU&RQILJXULQJWKH
8VHUVHWWLQJVFDQEHFKDQJHGE\HDFKXVHUWRDIIHFWMXVWWKDWXVHUߞVVHVVLRQV
0DVWHU ,IVHWE\WKHVXSHUXVHUWKHVHWWLQJEHFRPHVDGHIDXOWIRUDOOXVHUVZKR
PDWHULDOL]HGYLHZV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/9LHZV0DWHULDOL]HG FRQQHFWDIWHUDUHORDG
9LHZV0DWHULDOL]HG9LHZV 6XSHUXVHUVHWWLQJVFDQEHFKDQJHGRQO\E\DVXSHUXVHUDQGZLOODSSO\WRDOO
XVHUVZKRFRQQHFWDIWHUDUHORDG8VHUVFDQQRWLQGLYLGXDOO\RYHUULGHWKH
PD[BFRQQHFWLRQVQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV VHWWLQJ
PD[BSDUDOOHOBZRUNHUVQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV 3RVWPDVWHUVHWWLQJVDIIHFWWKHHQWLUHVHUYHUSRVWPDVWHUUHSUHVHQWVWKH
3DUDOOHOL]HG4XHULHV 3RVWJUH64/VHUYLFHDQGWDNHHIIHFWRQO\DIWHUDUHVWDUW
PD[BSDUDOOHOBZRUNHUVBSHUBJDWKHUQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQI 6HWWLQJVZLWKXVHURUVXSHUXVHUFRQWH[WFDQEHVHWIRUDVSHFLILFGDWDEDVH
XVHUVHVVLRQDQGIXQFWLRQOHYHO)RUH[DPSOH\RXPLJKWZDQWWRVHW
VHWWLQJV3DUDOOHOL]HG4XHULHV:KDW'RHVD3DUDOOHO4XHU\3ODQ/RRN/LNH"
ZRUNBPHPKLJKHUIRUDQ64/JXUXOHYHOXVHUZKRZULWHVPLQGERJJOLQJ
PD[BZRUNHUBSURFHVVHVQHWZRUNVHWWLQJ3DUDOOHOL]HG4XHULHV TXHULHV6LPLODUO\LI\RXKDYHRQHIXQFWLRQWKDWLVVRUWLQWHQVLYH\RXFRXOG
UDLVHZRUNBPHPMXVWIRULW6HWWLQJVVHWDWGDWDEDVHXVHUVHVVLRQDQG /$7(5$/NH\ZRUG/DWHUDO-RLQV/DWHUDO-RLQV
IXQFWLRQOHYHOVGRQRWUHTXLUHDUHORDG6HWWLQJVVHWDWWKHGDWDEDVHOHYHOWDNH
HIIHFWRQWKHQH[WFRQQHFWWRWKHGDWDEDVH6HWWLQJVVHWIRUWKHVHVVLRQRU /($'IXQFWLRQ25'(5%<
IXQFWLRQWDNHHIIHFWULJKWDZD\ OH[HPHV769HFWRUV
%HFDUHIXOFKHFNLQJWKHXQLWVRIPHDVXUHPHQWXVHGIRUPHPRU\$V\RXFDQ
VHHLQ([DPSOHVRPHDUHUHSRUWHGLQ.%EORFNVDQGVRPHMXVWLQ /LEUH2IILFHRIILFHVXLWH'DWDEDVH'ULYHUV
NLORE\WHV5HJDUGOHVVRIKRZDVHWWLQJGLVSOD\V\RXFDQXVHDQ\XQLWRI
/,.(RSHUDWRU3RSXODUH[WHQVLRQV)XOO7H[W6HDUFK2SHUDWRU&ODVVHV,/,.(
FKRLFHZKHQVHWWLQJ0%LVDYHUVDWLOHFKRLFHIRUPRVWPHPRU\VHWWLQJV
IRU&DVH,QVHQVLWLYH6HDUFK
6KRZLQJXQLWVDV.%LVDQQR\LQJDWEHVWDQGLVGHVWDELOL]LQJDWZRUVW7KH
SHOWFRPPDQGLQ64/RIIHUVGLVSOD\VHWWLQJVLQODEHOHGDQGPRUHLQWXLWLYH /,0,7FODXVH/,0,7DQG2))6(7
XQLWV)RUH[DPSOHUXQQLQJ
/,0,772PRGLILHU4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
SHOW shared_buffers; /LQX[SODWIRUP
UHWXUQV1028MB6LPLODUO\UXQQLQJ DUFKLYHBFRPPDQGGLUHFWLYHDQG&RQILJXULQJWKH0DVWHU
LQVWDOOLQJ3RVWJUH64/:LQGRZVDQG'HVNWRS/LQX[
UHWXUQV1s,I\RXZDQWWRVHHWKHXQLWVIRUDOOVHWWLQJVHQWHUSHOW ALL
settingLVWKHFXUUHQWVHWWLQJboot_valLVWKHGHIDXOWVHWWLQJreset_valLV SVTOWRRODQGSVTO&XVWRPL]DWLRQV
WKHQHZVHWWLQJLI\RXZHUHWRUHVWDUWRUUHORDGWKHVHUYHU0DNHVXUHWKDW
UHVWRUHBFRPPDQGGLUHFWLYHDQG&RQILJXULQJWKH6ODYHVIRU)XOO6HUYHU
settingDQGreset_val matchDIWHU\RXPDNHDFKDQJH,IQRWWKHVHUYHU
QHHGVDUHVWDUWRUUHORDG &OXVWHU5HSOLFDWLRQ
1HZLQYHUVLRQLVDV\VWHPYLHZFDOOHGSJBILOHBVHWWLQJVZKLFK\RXFDQXVH UHWULHYLQJFRPPDQGKLVWRU\5HWULHYLQJ3ULRU&RPPDQGV
WRTXHU\VHWWLQJV,WVRXWSXWOLVWVWKHVRXUFHILOHZKHUHWKHVHWWLQJVFDQEHIRXQG
OLVWHQBDGGUHVVHVQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV
7KHDSSOLHGWHOOV\RXZKHWKHUWKHVHWWLQJLVLQHIIHFWLIWKHVHWWLQJKDVDQfLQ
WKDWFROXPQ\RXQHHGWRUHORDGRUUHVWDUWWRPDNHLWWDNHHIIHFW,QFDVHVZKHUHD OLVWVRIREMHFWV5HWULHYLQJ'HWDLOVRI'DWDEDVH2EMHFWV
SDUWLFXODUVHWWLQJLVSUHVHQWLQERWKSRVWJUHVTOFRQIDQGSRVWJUHVTODXWRFRQIWKH
SRVWJUHVTODXWRFRQIRQHZLOOWDNHSUHFHGHQWDQG\RXߞOOVHHWKHRWKHUILOHVZLWK /LYH6FULSWODQJXDJH:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW
DSSOLHGVHWWRIDOVHI7KHDSSOLHGLVVKRZQLQ([DPSOH )XQFWLRQV
([DPSOH4XHU\LQJSJBILOHBVHWWLQJV ORFDOYDULDEOHV:ULWLQJ3/SJ64/)XQFWLRQV
SELECT name, sourcefile, sourceline, setting, applied
FROM pg_file_settings ORFNBWLPHRXWVHWWLQJ0DQDJLQJ&RQQHFWLRQV
WHERE name IN ('listen_addresses','deadlock_timeout','shared_buffers',
'effective_cache_size','work_mem','maintenance_work_mem') ORJLFDOGHFRGLQJ5HSOLFDWLRQ-DUJRQ
3/9DQG:ULWLQJ)XQFWLRQV ORDER BY name;
name | sourcefile | sourceline | setting | applied
---------------------+-------------------------------+------------+---------+--------
MVRQEBDUUD\BHOHPHQWVIXQFWLRQ%LQDU\-621MVRQE effective_cache_size | E:/data96/[Link]| 11 | 8GB | t
listen_addresses | E:/data96/[Link] | 59 | * | t
MVRQEBHDFKIXQFWLRQ%LQDU\-621MVRQE maintenance_work_mem | E:/data96/[Link]| 3 | 16MB | t
shared_buffers | E:/data96/[Link] | 115 | 128MB | f
MVRQEBH[WUDFWBSDWKBWH[WIXQFWLRQ%LQDU\-621MVRQE shared_buffers | E:/data96/[Link]| 5 | 131584 | t
MVRQEBLQVHUWIXQFWLRQ-621 3D\VSHFLDODWWHQWLRQWRWKHIROORZLQJQHWZRUNVHWWLQJVLQSRVWJUHVTOFRQIRU
SRVWJUHVTODXWRFRQIEHFDXVHDQLQFRUUHFWHQWU\KHUHZLOOSUHYHQWFOLHQWVIURP
MVRQEBVHWIXQFWLRQ(GLWLQJ-621%GDWD FRQQHFWLQJ&KDQJLQJWKHLUYDOXHVUHTXLUHVDVHUYLFHUHVWDUW
MVRQBDJJIXQFWLRQ2XWSXWWLQJ-621&RPSRVLWH7\SHVLQ4XHULHV OLVWHQBDGGUHVVHV
,QIRUPV3RVWJUH64/ZKLFK,3DGGUHVVHVWROLVWHQRQ7KLVXVXDOO\GHIDXOWVWR
MVRQBDUUD\BHOHPHQWVIXQFWLRQ4XHU\LQJ-621%LQDU\-621MVRQE
ORFDOPHDQLQJDVRFNHWRQWKHORFDOV\VWHPRUORFDOKRVWPHDQLQJWKH,3Y
MVRQBEXLOGBDUUD\IXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ RU,3YORFDOKRVW,3DGGUHVV%XWPDQ\SHRSOHFKDQJHWKHVHWWLQJWR
PHDQLQJDOODYDLODEOH,3DGGUHVVHV
MVRQBEXLOGBREMHFWIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
SRUW
MVRQBHDFKIXQFWLRQ%LQDU\-621MVRQE
'HIDXOWVWR<RXPD\ZLVKWRFKDQJHWKLVZHOONQRZQSRUWWRVRPHWKLQJ
MVRQBH[WUDFWBSDWKIXQFWLRQ4XHU\LQJ-621 HOVHIRUVHFXULW\RULI\RXDUHUXQQLQJPXOWLSOH3RVWJUH64/VHUYLFHVRQWKH
VDPHVHUYHU
MVRQBH[WUDFWBSDWKBWH[WIXQFWLRQ4XHU\LQJ-621%LQDU\-621MVRQE
PD[BFRQQHFWLRQV
MVRQBREMHFWIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
7KHPD[LPXPQXPEHURIFRQFXUUHQWFRQQHFWLRQVDOORZHG
MVRQBWRBUHFRUGIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
ORJBGHVWLQDWLRQ
MVRQBWRBUHFRUGVHWIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ 7KLVVHWWLQJLVVRPHZKDWDPLVQRPHU,WVSHFLILHVWKHIRUPDWRIWKHORJILOHV
. UDWKHUWKDQWKHLUSK\VLFDOORFDWLRQ7KHGHIDXOWLVVWGHUU,I\RXLQWHQGWR
SHUIRUPH[WHQVLYHDQDO\VLVRQ\RXUORJVZHVXJJHVWFKDQJLQJLWWRFVYORJ
NH\H[LVWVRSHUDWRU"%LQDU\-621MVRQE ZKLFKLVHDVLHUWRH[SRUWWRWKLUGSDUW\DQDO\WLFWRROV0DNHVXUH\RXKDYHWKH
ORJJLQJBFROOHFWLRQVHWWRRQLI\RXZDQWORJJLQJ
/
7KHIROORZLQJVHWWLQJVDIIHFWSHUIRUPDQFH'HIDXOWVDUHUDUHO\WKHRSWLPDOYDOXH
/$*IXQFWLRQ25'(5%< IRU\RXULQVWDOODWLRQ$VVRRQDV\RXJDLQHQRXJKFRQILGHQFHWRWZHDN
FRQILJXUDWLRQVHWWLQJV\RXVKRXOGWXQHWKHVHYDOXHV
/$1*8$*(TXDOLILHU)XQFWLRQ%DVLFV
VKDUHGBEXIIHUV
ODWHUDOMRLQV/DWHUDO-RLQV/DWHUDO-RLQV
$OORFDWHGDPRXQWRIPHPRU\VKDUHGDPRQJDOOFRQQHFWLRQVWRVWRUHUHFHQWO\ -DYDODQJXDJH'DWDEDVH'ULYHUV
DFFHVVHGSDJHV7KLVVHWWLQJSURIRXQGO\DIIHFWVWKHVSHHGRI\RXUTXHULHV
<RXZDQWWKLVVHWWLQJWREHIDLUO\KLJKSUREDEO\DVPXFKDVRI\RXU -DYD6FULSW2EMHFW1RWDWLRQ-621-621(GLWLQJ-621%GDWD
5$0+RZHYHU\RXߞOOJHQHUDOO\VHHGLPLQLVKLQJUHWXUQVDIWHUPRUHWKDQ MREVFKHGXOLQJ-RE6FKHGXOLQJZLWKSJ$JHQW+HOSIXOSJ$JHQW4XHULHV
*%&KDQJHVUHTXLUHDUHVWDUW
MRLQV
HIIHFWLYHBFDFKHBVL]H
$QHVWLPDWHRIKRZPXFKPHPRU\3RVWJUH64/H[SHFWVWKHRSHUDWLQJV\VWHP KDVK3DUDOOHO-RLQV
WRGHYRWHWRLW7KLVVHWWLQJKDVQRHIIHFWRQDFWXDODOORFDWLRQEXWWKHTXHU\ ODWHUDO/DWHUDO-RLQV/DWHUDO-RLQV
SODQQHUILJXUHVLQWKLVVHWWLQJWRJXHVVZKHWKHULQWHUPHGLDWHVWHSVDQGTXHU\
RXWSXWZRXOGILWLQ5$0,I\RXVHWWKLVPXFKORZHUWKDQDYDLODEOH5$0 SDUDOOHO3DUDOOHO-RLQV
WKHSODQQHUPD\IRUJRXVLQJLQGH[HV:LWKDGHGLFDWHGVHUYHUVHWWLQJWKH
YDOXHWRKDOIRI\RXU5$0LVDJRRGVWDUWLQJSRLQW&KDQJHVUHTXLUHDUHORDG -621-DYD6FULSW2EMHFW1RWDWLRQ-621(GLWLQJ-621%GDWD
ZRUNBPHP MVRQGDWDW\SH
&RQWUROVWKHPD[LPXPDPRXQWRIPHPRU\DOORFDWHGIRUHDFKRSHUDWLRQVXFK DERXW-621
DVVRUWLQJKDVKMRLQDQGWDEOHVFDQV7KHRSWLPDOVHWWLQJGHSHQGVRQKRZ
\RXߞUHXVLQJWKHGDWDEDVHKRZPXFKPHPRU\\RXKDYHWRVSDUHDQG IXOOWH[WVXSSRUW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/)XOO7H[W6XSSRUWIRU
ZKHWKHU\RXUVHUYHULVGHGLFDWHGWR3RVWJUH64/,I\RXKDYHPDQ\XVHUV -621DQG-621%
UXQQLQJVLPSOHTXHULHV\RXZDQWWKLVVHWWLQJWREHUHODWLYHO\ORZWREH
LQVHUWLQJGDWD,QVHUWLQJ-621'DWD
GHPRFUDWLFRWKHUZLVHWKHILUVWXVHUPD\KRJDOOWKHPHPRU\+RZKLJK\RX
VHWWKLVDOVRGHSHQGVRQKRZPXFK5$0\RXKDYHWREHJLQZLWK$JRRG RXWSXWWLQJGDWD2XWSXWWLQJ-621
DUWLFOHWRUHDGIRUJXLGDQFHLV8QGHUVWDQGLQJZRUNBPHP&KDQJHVUHTXLUHD
UHORDG 3/9DQG:ULWLQJ)XQFWLRQV
PDLQWHQDQFHBZRUNBPHP TXHULHVDQG4XHU\LQJ-621
7KHWRWDOPHPRU\DOORFDWHGIRUKRXVHNHHSLQJDFWLYLWLHVVXFKDVYDFXXPLQJ MVRQEGDWDW\SH
SUXQLQJUHFRUGVPDUNHGIRUGHOHWLRQ<RXVKRXOGQߞWVHWLWKLJKHUWKDQDERXW
*%5HORDGDIWHUFKDQJHV DERXW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/-621%LQDU\-621MVRQE
%LQDU\-621MVRQE
PD[BSDUDOOHOBZRUNHUVBSHUBJDWKHU
7KLVLVDQHZVHWWLQJLQWURGXFHGLQIRUSDUDOOHOLVP7KHVHWWLQJGHWHUPLQHV HGLWLQJGDWD(GLWLQJ-621%GDWD(GLWLQJ-621%GDWD
WKHPD[LPXPSDUDOOHOZRUNHUWKUHDGVWKDWFDQEHVSDZQHGIRUHDFKJDWKHU IXOOWH[WVXSSRUW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/)XOO7H[W6XSSRUWIRU
RSHUDWLRQ7KHGHIDXOWVHWWLQJLVZKLFKPHDQVSDUDOOHOLVPLVFRPSOHWHO\
-621DQG-621%
WXUQHGRII,I\RXKDYHPRUHWKDQRQH&38FRUH\RXZLOOZDQWWRHOHYDWH
WKLV3DUDOOHOSURFHVVLQJLVQHZLQYHUVLRQVR\RXPD\KDYHWR
IXQFWLRQDO)XQFWLRQDO,QGH[HV H[SHULPHQWZLWKWKLVVHWWLQJWRILQGZKDWZRUNVEHVWIRU\RXUVHUYHU$OVR
QRWHWKDWWKHQXPEHU\RXKDYHKHUHVKRXOGEHOHVVWKDQ
PXOWLFROXPQ0XOWLFROXPQ,QGH[HV max_worker_processesZKLFKGHIDXOWVWREHFDXVHWKHSDUDOOHO
RSHUDWRUFODVVHVDQG2SHUDWRU&ODVVHV2SHUDWRU&ODVVHV EDFNJURXQGZRUNHUSURFHVVHVDUHDVXEVHWRIWKHPD[LPXPDOORZHG
SURFHVVHV
SDUWLDO8QLTXH&RQVWUDLQWV3DUWLDO,QGH[HV
,QYHUVLRQWKHUHLVDQDGGLWLRQDOVHWWLQJFDOOHGmax_parallel_workers
W\SHVRI3RVWJUH64/6WRFN,QGH[HV3RVWJUH64/6WRFN,QGH[HV ZKLFKFRQWUROVWKHVXEVHWRIPD[BZRUNHUBSURFHVVHVDOORFDWHGIRU
SDUDOOHOL]DWLRQ
LQIRUPDWLRQBVFKHPDFDWDORJ3RVWJUH64/'DWDEDVH2EMHFWV'\QDPLF64/
([HFXWLRQ1DYLJDWLQJSJ$GPLQ &KDQJLQJWKHSRVWJUHVTOFRQIVHWWLQJV
,1+(5,7PRGLILHU&UHDWLQJ*URXS5ROHV 3RVWJUH64/LQWURGXFHGWKHDELOLW\WRFKDQJHVHWWLQJVXVLQJWKH$/7(5
6<67(064/FRPPDQG)RUH[DPSOHWRVHWWKHZRUNBPHPJOREDOO\HQWHUWKH
LQKHULWLQJ IROORZLQJ
WDEOHV3RVWJUH64/'DWDEDVH2EMHFWV,QKHULWHG7DEOHV5HVWULFWLQJ'(/(7( 7KLVFRPPDQGLVZLVHHQRXJKWRQRWGLUHFWO\HGLWSRVWJUHVFRQIEXWZLOOPDNH
83'$7(DQG6(/(&7IURP,QKHULWHG7DEOHV WKHFKDQJHLQSRVWJUHVDXWRFRQI
,16(57FRPPDQG,QVHUWLQJ-621'DWD 'HSHQGLQJRQWKHSDUWLFXODUVHWWLQJFKDQJHG\RXPD\QHHGWRUHVWDUWWKHVHUYLFH
,I\RXMXVWQHHGWRUHORDGLWKHUHߞVDFRQYHQLHQWFRPPDQG
LQVHUWFRQIOLFWKDQGOLQJ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
SELECT pg_reload_conf();
,16(57,172FODXVH836(57V,16(5721&21)/,&783'$7(
,167($'2)WULJJHUV8VLQJ7ULJJHUVWR8SGDWH9LHZV8VLQJ7ULJJHUVWR ,I\RXKDYHWRWUDFNPDQ\VHWWLQJVFRQVLGHURUJDQL]LQJWKHPLQWRPXOWLSOH
FRQILJXUDWLRQILOHVDQGWKHQOLQNLQJWKHPEDFNXVLQJWKHLQFOXGHRU
8SGDWH9LHZV7ULJJHUVDQG7ULJJHU)XQFWLRQV:ULWLQJ7ULJJHU)XQFWLRQVLQ
LQFOXGHBLIBH[LVWVGLUHFWLYHZLWKLQWKHSRVWJUHVTOFRQI7KHH[DFWV\QWD[LVDV
3/SJ64/
IROORZV
LQWUDQJHGDWDW\SH%XLOWLQ5DQJH7\SHV
include 'filename'
LQWUDQJHGDWDW\SH%XLOWLQ5DQJH7\SHV
7KHILOHQDPHDUJXPHQWFDQEHDQDEVROXWHSDWKRUDUHODWLYHSDWKIURPWKH
LQWHJHUGDWDW\SH6HULDOV SRVWJUHVTOFRQIILOH
LQWHUYDOGDWDW\SH7HPSRUDOV7HPSRUDOV
ߡ,HGLWHGP\SRVWJUHVTOFRQIDQGQRZP\VHUYHUZRQߞWVWDUWߢ
- 7KHHDVLHVWZD\WRILJXUHRXWZKDW\RXVFUHZHGXSLVWRORRNDWWKHORJILOH
ORFDWHGDWWKHURRWRIWKHGDWDIROGHURULQWKHSJBORJVXEIROGHU2SHQWKHODWHVW VWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ
ILOHDQGUHDGZKDWWKHODVWOLQHVD\V7KHHUURUUDLVHGLVXVXDOO\VHOIH[SODQDWRU\
KXQVSHOOFRQILJXUDWLRQ)76&RQILJXUDWLRQV)76&RQILJXUDWLRQV
$FRPPRQFXOSULWLVVHWWLQJVKDUHGBEXIIHUVWRRKLJK$QRWKHUVXVSHFWLVDQROG
SRVWPDVWHUSLGOHIWRYHUIURPDIDLOHGVKXWGRZQ<RXFDQVDIHO\GHOHWHWKLVILOH ,
ORFDWHGLQWKHGDWDFOXVWHUIROGHUDQGWU\UHVWDUWLQJDJDLQ
?LFRPPDQG$FFHVVLQJSVTOIURPSJ$GPLQ
7KHSJBKEDFRQI)LOH LGHQWDXWKHQWLFDWLRQPHWKRG$XWKHQWLFDWLRQPHWKRGV
7KHSJBKEDFRQIILOHFRQWUROVZKLFK,3DGGUHVVHVDQGXVHUVFDQFRQQHFWWRWKH ,'(17,7<TXDOLILHU)HDWXUHV,QWURGXFHGLQ3RVWJUH64/%DVLF7DEOH
GDWDEDVH)XUWKHUPRUHLWGLFWDWHVWKHDXWKHQWLFDWLRQSURWRFROWKDWWKHFOLHQWPXVW &UHDWLRQ%DVLF7DEOH&UHDWLRQ
IROORZ&KDQJHVWRWKHILOHUHTXLUHDWOHDVWDUHORDGWRWDNHHIIHFW$W\SLFDO
SJBKEDFRQIORRNVOLNH([DPSOH LGOHBLQBWUDQVDFWLRQBVHVVLRQBWLPHRXWVHWWLQJ0DQDJLQJ&RQQHFWLRQV
([DPSOH6DPSOHSJBKEDFRQI ,/,.(RSHUDWRU3RSXODUH[WHQVLRQV)XOO7H[W6HDUFK,/,.(IRU&DVH
# TYPE DATABASE USER ADDRESS METHOD ,QVHQVLWLYH6HDUFK
host all all [Link]/32 ident
host all all ::1/128 trust
host all all [Link]/24 md5 LPSOLFLWFDVWV3RVWJUH64/'DWDEDVH2EMHFWV
hostssl all all [Link]/0 md5
,03257)25(,*16&+(0$FRPPDQG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
# TYPE DATABASE USER ADDRESS METHOD
# Allow replication connections from localhost,
4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
# by a user with replication privilege.
#host replication postgres [Link]/32 trust LPSRUWLQJGDWD
#host replication postgres ::1/128 trust
$XWKHQWLFDWLRQPHWKRG7KHXVXDOFKRLFHVDUHLGHQWWUXVWPGSHHUDQG SJ$GPLQDQG,PSRUWDQG([SRUW
SDVVZRUG
,3YV\QWD[IRUGHILQLQJQHWZRUNUDQJH7KLVDSSOLHVRQO\WRVHUYHUVZLWK SVTODQG,PSRUWLQJDQG([SRUWLQJ'DWDSVTO,PSRUW
,3YVXSSRUWDQGPD\SUHYHQWSJBKEDFRQIIURPORDGLQJLI\RXDGGWKLV LQGH[RQO\VFDQ0XOWLFROXPQ,QGH[HV
VHFWLRQZLWKRXWDFWXDOO\KDYLQJ,3YQHWZRUNLQJHQDEOHGRQWKHVHUYHU
,3YV\QWD[IRUGHILQLQJQHWZRUNUDQJH7KHILUVWSDUWLVWKHQHWZRUNDGGUHVV LQGH[HV
IROORZHGE\WKHELWPDVNIRULQVWDQFH3RVWJUH64/ZLOO
DFFHSWFRQQHFWLRQUHTXHVWVIURPDQ\,3DGGUHVVZLWKLQWKHUDQJH DERXW7DEOHV&RQVWUDLQWVDQG,QGH[HV,QGH[HV
66/FRQQHFWLRQUXOH,QRXUH[DPSOHZHDOORZDQ\RQHWRFRQQHFWWRRXU ELWPDSLQGH[VFDQ0XOWLFROXPQ,QGH[HV
VHUYHURXWVLGHRIWKHDOORZHG,3UDQJHDVORQJDVWKH\FDQFRQQHFWXVLQJ66/
GHWHUPLQLQJXVHIXOQHVVRI+RZ8VHIXO,V<RXU,QGH["+RZ8VHIXO,V<RXU
66/FRQILJXUDWLRQVHWWLQJVFDQEHIRXQGLQSRVWJUHVFRQIRU
,QGH["
SRVWJUHVDXWRFRQIsslssl_cert_filessl_key_file2QFHWKHVHUYHU
FRQILUPVWKDWWKHFOLHQWLVDEOHWRVXSSRUW66/LWZLOOKRQRUWKHFRQQHFWLRQ ILOWHUHG8QLTXH&RQVWUDLQWV3DUWLDO,QGH[HV
*UDQW:L]DUG3ULYLOHJHPDQDJHPHQW UHTXHVWDQGDOOWUDQVPLVVLRQVZLOOEHHQFU\SWHGXVLQJWKHNH\LQIRUPDWLRQ
5DQJHRI,3DGGUHVVHVDOORZHGWRUHSOLFDWHZLWKWKLVVHUYHU
JUDSKLFDOH[SODLQSODQ*UDSKLFDO([SODLQ*UDSKLFDO([SODLQ
)RUHDFKFRQQHFWLRQUHTXHVWSJBKEDFRQILVFKHFNHGIURPWKHWRSGRZQ$V
*UHHQ3OXPGDWDEDVH1RWDEOH3RVWJUH64/)RUNV VRRQDVDUXOHJUDQWLQJDFFHVVLVHQFRXQWHUHGDFRQQHFWLRQLVDOORZHGDQGWKH
JURRQJDHQJLQH3RVWJUH64/6WRFN,QGH[HV VHUYHUUHDGVQRIXUWKHULQWKHILOH$VVRRQDVDUXOHUHMHFWLQJDFFHVVLV
HQFRXQWHUHGWKHFRQQHFWLRQLVGHQLHGDQGWKHVHUYHUUHDGVQRIXUWKHULQWKHILOH
*5283%<FODXVH7DEOH6WDWLVWLFV ,IWKHHQGRIWKHILOHLVUHDFKHGZLWKRXWDQ\PDWFKLQJUXOHVWKHFRQQHFWLRQLV
GHQLHG$FRPPRQPLVWDNHSHRSOHPDNHLVWRSXWWKHUXOHVLQWKHZURQJRUGHU
JURXSORJLQUROHV5ROHV
)RUH[DPSOHLI\RXDGGHG[Link]/0 rejectEHIRUH[Link]/32 trust
JURXSUROHV ORFDOXVHUVZRQߞWEHDEOHWRFRQQHFWHYHQWKRXJKDUXOHLVLQSODFHDOORZLQJ
WKHPWR
DERXW5ROHV
1HZLQYHUVLRQLVWKHpg_hba_file_rulesV\VWHPYLHZWKDWOLVWVDOOWKH
FUHDWLQJ&UHDWLQJ*URXS5ROHV&UHDWLQJ*URXS5ROHV FRQWHQWVRIWKHSJBKEDFRQIILOH
LQKHULWLQJSULYLOHJHVIURP&UHDWLQJ*URXS5ROHV ߡ,HGLWHGP\SJBKEDFRQIDQGQRZP\VHUYHULVEURNHQߢ
JURXSLQJVHWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/*5283,1*6(76 'RQߞWZRUU\7KLVKDSSHQVTXLWHRIWHQEXWLVHDV\WRUHFRYHUIURP7KLVHUURULV
&8%(52//83*5283,1*6(76&8%(52//83 JHQHUDOO\FDXVHGE\W\SRVRUE\DGGLQJDQXQDYDLODEOHDXWKHQWLFDWLRQVFKHPH
:KHQWKHSRVWJUHVVHUYLFHFDQߞWSDUVHSJBKEDFRQILWEORFNVDOODFFHVVMXVWWREH
*8&JUDQGXQLILHGFRQILJXUDWLRQ3RVWJUH64/'DWDEDVH2EMHFWV VDIH6RPHWLPHVLWZRQߞWHYHQVWDUWXS7KHHDVLHVWZD\WRILJXUHRXWZKDW\RX
GLGZURQJLVWRUHDGWKHORJILOHORFDWHGLQWKHURRWRIWKHGDWDIROGHURULQWKH
+ SJBORJVXEIROGHU2SHQWKHODWHVWILOHDQGUHDGWKHODVWOLQH7KHHUURUPHVVDJHLV
KDGRRSBIGZZUDSSHU5HSOLFDWLRQDQG([WHUQDO'DWD XVXDOO\VHOIH[SODQDWRU\,I\RXߞUHSURQHWRVOLSSHU\ILQJHUVEDFNXSWKHILOH
SULRUWRHGLWLQJ
KDVKLQGH[HV3RVWJUH64/6WRFN,QGH[HV
$XWKHQWLFDWLRQPHWKRGV
KDVKMRLQV3DUDOOHO-RLQV
3RVWJUH64/JLYHV\RXPDQ\FKRLFHVIRUDXWKHQWLFDWLQJXVHUVߚSUREDEO\PRUH
+($'(5RSWLRQSVTO([SRUW WKDQDQ\RWKHUGDWDEDVHSURGXFW0RVWSHRSOHDUHFRQWHQWZLWKWKHSRSXODURQHV
WUXVWSHHULGHQWPGDQGSDVVZRUG$QGGRQߞWIRUJHWDERXWUHMHFWZKLFK
+,676,=(HQYLURQPHQWYDULDEOH5HWULHYLQJ3ULRU&RPPDQGV LPPHGLDWHO\GHQLHVDFFHVV$OVRNHHSLQPLQGWKDWSJBKEDFRQIRIIHUVVHWWLQJVDW
+RPHEUHZSDFNDJHPDQDJHUPDF26 PDQ\RWKHUOHYHOVDVWKHJDWHNHHSHUWRWKHHQWLUH3RVWJUH64/VHUYHU8VHUVRU
GHYLFHVPXVWVWLOOVDWLVI\UROHDQGGDWDEDVHDFFHVVUHVWULFWLRQVDIWHUEHLQJ
KVWRUHH[WHQVLRQ3RSXODUH[WHQVLRQV&RPSRVLWH7\SHVLQ4XHULHV DGPLWWHGE\SJBKEDFRQI
+70/IRUPDW%DVLF5HSRUWLQJ%DVLF5HSRUWLQJ([SRUWLQJTXHULHVDVD :HGHVFULEHWKHFRPPRQDXWKHQWLFDWLRQPHWKRGVKHUH
WUXVW JDWKHUPRGH:KDW'RHVD3DUDOOHO4XHU\3ODQ/RRN/LNH"
VWDWLVWLFDO3HUFHQWLOHVDQG0RGH3HUFHQWLOHVDQG0RGH SJBVWDWBDFWLYLW\LVDYLHZWKDWOLVWVWKHODVWTXHU\UXQQLQJRQHDFKFRQQHFWLRQ
WKHFRQQHFWHGXVHUXVHQDPHWKHGDWDEDVHGDWQDPHLQXVHDQGWKHVWDUW
VWULQJ6WULQJ)XQFWLRQV WLPHVRIWKHTXHULHV5HYLHZWKHOLVWWRLGHQWLI\WKH3,'VRIFRQQHFWLRQV\RX
ZLVKWRWHUPLQDWH
WULJJHU3RVWJUH64/'DWDEDVH2EMHFWV7ULJJHUVDQG7ULJJHU)XQFWLRQV
7ULJJHUVDQG7ULJJHU)XQFWLRQV:ULWLQJ7ULJJHU)XQFWLRQVLQ3/SJ64/ &DQFHODFWLYHTXHULHVRQDFRQQHFWLRQZLWK3,'1234
XVDJHFRQVLGHUDWLRQV8VLQJ)XOO7H[W6HDUFK
<RXFDQVHWFHUWDLQRSHUDWLRQDOSDUDPHWHUVDWWKHVHUYHUGDWDEDVHXVHUVHVVLRQ
RUIXQFWLRQOHYHO$Q\TXHULHVWKDWH[FHHGWKHSDUDPHWHUZLOODXWRPDWLFDOO\EH IXQFWLRQDOLQGH[HV)XQFWLRQDO,QGH[HV
FDQFHOOHGE\WKHVHUYHU6HWWLQJDSDUDPHWHUWRGLVDEOHVWKHSDUDPHWHU
IXQFWLRQV
GHDGORFNBWLPHRXW
7KLVLVWKHDPRXQWRIWLPHDGHDGORFNHGTXHU\VKRXOGZDLWEHIRUHJLYLQJXS DERXW3RVWJUH64/'DWDEDVH2EMHFWV'DWD7\SHV:ULWLQJ)XQFWLRQV
7KLVGHIDXOWVWRPV,I\RXUDSSOLFDWLRQSHUIRUPVDORWRIXSGDWHV\RX
DJJUHJDWH$JJUHJDWHV$JJUHJDWHV:ULWLQJ64/$JJUHJDWH)XQFWLRQV:ULWLQJ
PD\ZDQWWRLQFUHDVHWKLVYDOXHWRPLQLPL]HFRQWHQWLRQ
64/$JJUHJDWH)XQFWLRQV:ULWLQJ$JJUHJDWH)XQFWLRQVZLWK3/9
,QVWHDGRIUHO\LQJRQWKLVVHWWLQJ\RXFDQLQFOXGHD12:$,7FODXVHLQ\RXU
XSGDWH64/SELECT FOR UPDATE NOWAIT ... DQDWRP\RI$QDWRP\RI3RVWJUH64/)XQFWLRQV7UXVWHGDQG8QWUXVWHG
/DQJXDJHV
7KHTXHU\ZLOOEHDXWRPDWLFDOO\FDQFHOOHGXSRQHQFRXQWHULQJDGHDGORFN
DUJXPHQWVLQ)XQFWLRQ%DVLFV
,Q3RVWJUH64/\RXKDYHDQRWKHUFKRLFHSELECT FOR UPDATE SKIP
LOCKEDZLOOVNLSRYHUORFNHGURZV EDVLFVWUXFWXUHRI)XQFWLRQ%DVLFV)XQFWLRQ%DVLFV
VWDWHPHQWBWLPHRXW EXLOGLQJIRUFXVWRPGDWDW\SHV%XLOGLQJ2SHUDWRUVDQG)XQFWLRQVIRU&XVWRP
7KLVLVWKHDPRXQWRIWLPHDTXHU\FDQUXQEHIRUHLWLVIRUFHGWRFDQFHO7KLV 7\SHV
GHIDXOWVWRPHDQLQJQRWLPHOLPLW,I\RXKDYHORQJUXQQLQJIXQFWLRQVWKDW
FDQFHOOLQJ0DQDJLQJ&RQQHFWLRQV
\RXZDQWFDQFHOOHGLIWKH\H[FHHGDFHUWDLQWLPHVHWWKLVYDOXHLQWKH
GHILQLWLRQRIWKHIXQFWLRQUDWKHUWKDQJOREDOO\&DQFHOOLQJDIXQFWLRQFDQFHOV FRPSXWLQJSHUFHQWLOHV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
WKHTXHU\DQGWKHWUDQVDFWLRQWKDWߞVFDOOLQJLW
GDWHWLPH'DWHWLPH2SHUDWRUVDQG)XQFWLRQV'DWHWLPH2SHUDWRUVDQG
ORFNBWLPHRXW
)XQFWLRQV
7KLVLVWKHDPRXQWRIWLPHDTXHU\VKRXOGZDLWIRUDORFNEHIRUHJLYLQJXS
HPEHGGLQJZLWKLQ6(/(&7FRPPDQG0DQDJLQJ&RQQHFWLRQV
TXHU\LQJQRQFRQYHQWLRQDOGDWDVRXUFHV4XHU\LQJ1RQFRQYHQWLRQDO'DWD DQGLVPRVWDSSOLFDEOHWRXSGDWHTXHULHV%HIRUHGDWDXSGDWHVWKHTXHU\PXVW
6RXUFHV4XHU\LQJ1RQFRQYHQWLRQDO'DWD6RXUFHV REWDLQDQH[FOXVLYHORFNRQDIIHFWHGUHFRUGV7KHGHIDXOWLVPHDQLQJWKDW
WKHTXHU\ZLOOZDLWLQILQLWHO\7KLVVHWWLQJLVJHQHUDOO\XVHGDWWKHIXQFWLRQRU
TXHU\LQJRWKHUWDEXODUIRUPDWV4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWK VHVVLRQOHYHOORFNBWLPHRXWVKRXOGEHORZHUWKDQVWDWHPHQWBWLPHRXW
RJUBIGZ4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ RWKHUZLVHVWDWHPHQWBWLPHRXWZLOODOZD\VRFFXUILUVWPDNLQJORFNBWLPHRXW
LUUHOHYDQW
YHUVLRQLPSURYHPHQWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
LGOHBLQBWUDQVDFWLRQBVHVVLRQBWLPHRXW
IRUHLJQNH\FRQVWUDLQWV)RUHLJQ.H\&RQVWUDLQWV
7KLVLVWKHDPRXQWRIWLPHDWUDQVDFWLRQFDQVWD\LQDQLGOHVWDWHEHIRUHLWLV
IRUHLJQVHUYHUV WHUPLQDWHG7KLVGHIDXOWVWRPHDQLQJLWFDQVWD\DOLYHLQILQLWHO\7KLV
VHWWLQJLVQHZLQ3RVWJUH64/,WߞVXVHIXOIRUSUHYHQWLQJTXHULHVIURP
FUHDWLQJ4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V KROGLQJRQWRORFNVRQGDWDLQGHILQLWHO\RUHDWLQJXSDFRQQHFWLRQ
TXHU\LQJ4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV4XHU\LQJ2WKHU3RVWJUH64/
6HUYHUV &KHFNIRU4XHULHV%HLQJ%ORFNHG
7KHpg_stat_activityYLHZKDVFKDQJHGFRQVLGHUDEO\VLQFHYHUVLRQZLWK
IRUHLJQWDEOHV
WKHUHQDPLQJGURSSLQJDQGDGGLWLRQRIQHZFROXPQV6WDUWLQJIURPYHUVLRQ
DERXW3RVWJUH64/'DWDEDVH2EMHFWV)RUHLJQ'DWD:UDSSHUV procpidZDVUHQDPHGWRpid
FUHDWLQJ4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV pg_stat_activityFKDQJHGLQ3RVWJUH64/WRSURYLGHPRUHGHWDLODERXW
ZDLWLQJTXHULHV,QSULRUYHUVLRQVRI3RVWJUH64/WKHUHZDVDILHOGFDOOHG
LQKHULWDQFHDQG,QKHULWHG7DEOHV waitingWKDWFRXOGWDNHWKHYDOXHtrueRUfalsetrueGHQRWHGDTXHU\WKDWZDV
EHLQJEORFNHGZDLWLQJVRPHUHVRXUFHEXWWKHUHVRXUFHEHLQJZDLWHGIRUZDV
SODFLQJWULJJHUVLQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
QHYHUVWDWHG,Q3RVWJUH64/waitingZDVUHPRYHGDQGUHSODFHGZLWK
IRUNLQJGDWDEDVHV1RWDEOH3RVWJUH64/)RUNV wait_event_typeDQGwait_eventWRSURYLGHPRUHLQIRUPDWLRQDERXWZKDW
UHVRXUFHDTXHU\ZDVZDLWLQJIRU7KHUHIRUHSULRUWR3RVWJUH64/XVH
)UHH%6'SODWIRUP)UHH%6'
waiting = trueWRGHWHUPLQHZKDWTXHULHVDUHEHLQJEORFNHG,Q3RVWJUH64/
)520FODXVH:,7+25',1$/,7< RUKLJKHUXVHwait_event IS NOT NULL
IXOOWH[WVWULSSLQJ)XOO7H[W6WULSSLQJ
5ROHV 2WKHU3RVWJUH64/6HUYHUV
3RVWJUH64/KDQGOHVFUHGHQWLDOLQJXVLQJUROHV5ROHVWKDWFDQORJLQDUHFDOOHG TXHU\LQJQRQFRQYHQWLRQDOGDWDVRXUFHV4XHU\LQJ1RQFRQYHQWLRQDO'DWD
ORJLQUROHV5ROHVFDQDOVREHPHPEHUVRIRWKHUUROHVWKHUROHVWKDWFRQWDLQRWKHU 6RXUFHV4XHU\LQJ1RQFRQYHQWLRQDO'DWD6RXUFHV
UROHVDUHFDOOHGJURXSUROHV$QG\HVJURXSUROHVFDQEHPHPEHUVRIRWKHU
JURXSUROHVDQGVRRQEXWGRQߞWJRWKHUHXQOHVV\RXKDYHDNQDFNIRU TXHU\LQJRWKHUWDEXODUIRUPDWHV4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWK
KLHUDUFKLFDOWKLQNLQJ*URXSUROHVWKDWFDQORJLQDUHFDOOHGJURXSORJLQUROHV RJUBIGZ4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ
+RZHYHUIRUVHFXULW\JURXSUROHVJHQHUDOO\FDQQRWORJLQ$UROHFDQEH
YHUVLRQLPSURYHPHQWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
GHVLJQDWHGDVDVXSHUXVHU7KHVHUROHVKDYHXQIHWWHUHGDFFHVVWRWKH3RVWJUH64/
VHUYLFHDQGVKRXOGEHDVVLJQHGZLWKGLVFUHWLRQ )HGRUDSODWIRUP&HQW26)HGRUD5HG+DW6FLHQWLILF/LQX[
ILOHBIGZZUDSSHU)RUHLJQ'DWD:UDSSHUV
:$51,1*
ILOHBWH[WDUUD\BIGZZUDSSHU4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V
5HFHQWYHUVLRQVRI3RVWJUH64/QRORQJHUXVHWKHWHUPVXVHUVDQGJURXSV<RXZLOOVWLOOUXQ
LQWRWKHVHWHUPVMXVWNQRZWKDWWKH\PHDQORJLQUROHVDQGJURXSUROHVUHVSHFWLYHO\)RU
EDFNZDUGFRPSDWLELOLW\&5($7(86(5DQG&5($7(*5283VWLOOZRUNLQFXUUHQWYHUVLRQV ),/7(5FODXVH),/7(5&ODXVHIRU$JJUHJDWHV),/7(5&ODXVHIRU$JJUHJDWHV
EXWVKXQWKHPDQGXVH&5($7(52/(LQVWHDG 8VLQJ),/7(5,QVWHDGRI&$6(
ILOWHUHGLQGH[HV8QLTXH&RQVWUDLQWV3DUWLDO,QGH[HV
&UHDWLQJ/RJLQ5ROHV )LQNSDFNDJHGLVWULEXWLRQPDF26
:KHQ\RXLQLWLDOL]HWKHGDWDFOXVWHUGXULQJVHWXS3RVWJUH64/FUHDWHVDVLQJOH
ORJLQUROHZLWKWKHQDPHSRVWJUHV3RVWJUH64/DOVRFUHDWHVDQDPHVDNH IODWILOHVTXHU\LQJ4XHU\LQJ)ODW)LOHV4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V
GDWDEDVHFDOOHGSRVWJUHV<RXFDQE\SDVVWKHSDVVZRUGVHWWLQJE\PDSSLQJDQ )2525',1$/,7<PRGLILHU4XHU\LQJ;0/'DWD
26URRWXVHUWRWKHQHZUROHDQGXVLQJidentpeerRUtrustIRUDXWKHQWLFDWLRQ
$IWHU\RXߞYHLQVWDOOHG3RVWJUH64/EHIRUH\RXGRDQ\WKLQJHOVH\RXVKRXOGORJ )259$/8(6)520FODXVH3DUWLWLRQHG7DEOHV
LQDVSRVWJUHVDQGFUHDWHRWKHUUROHVSJ$GPLQKDVDJUDSKLFDOVHFWLRQIRU
IRUFHBSDUDOOHOBPRGHVHWWLQJ:KDW'RHVD3DUDOOHO4XHU\3ODQ/RRN/LNH"
FUHDWLQJXVHUUROHVEXWLI\RXZDQWWRFUHDWHRQHXVLQJ64/H[HFXWHDQ64/
FRPPDQGOLNHWKHRQHVKRZQLQ([DPSOH IRUHLJQGDWDZUDSSHUV)':V
([DPSOH&UHDWLQJORJLQUROHV
DERXW3RVWJUH64/'DWDEDVH2EMHFWV5HSOLFDWLRQDQG([WHUQDO'DWD)RUHLJQ
CREATE ROLE leo LOGIN PASSWORD 'king' VALID UNTIL 'infinity' CREATEDB;
'DWD:UDSSHUV
6SHFLI\LQJ9$/,'817,/LVRSWLRQDO,IRPLWWHGWKHUROHUHPDLQVDFWLYH
LQGHILQLWHO\&5($7('%JUDQWVGDWDEDVHFUHDWLRQSULYLOHJHWRWKHQHZUROH TXHU\LQJIODWILOHV4XHU\LQJ)ODW)LOHV4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V
7RFUHDWHDXVHUZLWKVXSHUXVHUSULYLOHJHVIROORZ([DPSOH1DWXUDOO\\RX TXHU\LQJIRUHLJQVHUYHUV4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV4XHU\LQJ
PXVWEHDVXSHUXVHUWRFUHDWHRWKHUVXSHUXVHUV 2WKHU3RVWJUH64/6HUYHUV
(;3/$,19(5%26(FRPPDQG(;3/$,12SWLRQV ([DPSOH&UHDWLQJVXSHUXVHUUROHV
CREATE ROLE regina LOGIN PASSWORD 'queen' VALID UNTIL '2020-1-1 00:00' SUPERUSER;
H[SOLFLWFDVWV3RVWJUH64/'DWDEDVH2EMHFWV
%RWKRIWKHSUHYLRXVH[DPSOHVFUHDWHUROHVWKDWFDQORJLQ7RFUHDWHUROHVWKDW
H[SRUWLQJGDWD FDQQRWORJLQRPLWWKH/2*,13$66:25'FODXVH
SJ$GPLQDQG([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ
([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ &UHDWLQJ*URXS5ROHV
*URXSUROHVJHQHUDOO\FDQQRWORJLQ5DWKHUWKH\VHUYHDVFRQWDLQHUVIRURWKHU
SVTODQG,PSRUWLQJDQG([SRUWLQJ'DWDSVTO([SRUW UROHV7KLVLVPHUHO\DEHVWSUDFWLFHVXJJHVWLRQ1RWKLQJVWRSV\RXIURPFUHDWLQJ
H[WHQVLRQV DUROHWKDWFDQORJLQDVZHOODVFRQWDLQRWKHUUROHV
&UHDWHDJURXSUROHXVLQJWKHIROORZLQJ64/
DERXW3RVWJUH64/'DWDEDVH2EMHFWV([WHQVLRQV([WHQVLRQV
CREATE ROLE royalty INHERIT;
FODVVLF&ODVVLFH[WHQVLRQV
FRPPRQ&RPPRQ([WHQVLRQV&ODVVLFH[WHQVLRQV 1RWHWKHXVHRIWKHPRGLILHU,1+(5,77KLVPHDQVWKDWDQ\PHPEHURIUR\DOW\
ZLOODXWRPDWLFDOO\LQKHULWSULYLOHJHVRIWKHUR\DOW\UROHH[FHSWIRUWKHVXSHUXVHU
FUHDWLQJVFKHPDVWRKRXVH3RVWJUH64/'DWDEDVH2EMHFWV8VLQJ6FKHPDV SULYLOHJH)RUVHFXULW\3RVWJUH64/QHYHUSDVVHVGRZQWKHVXSHUXVHUSULYLOHJH
6WHS,QVWDOOLQJLQWRDGDWDEDVH ,1+(5,7LVWKHGHIDXOWEXWZHUHFRPPHQGWKDW\RXDOZD\VLQFOXGHWKHPRGLILHU
IRUFODULW\
GRZQORDGLQJ,QVWDOOLQJ([WHQVLRQV
7RUHIUDLQIURPSDVVLQJSULYLOHJHVIURPWKHJURXSWRLWVPHPEHUVFUHDWHWKHUROH
JHWWLQJLQIRUPDWLRQDERXW([WHQVLRQV ZLWKWKH12,1+(5,7PRGLILHU
LQVWDOOLQJ([WHQVLRQV8SJUDGLQJWRWKHQHZH[WHQVLRQPRGHO 7RDGGPHPEHUVWRDJURXSUROH\RXZRXOGGR
HIIHFWLYHBFDFKHBVL]HQHWZRUNVHWWLQJ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV
SET ROLE royalty;
HQDEOHBQHVWORRSVHWWLQJ6WUDWHJ\6HWWLQJV
+LVVXSHUXVHUULJKWVZLOOODVWRQO\IRUKLVFXUUHQWVHVVLRQ
HQDEOHBVHTVFDQVHWWLQJ6WUDWHJ\6HWWLQJV
7KLVIHDWXUHWKRXJKSHFXOLDULVXVHIXOLI\RXZDQWWRSUHYHQW\RXUVHOIIURP
XQLQWHQWLRQDOO\GRLQJVXSHUXVHUWKLQJVZKLOH\RXDUHORJJHGLQ HQGRIOLIH(2/VXSSRUW:K\8SJUDGH"
SET ROLELVDFRPPDQGDYDLODEOHWRDOOXVHUVEXWDPRUHSRZHUIXOFRPPDQG (QWHUSULVH'%1RWDEOH3RVWJUH64/)RUNV:LQGRZVDQG'HVNWRS/LQX[PDF26
FDOOHGSET SESSION AUTHORIZATIONLVDYDLODEOHWRSHRSOHZKRORJLQDV
VXSHUXVHUV,QRUGHUWRXQGHUVWDQGWKHGLIIHUHQFHVZHߞOOILUVWLQWURGXFHWZR HQYLURQPHQWYDULDEOHV(QYLURQPHQW9DULDEOHV
JOREDOYDULDEOHVWKDW3RVWJUH64/KDVFDOOHGcurrent_userDQGsession_user (2/HQGRIOLIHVXSSRUW:K\8SJUDGH"
<RXFDQVHHWKHVHYDOXHVZKHQ\RXORJLQE\UXQQLQJWKH64/VWDWHPHQW
HTXDOLW\RSHUDWRU $UUD\&RQWDLQPHQW&KHFNV%LQDU\-621MVRQE
SELECT session_user, current_user;
HYDOIXQFWLRQ%DVLF)XQFWLRQV
:KHQ\RXILUVWORJLQWKHYDOXHVRIWKHVHWZRYDULDEOHVDUHWKHVDPHSET ROLE
(;&(37PRGLILHU4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
FKDQJHVWKHcurrent_userZKLOHSET SESSION AUTHORIZATIONFKDQJHVERWK
WKHcurrent_userDQGsession_userYDULDEOHV H[FOXVLRQFRQVWUDLQWV([FOXVLRQ&RQVWUDLQWV
+HUHDUHWKHVDOLHQWSURSHUWLHVRISET ROLE (;3/$,1$1$/<=(FRPPDQG
6(752/(GRHVQRWUHTXLUHVXSHUXVHUULJKWV DERXW(;3/$,1(;3/$,12SWLRQV
6(752/(FKDQJHVWKHFXUUHQWBXVHUYDULDEOHEXWQRWWKHVHVVLRQBXVHU JUDSKLFDORXWSXWV*UDSKLFDO2XWSXWV*UDSKLFDO2XWSXWV
YDULDEOH
VDPSOHUXQVDQGRXWSXW6DPSOH5XQVDQG2XWSXW6DPSOH5XQVDQG2XWSXW
$VHVVLRQBXVHUWKDWKDVVXSHUXVHUULJKWVFDQ6(752/(WRDQ\RWKHUUROH
1RQVXSHUXVHUVFDQ6(752/(RQO\WRWKHUROHWKHVHVVLRQBXVHULVRUWKHUROHV (;3/$,1FRPPDQG
WKHVHVVLRQBXVHUEHORQJVWR DERXW(;3/$,1
:KHQ\RXGR6(752/(\RXJDLQDOOSULYLOHJHVRIWKHLPSHUVRQDWHGXVHU
JUDSKLFDORXWSXWV*UDSKLFDO2XWSXWV*UDSKLFDO2XWSXWV
H[FHSWIRU6(76(66,21B$87+25,=$7,21DQG6(752/(
RSWLRQDODUJXPHQWV(;3/$,12SWLRQV
$PRUHSRZHUIXOFRPPDQGSET SESSION AUTHORIZATIONLVDYDLODEOHDVZHOO
.H\IHDWXUHVRI6(76(66,21$87+25,=$7,21DUHDVIROORZV VDPSOHUXQVDQGRXWSXW6DPSOH5XQVDQG2XWSXW6DPSOH5XQVDQG2XWSXW
GHSHQGHQFLHVVWDWLVWLF7DEOH6WDWLVWLFV 2QO\DXVHUWKDWORJVLQDVDVXSHUXVHUKDVSHUPLVVLRQWRGR6(76(66,21
$87+25,=$7,21WRDQRWKHUUROH
?G)FRPPDQG)76&RQILJXUDWLRQV
7KH6(76(66,21$87+25,=$7,21SULYLOHJHLVLQHIIHFWIRUWKHOLIHRI
GLVFUHWHUDQJHW\SHV'LVFUHWH9HUVXV&RQWLQXRXV5DQJHV WKHVHVVLRQPHDQLQJWKDWHYHQLI\RX6(76(66,21$87+25,=$7,21WRD
XVHUWKDWLVQRWDVXSHUXVHU\RXVWLOOKDYHWKH6(76(66,21
GLVWDQFHRSHUDWRU!)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
$87+25,=$7,21SULYLOHJHIRUWKHOLIHRI\RXUVHVVLRQ
',67,1&721FODXVH',67,1&721
6(76(66,21$87+25,=$7,21FKDQJHVWKHYDOXHVRIWKHFXUUHQWBXVHU
'MDQJRZHEIUDPHZRUN'DWDEDVH'ULYHUV DQGVHVVLRQBXVHUYDULDEOHVWRWKRVHRIWKHXVHUEHLQJLPSHUVRQDWHG
'2FRPPDQG'2 $VHVVLRQBXVHUWKDWKDVVXSHUXVHUULJKWVFDQ6(752/(WRDQ\RWKHUUROH
GHDGORFNBWLPHRXWVHWWLQJ0DQDJLQJ&RQQHFWLRQV
'DWDEDVH&UHDWLRQ
7KHPLQLPXP64/FRPPDQGWRFUHDWHDGDWDEDVHLV 'HELDQSODWIRUP'HELDQ8EXQWX
'(&/$5(FRPPDQG:ULWLQJ3/SJ64/)XQFWLRQV
CREATE DATABASE mydb;
GHIDXOWSULYLOHJHV'HIDXOW3ULYLOHJHV'HIDXOW3ULYLOHJHV
7KLVFUHDWHVDFRS\RIWKHWHPSODWHGDWDEDVH$Q\UROHZLWK&5($7('%
SULYLOHJHFDQFUHDWHQHZGDWDEDVHV '(/(7(FRPPDQG5HVWULFWLQJ'(/(7(83'$7(DQG6(/(&7IURP
,QKHULWHG7DEOHV
7HPSODWH'DWDEDVHV '(/(7(86,1*FRPPDQG'(/(7(86,1*
$WHPSODWHGDWDEDVHLVDVWKHQDPHVXJJHVWVDGDWDEDVHWKDWVHUYHVDVDVNHOHWRQ
GHOLPLWHUVSVTO([SRUW([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQ
IRUQHZGDWDEDVHV:KHQ\RXFUHDWHDQHZGDWDEDVH3RVWJUH64/FRSLHVDOOWKH
GDWDEDVHVHWWLQJVDQGGDWDIURPWKHWHPSODWHGDWDEDVHWRWKHQHZGDWDEDVH SJ$GPLQ
WHPSRUDOV7HPSRUDOV'DWHWLPH2SHUDWRUVDQG)XQFWLRQV 7KHGHIDXOW3RVWJUH64/LQVWDOODWLRQFRPHVZLWKWZRWHPSODWHGDWDEDVHV
WHPSODWHDQGWHPSODWH,I\RXGRQߞWVSHFLI\DWHPSODWHGDWDEDVHWRIROORZ
WVYHFWRU769HFWRUV769HFWRUV ZKHQ\RXFUHDWHDGDWDEDVHWHPSODWHLVXVHG
[PO;0/4XHU\LQJ;0/'DWD
GDWDEDVHDGPLQLVWUDWLRQ :$51,1*
<RXVKRXOGQHYHUDOWHUWHPSODWHEHFDXVHLWLVWKHLPPDFXODWHPRGHOWKDW\RXߞOOQHHGWRFRS\
EDFNXSDQGUHVWRUH%DFNXSDQG5HVWRUH8VLQJSJBUHVWRUH%DFNLQJXSDQ IURPLI\RXVFUHZXS\RXUWHPSODWHV0DNH\RXUFXVWRPL]DWLRQVWRWHPSODWHRUDQHZ
WHPSODWHGDWDEDVH\RXFUHDWH<RXFDQߞWFKDQJHWKHHQFRGLQJDQGFROODWLRQRIDGDWDEDVH\RX
HQWLUHGDWDEDVH6HOHFWLYHEDFNXSRIGDWDEDVHDVVHWV'DWDEDVH%DFNXS8VLQJ FUHDWHIURPWHPSODWHRUDQ\RWKHUWHPSODWHGDWDEDVH\RXFUHDWH6RLI\RXQHHGDGLIIHUHQW
SJBGXPS'DWDEDVH5HVWRUHSJBUHVWRUH HQFRGLQJRUFROODWLRQIURPWKRVHLQWHPSODWHFUHDWHWKHGDWDEDVHIURPWHPSODWH
FRPPRQPLVWDNHV9HUERWHQ3UDFWLFHV'RQߞW7U\WR6WDUW3RVWJUH64/RQD
3RUW$OUHDG\LQ8VH 7KHEDVLFV\QWD[WRFUHDWHDGDWDEDVHPRGHOHGDIWHUDVSHFLILFWHPSODWHLV
FRQILJXUDWLRQILOHV&RQILJXUDWLRQ)LOHV$XWKHQWLFDWLRQPHWKRGV CREATE DATABASE my_db TEMPLATE my_template_db;
FUHDWLQJDVVHWV&UHDWLQJ'DWDEDVH$VVHWVDQG6HWWLQJ3ULYLOHJHV
<RXFDQSLFNDQ\GDWDEDVHWRVHUYHDVWKHWHPSODWH7KLVFRXOGFRPHLQTXLWH
GDWDEDVHFUHDWLRQ'DWDEDVH&UHDWLRQ8VLQJ6FKHPDV KDQG\ZKHQPDNLQJUHSOLFDV<RXFDQDOVRPDUNDQ\GDWDEDVHDVDWHPSODWH
GDWDEDVH2QFH\RXGRWKHGDWDEDVHLVQRORQJHUHGLWDEOHDQGGHOHWDEOH$Q\UROH
H[WHQVLRQVDQG([WHQVLRQV&ODVVLFH[WHQVLRQV ZLWKWKH&5($7('%SULYLOHJHFDQXVHDWHPSODWHGDWDEDVH7RPDNHDQ\
GDWDEDVHDWHPSODWHUXQWKHIROORZLQJ64/DVDVXSHUXVHU
ORJLFDOUHSOLFDWLRQDQG5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHVZLWK
/RJLFDO5HSOLFDWLRQ5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHVZLWK/RJLFDO UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'mydb';
5HSOLFDWLRQ
,IHYHU\RXQHHGWRHGLWRUGURSDWHPSODWHGDWDEDVHILUVWVHWWKHGDWLVWHPSODWH
PDNLQJFRQILJXUDWLRQVWDNHHIIHFW0DNLQJ&RQILJXUDWLRQV7DNH(IIHFW DWWULEXWHWR)$/6('RQߞWIRUJHWWRFKDQJHWKHYDOXHEDFNDIWHU\RXߞUHGRQHZLWK
5HVWDUWLQJ HGLWV
PDQDJLQJFRQQHFWLRQV0DQDJLQJ&RQQHFWLRQV&KHFNIRU4XHULHV%HLQJ
%ORFNHG 8VLQJ6FKHPDV
6FKHPDVRUJDQL]H\RXUGDWDEDVHLQWRORJLFDOJURXSV,I\RXKDYHPRUHWKDQWZR
PDQDJLQJGLVNVWRUDJH0DQDJLQJ'LVN6WRUDJHZLWK7DEOHVSDFHV
GR]HQWDEOHVLQ\RXUGDWDEDVHFRQVLGHUFXEE\KROLQJWKHPLQWRVFKHPDV2EMHFWV
SULYLOHJHVDQG3ULYLOHJHV&UHDWLQJ'DWDEDVH$VVHWVDQG6HWWLQJ3ULYLOHJHV PXVWKDYHXQLTXHQDPHVZLWKLQDVFKHPDEXWQHHGQRWEHXQLTXHDFURVVWKH
3ULYLOHJHPDQDJHPHQW GDWDEDVH,I\RXFUDPDOO\RXUWDEOHVLQWRWKHGHIDXOWSXEOLFVFKHPD\RXߞOOUXQ
LQWRQDPHFODVKHVVRRQHURUODWHU,WߞVXSWR\RXKRZWRRUJDQL]H\RXUVFKHPDV
UROHVDQG5ROHV&UHDWLQJ*URXS5ROHV )RUH[DPSOHLI\RXDUHDQDLUOLQH\RXFDQSODFHDOOWDEOHVRISODQHV\RXRZQDQG
WKHLUPDLQWHQDQFHUHFRUGVLQWRDSODQHVVFKHPD3ODFHDOO\RXUFUHZDQGVWDII
LQWRDQHPSOR\HHVVFKHPDDQGSODFHDOOSDVVHQJHUUHODWHGLQIRUPDWLRQLQWRD &8%(52//83
SDVVHQJHUVVFKHPD
FXUUHQWBXVHUJOREDOYDULDEOH&UHDWLQJ*URXS5ROHV
$QRWKHUFRPPRQZD\WRRUJDQL]HVFKHPDVLVE\UROHV:HIRXQGWKLVWREH
SDUWLFXODUO\KDQG\ZLWKDSSOLFDWLRQVWKDWVHUYHPXOWLSOHFOLHQWVZKRVHGDWDPXVW FXVWRPGDWDW\SHV
EHNHSWVHSDUDWH
EXLOGLQJ%XLOGLQJ&XVWRP'DWD7\SHV
6XSSRVHWKDW\RXVWDUWHGDGRJEHDXW\PDQDJHPHQWEXVLQHVVGRJJLHVSD<RX
VWDUWZLWKDWDEOHLQSXEOLFFDOOHGGRJVWRWUDFNDOOWKHGRJV\RXKRSHWRJURRP EXLOGLQJRSHUDWRUVDQGIXQFWLRQVIRU%XLOGLQJ2SHUDWRUVDQG)XQFWLRQVIRU
<RXFRQYLQFH\RXUWZREHVWIULHQGVWREHFRPHFXVWRPHUV:KLPVLFDO &XVWRP7\SHV
JRYHUQPHQWSULYDF\UHJXODWLRQSDVVHVDQGQRZ\RXKDYHWRSXWLQLURQFODG
DVVXUDQFHVWKDWRQHFXVWRPHUFDQQRWVHHGRJLQIRUPDWLRQIURPDQRWKHU7R WDEOHVDV$OO7DEOHV$UH&XVWRP'DWD7\SHV
FRPSO\\RXVHWXSRQHVFKHPDSHUFXVWRPHUDQGFUHDWHWKHVDPHGRJVWDEOHLQ '
HDFKDVIROORZV
?GFRPPDQG5HWULHYLQJ'HWDLOVRI'DWDEDVH2EMHFWV
CREATE SCHEMA customer1;
CREATE SCHEMA customer2; GDWDGHILQLWLRQODQJXDJH''/3RVWJUH64/'DWDEDVH2EMHFWV5HSOLFDWLRQ
-DUJRQ
<RXWKHQPRYHWKHGRJUHFRUGVLQWRWKHVFKHPDWKDWFRUUHVSRQGVZLWKWKHFOLHQW
7KHILQDOWRXFKLVWRFUHDWHGLIIHUHQWORJLQUROHVIRUHDFKVFKHPDZLWKWKHVDPH GDWDW\SHV
QDPHDVWKHVFKHPD'RJVDUHQRZFRPSOHWHO\LVRODWHGLQWKHLUUHVSHFWLYH
VFKHPDV:KHQFXVWRPHUVORJLQWR\RXUGDWDEDVHWRPDNHDSSRLQWPHQWVWKH\ DERXW3RVWJUH64/'DWDEDVH2EMHFWV'DWD7\SHV
ZLOOEHDEOHWRDFFHVVRQO\LQIRUPDWLRQSHUWDLQLQJWRWKHLURZQGRJV $1<RSHUDWRUDQG$1<$UUD\6HDUFK
:DLWLWJHWVEHWWHU%HFDXVHZHQDPHGRXUUROHVWRPDWFKWKHLUUHVSHFWLYH
DUUD\V$UUD\V$UUD\&RQWDLQPHQW&KHFNV
VFKHPDVZHߞUHEOHVVHGZLWKDQRWKHUXVHIXOWHFKQLTXH%XWZHPXVWILUVW
LQWURGXFHWKHVHDUFKBSDWKGDWDEDVHYDULDEOH FKDUDFWHUVDQGVWULQJV7H[WXDOV5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
$VZHPHQWLRQHGHDUOLHUREMHFWQDPHVPXVWEHXQLTXHZLWKLQDVFKHPDEXW\RX FXVWRPDQGFRPSRVLWH&XVWRPDQG&RPSRVLWH'DWD7\SHV%XLOGLQJ
FDQKDYHVDPHQDPHGREMHFWVLQGLIIHUHQWVFKHPDV)RUH[DPSOH\RXKDYHWKH
2SHUDWRUVDQG)XQFWLRQVIRU&XVWRP7\SHV
VDPHWDEOHFDOOHGGRJVLQDOORI\RXUVFKHPDV:KHQ\RXH[HFXWHVRPHWKLQJ
OLNHSELECT * FROM dogsKRZGRHV3RVWJUH64/NQRZZKLFKVFKHPD\RXߞUH MVRQ-621(GLWLQJ-621%GDWD
UHIHUULQJWR"7KHVLPSOHDQVZHULVWRDOZD\VSUHSHQGWKHVFKHPDQDPHRQWRWKH
WDEOHQDPHZLWKDGRWVXFKDVLQSELECT * FROM [Link]$QRWKHU MVRQE-621%LQDU\-621MVRQE(GLWLQJ-621%GDWD
PHWKRGLVWRVHWWKHVHDUFKBSDWKYDULDEOHWREHVRPHWKLQJOLNHcustomer1, QXPHULFV1XPHULFV*HQHUDWH6HULHV)XQFWLRQ
public:KHQWKHTXHU\H[HFXWHVWKHSODQQHUVHDUFKHVIRUWKHGRJVWDEOHILUVWLQ
WKHFXVWRPHUVFKHPD,IQRWIRXQGLWFRQWLQXHVWRWKHSXEOLFVFKHPDDQGVWRSV UDQJHW\SHV5DQJH7\SHV&RQWDLQVDQGFRQWDLQHGLQRSHUDWRUV
WKHUH VKRUWKDQGFDVWLQJ6KRUWKDQG&DVWLQJ
&5($7(6(48(1&(FRPPDQG6HULDOV 3RVWJUH64/KDVDOLWWOHNQRZQYDULDEOHFDOOHGXVHUWKDWUHWULHYHVWKHUROH
FXUUHQWO\ORJJHGLQSELECT userUHWXUQVWKLVQDPHuserLVMXVWDQDOLDVIRU
&5($7(67$7,67,&6FRPPDQG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/7DEOH
current_userVR\RXFDQXVHHLWKHU
6WDWLVWLFV
5HFDOOKRZZHQDPHGRXUFXVWRPHUVߞVFKHPDVWREHWKHVDPHDVWKHLUORJLQ
&5($7(68%6&5,37,21FRPPDQG5HSOLFDWLRQ-DUJRQ5HSOLFDWLQJ2QO\ UROHV:HGLGWKLVVRWKDWZHFDQWDNHDGYDQWDJHRIWKHGHIDXOWVHDUFKSDWKVHWLQ
6RPH7DEOHVRU'DWDEDVHVZLWK/RJLFDO5HSOLFDWLRQ SRVWJUHVTOFRQI
DERXW&RPPRQ7DEOH([SUHVVLRQV 7KHQDGG\RXUQHZVFKHPDWRWKHVHDUFKSDWK
EDVLF%DVLF&7(V
ALTER DATABASE mydb SET search_path='$user', public, my_extensions;
UHFXUVLYH5HFXUVLYH&7(
:KHQ\RXLQVWDOOH[WHQVLRQVEHVXUHWRLQGLFDWH\RXUQHZVFKHPDDVWKHLUQHZ
ZULWDEOH:ULWDEOH&7(V KRPH
&8%(RSHUDWRU)HDWXUHV,QWURGXFHGLQ3RVWJUH64/*5283,1*6(76
LQVWDOOLQJDGPLQSDFN(GLWLQJSRVWJUHVTOFRQIDQGSJBKEDFRQIIURP
:$51,1*
SJ$GPLQ
ALTER DATABASE .. SET search_pathZLOOQRWWDNHHIIHFWIRUH[LVWLQJFRQQHFWLRQV<RXߞOO
QHHGWRUHFRQQHFW LQVWDOOLQJ)':V)RUHLJQ'DWD:UDSSHUV4XHU\LQJ2WKHU3RVWJUH64/
6HUYHUV
LQVWDOOLQJKXQVSHOO)76&RQILJXUDWLRQV
3ULYLOHJHV
3ULYLOHJHVRIWHQFDOOHGSHUPLVVLRQVFDQEHWULFN\WRDGPLQLVWHULQ3RVWJUH64/ LQVWDOOLQJSJ$JHQW,QVWDOOLQJSJ$JHQW
EHFDXVHRIWKHJUDQXODUFRQWURODW\RXUGLVSRVDO6HFXULW\FDQERUHGRZQWRWKH LQVWDOOLQJ3/9ODQJXDJHIDPLO\:ULWLQJ3/93/&RIIHH6FULSWDQG
FROXPQDQGURZOHYHO<HV<RXFDQDVVLJQGLIIHUHQWSULYLOHJHVWRHDFKGDWDSRLQW 3//LYH6FULSW)XQFWLRQV
RI\RXUWDEOHLIWKDWHYHUEHFRPHVQHFHVVDU\
VODYHVHUYHUVDQG5HSOLFDWLRQ-DUJRQ
127( &5($7()25(,*17$%/(FRPPDQG4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
5RZOHYHOVHFXULW\5/6ILUVWDSSHDUHGLQ3RVWJUH64/$OWKRXJK5/6LVDYDLODEOHRQDOO
3RVWJUH64/LQVWDOODWLRQVZKHQXVHGLQ6(/LQX[FHUWDLQDGYDQFHGIHDWXUHVDUHHQDEOHG
&5($7(*5283FRPPDQG5ROHV
&5($7(,1'(;FRPPDQG%LQDU\-621MVRQE
7HDFKLQJ\RXDOOWKHUHLVWRNQRZDERXWSULYLOHJHVFRXOGWDNHDIHZFKDSWHUV &5($7(0$7(5,$/,=('9,(:FRPPDQG0DWHULDOL]HG9LHZV
:KDWZHߞOODLPIRULQWKLVVHFWLRQLQVWHDGLVWRJLYH\RXHQRXJKLQIRUPDWLRQWR
JHWXSDQGUXQQLQJDQGWRJXLGH\RXDURXQGVRPHRIWKHPRUHQRQLQWXLWLYHODQG &5($7(23(5$725FRPPDQG%XLOGLQJ2SHUDWRUVDQG)XQFWLRQVIRU&XVWRP
PLQHVWKDWFRXOGHLWKHUORFN\RXRXWFRPSOHWHO\RUH[SRVH\RXUVHUYHU 7\SHV
LQDSSURSULDWHO\
&5($7(255(3/$&(9,(:FRPPDQG6LQJOH7DEOH9LHZV
3ULYLOHJHPDQDJHPHQWLQ3RVWJUH64/LVQRFDNHZDON7KHSJ$GPLQJUDSKLFDO
DGPLQLVWUDWLRQWRROFDQHDVHVRPHRIWKHWDVNVRUDWWKHYHU\OHDVWSDLQW\RXD &5($7(352'&('85$//$1*8$*(FRPPDQG3RVWJUH64/'DWDEDVH
SLFWXUHRI\RXUSULYLOHJHVHWWLQJV<RXFDQDFFRPSOLVKPRVWLIQRWDOORI\RXU 2EMHFWV
SULYLOHJHDVVLJQPHQWWDVNVLQSJ$GPLQ,I\RXߞUHVDGGOHGZLWKWKHWDVNRI
&5($7(38%/,&$7,21FRPPDQG5HSOLFDWLRQ-DUJRQ5HSOLFDWLQJ2QO\
DGPLQLVWHULQJSULYLOHJHVDQGDUHQHZWR3RVWJUH64/VWDUWZLWKSJ$GPLQ-XPS
6RPH7DEOHVRU'DWDEDVHVZLWK/RJLFDO5HSOLFDWLRQ
WRߡ&UHDWLQJ'DWDEDVH$VVHWVDQG6HWWLQJ3ULYLOHJHVߢLI\RXFDQߞWZDLW
&5($7(52/(FRPPDQG5ROHV&UHDWLQJ/RJLQ5ROHV*HWWLQJ6WDUWHG
7\SHVRI3ULYLOHJHV &RQILJXULQJWKH0DVWHU
3RVWJUH64/KDVDIHZGR]HQSULYLOHJHVVRPHRIZKLFK\RXPD\QHYHUQHHGWR &5($7(6&+(0$FRPPDQG8VLQJ6FKHPDV4XHU\LQJ2WKHU7DEXODU
ZRUU\DERXW7KHPRUHPXQGDQHSULYLOHJHVDUH6(/(&7,16(5783'$7( )RUPDWVZLWKRJUBIGZ
$/7(5(;(&87('(/(7(DQG7581&$7(
WRVHUYHUV&RQQHFWLQJWRD3RVWJUH64/6HUYHU 0RVWSULYLOHJHVPXVWKDYHDFRQWH[W)RUH[DPSOHDUROHKDYLQJDQ$/7(5
SULYLOHJHLVPHDQLQJOHVVXQOHVVTXDOLILHGZLWKDGDWDEDVHREMHFWVXFKDV$/7(5
FRQVWUDLQWV SULYLOHJHRQWDEOHV6(/(&7SULYLOHJHRQWDEOH(;(&87(SULYLOHJHRQ
IXQFWLRQDQGVRRQ1RWDOOSULYLOHJHVDSSO\WRDOOREMHFWVDQ(;(&87(
DERXW7DEOHV&RQVWUDLQWVDQG,QGH[HV&RQVWUDLQWV
SULYLOHJHIRUDWDEOHLVQRQVHQVH
FKHFN,QVHUWLQJ;0/'DWD,QKHULWHG7DEOHV&KHFN&RQVWUDLQWV 6RPHSULYLOHJHVPDNHVHQVHZLWKRXWDFRQWH[W&5($7('%DQG&5($7(
H[FOXVLRQ([FOXVLRQ&RQVWUDLQWV 52/(DUHWZRSULYLOHJHVZKHUHFRQWH[WLVLUUHOHYDQW
IRUHLJQNH\)RUHLJQ.H\&RQVWUDLQWV
127(
XQLTXH8QLTXH&RQVWUDLQWV3DUWLDO,QGH[HV 3ULYLOHJHVLQRWKHUGDWDEDVHSURGXFWVPLJKWEHFDOOHGULJKWVRUSHUPLVVLRQV
FRQWDLQHGLQRSHUDWRU#$UUD\&RQWDLQPHQW&KHFNV&RQWDLQVDQGFRQWDLQHG
LQRSHUDWRUV%LQDU\-621MVRQE
*HWWLQJ6WDUWHG
FRQWDLQVRSHUDWRU#!$UUD\&RQWDLQPHQW&KHFNV&RQWDLQVDQGFRQWDLQHGLQ 6R\RXVXFFHVVIXOO\LQVWDOOHG3RVWJUH64/\RXVKRXOGKDYHRQHVXSHUXVHU
RSHUDWRUV%LQDU\-621MVRQE ZKRVHSDVVZRUG\RXNQRZE\KHDUW1RZ\RXVKRXOGWDNHWKHIROORZLQJVWHSVWR
VHWXSDGGLWLRQDOUROHVDQGDVVLJQSULYLOHJHV
FRQWLQXRXVUDQJHW\SHV'LVFUHWH9HUVXV&RQWLQXRXV5DQJHV
3RVWJUH64/FUHDWHVRQHVXSHUXVHUDQGRQHGDWDEDVHIRU\RXDWLQVWDOODWLRQ
FRQWULEVVHHH[WHQVLRQV
ERWKQDPHGSRVWJUHV/RJLQWR\RXUVHUYHUDVSRVWJUHV
&RRUGLQDWHG8QLYHUVDO7LPH87&7HPSRUDOV %HIRUHFUHDWLQJ\RXUILUVWGDWDEDVHFUHDWHDUROHWKDWZLOORZQWKHGDWDEDVH
?FRS\FRPPDQG,PSRUWLQJDQG([SRUWLQJ'DWD&RS\LQJIURPRUWR3URJUDP DQGFDQORJLQVXFKDV
,PSRUWLQJILOHV
CREATE ROLE mydb_admin LOGIN PASSWORD 'something';
&267TXDOLILHU)XQFWLRQ%DVLFV
&UHDWHWKHGDWDEDVHDQGVHWWKHRZQHU
&5($7($**5(*$7(FRPPDQG$JJUHJDWHV:ULWLQJ$JJUHJDWH)XQFWLRQV
ZLWK3/9 CREATE DATABASE mydb WITH owner = mydb_admin;
&5($7('$7$%$6(FRPPDQG'DWDEDVH&UHDWLRQ*HWWLQJ6WDUWHG6HOHFWLYH
1RZORJLQDVWKHmydb_adminXVHUDQGVWDUWVHWWLQJXSDGGLWLRQDOVFKHPDV
%DFNXS8VLQJSJBGXPS8VLQJSJBUHVWRUH
DQGWDEOHV
&5($7((;7(16,21FRPPDQG3RVWJUH64/'DWDEDVH2EMHFWV
*5$17
DERXW6WHS,QVWDOOLQJLQWRDGDWDEDVH
7KH*5$17FRPPDQGLVWKHSULPDU\PHDQVWRDVVLJQSULYLOHJHV%DVLFXVDJHLV
GRANT some_privilege TO some_role; &RPPDQGV
$IHZWKLQJVWRNHHSLQPLQGZKHQLWFRPHVWR*5$17 UHWULHYLQJSULRUFRPPDQGV5HWULHYLQJ3ULRU&RPPDQGV
6RPHSULYLOHJHVDOZD\VUHPDLQZLWKWKHRZQHURIDQREMHFWDQGFDQQHYHUEH EDVLF%DVLF&7(V
JUDQWHGDZD\7KHVHLQFOXGH'523DQG$/7(5
UHFXUVLYH5HFXUVLYH&7(
7KHRZQHURIDQREMHFWUHWDLQVDOOSULYLOHJHV*UDQWLQJDQRZQHUSULYLOHJHLQ
ZKDWLWDOUHDG\RZQVLVXQQHFHVVDU\.HHSLQPLQGWKRXJKWKDWRZQHUVKLS ZULWDEOH:ULWDEOH&7(V
GRHVQRWGULOOGRZQWRFKLOGREMHFWV)RULQVWDQFHLI\RXRZQDGDWDEDVH\RX FRPSRVLWHGDWDW\SH
PD\QRWQHFHVVDULO\RZQDOOWKHVFKHPDVZLWKLQLW
DERXW&XVWRPDQG&RPSRVLWH'DWD7\SHV&RPSRVLWH7\SHVLQ4XHULHV
:KHQJUDQWLQJSULYLOHJHV\RXFDQDGG:,7+*5$17237,217KLVPHDQV
WKDWWKHJUDQWHHFDQJUDQWKHURZQSULYLOHJHVWRRWKHUVSDVVLQJWKHPRQ 18//YDOXHDQG&RPSRVLWHVDQG18//V
GRANT ALL ON ALL TABLES IN SCHEMA public TO mydb_admin WITH GRANT OPTION; VHWUHWXUQLQJIXQFWLRQVDQG%DVLF64/)XQFWLRQ
WDEOHVDQG7<3(2)
7RJUDQWVSHFLILFSULYLOHJHVRQ$//REMHFWVRIDVSHFLILFW\SHXVH$//
LQVWHDGRIWKHVSHFLILFREMHFWQDPHDVLQ FRQFDWHQDWLRQRSHUDWRU__6WULQJ)XQFWLRQV$UUD\6OLFLQJDQG6SOLFLQJ(GLWLQJ
-621%GDWD769HFWRUV
GRANT SELECT, REFERENCES, TRIGGER ON
ALL TABLES IN SCHEMA my_schema TO &21&855(17/<TXDOLILHU0DWHULDOL]HG9LHZV
PUBLIC;
FRQILJXUDWLRQILOHV&RQILJXUDWLRQ)LOHV$XWKHQWLFDWLRQPHWKRGV(GLWLQJ
1RWHWKDWALL TABLESLQFOXGHVUHJXODUWDEOHVIRUHLJQWDEOHVDQGYLHZV SRVWJUHVTOFRQIDQGSJBKEDFRQIIURPSJ$GPLQ
7RJUDQWSULYLOHJHVWRDOOUROHV\RXFDQXVHWKH38%/,&DOLDVDVLQ FRQILJXUDWLRQYDULDEOHV5HSOLFDWLRQ-DUJRQ
FRQIOLFWKDQGOLQJ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
GRANT USAGE ON SCHEMA my_schema TO PUBLIC;
?FRQQHFWFRPPDQG&XVWRP3URPSWV
7KH*5$17FRPPDQGLVFRYHUHGLQGHWDLOLQ*5$17:HVWURQJO\UHFRPPHQG
WKDW\RXWDNHWKHWLPHWRVWXG\WKLVGRFXPHQWEHIRUH\RXLQDGYHUWHQWO\NQRFND FRQQHFWLRQV
ELJKROHLQ\RXUVHFXULW\ZDOO
PDQDJLQJ0DQDJLQJ&RQQHFWLRQV&KHFNIRU4XHULHV%HLQJ%ORFNHG
6RPHSULYLOHJHVDUHE\GHIDXOWJUDQWHGWR38%/,&7KHVHDUH&211(&7DQG
FHUWDXWKHQWLFDWLRQPHWKRG$XWKHQWLFDWLRQPHWKRGV &5($7(7(037$%/(IRUGDWDEDVHVDQG(;(&87(IRUIXQFWLRQV,QPDQ\
FDVHV\RXPLJKWFRQVLGHUUHYRNLQJVRPHRIWKHGHIDXOWVZLWKWKH5(92.(
FKDUGDWDW\SH7H[WXDOV FRPPDQGDVLQ
FKDUDFWHUVDQGVWULQJV
REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA my_schema FROM PUBLIC;
DERXW7H[WXDOV
'HIDXOW3ULYLOHJHV
GROODUTXRWLQJ'ROODU4XRWLQJ'2
'HIDXOWSULYLOHJHVHDVHSULYLOHJHPDQDJHPHQWE\OHWWLQJ\RXVHWSULYLOHJHVEHIRUH
SDWWHUQPDWFKLQJDQG5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ5HJXODU WKHLUFUHDWLRQ
([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
UHJXODUH[SUHVVLRQVDQG5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ5HJXODU :$51,1*
([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ $GGLQJRUFKDQJLQJGHIDXOWSULYLOHJHVZRQߞWDIIHFWSULYLOHJHVHWWLQJVRQH[LVWLQJREMHFWV
UHPRYLQJFDVHVHQVLWLYLW\IURPFKDUDFWHUW\SHV7H[WXDOV
VSOLWWLQJVWULQJV6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU6XEVWULQJV /HWߞVVXSSRVHZHZDQWDOOXVHUVRIRXUGDWDEDVHWRKDYH(;(&87(DQG
6(/(&7SULYLOHJHVDFFHVVWRDQ\IXWXUHWDEOHVDQGIXQFWLRQVLQDSDUWLFXODU
VWULQJIXQFWLRQV6WULQJ)XQFWLRQV VFKHPD:HFDQGHILQHSULYLOHJHVDVVKRZQLQ([DPSOH$OOUROHVRID
3RVWJUH64/VHUYHUDUHPHPEHUVRIWKHJURXS38%/,&
FKHFNFRQVWUDLQWV,QVHUWLQJ;0/'DWD,QKHULWHG7DEOHV&KHFN&RQVWUDLQWV
([DPSOH'HILQLQJGHIDXOWSULYLOHJHVRQDVFKHPD
&LWXVSURMHFW1RWDEOH3RVWJUH64/)RUNV GRANT USAGE ON SCHEMA my_schema TO PUBLIC;
IHWFKLQJRXWSXWIURP&RS\LQJIURPRUWR3URJUDP $OORZVDOOXVHUVWKDWFDQFRQQHFWWRWKHGDWDEDVHWRDOVREHDEOHWRXVHDQG
FUHDWHREMHFWVLQDVFKHPDLIWKH\KDYHULJKWVWRWKRVHREMHFWVLQWKHVFKHPD
SDFNDJHG3RVWJUH64/3DFNDJHG&RPPDQG/LQH7RROVSVTO1RQLQWHUDFWLYH *5$1786$*(RQDVFKHPDLVWKHILUVWVWHSWRJUDQWLQJDFFHVVWRREMHFWVLQ
WKHVFKHPD,IDXVHUKDVULJKWVWRVHOHFWIURPDWDEOHLQDVFKHPDEXWQR EORFNUDQJHLQGH[HV%5,1)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
86$*(RQWKHVFKHPDWKHQKHZLOOQRWEHDEOHWRTXHU\WKHWDEOH 3RVWJUH64/6WRFN,QGH[HV
*UDQWUHDGDQGUHIHUHQFHULJKWVWKHDELOLW\WRFUHDWHIRUHLJQNH\FRQVWUDLQWV
DJDLQVWFROXPQVLQDWDEOHIRUDOOIXWXUHWDEOHVFUHDWHGLQDVFKHPDWRDOO %5,1EORFNUDQJHLQGH[HV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
XVHUVWKDWKDYH86$*(RIWKHVFKHPD 3RVWJUH64/6WRFN,QGH[HV
*5$17$//SHUPLVVLRQVRQIXWXUHWDEOHVWRUROHP\GEBDGPLQ,QDGGLWLRQ EWUHHBJLQH[WHQVLRQ3RSXODUH[WHQVLRQV
DOORZPHPEHUVLQP\GEBDGPLQWREHDEOHWRJUDQWDVXEVHWRUDOOSULYLOHJHV
WRRWKHUXVHUVWRIXWXUHWDEOHVLQWKLVVFKHPD*5$17$//JLYHVSHUPLVVLRQ EWUHHBJLVWH[WHQVLRQ3RSXODUH[WHQVLRQV([FOXVLRQ&RQVWUDLQWV
WRDGGXSGDWHGHOHWHWUXQFDWHURZVDGGWULJJHUVDQGFUHDWHFRQVWUDLQWVRQWKH
WDEOHV EWULPIXQFWLRQ6WULQJ)XQFWLRQV
*5$17SHUPLVVLRQVRQIXWXUHVHTXHQFHVIXQFWLRQVDQGW\SHV &
7RUHDGPRUHDERXWGHIDXOWSULYLOHJHVVHH$/7(5'()$8/735,9,/(*(6
FDFKLQJ&DFKLQJ&DFKLQJ
3ULYLOHJH,GLRV\QFUDVLHV FDQRQLFDOIRUP'LVFUHWH9HUVXV&RQWLQXRXV5DQJHV
%HIRUHZHXQOHDVK\RXWRH[SORUHSULYLOHJHVRQ\RXURZQZHGRZDQWWRSRLQW &$6&$'(PRGLILHU7<3(2)
RXWDIHZTXLUNVWKDWPD\QRWEHDSSDUHQW
FDVFDGLQJUHSOLFDWLRQ5HSOLFDWLRQ-DUJRQ
8QOLNHLQRWKHUGDWDEDVHSURGXFWVEHLQJWKHRZQHURID3RVWJUH64/GDWDEDVH
GRHVQRWJLYH\RXDFFHVVWRDOOREMHFWVLQWKHGDWDEDVH$QRWKHUUROHFRXOG FDVFDGLQJVWDQGE\5HSOLFDWLRQ-DUJRQ
FRQFHLYDEO\FUHDWHDWDEOHLQ\RXUGDWDEDVHDQGGHQ\\RXDFFHVVWRLW+RZHYHU
WKHSULYLOHJHWRGURSWKHHQWLUHGDWDEDVHFRXOGQHYHUEHZUHVWOHGDZD\IURP\RX &$6(H[SUHVVLRQ
$IWHUJUDQWLQJSULYLOHJHVWRWDEOHVDQGIXQFWLRQVZLWKDVFKHPDGRQߞWIRUJHWWR ),/7(5FODXVHDQG),/7(5&ODXVHIRU$JJUHJDWHV8VLQJ),/7(5,QVWHDGRI
JUDQWXVDJHRQWKHVFKHPDLWVHOI &$6(
XVDJHFRQVLGHUDWLRQV0DNH*RRG8VHRI&$6(
([WHQVLRQV FDVHVHQVLWLYLW\
([WHQVLRQVIRUPHUO\FDOOHGFRQWULEVDUHDGGRQVWKDW\RXFDQLQVWDOOLQD
3RVWJUH64/GDWDEDVHWRH[WHQGIXQFWLRQDOLW\EH\RQGWKHEDVHRIIHULQJV7KH\ UHPRYLQJIURPFKDUDFWHUW\SHV7H[WXDOV
H[HPSOLI\WKHEHVWRIRSHQVRXUFHVRIWZDUHSHRSOHFROODERUDWLQJEXLOGLQJDQG
VHDUFKHVDQG,/,.(IRU&DVH,QVHQVLWLYH6HDUFK
IUHHO\VKDULQJQHZIHDWXUHV6LQFHYHUVLRQWKHQHZH[WHQVLRQPRGHOKDV
PDGHDGGLQJH[WHQVLRQVDFLQFK FDVWV3RVWJUH64/'DWDEDVH2EMHFWV6KRUWKDQG&DVWLQJ
FDWDORJV3RVWJUH64/'DWDEDVH2EMHFWV
7,3
?FGFRPPDQGSVTO,PSRUW$FFHVVLQJSVTOIURPSJ$GPLQ
DERXW%DFNXSDQG5HVWRUH 2OGHUDGGRQVRXWVLGHWKHH[WHQVLRQPRGHODUHVWLOOFDOOHGFRQWULEVEXWZLWKDQH\HWRZDUGWKH
IXWXUHZHߞOOFDOOWKHPDOOH[WHQVLRQV
SJ$GPLQWRRO%DFNXSDQG5HVWRUH6HOHFWLYHEDFNXSRIGDWDEDVHDVVHWV
SJBEDVHEDFNXSWRRO%DFNXSDQG5HVWRUH 1RWDOOH[WHQVLRQVQHHGWREHLQDOOGDWDEDVHV<RXVKRXOGLQVWDOOH[WHQVLRQVWR
\RXULQGLYLGXDOGDWDEDVHRQDQDVQHHGHGEDVLV,I\RXZDQWDOO\RXUGDWDEDVHVWR
SJBGXPSWRRO%DFNXSDQG5HVWRUH6HOHFWLYH%DFNXS8VLQJSJBGXPS
KDYHDFHUWDLQVHWRIH[WHQVLRQV\RXFDQGHYHORSDWHPSODWHGDWDEDVHDV
%DFNXSDQG5HVWRUHSJ6FULSW'DWDEDVH%DFNXS8VLQJSJBGXPS GLVFXVVHGLQߡ7HPSODWH'DWDEDVHVߢZLWKDOOWKHH[WHQVLRQVLQVWDOOHGDQGWKHQ
SJBGXPSDOOWRRO%DFNXSDQG5HVWRUH6\VWHPZLGH%DFNXS8VLQJ EHJHWIXWXUHGDWDEDVHVIURPWKDWWHPSODWH
SJBGXPSDOO%DFNLQJXSV\VWHPZLGHREMHFWV6HUYHU%DFNXSSJBGXPSDOO 2FFDVLRQDOO\SUXQHH[WHQVLRQVWKDW\RXQRORQJHUQHHGWRDYRLGEORDW/HDYLQJ
ROGH[WHQVLRQV\RXGRQߞWQHHGPD\FDXVHSUREOHPVGXULQJDQLQSODFHXSJUDGH
SJBUHVWRUHWRRO6HOHFWLYH%DFNXS8VLQJSJBGXPS5HVWRULQJ'DWD8VLQJ VLQFHDOOH[WHQVLRQV\RXKDYHLQVWDOOHGPXVWEHDOVRLQVWDOOHGLQWKHQHZ
SJBUHVWRUH%DFNXSDQG5HVWRUH'DWDEDVH5HVWRUHSJBUHVWRUH 3RVWJUH64/YHUVLRQ\RXDUHXSJUDGLQJWR
SVTOWRRO5HVWRULQJ'DWD 7RVHHZKLFKH[WHQVLRQV\RXKDYHDOUHDG\LQVWDOOHGLQDGDWDEDVHFRQQHFWWRWKH
GDWDEDVHDQGUXQWKHTXHU\LQ([DPSOH<RXUOLVWFRXOGYDU\VLJQLILFDQWO\
WKLUGSDUW\WRROV%DFNXSDQG5HVWRUH IURPRXUV
%DUPDQWRRO%DFNXSDQG5HVWRUH ([DPSOH([WHQVLRQVLQVWDOOHGLQDGDWDEDVH
SELECT name, default_version, installed_version, left(comment,30) As comment
%DUWXQRY2OHJ5DQNLQJ5HVXOWV FROM pg_available_extensions
WHERE installed_version IS NOT NULL
EDVLF&7(V%DVLF&7(V ORDER BY name;
name | default_version | installed_version | comment
EDWFKMREVSJ$JHQWDQG,QVWDOOLQJSJ$JHQW ---------------+-----------------+-------------------+--------------------------------
btree_gist | 1.5 | 1.5 | support for indexing common da
fuzzystrmatch | 1.1 | 1.1 | determine similarities and dis
%'5ELGLUHFWLRQDOUHSOLFDWLRQ1RWDEOH3RVWJUH64/)RUNV hstore | 1.4 | 1.4 | data type for storing sets of
ogr_fdw | 1.0 | 1.0 | foreign-data wrapper for GIS d
%()25(WULJJHU7ULJJHUVDQG7ULJJHU)XQFWLRQV pgrouting | 2.4.1 | 2.4.1 | pgRouting Extension
plpgsql | 1.0 | 1.0 | PL/pgSQL procedural language
%(7:((1RSHUDWRU'DWHWLPH2SHUDWRUVDQG)XQFWLRQV plv8 | 1.4.10 | 1.4.10 | PL/JavaScript (v8) trusted pro
postgis | 2.4.0dev | 2.4.0dev | PostGIS geometry, geography, a
ELGLUHFWLRQDOUHSOLFDWLRQ%'51RWDEOH3RVWJUH64/)RUNV (8 rows)
,I\RXZDQWWRVHHDOOWKHH[WHQVLRQVLQVWDOOHGRQWKHVHUYHUUHJDUGOHVVRILIWKH\
ELJLQWGDWDW\SH6HULDOV
DUHLQVWDOOHGLQ\RXUFXUUHQWGDWDEDVHOHDYHRXWWKHWHERE installed_version
ELJVHULDOGDWDW\SH6HULDOV IS NOT NULL
%LJ64/WHFKQRORJ\*HWWLQJ6WDUWHG:LQGRZVDQG'HVNWRS/LQX[PDF26 7RJHWPRUHGHWDLOVDERXWDSDUWLFXODUH[WHQVLRQDOUHDG\LQVWDOOHGLQ\RXU
GDWDEDVHHQWHUWKHIROORZLQJFRPPDQGIURPSVTO
ELWPDSLQGH[VFDQ0XOWLFROXPQ,QGH[HV
\dx+ fuzzystrmatch UHIHUHQFLQJHOHPHQWVLQ5HIHUHQFLQJ(OHPHQWVLQDQ$UUD\
$OWHUQDWLYHO\H[HFXWHWKHIROORZLQJTXHU\ VOLFLQJDQGVSOLFLQJ$UUD\6OLFLQJDQG6SOLFLQJ
DXWRFRPPLWFRPPDQGV$XWRFRPPLW&RPPDQGV
([WHQVLRQVFDQLQFOXGHGDWDEDVHDVVHWVRIDOOW\SHVIXQFWLRQVWDEOHVGDWDW\SHV
FDVWVODQJXDJHVRSHUDWRUVHWFEXWIXQFWLRQVXVXDOO\FRQVWLWXWHWKHEXONRIWKH %
SD\ORDG
%7UHHLQGH[HV3RVWJUH64/6WRFN,QGH[HV2SHUDWRU&ODVVHV
,QVWDOOLQJ([WHQVLRQV %7UHH*,1LQGH[HV3RVWJUH64/6WRFN,QGH[HV
*HWWLQJDQH[WHQVLRQLQWR\RXUGDWDEDVHWDNHVWZRLQVWDOODWLRQVWHSV)LUVW %7UHH*L67LQGH[HV3RVWJUH64/6WRFN,QGH[HV
GRZQORDGWKHH[WHQVLRQDQGLQVWDOOLWRQWR\RXUVHUYHU6HFRQGLQVWDOOWKH
H[WHQVLRQLQWR\RXUGDWDEDVH EDFNUHIHUHQFLQJ5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
EDFNJURXQGZRUNHUVG\QDPLF)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
7,3
EDFNVODVK?5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
:HߞOOEHXVLQJWKHVDPHWHUPߚLQVWDOOߚWRUHIHUWRERWKSURFHGXUHVEXWGLVWLQJXLVKEHWZHHQWKH
LQVWDOODWLRQRQWKHVHUYHUDQGWKHLQVWDOODWLRQLQWRWKHGDWDEDVHZKHQWKHFRQWH[WLVXQFOHDU EDFNXSDQGUHVWRUH
DGGLQJXQLTXHNH\V8QLTXH&RQVWUDLQWV :HFRYHUERWKVWHSVLQWKLVVHFWLRQDVZHOODVKRZWRLQVWDOORQ3RVWJUH64/
YHUVLRQVSULRUWRH[WHQVLRQVXSSRUW
GURSSLQJSULPDU\NH\6DPSOH5XQVDQG2XWSXW
6WHS,QVWDOOLQJRQWKHVHUYHU
PRYLQJWDEOHV0RYLQJ2EMHFWV$PRQJ7DEOHVSDFHV
7KHLQVWDOODWLRQRIH[WHQVLRQVRQ\RXUVHUYHUYDULHVE\267KHRYHUDOOLGHDLVWR
XQORJJHGWDEOHVDQG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ GRZQORDGELQDU\ILOHVDQGUHTXLVLWHOLEUDULHVWKHQFRS\WKHUHVSHFWLYHELQDULHVWR
WKHELQDQGOLEIROGHUVDQGWKHVFULSWILOHVWRVKDUHH[WHQVLRQYHUVLRQVDQG
$/7(57$%/(63$&(FRPPDQG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
DERYHRUVKDUHFRQWULESULRUWRYHUVLRQ7KLVPDNHVWKHH[WHQVLRQDYDLODEOH
0RYLQJ2EMHFWV$PRQJ7DEOHVSDFHV5DQGRP3DJH&RVWDQG4XDOLW\RI'ULYHV IRUWKHVHFRQGVWHS
$/7(57<3(FRPPDQG7<3(2) )RUVPDOOHUSRSXODUH[WHQVLRQVPDQ\RIWKHUHTXLVLWHOLEUDULHVFRPH
SUHSDFNDJHGZLWK\RXU3RVWJUH64/LQVWDOODWLRQRUFDQEHHDVLO\UHWULHYHGXVLQJ
$PD]RQ5HGVKLIWGDWDZDUHKRXVH1RWDEOH3RVWJUH64/)RUNV
\XPRUDSWJHWSRVWJUHVTOFRQWULE)RURWKHUV\RXߞOOQHHGWRFRPSLOH\RXURZQ
DQGRSHUDWRU 764XHULHV ILQGLQVWDOOHUVWKDWVRPHRQHKDVDOUHDG\FUHDWHGRUFRS\WKHILOHVIURPDQRWKHU
HTXLYDOHQWVHUYHUVHWXS/DUJHUH[WHQVLRQVVXFKDV3RVW*,6FDQXVXDOO\EH
DQGRSHUDWRU 764XHULHV IRXQGDWWKHVDPHORFDWLRQZKHUH\RXGRZQORDGHG3RVWJUH64/7RYLHZDOO
H[WHQVLRQELQDULHVDOUHDG\DYDLODEOHRQ\RXUVHUYHUHQWHU
DQ\RIDUUD\RINH\VH[LVWVRSHUDWRU"_%LQDU\-621MVRQE
DSWBSRVWJUHVTOUHSRVLWRU\'HELDQ8EXQWX 6WHS,QVWDOOLQJLQWRDGDWDEDVH
DUFKLYHBFRPPDQGFRQILJXUDWLRQGLUHFWLYH&RQILJXULQJWKH0DVWHU 7KHH[WHQVLRQVXSSRUWPDNHVLQVWDOODWLRQRIDGGHGIHDWXUHVVLPSOH8VHWKH
&5($7((;7(16,21FRPPDQGWRLQVWDOOH[WHQVLRQVLQWRHDFKGDWDEDVH7KH
DUJXPHQWVLQIXQFWLRQV)XQFWLRQ%DVLFV WKUHHELJEHQHILWVDUHWKDW\RXGRQߞWKDYHWRILJXUHRXWZKHUHWKHH[WHQVLRQILOHV
DUHNHSWVKDUHH[WHQVLRQ\RXFDQXQLQVWDOOWKHPDWZLOOXVLQJ'523
DUUD\IXQFWLRQ$UUD\&RQVWUXFWRUV
(;7(16,21DQG\RXZLOOKDYHDUHDGLO\DYDLODEOHOLVWLQJRIZKDWLVLQVWDOOHG
DUUD\V DQGZKDWLVDYDLODEOH
3RVWJUH64/LQVWDOODWLRQSDFNDJHVDOUHDG\LQFOXGHWKHPRVWSRSXODUH[WHQVLRQV
DERXW$UUD\V
7RUHWULHYHDGGLWLRQDOH[WHQVLRQVYLVLWWKH3RVWJUH64/([WHQVLRQ1HWZRUN
$1<RSHUDWRUDQG$1<$UUD\6HDUFK <RXߞOODOVRILQGPDQ\3RVWJUH64/H[WHQVLRQVRQ*LW+XEE\VHDUFKLQJIRU
postgresql extension
FRQWDLQPHQWFKHFNVIRU$UUD\&RQWDLQPHQW&KHFNV
+HUHLVKRZZHZRXOGLQVWDOOWKHIX]]\VWUPDWFKH[WHQVLRQXVLQJ64/
FUHDWLQJ$UUD\&RQVWUXFWRUV
CREATE EXTENSION fuzzystrmatch;
SDVVLQJLQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
<RXFDQVWLOOLQVWDOODQH[WHQVLRQQRQLQWHUDFWLYHO\XVLQJSVTO0DNHVXUH\RXߞUH ZULWLQJLQ64/:ULWLQJ64/$JJUHJDWH)XQFWLRQV:ULWLQJ64/$JJUHJDWH
FRQQHFWHGWRWKHGDWDEDVHZKHUH\RXQHHGWKHH[WHQVLRQWKHQUXQ )XQFWLRQV
DJJUHJDWHV
:$51,1*
DERXW$JJUHJDWHV$JJUHJDWHV
&EDVHGH[WHQVLRQVPXVWEHLQVWDOOHGE\DVXSHUXVHU0RVWH[WHQVLRQVIDOOLQWRWKLVFDWHJRU\
),/7(5FODXVHDQG),/7(5&ODXVHIRU$JJUHJDWHV),/7(5&ODXVHIRU
$JJUHJDWHV
:HVWURQJO\VXJJHVW\RXFUHDWHRQHRUPRUHVFKHPDVWRKRXVHH[WHQVLRQVWRNHHS
WKHPVHSDUDWHIURPSURGXFWLRQGDWD$IWHU\RXFUHDWHWKHVFKHPDLQVWDOO 3/9DQG:ULWLQJ$JJUHJDWH)XQFWLRQVZLWK3/9
H[WHQVLRQVLQWRLWWKURXJKDFRPPDQGOLNHWKHIROORZLQJ
64/DQG:ULWLQJ64/$JJUHJDWH)XQFWLRQV:ULWLQJ64/$JJUHJDWH
CREATE EXTENSION fuzzystrmatch SCHEMA my_extensions; )XQFWLRQV
8SJUDGLQJWRWKHQHZH[WHQVLRQPRGHO ZLQGRZIXQFWLRQV:LQGRZ)XQFWLRQV25'(5%<
#VLJQVHOHFWLQJDWWULEXWHVRIHOHPHQWV4XHU\LQJ;0/'DWD &RPPRQ([WHQVLRQV
#!FRQWDLQVRSHUDWRU$UUD\&RQWDLQPHQW&KHFNV&RQWDLQVDQGFRQWDLQHGLQ 0DQ\H[WHQVLRQVFRPHSDFNDJHGZLWK3RVWJUH64/EXWDUHQRWLQVWDOOHGE\
GHIDXOW6RPHSDVWH[WHQVLRQVKDYHJDLQHGHQRXJKWUDFWLRQWREHFRPHSDUWRIWKH
RSHUDWRUV%LQDU\-621MVRQE
3RVWJUH64/FRUH,I\RXߞUHXSJUDGLQJIURPDQDQFLHQWYHUVLRQ\RXPD\JDLQ
##RSHUDWRU8VLQJ)XOO7H[W6HDUFK IXQFWLRQDOLW\ZLWKRXWQHHGLQJDQ\H[WHQVLRQV
General options:
6HOHFWLYH%DFNXS8VLQJSJBGXPS -c, --command=COMMAND run only single command (SQL or internal) and exit
-d, --dbname=DBNAME database name to connect to
)RUGD\WRGD\EDFNXSSJBGXPSLVPRUHH[SHGLWLRXVWKDQSJBGXPSDOOEHFDXVH -f, --file=FILENAME execute commands from file, then exit
SJBGXPSFDQVHOHFWLYHO\EDFNXSWDEOHVVFKHPDVDQGGDWDEDVHVSJBGXPSFDQ -l, --list list available databases, then exit
-v, --set=, --variable=NAME=VALUE
EDFNXSWRSODLQ64/DVZHOODVFRPSUHVVHG7$5DQGGLUHFWRU\IRUPDWV set psql variable NAME to VALUE
&RPSUHVVHG7$5DQGGLUHFWRU\IRUPDWEDFNXSVFDQWDNHDGYDQWDJHRIWKH (e.g., -v ON_ERROR_STOP=1)
-X, --no-psqlrc do not read startup file (~/.psqlrc)
SDUDOOHOUHVWRUHIHDWXUHRISJBUHVWRUH'LUHFWRU\EDFNXSVDOORZSDUDOOHOSJBGXPS -1 ("one"), --single-transaction
RIDODUJHGDWDEDVH%HFDXVHZHEHOLHYH\RXߞOOEHXVLQJSJBGXPSDVSDUWRI\RXU execute command file as a single transaction
\dA[+] [PATTERN] list access methods GDLO\UHJLPHQZHKDYHLQFOXGHGDIXOOGXPSRIWKHKHOSLQߡ'DWDEDVH%DFNXS
\db[+] [PATTERN] list tablespaces
\dc[S] [PATTERN] list conversions
8VLQJSJBGXPSߢVR\RXFDQVHHWKHP\ULDGVZLWFKHVLQDVLQJOHJODQFH
\dC [PATTERN] list casts
\dd[S] [PATTERN] show comments on objects
7KHQH[WH[DPSOHVGHPRQVWUDWHDIHZFRPPRQEDFNXSVFHQDULRVDQG
\ddp [PATTERN] list default privileges FRUUHVSRQGLQJSJBGXPSRSWLRQV7KH\VKRXOGZRUNIRUDQ\YHUVLRQRI
\dD[S] [PATTERN] list domains 3RVWJUH64/
\det[+] [PATTERN] list foreign tables
\des[+] [PATTERN] list foreign servers 7RFUHDWHDFRPSUHVVHGVLQJOHGDWDEDVHEDFNXS
\deu[+] [PATTERN] list user mappings
\dew[+] [PATTERN] list foreign-data wrappers
\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions pg_dump -h localhost -p 5432 -U someuser -F c -b -v -f [Link] mydb
\dF[+] [PATTERN] list text search configurations
\dFd[+] [PATTERN] list text search dictionaries 7RFUHDWHDSODLQWH[WVLQJOHGDWDEDVHEDFNXSLQFOXGLQJD&RSWLRQZKLFK
\dFp[+] [PATTERN] list text search parsers
\dFt[+] [PATTERN] list text search templates VWDQGVIRU&5($7('$7$%$6(
\dg[S+] [PATTERN] list roles
\di[S+] [PATTERN] list indexes pg_dump -h localhost -p 5432 -U someuser -C -F p -b -v -f [Link] mydb
\dl list large objects, same as \lo_list
\dL[S+] [PATTERN] list procedural languages
\dm[S+] [PATTERN] list materialized views 7RFUHDWHDFRPSUHVVHGEDFNXSRIWDEOHVZKRVHQDPHVVWDUWZLWKSD\LQDQ\
\dn[S+] [PATTERN] list schemas VFKHPD
\do[S] [PATTERN] list operators
\dO[S+] [PATTERN] list collations
\dp [PATTERN] list table, view, and sequence access privileges pg_dump -h localhost -p 5432 -U someuser -F c -b -v -t *.pay* -f [Link] mydb
\drds [PATRN1 [PATRN2]] list per-database role settings
\dRp[+] [PATTERN] list replication publications
\dRs[+] [PATTERN] list replication subscriptions 7RFUHDWHDFRPSUHVVHGEDFNXSRIDOOREMHFWVLQWKHhrDQGpayrollVFKHPDV
\ds[S+] [PATTERN] list sequences
\dt[S+] [PATTERN] list tables pg_dump -h localhost -p 5432 -U someuser -F c -b -v \
\dT[S+] [PATTERN] list data types -n hr -n payroll -f [Link] mydb
\du[S+] [PATTERN] list roles
\dv[S+] [PATTERN] list views
\dE[S+] [PATTERN] list foreign tables 7RFUHDWHDFRPSUHVVHGEDFNXSRIDOOREMHFWVLQDOOVFKHPDVH[FOXGLQJWKHSXEOLF
\dx[+] [PATTERN] list extensions VFKHPD
\dy [PATTERN] list event triggers
\l[+] list databases
\sf[+] FUNCNAME show a function's definition pg_dump -h localhost -p 5432 -U someuser -F c -b -v -N public \
\sv[+] VIEWNAME show a view's definition -f all_sch_except_pub.backup mydb
\z [PATTERN] same as \dp
Formatting 7RFUHDWHDSODLQWH[W64/EDFNXSRIVHOHFWWDEOHVXVHIXOIRUSRUWLQJVWUXFWXUH
\a toggle between unaligned and aligned output mode
\C [STRING] set table title, or unset if none DQGGDWDWRORZHUYHUVLRQVRI3RVWJUH64/RUQRQ3RVWJUH64/GDWDEDVHVSODLQ
\f [STRING] show or set field separator for unaligned query output WH[WJHQHUDWHVDQ64/VFULSWWKDW\RXFDQUXQRQDQ\V\VWHPWKDWVSHDNV64/
\H toggle HTML output mode (currently off)
\pset NAME [VALUE] set table output option
(NAME := {format|border|expanded|fieldsep|fieldsep_zero pg_dump -h localhost -p 5432 -U someuser -F p --column-inserts \
| footer|null| -f select_tables.backup mydb
numericlocale|recordsep|tuples_only|title|tableattr|pager
7,3 SVTO,QWHUDFWLYH&RPPDQGV
,I\RXUILOHSDWKVFRQWDLQVSDFHVRURWKHUFKDUDFWHUVWKDWFRXOGWKURZRIIWKHFRPPDQGOLQH
LQWHUSUHWHUZUDSWKHILOHSDWKLQGRXEOHTXRWHV"/path with spaces/[Link]"$VD
([DPSOH%OLVWVFRPPDQGVDYDLODEOHLQSVTOZKHQ\RXODXQFKDQLQWHUDFWLYH
JHQHUDOUXOH\RXFDQDOZD\VXVHGRXEOHTXRWHVLI\RXDUHQߞWVXUH VHVVLRQ)RUH[DPSOHVRIXVDJHVHHߡ(QYLURQPHQW9DULDEOHVߢDQGߡ,QWHUDFWLYH
YHUVXV1RQLQWHUDFWLYHSVTOߢ
([DPSOH%*HWWLQJDOLVWRILQWHUDFWLYHSVTOFRPPDQGV
7KHGLUHFWRU\IRUPDWRSWLRQZDVLQWURGXFHGLQYHUVLRQ3RVWJUH64/7KLV
\?
RSWLRQEDFNVXSHDFKWDEOHDVDVHSDUDWHILOHLQDIROGHUDQGJHWVDURXQGILOHVL]H General
OLPLWDWLRQV7KLVRSWLRQLVWKHRQO\SJBGXPSEDFNXSIRUPDWRSWLRQWKDWUHVXOWVLQ \copyright show PostgreSQL usage and distribution terms
\errverbose show most recent error message at maximum verbosity
PXOWLSOHILOHVDVVKRZQLQ([DPSOH,WFUHDWHVDQHZGLUHFWRU\DQG \g [FILE] or ; execute query (and send results to file or |pipe)
SRSXODWHVLWZLWKDJ]LSSHGILOHIRUHDFKWDEOHDOVRLQFOXGHGLVDILOHOLVWLQJWKH \gexec execute query, then execute each value in its result
KLHUDUFK\7KLVEDFNXSFRPPDQGH[LWVZLWKDQHUURULIWKHGLUHFWRU\DOUHDG\ \gset [PREFIX] execute query and store results in psql variables
\h [NAME] help on syntax of SQL commands, * for all commands
H[LVWV \gx [FILE] as \g, but forces expanded output mode
\q quit psql
([DPSOH'LUHFWRU\IRUPDWEDFNXS \crosstabview [COLUMNS] execute query and display results in crosstab
pg_dump -h localhost -p 5432 -U someuser -F d -f /somepath/a_directory mydb \watch [SEC] execute query every SEC seconds
Help
$SDUDOOHOEDFNXSRSWLRQZDVLQWURGXFHGLQYHUVLRQXVLQJWKH--jobsRU-j \? [commands] show help on backslash commands
\? options show help on psql command-line options
RSWLRQDQGVSHFLI\LQJWKHQXPEHURIMREV)RUH[DPSOH--jobs=3-j 3UXQV \? variables show help on special variables
WKUHHEDFNXSVLQSDUDOOHO3DUDOOHOEDFNXSPDNHVVHQVHRQO\ZLWKWKHGLUHFWRU\ \h [NAME] help on syntax of SQL commands, * for all commands
Query Buffer
IRUPDWRSWLRQEHFDXVHLWߞVWKHRQO\EDFNXSZKHUHPXOWLSOHILOHVDUHFUHDWHG \e [FILE] [LINE] edit the query buffer (or file) with external editor
([DPSOHGHPRQVWUDWHVLWVXVH \ef [FUNCNAME [LINE]] edit function definition with external editor
\ev [VIEWNAME [LINE]] edit view definition with external editor
([DPSOH'LUHFWRU\IRUPDWSDUDOOHOEDFNXS \p show the contents of the query buffer
pg_dump -h localhost -p 5432 -U someuser -j 3 -Fd -f /somepath/a_directory mydb \r reset (clear) the query buffer
\w FILE write query buffer to file
Input/Output
6\VWHPZLGH%DFNXS8VLQJSJBGXPSDOO \copy ... perform SQL COPY with data stream to the client host
\echo [STRING] write string to standard output
8VHWKHSJBGXPSDOOXWLOLW\WREDFNXSDOOGDWDEDVHVRQDVHUYHULQWRDVLQJOH \i FILE execute commands from file
\ir FILE as \i, but relative to location of current script
SODLQWH[WILOH7KLVFRPSUHKHQVLYHEDFNXSDXWRPDWLFDOO\LQFOXGHVVHUYHUJOREDOV \o [FILE] send all query results to file or |pipe
VXFKDVWDEOHVSDFHGHILQLWLRQVDQGUROHV6HHߡ6HUYHU%DFNXSSJBGXPSDOOߢIRUD \qecho [STRING] write string to query output stream (see \o)
Conditional
OLVWLQJRIDYDLODEOHSJBGXPSDOOFRPPDQGRSWLRQV \if EXPR begin conditional block
\elif EXPR alternative within current conditional block
,WߞVDJRRGLGHDWREDFNXSJOREDOVRQDGDLO\EDVLV$OWKRXJK\RXFDQXVH \else final alternative within current conditional block
SJBGXPSDOOWREDFNXSGDWDEDVHVDVZHOOZHSUHIHUEDFNLQJXSGDWDEDVHV \endif end conditional block
LQGLYLGXDOO\XVLQJSJBGXPSRUXVLQJSJBEDVHEDFNXSWRGRD3RVWJUH64/ Informational
(options: S = show system objects, + = additional detail)
VHUYLFHOHYHOEDFNXS5HVWRULQJIURPDKXJHSODLQWH[WEDFNXSWULHVRXUSDWLHQFH \d[S+] list tables, views, and sequences
8VLQJSJBEDVHEDFNXSLQFRQMXQFWLRQZLWKVWUHDPLQJUHSOLFDWLRQLVWKHIDVWHVW \d[S+] NAME describe table, view, sequence, or index
\da[S] [PATTERN] list aggregates
-a, --data-only restore only the data, no schema ZD\WRUHFRYHUIURPPDMRUVHUYHUIDLOXUH
-c, --clean clean (drop) database objects before recreating
-C, --create create the target database 7REDFNXSDOOJOREDOVDQGWDEOHVSDFHGHILQLWLRQVRQO\XVHWKHIROORZLQJ
-e, --exit-on-error exit on error, default is to continue
-I, --index=NAME restore named index
-j, --jobs=NUM use this many parallel jobs to restore pg_dumpall -h localhost -U postgres --port=5432 -f [Link] --globals-only
-L, --use-list=FILENAME use table of contents from this file for
selecting/ordering output 7REDFNXSVSHFLILFJOREDOVHWWLQJVXVHWKHIROORZLQJ
-n, --schema=NAME restore only objects in this schema
-N, --exclude-schema=NAME do not restore objects in this schema
-O, --no-owner skip restoration of object ownership pg_dumpall -h localhost -U postgres --port=5432 -f [Link] --roles-only
-P, --function=NAME(args) restore named function
-s, --schema-only restore only the schema, no data
-S, --superuser=NAME superuser user name to use for disabling triggers 5HVWRULQJ'DWD
-t, --table=NAME restore named relation (table, view, etc.)
-T, --trigger=NAME restore named trigger 7KHUHDUHWZRZD\VWRUHVWRUHGDWDLQ3RVWJUH64/IURPEDFNXSVFUHDWHGZLWK
-x, --no-privileges skip restoration of access privileges (grant/revoke) SJBGXPSRUSJBGXPSDOO
-1, --single-transaction restore as a single transaction
--enable-row-security enable row security 8VHSVTOWRUHVWRUHSODLQWH[WEDFNXSVJHQHUDWHGZLWKSJBGXPSDOORU
--disable-triggers disable triggers during data-only restore
--no-data-for-failed-tables do not restore data of tables that could not be SJBGXPS
created
--no-publications do not restore publications 8VHSJBUHVWRUHWRUHVWRUHFRPSUHVVHG7$5DQGGLUHFWRU\EDFNXSVFUHDWHG
--no-security-labels do not restore security labels ZLWKSJBGXPS
--no-subscriptions do not restore subscriptions
--no-tablespaces do not restore tablespace assignments
--section=SECTION restore named section (pre-data, data, or post-data) 8VLQJSVTOWRUHVWRUHSODLQWH[W64/EDFNXSV
--strict-names require table and/or schema include patterns to
match at least one entity each $SODLQ64/EDFNXSLVQRWKLQJPRUHWKDQDWH[WILOHFRQWDLQLQJDKHIW\64/
--use-set-session-authorization VFULSW,WߞVWKHOHDVWFRQYHQLHQWEDFNXSWRKDYHEXWLWߞVWKHPRVWYHUVDWLOH:LWK
use SET SESSION AUTHORIZATION commands instead of
ALTER OWNER commands to set ownership
64/EDFNXS\RXPXVWH[HFXWHWKHHQWLUHVFULSW<RXFDQߞWFKHUU\SLFNREMHFWV
XQOHVV\RXߞUHZLOOLQJWRPDQXDOO\HGLWWKHILOH5XQDOORIWKHIROORZLQJH[DPSOHV
Connection options: IURPWKH26FRQVROHRUSVTO
-h, --host=HOSTNAME database server host or socket directory
-p, --port=PORT database server port number 7RUHVWRUHDEDFNXSDQGLJQRUHHUURUV
-U, --username=NAME connect as specified database user
-w, --no-password never prompt for password
-W, --password force password prompt (should happen automatically) psql -U postgres -f [Link]
--role=ROLENAME do SET ROLE before restore
7RUHVWRUHVWRSSLQJLIDQ\HUURULVIRXQG
1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/
1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/3ULRUWRWKH-tRSWLRQ psql -U postgres --set ON_ERROR_STOP=on -f [Link]
PDWFKHGRQO\WDEOHV,QLWZDVFKDQJHGWRDOVRPDWFKIRUHLJQWDEOHV
YLHZVPDWHULDOL]HGYLHZVDQGVHTXHQFHV 7RUHVWRUHWRDVSHFLILFGDWDEDVH
1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/
psql -U postgres -d mydb -f select_objects.sql
8VLQJSJBUHVWRUH --no-sync do not wait for changes to be written safely to disk
--no-tablespaces do not dump tablespace assignments
,I\RXEDFNHGXSXVLQJSJBGXPSDQGFKRVHDIRUPDWVXFKDV7$5FXVWRPRU --no-unlogged-table-data do not dump unlogged table data
--no-role-passwords do not dump passwords for roles
GLUHFWRU\\RXKDYHWRXVHWKHSJBUHVWRUHXWLOLW\WRUHVWRUHSJBUHVWRUHSURYLGHVD
--quote-all-identifiers quote all identifiers, even if not keywords
GL]]\LQJDUUD\RIRSWLRQVIDUVXUSDVVLQJWKHUHVWRUHXWLOLW\IRXQGLQRWKHU --use-set-session-authorization
GDWDEDVHSURGXFWVZHߞYHXVHG6RPHRILWVRXWVWDQGLQJIHDWXUHVLQFOXGH use SET SESSION AUTHORIZATION commands instead o
ALTER OWNER commands to set ownership
<RXFDQSHUIRUPSDUDOOHOUHVWRUHVXVLQJWKH-jHTXLYDOHQWWR--jobs=RSWLRQ Connection options:
WRLQGLFDWHWKHQXPEHURIWKUHDGVWRXVH7KLVDOORZVHDFKWKUHDGWRUHVWRUHD -d, --dbname=CONNSTR connect using connection string
VHSDUDWHWDEOHVLPXOWDQHRXVO\VLJQLILFDQWO\SLFNLQJXSWKHSDFHRIZKDWFRXOG -h, --host=HOSTNAME database server host or socket directory
-l, --database=DBNAME alternative default database
RWKHUZLVHEHDOHQJWK\SURFHVV -p, --port=PORT database server port number
-U, --username=NAME connect as specified database user
<RXFDQXVHSJBUHVWRUHWRJHQHUDWHDWDEOHRIFRQWHQWVILOHIURP\RXUEDFNXS -w, --no-password never prompt for password
ILOHWRFKHFNZKDWKDVEHHQEDFNHGXS<RXFDQDOVRHGLWWKLVWDEOHRIFRQWHQWV -W, --password force password prompt (should happen automatically)
--role=ROLENAME do SET ROLE before dump
DQGXVHWKHUHYLVHGILOHWRFRQWUROZKDWJHWVUHVWRUHG
If -f/--file is not used, then the SQL script will be written to the standard
SJBUHVWRUHDOORZV\RXWRVHOHFWLYHO\UHVWRUHHYHQIURPZLWKLQDEDFNXSRID output.
IXOOGDWDEDVH,I\RXMXVWQHHGRQHWDEOHUHVWRUHG\RXFDQGRWKDW
1HZLQ3RVWJUH64/
SJBUHVWRUHLVEDFNZDUGFRPSDWLEOHIRUWKHPRVWSDUW<RXFDQEDFNXSD
GDWDEDVHRQDQROGHUYHUVLRQRI3RVWJUH64/DQGUHVWRUHWRDQHZHUYHUVLRQ
'DWDEDVH5HVWRUHSJBUHVWRUH
6HHߡ'DWDEDVH5HVWRUHSJBUHVWRUHߢIRUDOLVWLQJRISJBUHVWRUHRSWLRQV
8VHpg_restoreWRUHVWRUHEDFNXSILOHVLQWDUFXVWRPRUGLUHFWRU\IRUPDWV
7RSHUIRUPDUHVWRUHXVLQJSJBUHVWRUHILUVWFUHDWHWKHGDWDEDVHDQHZXVLQJ64/
FUHDWHGXVLQJpg_dump([DPSOH%VKRZVWKHpg_restoreKHOSRXWSXW6HH
CREATE DATABASE mydb;
ߡ5HVWRULQJ'DWDߢIRUPRUHH[DPSOHV
([DPSOH%SJBUHVWRUHKHOS
7KHQUHVWRUH pg_restore --help
pg_restore restores a PostgreSQL database from an archive created by pg_dump.
pg_restore --dbname=mydb --jobs=4 --verbose [Link] Usage:
pg_restore [OPTION]... [FILE]
127( %LJ64/PDLQWDLQVDQHDV\WRXVHRQHVWHSLQVWDOOHUIRUPDF26ELWXVHUV
)RUDGGRQV%LJ64/RIIHUVDFRPPDQGOLQHWRROFDOOHGSJFDQGDSJ'HYRSV
,QYHUVLRQWKHSJB[ORJIROGHUZDVUHQDPHGWRSJBZDODQGSJBFORJZDVUHQDPHGWRSJB[DFW
WRSUHYHQWSHRSOHIURPWKLQNLQJWKHVHDUHORJIROGHUVZKHUHFRQWHQWVFDQEHGHOHWHGZLWKRXW ZHEEURZVHULQWHUIDFHZKLFKZHFRYHUHGLQߡ:LQGRZVDQG'HVNWRS/LQX[ߢ
GHVWUXFWLYHFRQVHTXHQFHV DQGIURPZKLFK\RXFDQLQVWDOOSRSXODUH[WHQVLRQVGULYHUVODQJXDJHVDQG
DGPLQLVWUDWLRQWRROV%LJ64/FXUUHQWO\LQFOXGHV3/9IRUQRQ:LQGRZV
+RPHEUHZLVDPDF26SDFNDJHPDQDJHUIRUPDQ\WKLQJV3RVWJUH64/
'RQߞW*UDQW)XOO26$GPLQLVWUDWLYH3ULYLOHJHVWRWKH
3RVWJUH64/+RPHEUHZDQG<RXSURYLGHVLQVWUXFWLRQVIRULQVWDOOLQJ
3RVWJUHV6\VWHP$FFRXQWSRVWJUHV
3RVWJUH64/XVLQJ+RPHEUHZ<RXߞOOILQGRWKHUDUWLFOHVDWWKH+RPHEUHZ
0DQ\SHRSOHDUHXQGHUWKHPLVFRQFHSWLRQWKDWWKHSRVWJUHVDFFRXQWQHHGVWR 3RVWJUH64/:LNL
KDYHIXOODGPLQLVWUDWLYHSULYLOHJHVWRWKHVHUYHU,QIDFWGHSHQGLQJRQ\RXU
3RVWJUH64/YHUVLRQLI\RXJLYHWKHSRVWJUHVDFFRXQWIXOODGPLQLVWUDWLYH 3RVWJUHVDSSGLVWULEXWHGE\+HURNXLVDIUHHGHVNWRSGLVWULEXWLRQWRXWHGDV
SULYLOHJHVWRWKHVHUYHU\RXUGDWDEDVHVHUYHUPLJKWQRWHYHQVWDUW WKHHDVLHVWZD\WRJHWVWDUWHGZLWK3RVWJUH64/RQWKH0DF,WXVXDOO\
PDLQWDLQVWKHODWHVWYHUVLRQRI3RVWJUH64/EXQGOHGZLWKSRSXODUH[WHQVLRQV
7KHSRVWJUHVDFFRXQWVKRXOGDOZD\VEHFUHDWHGDVDUHJXODUV\VWHPXVHULQWKH VXFKDV3RVW*,63/3\WKRQDQG3/93RVWJUHVDSSUXQVDVDVWDQGDORQH
26ZLWKSULYLOHJHVMXVWWRWKHGDWDFOXVWHUDQGDGGLWLRQDOWDEOHVSDFHIROGHUV0RVW DSSOLFDWLRQWKDW\RXFDQVWRSDQGVWDUWDVQHHGHGPDNLQJLWVXLWDEOHIRU
LQVWDOOHUVZLOOVHWXSWKHFRUUHFWSHUPLVVLRQVZLWKRXW\RXQHHGLQJWRZRUU\'RQߞW GHYHORSPHQWRUVLQJOHXVHUV
WU\WRGRSRVWJUHVDQ\IDYRUVE\JLYLQJLWPRUHDFFHVVWKDQLWQHHGV*UDQWLQJ
XQQHFHVVDU\DFFHVVOHDYHV\RXUV\VWHPYXOQHUDEOHLI\RXIDOOYLFWLPWRDQ64/ 0DF3RUWVLVDPDF26SDFNDJHGLVWULEXWLRQIRUFRPSLOLQJLQVWDOOLQJDQG
LQMHFWLRQDWWDFN XSJUDGLQJPDQ\RSHQVRXUFHSDFNDJHV,WߞVWKHROGHVWRIWKHPDF26
GLVWULEXWLRQV\VWHPVWKDWFDUULHV3RVWJUH64/
7KHUHDUHFDVHVZKHUH\RXߞOOQHHGWRJLYHWKHSRVWJUHVDFFRXQWZULWHGHOHWHUHDG
ULJKWVWRIROGHUVRUH[HFXWDEOHVRXWVLGHRIWKHGDWDFOXVWHU:LWKVFKHGXOHGMREV )LQNLVDPDF26'DUZLQSDFNDJHGLVWULEXWLRQEDVHGRQWKH'HELDQDSWJHW
WKDWH[HFXWHEDWFKILOHVDQG)':VWKDWKDYHIRUHLJQWDEOHVLQILOHVWKLVQHHG LQVWDOODWLRQIUDPHZRUN
RIWHQDULVHV3UDFWLFHUHVWUDLQWDQGEHVWRZRQO\WKHPLQLPXPDFFHVVQHFHVVDU\WR
JHWWKHMREGRQH
'RQߞW6HWVKDUHGBEXIIHUV7RR+LJK
/RDGLQJXS\RXUVHUYHUZLWK5$0GRHVQߞWPHDQ\RXFDQVHWWKHVKDUHGBEXIIHUV
DVKLJKDV\RXUSK\VLFDO5$07U\LWDQG\RXUVHUYHUPD\FUDVKRUUHIXVHWR
VWDUW,I\RXDUHUXQQLQJ3RVWJUH64/RQELW:LQGRZVVHWWLQJLWKLJKHUWKDQ
0%RIWHQUHVXOWVLQLQVWDELOLW\:LWKELW:LQGRZV\RXFDQSXVKWKH
<RXFDQLQVWDOOWKHODWHVWVWDEOHDQGGHYHORSPHQWYHUVLRQVRI3RVWJUH64/RQ HQYHORSHKLJKHUDQGFDQHYHQH[FHHG*%ZLWKRXWDQ\LVVXHV2QVRPH/LQX[
ERWK'HELDQDQG8EXQWXIURPWKHDSWSRVWJUHVTOUHSRVLWRU\DSWBSRVWJUHVTOLVD V\VWHPVVKDUHGBEXIIHUVFDQߞWEHKLJKHUWKDQWKH6+00$;YDULDEOHZKLFKLV
UHSRVLWRU\VLPLODUWR\XPSRVWJUHVTOWKDWLVPDLQWDLQHGE\WKH3RVWJUH64/ XVXDOO\TXLWHORZ
GHYHORSPHQWJURXS7KHODWHVWVWDEOHYHUVLRQLVJHQHUDOO\DOVRDYDLODEOHYLDWKH
3RVWJUH64/FKDQJHGKRZNHUQHOPHPRU\LVXVHGVRWKDWPDQ\RIWKHLVVXHV
GHIDXOW8EXQWXDQG'HELDQUHSRV$W\SLFDOLQVWDOODWLRQFRPPDQGORRNVOLNH
SHRSOHUDQLQWRZLWKOLPLWDWLRQVLQSULRUYHUVLRQVDUHQRORQJHULVVXHV<RXFDQ
ILQGPRUHGHWDLOVLQ.HUQHO5HVRXUFHV
sudo apt-get install postgresql-9.6
,I\RXSODQWRFRPSLOHDGGRQV\RXGRQߞWILQGOLVWHGLQWKHUHSR\RXQHHGWRDOVR 'RQߞW7U\WR6WDUW3RVWJUH64/RQD3RUW$OUHDG\LQ8VH
LQVWDOOWKHSRVWJUHVTOVHUYHUGHY ,I\RXWU\WRVWDUW3RVWJUH64/RQDSRUWWKDWߞVDOUHDG\LQXVH\RXߞOOVHHHUURUVLQ
\RXUSJBORJILOHVRIWKHIRUPmake sure PostgreSQL is not already
sudo apt-get install postgresql-server-dev-9.6
running+HUHDUHWKHFRPPRQUHDVRQVZK\WKLVKDSSHQV
,I\RXUUHSRVLWRU\GRHVQߞWKDYHWKHODWHVWYHUVLRQRI3RVWJUH64/WU\YLVLWLQJWKH
<RXߞYHDOUHDG\VWDUWHGWKHSRVWJUHVVHUYLFH
$SW3RVWJUH64/SDFNDJHVIRUWKHODWHVWVWDEOHDQGEHWDUHOHDVHV,WDOVRRIIHUV
DGGLWLRQDOSDFNDJHVVXFKDV3/9DQG3RVW*,6,WJHQHUDOO\VXSSRUWVWKHODWHVW <RXDUHWU\LQJWRUXQ3RVWJUH64/RQDSRUWDOUHDG\LQXVHE\DQRWKHUVHUYLFH
WZRRUWKUHHYHUVLRQVRI'HELDQDQG8EXQWX
<RXUSRVWJUHVVHUYLFHKDGDVXGGHQVKXWGRZQDQG\RXKDYHDQRUSKDQ
SRVWJUHVTOSLGILOHLQWKHGDWDIROGHU'HOHWHWKHILOHDQGWU\DJDLQ
)UHH%6' <RXKDYHDQRUSKDQHG3RVWJUH64/SURFHVV:KHQDOOHOVHIDLOVNLOODOO
)UHH%6'LVDSRSXODUSODWIRUPIRU3RVWJUH64/<RXFDQILQGWKHODWHVWYHUVLRQV UXQQLQJ3RVWJUH64/SURFHVVHVDQGWKHQWU\VWDUWLQJDJDLQ
RI3RVWJUH64/DW)UHH%6'DQGLQVWDOOLWYLDWKH)UHH%6'SRUWVSDFNDJH
PDQDJHPHQWV\VWHP
PDF26
:HߞYHVHHQDYDULHW\RIZD\VWRLQVWDOO3RVWJUH64/RQ0DFV%RWK(QWHUSULVH'%
DQG%LJ64/RIIHUDQLQVWDOOHU7KH+RPHEUHZSDFNDJHPDQDJHULVJDLQLQJ
SRSXODULW\DQGDWWUDFWVDGYDQFHG0DFXVHUV3RVWJUHVDSSLVDYDULDQWGLVWULEXWHG
E\+HURNXWKDWLVYHU\SRSXODUZLWKQRYLFHXVHUV7KHORQJVWDQGLQJ0DF3RUWV
DQG)LQNGLVWULEXWLRQVDUHVWLOODURXQG:HGRDGYLVHDJDLQVWPL[LQJLQVWDOOHUVIRU
0DFXVHUV)RULQVWDQFHLI\RXLQVWDOOHG3RVWJUH64/XVLQJ%LJ64/GRQߞWJRWR
(QWHUSULVH'%WRJHWDGGRQV
7KHIROORZLQJOLVWGHVFULEHVHDFKRIWKHVHRSWLRQV
SJDGPLQDQGWKHDELOLW\WRLQVWDOODQGPRQLWRUELJVTOSDFNDJHV
&KDSWHUSVTO $IWHU\RXLQVWDOOLW\RXZRXOGGR
PSQL_HISTORY )RUDGYHQWXURXV/LQX[XVHUVGRZQORDGWKHODWHVW3RVWJUH64/LQFOXGLQJWKH
GHYHORSPHQWDOYHUVLRQVE\JRLQJWRWKH3RVWJUH64/<XPUHSRVLWRU\1RWRQO\
6HWVWKHQDPHRIWKHSVTOKLVWRU\ILOHWKDWOLVWVDOOFRPPDQGVH[HFXWHGLQWKH ZLOO\RXILQGWKHFRUHVHUYHUEXW\RXFDQDOVRUHWULHYHSRSXODUDGGRQV
UHFHQWSDVW7KHGHIDXOWLVaSVTOBKLVWRU\ 3RVWJUH64/GHYHORSHUVPDLQWDLQWKLVUHSRVLWRU\DQGUHOHDVHSDWFKHVDQGXSGDWHV
PSQLRC DVVRRQDVWKH\DUHDYDLODEOH7KH3RVWJUH64/<XPUHSRVLWRU\JHQHUDOO\
PDLQWDLQVXSGDWHGSDFNDJHVIRUWKHQHZHVWVWDEOH3RVWJUH64/IRU࠺YHUVLRQV
6SHFLILHVWKHORFDWLRQDQGQDPHRIDFXVWRPFRQILJXUDWLRQILOH6KRXOG\RX RI&HQW265HG+DW(/)HGRUD6FLHQWLILF/LQX[$PD]RQ$0,DQG2UDFOH
GHFLGHWRFUHDWHWKLVILOH\RXFDQSODFHPRVWRI\RXUVHWWLQJVLQKHUH$W (QWHUSULVH,I\RXKDYHROGHUYHUVLRQVRIWKH26RUVWLOOQHHGROGHU3RVWJUH64/
VWDUWXSSVTOZLOOUHDGVHWWLQJVIURP\RXUFRQILJXUDWLRQILOHEHIRUHORDGLQJ YHUVLRQVWKDWKDYHUHDFKHG(2/FKHFNWKHGRFXPHQWDWLRQWRVHHZKDWUHSRVLWRU\
GHIDXOWYDOXHVDQG\RXUILOHߞVVHWWLQJVZLOORYHUULGHWKHGHIDXOWV VWLOOPDLQWDLQV)RUGHWDLOHGLQVWDOODWLRQLQVWUXFWLRQVXVLQJ<80UHIHUWRWKH
,I\RXRPLWWKHSDUDPHWHUVZKHQVWDUWLQJSVTODQGIDLOHGWRLQLWLDOL]HHQYLURQPHQW <XPVHFWLRQRIRXU3RVWJUHV2Q/LQHMRXUQDOVLWH
YDULDEOHVSVTOZLOOXVHWKHVWDQGDUGGHIDXOWV
'HELDQ8EXQWX
ZKLFKVWDQGVIRUߡSUHWW\JRRGFRPPDQGOLQHߢ7KHSJFSDFNDJHPDQDJHPHQW
127(
WRROIROORZVWKHVDPHSDWWHUQDV/LQX[\XPDSWJHWHWFHYHQRQ:LQGRZV6R
WRLQVWDOOQHZSDFNDJHVVWDUWE\RSHQLQJXSDVKHOOSURPSWDQGFKDQJLQJWKH ,I\RXXVHSJ$GPLQRQFHFRQQHFWHGWRDGDWDEDVH\RXFDQFOLFNDQLFRQWRRSHQXSSVTOZLWK
WKHVDPHSDUDPHWHUV\RXKDYHLQSJ$GPLQ
GLUHFWRU\WRWKHIROGHUZKHUH\RXLQVWDOOHG%LJ64/
7RXSGDWH\RXUORFDOOLVWRISDFNDJHVDQGVHHOLVWRISDFNDJHV
9RLO :HKDYHRXUUHVSRQVH
title :KHQ\RXODXQFKSVTOQRZWKHUHVXOWRIH[HFXWLQJWKHFRQILJXUDWLRQILOHHFKRHV
--------------------- WRWKHVFUHHQ
PostgreSQL 10 Roadmap
PostgreSQL: Roadmap
(2 rows) Null display is "NULL".
Timing is on. IMPORT FOREIGN SCHEMA "Housing"
Pager is always used. FROM SERVER ogr_fdw_ff INTO ff
psql (9.6beta3) OPTIONS(launder_table_names 'false', launder_column_names 'false');
Type "help" for help.
postgres@localhost:5442 postgresql_book#
7KLVFUHDWHVWKHWDEOHVZLWKQDPHV+RXVLQJBDQG+RXVLQJBZKHUHWKH
FROXPQQDPHVRIWKHWDEOHVZRXOGDSSHDULQWKHVDPHFDVHDVWKH\DUHLQWKH
6RPHFRPPDQGVZRUNRQO\RQ/LQX[8QL[V\VWHPVZKLOHRWKHUVZRUNRQO\RQ
KHDGHURIWKHILOHV
:LQGRZV,QHLWKHU26\RXVKRXOGXVHWKH/LQX[8QL[࠺VW\OHVODVKIRUZDUG
VODVKIRUSDWK,I\RXZDQWWRE\SDVVWKHFRQILJXUDWLRQILOHDQGVWDUWSVTOZLWKDOO
LWVGHIDXOWVVWDUWLWZLWKWKH-XRSWLRQ 4XHU\LQJ1RQFRQYHQWLRQDO'DWD6RXUFHV
<RXFDQFKDQJHVHWWLQJVRQWKHIO\ZKLOHLQSVTOWKRXJKWKHFKDQJHZLOORQO\EH 7KHGDWDEDVHZRUOGGRHVQRWDSSHDUWREHJHWWLQJPRUHKRPRJHQHRXV([RWLF
LQHIIHFWGXULQJ\RXUSVTOVHVVLRQ7RUHPRYHDFRQILJXUDWLRQYDULDEOHRUVHWLW GDWDEDVHVDUHVSDZQHGIDVWHUWKDQYLULOHHOHSKDQWV6RPHDUHIDGVDQGTXLFNO\
EDFNWRWKHGHIDXOWLVVXHWKH\unsetFRPPDQGIROORZHGE\WKHVHWWLQJDVLQ GURZQLQWKHLURZQK\SH6RPHDVSLUHWRGHWKURQHUHODWLRQDOGDWDEDVHV
\unset qstat92 DOWRJHWKHU6RPHFRXOGKDUGO\EHFRQVLGHUHGGDWDEDVHV7KHLQWURGXFWLRQRI
)':VLVLQSDUWDUHVSRQVHWRWKHJURZLQJGLYHUVLW\)':DVVLPLODWHVZLWKRXW
:KHQXVLQJsetNHHSLQPLQGWKDWWKHYDULDEOH\RXVHWLVFDVHVHQVLWLYH8VHDOO FRPSURPLVLQJWKH3RVJUH64/FRUH
FDSVWRVHWV\VWHPRSWLRQVDQGORZHUFDVHIRU\RXURZQYDULDEOHV,Q([DPSOH
,QWKLVQH[WH[DPSOHZHߞOOGHPRQVWUDWHKRZWRXVHWKHwww_fdw)':WRTXHU\
PROMPT1LVDV\VWHPVHWWLQJIRUKRZWKHSVTOSURPSWVKRXOGDSSHDUZKHUHDV
ZHEVHUYLFHV:HERUURZHGWKHH[DPSOHIURPZZZBIGZ([DPSOHV
qstats92LVDYDULDEOHLQLWLDOL]HGDVVKRUWKDQGWRGLVSOD\FXUUHQWDFWLYLWLHVRQWKH
3RVWJUH64/VHUYHU 7KHwww_fdw)':LVQRWJHQHUDOO\SDFNDJHGZLWK3RVWJUH64/,I\RXDUHRQ
/LQX[8QL[LWߞVDQHDV\FRPSLOHLI\RXKDYHWKHpostgresql-devSDFNDJH
&XVWRP3URPSWV LQVWDOOHGDQGFDQGRZQORDGWKHODWHVWVRXUFH:HGLGWKHZRUNRIFRPSLOLQJIRU
VRPH:LQGRZVSODWIRUPV\RXFDQGRZQORDGRXUELQDULHVIURP:LQGRZV
,I\RXVSHQG\RXUZDNLQJKRXUVSOD\LQJZLWKSVTOFRQQHFWLQJWRPXOWLSOHVHUYHUV )':VDQG:LQGRZV)':V
DQGGDWDEDVHVFXVWRPL]LQJ\RXUSURPSWWRGLVSOD\WKHFRQQHFWHGVHUYHUDQG
GDWDEDVHZLOOHQKDQFH\RXUVLWXDWLRQDODZDUHQHVVDQGSRVVLEO\DYRLGGLVDVWHU 1RZFUHDWHDQH[WHQVLRQWRKROGWKH)':
+HUHߞVDVLPSOHZD\WRVHWDKLJKO\LQIRUPDWLRQDOSURPSW
CREATE EXTENSION www_fdw;
,QWKHDIRUHPHQWLRQHGH[DPSOH&69ILOHVQDPHG+RXVLQJBFVYDQG 7RXQGRWKHXSGDWHUXQ
+RXVLQJBFVYZLOOEHOLQNHGLQDVIRUHLJQWDEOHVLQVFKHPDIIZLWKQDPHV
KRXVLQJBDQGKRXVLQJB ROLLBACK;
RJUBIGZE\GHIDXOWODXQGHUVWDEOHQDPHVDQGFROXPQQDPHVDOOXSSHUFDVHWDEOH
7RPDNHWKHXSGDWHSHUPDQHQWUXQ
QDPHVDQGFROXPQQDPHVDUHFRQYHUWHGWRORZHUFDVH,I\RXGRQߞWZDQWWKLV
EHKDYLRU\RXFDQSDVVLQVHWWLQJVLQ,03257)25(,*16&+(0$WRNHHS COMMIT;
WDEOHQDPHVDQGFROXPQQDPHVDVWKH\ZHUHQDPHGLQWKHIRUHLJQWDEOH)RU
H[DPSOH
6HYHUDOSDFNDJHVWKDWGLVWULEXWH3RVW*,6DOVRRIIHUWKHRJUBIGZH[WHQVLRQ)RU
:$51,1*
LQVWDQFHWKH3RVW*,6%XQGOHIRU:LQGRZVIRXQGRQWKHVWDFNEXLOGHULQFOXGHV
'RQߞWIRUJHWWRFRPPLW\RXUFKDQJHVLIDXWRFRPPLWLVRIIRWKHUZLVHWKH\UROOEDFNZKHQ\RX WKHRJUBIGZH[WHQVLRQRJUBIGZIRU&HQW265+(/LVDYDLODEOHYLD
H[LWSVTO
\XPSRVWJUHVTORUJDQG%LJ64//LQX[0DF:LQGRZV3RVWJUH64/GLVWULEXWLRQ
DOVRRIIHUVRJUBIGZ,I\RXQHHGRUZDQWWRFRPSLOHLW\RXUVHOIWKHVRXUFHIRU
RJUBIGZLVRQ*LW+XE
6KRUWFXWV
8QGHUQHDWKWKHKRRGRJUBIGZUHOLHVRQWKH*HRVSDWLDO'DWD$EVWUDFWLRQ/LEUDU\
<RXFDQXVHWKH\setFRPPDQGWRFUHDWHXVHIXONH\ERDUGVKRUWFXWV6WRUH
*'$/WRGRWKHKHDY\OLIWLQJ7KHUHIRUH\RXQHHGWRKDYH*'$/FRPSLOHG
XQLYHUVDOO\DSSOLFDEOHVKRUWFXWVLQ\RXUSVTOUFILOH)RUH[DPSOHLI\RXXVH
DQGLQVWDOOHGEHIRUHEHLQJDEOHWRFRPSLOHRUXVHRJUBIGZ*'$/KDVXQGHUJRQH
EXPLAIN ANALYZE VERBOSERQFHHYHU\PLQXWHVFUHDWHDVKRUWFXWDVIROORZV TXLWHDIHZHYROXWLRQVDQGLWVFDSDELOLWLHVYDU\DFFRUGLQJWRWKHGHSHQGHQFLHVLW
ZDVFRPSLOHGZLWK6REHZDUQHGWKDW\RXU*'$/PD\QRWEHRXU*'$/
\set eav 'EXPLAIN ANALYZE VERBOSE'
*'$/LVJHQHUDOO\LQVWDOOHGDVSDUWRI3RVW*,6WKHVSDWLDOH[WHQVLRQIRU
3RVWJUH64/6RWRPDNH*'$/XVHHDVLHUZHUHFRPPHQGDOZD\VLQVWDOOLQJWKH
1RZDOO\RXKDYHWRW\SHLV:eavWKHFRORQUHVROYHVWKHYDULDEOH
ODWHVWYHUVLRQRI3RVW*,6
:eav SELECT COUNT(*) FROM pg_tables; 0DQ\*'$/LQVWDQFHVFRPHZLWKVXSSRUWIRU([FHO/LEUH2IILFH&DOF2'%&
DQGYDULRXV6SDWLDOZHEVHUYLFHV<RXZLOOILQGVXSSRUWIRU0LFURVRIW$FFHVVRQ
<RXFDQHYHQVDYHHQWLUHTXHULHVDVVKRUWFXWVDVZHGLGLQ([DPSOH8VH :LQGRZVEXWUDUHO\RQ/LQX[0DFGLVWULEXWLRQV
ORZHUFDVHWRQDPH\RXUVKRUWFXWVWRGLVWLQJXLVKWKHPIURPV\VWHPVHWWLQJV
$IWHU\RXKDYHLQVWDOOHGWKHRJUBIGZELQDULHVWRHQDEOHWKHRJUBIGZLQD
SDUWLFXODUGDWDEDVHFRQQHFWWRWKHGDWDEDVHDQGUXQ
5HWULHYLQJ3ULRU&RPPDQGV
$VZLWKPDQ\FRPPDQGOLQHWRROV\RXFDQXVHWKHXSDUURZVLQSVTOWRUHFDOO CREATE EXTENSION ogr_fdw;
FRPPDQGV7KHHISTSIZEYDULDEOHGHWHUPLQHVWKHQXPEHURISUHYLRXV
)RUHLJQVHUYHUVWDNHRQGLIIHUHQWPHDQLQJVGHSHQGLQJRQWKHW\SHRIGDWDVRXUFH
FRPPDQGVWKDW\RXFDQUHFDOO)RUH[DPSOH\set HISTSIZE 10OHWV\RX
)RUH[DPSOHDIROGHURI&69ILOHVZRXOGEHFRQVLGHUHGDVHUYHUZLWKHDFKILOH
UHFRYHUWKHSDVWFRPPDQGV
EHLQJDVHSDUDWHWDEOH$0LFURVRIW([FHORU/LEUH2IILFH&DOFZRUNERRNZRXOG
,I\RXVSHQWWLPHEXLOGLQJDQGWHVWLQJDGLIILFXOWTXHU\RUSHUIRUPLQJDVHULHVRI EHFRQVLGHUHGDVHUYHUZLWKHDFKVKHHWLQWKHZRUNERRNEHLQJDVHSDUDWHWDEOH
LPSRUWDQWXSGDWHV\RXPD\ZDQWWRKDYHWKHKLVWRU\RIFRPPDQGVSLSHGLQWR $Q64/LWHGDWDEDVHZRXOGEHFRQVLGHUHGDVHUYHUDQGHDFKWDEOHDIRUHLJQWDEOH
VHSDUDWHILOHVIRUSHUXVDOODWHU
7KHIROORZLQJH[DPSOHOLQNVD/LEUH2IILFHZRUNERRNDVDVHUYHUDQG
\set HISTFILE ~/.psql_history - :DBNAME
FRUUHVSRQGLQJVSUHDGVKHHWVDVIRUHLJQWDEOHV
1HZLQ3RVWJUH64/SVTOLVWKH\crosstabviewFRPPDQGZKLFKJUHDWO\
,IDWDEOHVSHFLILHGLQWKHLIMIT TOGRHVQRWH[LVWRQWKHUHPRWHVHUYHUQRHUURU
VLPSOLILHVFURVVWDETXHULHV7KLVODERUVDYLQJFRPPDQGLVDYDLODEOHRQO\LQWKH
ZLOOEHWKURZQ<RXPLJKWZDQWWRYHULI\DIWHUWKHLPSRUWWKDW\RXKDYHDOOWKH
SVTOHQYLURPHQW:HߞOOLOOXVWUDWHZLWKDQH[DPSOHLQ([DPSOHIROORZLQJLW
7KHUROH\RXPDSWRPXVWH[LVWRQWKHIRUHLJQVHUYHUDQGKDYHORJLQULJKWV ZLWKDQH[SODQDWLRQ
$Q\RQHZKRFDQFRQQHFWWR\RXUGDWDEDVHZLOOEHDEOHWRDFFHVVWKHIRUHLJQ ([DPSOH&URVVWDEYLHZ
VHUYHUDVZHOO
SELECT student, subject, AVG(score)::numeric(5,2) As avg_score
1RZ\RXDUHUHDG\WRFUHDWHDIRUHLJQWDEOH7KLVWDEOHFDQKDYHDVXEVHWRI FROM test_scores
GROUP BY student, subject
FROXPQVRIWKHWDEOHLWFRQQHFWVWR,Q([DPSOHZHFUHDWHDIRUHLJQWDEOH ORDER BY student, subject
WKDWPDSVWRWKH[Link]WDEOH \crosstabview student subject avg_score
student | algebra | calculus | chemistry | physics | scheme
([DPSOH'HILQLQJD3RVWJUH64/IRUHLJQWDEOH ---------+---------+----------+-----------+---------+--------
alex | 74.00 | 73.50 | 82.00 | 81.00 |
CREATE FOREIGN TABLE ft_facts ( leo | 82.00 | 65.50 | 75.50 | 72.00 |
fact_type_id int NOT NULL, regina | 72.50 | 64.50 | 73.50 | 84.00 | 90.00
tract_id varchar(11), sonia | 76.50 | 67.50 | 84.00 | 72.00 |
yr int, val numeric(12,3), (4 rows)
perc numeric(6,2)
)
SERVER book_server OPTIONS (schema_name 'census', table_name 'facts');
7KH\crosstabviewLPPHGLDWHO\IROORZVWKHTXHU\\RXZDQWWRFURVVWDEXODWH
7KH\crosstabviewVKRXOGOLVWWKUHHFROXPQVVHOHFWHGE\WKHTXHU\ZLWKDQ
7KLVH[DPSOHLQFOXGHVRQO\WKHPRVWEDVLFRSWLRQVIRUWKHIRUHLJQWDEOH%\ RSWLRQDOIRXUWKFROXPQWRFRQWUROVRUWLQJ7KHFURVVWDEXODWLRQRXWSXWVDWDEOH
GHIDXOWDOO3RVWJUH64/IRUHLJQWDEOHVDUHXSGDWDEOHXQOHVVWKHUHPRWHDFFRXQW ZKHUHWKHILUVWFROXPQVHUYHVDVDURZKHDGHUWKHVHFRQGFROXPQDVDFROXPQ
\RXXVHGRHVQߞWKDYHXSGDWHDFFHVV7KHupdatableVHWWLQJLVD%RROHDQVHWWLQJ KHDGHUDQGWKHODVWDVWKHYDOXHWKDWJRHVLQHDFKFHOO<RXFDQDOVRRPLWWKH
WKDWFDQEHFKDQJHGDWWKHIRUHLJQWDEOHRUWKHIRUHLJQVHUYHUGHILQLWLRQ)RU FROXPQQDPHVIURPWKH\crosstabviewFRPPDQGLQZKLFKFDVHWKHSELECT
H[DPSOHWRPDNH\RXUWDEOHUHDGRQO\H[HFXWH VWDWHPHQWPXVWUHTXHVWH[DFWO\WKUHHFROXPQVXVHGLQRUGHUIRUWKHFURVV
WDEXODWLRQ
ALTER FOREIGN TABLE ft_facts OPTIONS (ADD updatable 'false');
,Q([DPSOHstudentLVWKHURZKHDGHUDQGsubjectLVWKHFROXPQKHDGHU
<RXFDQVHWWKHWDEOHEDFNWRupdatableE\UXQQLQJ 7KHaverageVFRUHFROXPQSURYLGHVWKHHQWU\IRUHDFKSLYRWHGFHOO6KRXOGRXU
GDWDFRQWDLQDPLVVLQJVWXGHQWVXEMHFWSDLUWKHFRUUHVSRQGLQJFHOOZRXOGEHQXOO
ALTER FOREIGN TABLE ft_facts OPTIONS (SET updatable 'true'); :HVSHFLILHGDOOWKHFROXPQVLQWKH\crosstabviewFRPPDQGEXWZHFRXOG
KDYHRPLWWHGWKHPEHFDXVHWKH\DUHLQRXUSELECTLQWKHULJKWRUGHU
7KHupdatableSURSHUW\DWWKHWDEOHOHYHORYHUULGHVWKHIRUHLJQVHUYHUVHWWLQJ
,QDGGLWLRQWRFKDQJLQJOPTIONS\RXFDQDOVRDGGDQGGURSFROXPQVZLWKWKH '\QDPLF64/([HFXWLRQ
ALTER FOREIGN TABLE .. DROP COLUMNVWDWHPHQW
6XSSRVH\RXZDQWHGWRFRQVWUXFW64/VWDWHPHQWVWRUXQEDVHGRQWKHRXWSXWRID
3RVWJUH64/LQWURGXFHGWKHIMPORT FOREIGN SCHEMAFRPPDQGZKLFK TXHU\,QSULRUYHUVLRQVRI3RVWJUH64/\RXZRXOGEXLOGWKH64/RXWSXWLWWRD
VDYHVDJUHDWGHDORIWLPHE\DXWRPDWLFDOO\FUHDWLQJWKHIRUHLJQWDEOHVIRU\RX ILOHWKHQH[HFXWHWKHILOH$OWHUQDWLYHO\\RXFRXOGXVHWKHDOFRQVWUXFWZKLFK
1RWDOO)':VVXSSRUW,03257)25(,*16&+(0$(DFK)':FDQDOVR FRXOGEHXQZLHOG\LQSVTOIRUORQJ64/VWDWHPHQWV6WDUWLQJZLWK3RVWJUH64/
VXSSRUWDFXVWRPVHWRIVHUYHURSWLRQVZKHQLPSRUWLQJpostgres_fdwVXSSRUWV \RXFDQH[HFXWHJHQHUDWHG64/LQDVLQJOHVWHSZLWKWKHQHZ?JH[HF
WKHIROORZLQJFXVWRPRSWLRQV FRPPDQGZKLFKLWHUDWHVWKURXJKHDFKFHOORI\RXUTXHU\DQGH[HFXWHVWKH64/
import_collate WKHUHLQ,WHUDWLRQLVILUVWE\URZWKHQE\FROXPQ,WߞVQRW\HWVPDUWHQRXJKWR
GLVFHUQZKHWKHUHDFKFHOOFRQWDLQVDOHJLWLPDWH64/JH[HFLVDOVRREOLYLRXVWR SELECT unnest(x) FROM staging.factfinder_array WHERE x[1] = '[Link]'
WKHUHVXOWRIWKH64/H[HFXWLRQ6KRXOGWKH64/ZLWKLQDSDUWLFXODUFHOOWKURZDQ
HUURUJH[HFPHUULO\WUHDGVDORQJ+RZHYHULWVNLSVRYHUQXOOV([DPSOH 7KLVQH[WTXHU\ZLOOJLYHXVWKHILUVWWZRFROXPQVRIRXUGDWD
FUHDWHVWZRWDEOHVDQGLQVHUWVRQHURZLQHDFKWDEOHXVLQJWKH?JH[HFFRPPDQG
SELECT x[1] As geo_id, x[2] As tract_id
([DPSOH8VLQJJH[HFWRFUHDWHWDEOHVDQGLQVHUWGDWD FROM staging.factfinder_array WHERE x[1] ~ '[0-9]+';
SELECT
'CREATE TABLE ' || [Link] || '( a integer, b integer)' As create,
'INSERT INTO ' || [Link] || ' VALUES(1,2) ' AS insert
4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
FROM (VALUES ('leo'),('regina')) AS person (name) \gexec
CREATE TABLE
7KH3RVWJUH64/)':postgres_fdwLVSDFNDJHGZLWKPRVWGLVWULEXWLRQVRI
INSERT 0 1 3RVWJUH64/VLQFH3RVWJUH64/7KLV)':DOORZV\RXWRUHDGDVZHOODVSXVK
CREATE TABLE XSGDWHVWRRWKHU3RVWJUH64/VHUYHUVHYHQGLIIHUHQWYHUVLRQV
INSERT 0 1
6WDUWE\LQVWDOOLQJWKH)':IRUWKH3RVWJUH64/VHUYHULQDQHZGDWDEDVH
,QWKHQH[WH[DPSOHZHXVHgexecWRREWDLQPHWDGDWDE\TXHU\LQJ
information_schema CREATE EXTENSION postgres_fdw;
([DPSOH8VLQJJH[HFWRUHWULHYHFRXQWVRIUHFRUGVLQHDFKWDEOH
1H[WFUHDWHDIRUHLJQVHUYHU
SELECT
'SELECT ' || quote_literal(table_name) || ' AS table_name,
COUNT(*) As count FROM ' || quote_ident(table_name) AS cnt_q CREATE SERVER book_server
FROM information_schema.tables FOREIGN DATA WRAPPER postgres_fdw
WHERE table_name IN ('leo','regina') \gexec OPTIONS (host 'localhost', port '5432', dbname 'postgresql_book');
table_name | count
-----------+------
leo | 1
,I\RXQHHGWRFKDQJHRUDGGFRQQHFWLRQRSWLRQVWRWKHIRUHLJQVHUYHUDIWHU
(1 row) FUHDWLRQ\RXFDQXVHWKHALTER SERVERFRPPDQG)RUH[DPSOHLI\RXQHHGHG
WRFKDQJHWKHVHUYHU\RXDUHSRLQWLQJWR\RXFRXOGHQWHU
table_name | count
-----------+------
regina | 1 ALTER SERVER book_server OPTIONS (SET host 'prod');
(1 row)
:$51,1*
,PSRUWLQJDQG([SRUWLQJ'DWD &KDQJHVWRFRQQHFWLRQVHWWLQJVVXFKDVWKHKRVWSRUWDQGGDWDEDVHGRQRWWDNHHIIHFWXQWLOD
QHZVHVVLRQLVFUHDWHG7KLVLVEHFDXVHWKHFRQQHFWLRQLVRSHQHGRQILUVWXVHDQGLVNHSWRSHQ
SVTOKDVD\copyFRPPDQGWKDWOHWV\RXLPSRUWGDWDIURPDQGH[SRUWGDWDWRD
WH[WILOH7KHWDELVWKHGHIDXOWGHOLPLWHUEXW\RXFDQVSHFLI\RWKHUV1HZOLQH
EUHDNVPXVWVHSDUDWHWKHURZV)RURXUILUVWH[DPSOHZHGRZQORDGHGGDWDIURP
1H[WFUHDWHDXVHUPDSSLQJLWVSXEOLFUROHWRDUROHRQWKHIRUHLJQVHUYHU
86&HQVXV)DFW)LQGHUFRYHULQJUDFLDOGHPRJUDSKLFVRIKRXVLQJLQ
0DVVDFKXVHWWV<RXFDQGRZQORDGWKHILOHZHXVHLQWKLVH[DPSOH CREATE USER MAPPING FOR public SERVER book_server
'(&BB6)B47+BZLWKBDQQFVYIURPWKH3RVWJUH64/%RRN'DWD OPTIONS (user 'role_on_foreign', password 'your_password');
8QIRUWXQDWHO\file_textarray_fdwLVQRWSDUWRIWKHFRUH3RVWJUH64/VR SVTO,PSRUW
\RXߞOOQHHGWRFRPSLOHLW\RXUVHOI)LUVWLQVWDOO3RVWJUH64/ZLWK3RVWJUH64/ 2XUXVXDOVHTXHQFHLQORDGLQJGHQRUPDOL]HGRUXQIDPLOLDUGDWDLVWRFUHDWHD
GHYHORSPHQWKHDGHUV7KHQGRZQORDGWKHfile_textarray_fdwVRXUFHFRGH VWDJLQJVFKHPDWRDFFHSWWKHLQFRPLQJGDWD:HWKHQZULWHH[SORUDWLYHTXHULHVWR
IURPWKH$GXQVWDQ*LW+XEVLWH7KHUHLVDGLIIHUHQWEUDQFKIRUHDFKYHUVLRQRI JHWDVHQVHRIZKDWZHKDYHRQRXUKDQGV)LQDOO\ZHGLVWULEXWHWKHGDWDLQWR
3RVWJUH64/VRPDNHVXUHWRSLFNWKHULJKWRQH2QFH\RXߞYHFRPSLOHGWKHFRGH YDULRXVQRUPDOL]HGSURGXFWLRQWDEOHVDQGGHOHWHWKHVWDJLQJVFKHPD
LQVWDOOLWDVDQH[WHQVLRQDV\RXZRXOGDQ\RWKHU)':
%HIRUHEULQJLQJWKHGDWDLQWR3RVWJUH64/\RXPXVWILUVWFUHDWHDWDEOHWRVWRUH
,I\RXDUHRQ/LQX[8QL[LWߞVDQHDV\FRPSLOHLI\RXKDYHWKHpostgresql-dev WKHLQFRPLQJGDWD7KHGDWDPXVWPDWFKWKHILOHERWKLQWKHQXPEHURIFROXPQV
SDFNDJHLQVWDOOHG:HGLGWKHZRUNRIFRPSLOLQJIRU:LQGRZV\RXFDQ DQGLQGDWDW\SHV7KLVFRXOGEHDQDQQR\LQJH[WUDVWHSIRUDZHOOIRUPHGILOH
GRZQORDGRXUELQDULHVIURPRQHRIWKHIROORZLQJOLQNVRQHIRU:LQGRZV EXWLWGRHVREYLDWHWKHQHHGIRUSVTOWRJXHVVDWGDWDW\SHV
)':VDQGDQRWKHUIRU:LQGRZVDQG)':V
SVTOSURFHVVHVWKHHQWLUHLPSRUWDVDVLQJOHWUDQVDFWLRQLILWHQFRXQWHUVDQ\
7KHILUVWVWHSWRSHUIRUPDIWHU\RXKDYHLQVWDOOHGDQ)':LVWRFUHDWHDQ HUURUVLQWKHGDWDWKHHQWLUHLPSRUWIDLOV,I\RXߞUHXQVXUHDERXWWKHGDWD
H[WHQVLRQLQ\RXUGDWDEDVH FRQWDLQHGLQWKHILOHZHUHFRPPHQGVHWWLQJXSWKHWDEOHZLWKWKHPRVW
DFFRPPRGDWLQJGDWDW\SHVDQGWKHQUHFDVWLQJWKHPODWHULIQHFHVVDU\)RU
CREATE EXTENSION file_textarray_fdw;
H[DPSOHLI\RXFDQߞWEHVXUHWKDWDFROXPQZLOOKDYHMXVWQXPHULFYDOXHVPDNH
LWFKDUDFWHUYDU\LQJWRJHWWKHGDWDLQIRULQVSHFWLRQDQGWKHQUHFDVWLWODWHU
7KHQFUHDWHDIRUHLJQVHUYHUDV\RXZRXOGZLWKDQ\)':
([DPSOHORDGVGDWDLQWRWKHWDEOHZHFUHDWHGLQ([DPSOH/DXQFKSVTO
CREATE SERVER file_taserver FOREIGN DATA WRAPPER file_textarray_fdw; IURPWKHFRPPDQGOLQHDQGUXQWKHFRPPDQGVLQ([DPSOH
([DPSOH,PSRUWLQJGDWDZLWKSVTO
1H[WUHJLVWHUWKHWDEOHV<RXFDQSODFHIRUHLJQWDEOHVLQDQ\VFKHPD\RXZDQW
\connect postgresql_book
,Q([DPSOHZHXVHRXUVWDJLQJVFKHPDDJDLQ \cd /postgresql_book/ch03
([DPSOH0DNHDILOHWH[WDUUD\IRUHLJQWDEOHIURPDGHOLPLWHGILOH \copy staging.factfinder_import FROM DEC_10_SF1_QTH1_with_ann.csv CSV
([DPSOH0DNHDIRUHLJQWDEOHIURPDGHOLPLWHGILOH
SVTO([SRUW CREATE FOREIGN TABLE [Link] (developer VARCHAR(150), company VARCHAR(150))
SERVER my_server
([SRUWLQJGDWDLVHYHQHDVLHUWKDQLPSRUWLQJ<RXFDQHYHQH[SRUWVHOHFWHGURZV OPTIONS (
format 'csv',
IURPDWDEOH8VHWKHSVTO\copyFRPPDQGWRH[SRUW([DPSOH header 'true',
GHPRQVWUDWHVKRZWRH[SRUWWKHGDWDZHMXVWORDGHGEDFNWRDWDEGHOLPLWHGILOH filename '/postgresql_book/ch10/[Link]',
delimiter '|',
([DPSOH([SRUWLQJGDWDZLWKSVTO null ''
\connect postgresql_book );
\copy (SELECT * FROM staging.factfinder_import WHERE s01 ~ E'^[0-9]+' )
TO '/[Link]' ,QRXUH[DPSOHHYHQWKRXJKZHߞUHUHJLVWHULQJDSLSHGHOLPLWHGILOHZHVWLOOXVH
WITH DELIMITER E'\t' CSV HEADER WKHcsvRSWLRQ$&69ILOHDVIDUDV)':LVFRQFHUQHGUHSUHVHQWVDILOH
7KHGHIDXOWEHKDYLRURIH[SRUWLQJGDWDZLWKRXWTXDOLILFDWLRQVLVWRH[SRUWWRD GHOLPLWHGE\DQ\VSHFLILHGFKDUDFWHU
WDEGHOLPLWHGILOH+RZHYHUWKHWDEGHOLPLWHGIRUPDWGRHVQRWH[SRUWKHDGHU :KHQWKHVHWXSLVILQLVKHG\RXFDQILQDOO\TXHU\\RXUSLSHGHOLPLWHGILOH
FROXPQV<RXFDQXVHWKHHEADERRSWLRQRQO\ZLWKWKHFRPPDGHOLPLWHGIRUPDW GLUHFWO\
VHH([DPSOH
SELECT * FROM [Link] WHERE developer LIKE 'T%';
([DPSOH([SRUWLQJGDWDZLWKSVTO
\connect postgresql_book 2QFH\RXQRORQJHUQHHGWKHIRUHLJQWDEOHGURSLWXVLQJ
\copy staging.factfinder_import TO '/[Link]'
WITH CSV HEADER QUOTE '"' FORCE QUOTE *
DROP FOREIGN TABLE [Link];
FORCE QUOTE *GRXEOHTXRWHVDOOFROXPQV)RUFODULW\ZHVSHFLILHGWKHTXRWLQJ
FKDUDFWHUHYHQWKRXJKSVTOGHIDXOWVWRGRXEOHTXRWHV 4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V
2IWHQIODWILOHVKDYHDGLIIHUHQWQXPEHURIFROXPQVRQHDFKOLQHDQGFRXOG
&RS\LQJIURPRUWR3URJUDP LQFOXGHPXOWLSOHKHDGHUDQGIRRWHUURZV2XUIDYRULWH)':IRUKDQGOLQJWKHVH
6LQFH3RVWJUH64/SVTOFDQIHWFKGDWDIURPWKHRXWSXWRIFRPPDQGOLQH ILOHVLVfile_textarray_fdw7KLVZUDSSHUFDQKDQGOHDQ\NLQGRIGHOLPLWHG
SURJUDPVVXFKDVFXUOOVDQGZJHWDQGGXPSWKHGDWDLQWRDWDEOH([DPSOH IODWILOHHYHQLIWKHQXPEHURIHOHPHQWVYDU\IURPURZWRURZE\WUHDWLQJHDFK
LPSRUWVDGLUHFWRU\OLVWLQJXVLQJDGLUFRPPDQG URZDVDWH[WDUUD\text[]
UHVLGHVRQDQRWKHUGDWDEDVHSHUKDSVHYHQRQDQRWKHUSK\VLFDOVHUYHU2QFH\RX ([DPSOH,PSRUWGLUHFWRU\OLVWLQJZLWKSVTO
SXWLQWKHHIIRUWWRHVWDEOLVKIRUHLJQWDEOHVWKH\SHUVLVWLQ\RXUGDWDEDVHDQG \connect postgresql_book
\RXߞUHIRUHYHUIUHHIURPKDYLQJWRZRUU\DERXWWKHLQWULFDWHSURWRFROVRI CREATE TABLE dir_list (filename text);
\copy dir_list FROM PROGRAM 'dir C:\projects /b'
FRPPXQLFDWLQJZLWKDOLHQGDWDVRXUFHV<RXFDQDOVRILQGWKHVWDWXVRISRSXODU
)':VDQGH[DPSOHVRIXVDJHDW3RVWJUH64/:LNL)':<RXFDQILQGDFDWDORJ +XEHUW/XEDF]HZVNLKDVPRUHH[DPSOHVRIXVLQJ\copy9LVLW'HSHV]3LSLQJ
RIVRPH)':VIRU3RVWJUH64/DW3*;1)':DQG3*;1)RUHLJQ'DWD FRS\WRIURPDQH[WHUQDOSURJUDP
:UDSSHU<RXߞOOILQGWKHVRXUFHFRGHIRUPDQ\RIWKHVHDQGIRUDGGLWLRQDORQHV
RQ*LW+XEE\VHDUFKLQJIRU3RVWJUH64/)RUHLJQ'DWD:UDSSHUV,I\RXQHHGWR
ZUDSIRUHLJQGDWDVRXUFHVVWDUWE\YLVLWLQJWKHVHOLQNVWRVHHZKHWKHUVRPHRQH %DVLF5HSRUWLQJ
KDVDOUHDG\GRQHWKHZRUNRIFUHDWLQJZUDSSHUV,IQRWWU\FUHDWLQJRQH\RXUVHOI %HOLHYHLWRUQRWSVTOLVFDSDEOHRISURGXFLQJEDVLF+70/UHSRUWV7U\WKH
,I\RXVXFFHHGEHVXUHWRVKDUHLWZLWKRWKHUV IROORZLQJDQGFKHFNRXWWKHJHQHUDWHGRXWSXWVKRZQLQ)LJXUH
0RVW3RVWJUH64/LQVWDOOVSURYLGHWZR)':V\RXFDQLQVWDOOfile_fdwDQG
psql -d postgresql_book -H -c "
postgres_fdwXVLQJWKH&5($7((;7(16,21FRPPDQG SELECT category, COUNT(*) As num_per_cat
FROM pg_settings
8SWKURXJK3RVWJUH64/\RXFRXOGXVH)':VRQO\WRUHDGIURPIRUHLJQ WHERE category LIKE '%Query%'
VRXUFHV9HUVLRQLQWURGXFHGDQ$3,IHDWXUHWRXSGDWHIRUHLJQWDEOHVDVZHOO GROUP BY category
postgres_fdwVXSSRUWVXSGDWHV ORDER BY category;
" -o [Link]
,QWKLVVHFWLRQZHߞOOGHPRQVWUDWHKRZWRUHJLVWHUIRUHLJQVHUYHUVIRUHLJQXVHUV
DQGIRUHLJQWDEOHVDQGILQDOO\KRZWRTXHU\IRUHLJQWDEOHV$OWKRXJKZHXVH
64/WRFUHDWHDQGGHOHWHREMHFWVLQRXUH[DPSOHV\RXFDQSHUIRUPWKHH[DFW
VDPHFRPPDQGVXVLQJSJ$GPLQ
4XHU\LQJ)ODW)LOHV
7KHfile_fdwZUDSSHULVSDFNDJHGDVDQH[WHQVLRQ7RLQVWDOOLWXVHWKH
IROORZLQJ64/
1RWWRRVKDEE\%XWWKHFRPPDQGRXWSXWVRQO\DQ+70/WDEOHQRWDIXOO\
$OWKRXJKfile_fdwFDQUHDGRQO\IURPILOHSDWKVDFFHVVLEOHE\\RXUORFDO TXDOLILHG+70/GRFXPHQW7RFUHDWHDPHDWLHUUHSRUWFRPSRVHDVFULSWDV
VHUYHU\RXVWLOOQHHGWRGHILQHDVHUYHUIRULWIRUWKHVDNHRIFRQVLVWHQF\,VVXH VKRZQLQ([DPSOH
WKHIROORZLQJFRPPDQGWRFUHDWHDߡIDX[ߢIRUHLJQVHUYHULQ\RXUGDWDEDVH
([DPSOH6FULSWWRJHQHUDWHUHSRUW
CREATE SERVER my_server FOREIGN DATA WRAPPER file_fdw; \o settings_report.html
\T 'cellspacing=0 cellpadding=0'
\qecho '<html><head><style>H2{color:maroon}</style>'
1H[W\RXPXVWUHJLVWHUWKHWDEOHV<RXFDQSODFHIRUHLJQWDEOHVLQDQ\VFKHPD \qecho '<title>PostgreSQL Settings</title></head><body>'
\qecho '<table><tr valign=''top''><td><h2>Planner Settings</h2>' \connect book_sub;
\x on
\i pub_struct.sql
\t on
\pset format html
SELECT category, :HWKHQFUHDWHDSXEOLFDWLRQRQWKHSXEOLVKHUGDWDEDVHRILWHPVZHZDQWWR
string_agg(name || '=' || setting, E'\n' ORDER BY name) As settings
FROM pg_settings UHSOLFDWH)RUWKLVH[HUFLVHZHߞOOUHSOLFDWHDOOWKHWDEOHVLQWKHGDWDEDVHXVLQJ
WHERE category LIKE '%Planner%' &5($7(38%/,&$7,211RWHWKDWWKLVFRPPDQGZLOODOVRUHSOLFDWHIXWXUH
GROUP BY category
ORDER BY category;
WDEOHVFUHDWHGWKRXJKZHߞYHKDGWRFUHDWHWKHVWUXFWXUHRQWKHVXEVFULSWLRQ
\H GDWDEDVHV
\qecho '</td><td><h2>File Locations</h2>'
\x off
\t on CREATE PUBLICATION full_db_pub
\pset format html FOR ALL TABLES;
SELECT name, setting FROM pg_settings WHERE category = 'File Locations'
ORDER BY name;
\qecho '<h2>Memory Settings</h2>' ,QRUGHUWRXVHWKHSXEOLFDWLRQZHQHHGWRVXEVFULEHWRLW:HGRWKLVE\
SELECT name, setting, unit FROM pg_settings WHERE category ILIKE '%memory%' H[HFXWLQJWKLVFRPPDQGZKHQFRQQHFWHGWRWKHVXEVFULEHUGDWDEDVH
ORDER BY name;
\qecho '</td></tr></table>' ERRNBVXE
\qecho '</body></html>'
\o \connect book_sub;
5HGLUHFWVTXHU\RXWSXWWRDILOH CREATE SUBSCRIPTION book_sub
&66WDEOHVHWWLQJVIRUTXHU\RXWSXW CONNECTION 'host=localhost port=5447 dbname=postgresql_book \
$SSHQGVDGGLWLRQDO+70/ user=postgres'
PUBLICATION full_db_pub;
([SDQGPRGH5HSHDWVWKHFROXPQKHDGHUVIRUHDFKURZDQGRXWSXWVHDFK
FROXPQRIHDFKURZDVDVHSDUDWHURZ
:KHQ\RXLQVSHFWWKHWDEOHVRQWKHERRNBVXEGDWDEDVH\RXVKRXOGILQGWKDWDOO
)RUFHVWKHTXHULHVWRRXWSXWDVDQ+70/WDEOH
WKHWDEOHVDUHIXOORIGDWDFROOHFWHGGXULQJWKHLQLWLDOV\QFKURQL]DWLRQ,I\RXDGG
string_agg()LQWURGXFHGLQ3RVWJUH64/FRQFDWHQDWHVDOOSURSHUWLHVLQ
GDWDWRWKHSRVWJUHVTOBERRNGDWDEDVH\RXVKRXOGVHHWKHQHZUHFRUGVDSSHDURQ
WKHVDPHFDWHJRU\LQWRDVLQJOHFROXPQ
WKHERRNBVXEGDWDEDVH
7XUQVRIIH[SDQGPRGH7KHVHFRQGDQGWKLUGTXHULHVVKRXOGRXWSXWRQHURZ
SHUWDEOHURZ ,I\RXQRORQJHUQHHGDVXEVFULSWLRQRUSXEOLFDWLRQ\RXFDQGURSWKHPIURPWKH
7RJJOHVWXSOHVPRGH:KHQRQFROXPQKHDGHUVDQGURZFRXQWVDUHRPLWWHG SXEOLVKHUZLWK'52368%6&5,37,21DQG'52338%/,&$7,21
([DPSOHGHPRQVWUDWHVWKDWE\LQWHUVSHUVLQJ64/DQGSVTOFRPPDQGV\RX
FDQFUHDWHDFRPSUHKHQVLYHWDEXODUUHSRUWUHSOHWHZLWKVXEUHSRUWV5XQ )RUHLJQ'DWD:UDSSHUV
([DPSOHE\FRQQHFWLQJLQWHUDFWLYHO\ZLWKSVTODQGH[HFXWLQJ\i
)':VDUHDQH[WHQVLEOHVWDQGDUGFRPSOLDQWPHWKRGIRU\RXU3RVWJUH64/VHUYHU
settings_report.psql$OWHUQDWLYHO\UXQSVTOQRQLQWHUDFWLYHO\E\H[HFXWLQJ
WRTXHU\RWKHUGDWDVRXUFHVERWKRWKHU3RVWJUH64/VHUYHUVDQGPDQ\W\SHVRI
psql -f settings_report.psqlIURP\RXU26FRPPDQGOLQH7KHRXWSXW QRQ3RVWJUH64/GDWDVRXUFHV$WWKHFHQWHURIWKHDUFKLWHFWXUHLVDIRUHLJQWDEOH
JHQHUDWHGE\VHWWLQJVBUHSRUWKWPOLVVKRZQLQ)LJXUH DWDEOHWKDW\RXFDQTXHU\OLNHRWKHUWDEOHVLQ\RXU3RVWJUH64/GDWDEDVHEXWWKDW
PUBLICATIONRQWKHSXEOLVKLQJVHUYHULQWKHGDWDEDVHZLWKWDEOHV\RXZDQWWR
SXEOLVKWRGLFWDWHZKDWWDEOHVWRUHSOLFDWHDQG&5($7(68%6&5,37,21RQWKH
VXEVFULEHUGDWDEDVHGHQRWLQJWKHVHUYHUDQGSXEOLFDWLRQQDPHLWVKRXOGVXEVFULEH
WR7KHPDLQFDYHDWZLWKORJLFDOUHSOLFDWLRQLVWKDW''/LVQRWUHSOLFDWHGVRLQ
RUGHUWRUHSOLFDWHDWDEOHWKHWDEOHVWUXFWXUHPXVWH[LVWRQERWKWKHSXEOLVKHU
GDWDEDVHDQGWKHVXEVFULEHUGDWDEDVH
:HKDYHWZR3RVWJUH64/VHUYHUVUXQQLQJRQRXUVHUYHU7KHSXEOLVKHULVRQ
SRUWDQGWKHVXEVFULEHULVRQSRUW7KHSURFHVVLVWKHVDPHLIFOXVWHUV
DUHRQVHSDUDWHVHUYHUV7RUHSOLFDWH
0DNHVXUHWKHIROORZLQJFRQILJXUDWLRQVHWWLQJLVVHWRQWKHSXEOLVKHU
SHOW wal_level
,IDQ\WKLQJRWKHUWKDQlogicalGR
$VGHPRQVWUDWHGFRPSRVLQJSVTOVFULSWVOHWV\RXVKRZRXWSXWIURPPDQ\
$QGWKHQUHVWDUWWKHSRVWJUHVVHUYLFH
TXHULHVZLWKLQDVLQJOHUHSRUW)XUWKHUDIWHU\RXZULWHDVFULSW\RXFDQVFKHGXOH
7KLVFDQEHVHWRQWKHVXEVFULSWLRQVHUYHUDVZHOOHVSHFLDOO\LILQVRPHFDVHV LWVH[HFXWLRQLQWKHIXWXUHDQGDWIL[HGLQWHUYDOV8VHDGDHPRQOLNHSJ$JHQW
WKHVXEVFULSWLRQVHUYHUZLOODFWDVDSXEOLVKHUIRUVRPHWDEOHVRUGDWDEDVHV FURQWDERU:LQGRZV6FKHGXOHU
2QWKHGDWDEDVHZKHUH\RXZLOOEHUHSOLFDWLQJGDWDFUHDWHWKHWDEOHVWUXFWXUHV
IRUWDEOHV\RXZLOOEHUHSOLFDWLQJ,I\RXKDYHDORWRIWDEOHVRUZDQWWR
UHSOLFDWHDZKROHGDWDEDVHDVZHZLOOEHGRLQJXVHSJBGXPSRQWKH
SXEOLVKLQJGDWDEDVHWRFUHDWHEDFNXSVWUXFWXUHRIWDEOHV)RUH[DPSOHIRUWKH
SRVWJUHVTOBERRNGDWDEDVHZHZRXOGGXPSRXWWKHVWUXFWXUH
$QGWKHQXVHSVTORQWKHVXEVFULEHUVHUYHUWRFUHDWHRXUVXEVFULSWLRQGDWDEDVH
ZLWKVWUXFWXUHVDVIROORZV
SJ$GPLQYHUVLRQLVWKHFXUUHQWUHQGLWLRQRIWKHWULHGDQGWUXHJUDSKLFDO ,QWKLVH[DPSOHWKHDUFKLYHIROGHULVZKHUHZHߞUHFDFKLQJ
DGPLQLVWUDWLRQWRROIRU3RVWJUH64/,WLVDFRPSOHWHUHZULWHRIWKHSUHGHFHVVRU
SJ$GPLQ6RPHIHDWXUHVRISJ$GPLQKDYHQRWEHHQSRUWHGWRSJ$GPLQ ,QLWLDWLQJWKH6WUHDPLQJ5HSOLFDWLRQ3URFHVV
WKRXJKWKH\PD\EHLQWKHIXWXUH,QWKLVFKDSWHUZHߞOOIRFXVRQZKDWߞVDYDLODEOH
LQSJ$GPLQ0XFKRIWKHIXQFWLRQDOLW\\RXZLOOILQGLQSJ$GPLQZDVSUHVHQW $IWHU\RXKDYHPDGHWKHEDVHEDFNXSZLWKSJBEDVHEDFNXSDQGSXWLWLQSODFH
LQSJ$GPLQVRWKLVGLVFXVVLRQZLOOEHYDOXDEOHHYHQLI\RXDUHVWLOOXVLQJ YHULI\WKDWWKHVHWWLQJVLQWKHUHFRYHU\FRQIORRNULJKW7KHQVWDUWXSWKHVODYH
SJ$GPLQ:HZLOODOVRFRYHUVRPHSRSXODUIHDWXUHVRISJ$GPLQQRW\HW VHUYHU
SRUWHGWRSJ$GPLQ)RUWKHUHVWRIWKLVFKDSWHUZHߞOOVLPSO\UHIHUWRERWKDV <RXVKRXOGQRZEHDEOHWRFRQQHFWWRERWKVHUYHUV$Q\FKDQJHV\RXPDNHRQ
SJ$GPLQDQGRQO\PDNHGLVWLQJXLVKLQJYHUVLRQQRWHVZKHUHWKHIXQFWLRQDOLW\LV WKHPDVWHUHYHQVWUXFWXUDOFKDQJHVVXFKDVLQVWDOOLQJH[WHQVLRQVRUFUHDWLQJ
GLIIHUHQW WDEOHVVKRXOGWULFNOHGRZQWRWKHVODYH<RXVKRXOGDOVREHDEOHWRTXHU\WKH
VODYH
127( :KHQDQGLIWKHWLPHFRPHVWROLEHUDWHDFKRVHQVODYHFUHDWHDEODQNILOHFDOOHG
IDLORYHUQRZLQWKHGDWDIROGHURIWKHVODYH3RVWJUH64/ZLOOWKHQFRPSOHWH
0RVWRIWKHNH\FKDQJHVWKXVIDUZLWKSJ$GPLQFRPSDUHGWRSJ$GPLQLVWKDWSJ$GPLQ
EHWWHUVXSSRUWVWKHQHZDQGFRQVWUXFWVLQFOXGLQJWKHDELOLW\WRUXQLQDVHUYHURUGHVNWRS SOD\EDFNRIWKH:$/DQGUHQDPHWKHUHFRYHU\FRQIILOHWRUHFRYHUGRQH$WWKDW
PRGHDQLPSURYHGTXHU\UHVXOWVSDQHZLWKDELOLW\WRHGLWUHFRUGVDQGDOVRVHOHFW SRLQW\RXUVODYHZLOOEHXQVKDFNOHGIURPWKHPDVWHUDQGFRQWLQXHOLIHRQLWVRZQ
QRQFRQWLJXRXVURZVDQGLPSURYHGSHUIRUPDQFH,I\RXDUHXVLQJ:LQGRZVPDNHVXUHWRXVH
SJ$GPLQRUDERYH3ULRUSJ$GPLQYHUVLRQVKDGSHUIRUPDQFHLVVXHVRQ:LQGRZVZKHQ
ZLWKDOOWKHGDWDIURPWKHODVW:$/2QFHWKHVODYHKDVWDVWHGIUHHGRPWKHUHߞV
UXQQLQJLQGHVNWRSPRGH QRJRLQJEDFN,QRUGHUWRPDNHLWDVODYHDJDLQ\RXߞOOQHHGWRJRWKURXJKWKH
ZKROHSURFHVVIURPWKHEHJLQQLQJ
$OWKRXJKSJ$GPLQKDVVKRUWFRPLQJVZHDUHDOZD\VHQFRXUDJHGE\QRWRQO\ 5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHVZLWK/RJLFDO
KRZTXLFNO\EXJVDUHIL[HGEXWDOVRKRZTXLFNO\QHZIHDWXUHVDUHDGGHG 5HSOLFDWLRQ
%HFDXVHWKH3RVWJUH64/GHYHORSHUVSRVLWLRQSJ$GPLQDVWKHPRVWFRPPRQO\
XVHGJUDSKLFDODGPLQLVWUDWLRQWRROIRU3RVWJUH64/DQGLWLVSDFNDJHGZLWKPDQ\ 1HZLQYHUVLRQLVWKHDELOLW\WRUHSOLFDWHRQO\VRPHRIWKHWDEOHVRUVRPHRI
ELQDU\GLVWULEXWLRQVRI3RVWJUH64/WKHGHYHORSHUVKDYHWDNHQRQWKH WKHGDWDEDVHVLQ\RXUPDVWHUXVLQJDQDSSURDFKFDOOHGORJLFDOUHSOLFDWLRQ2QH
UHVSRQVLELOLW\RINHHSLQJSJ$GPLQDOZD\VLQV\QFZLWKWKHODWHVW3RVWJUH64/ ELJEHQHILWRIORJLFDOUHSOLFDWLRQLV\RXFDQXVHLWWRUHSOLFDWHEHWZHHQD
UHOHDVHV,IDQHZUHOHDVHRI3RVWJUH64/LQWURGXFHVQHZIHDWXUHV\RXFDQFRXQW 3RVWJUH64/GDWDEDVHDQGIXWXUHYHUVLRQVRI3RVWJUH64/DQGHYHQUHSOLFDWH
RQWKHODWHVWSJ$GPLQWROHW\RXPDQDJHLW,I\RXߞUHQHZWR3RVWJUH64/\RX ZKHQ26SODWIRUPVRUDUFKLWHFWXUHVDUHGLIIHUHQW)RUH[DPSOH\RXFDQXVHLWWR
VKRXOGGHILQLWHO\VWDUWZLWKSJ$GPLQEHIRUHH[SORULQJRWKHUWRROV UHSOLFDWHEHWZHHQD/LQX[VHUYHUDQGD:LQGRZVVHUYHU
,QORJLFDOUHSOLFDWLRQWKHVHUYHUSURYLGLQJWKHGDWDLVFDOOHGWKHpublisherDQG
WKHVHUYHUUHFHLYLQJWKHGDWDLVFDOOHGWKHsubscriber<RXXVHCREATE
*HWWLQJ6WDUWHG
LGHQWLFDOIRUPLFURYHUVLRQVLVQRWDUHTXLUHPHQWDQG\RXߞUHZHOFRPHWR SJ$GPLQFRPHVSDFNDJHGZLWKPDQ\GLVWULEXWLRQV7KH%LJ64/DQG('%
H[SHULPHQWDQGVHHKRZIDU\RXFDQGHYLDWH GLVWULEXWLRQVIURP3RVWJUH64/RQLQFOXGHSJ$GPLQDVDQRSWLRQ1RWHLI
\RXKDYHDQHHGIRUSJ$GPLQIRU3RVWJUH64/\RXߞOOZDQWWRXVHWKH
6KXWGRZQ3RVWJUH64/RQWKHQHZVODYH
%LJ64/SJ$GPLQ/76ZKLFKKDVEHHQSDWFKHGWRKDQGOHYHUVLRQVDQG
2YHUZULWHWKHGDWDIROGHUILOHVZLWKWKRVH\RXJHQHUDWHGZLWKSJBEDVHEDFNXS SJ$GPLQ/76LVLQVWDOODEOHYLDWKH%LJ64/SDFNDJHPDQDJHU$IWHUYHUVLRQ
WKH('%SDFNDJHRQO\LQFOXGHVSJ$GPLQ7KHSJ$GPLQJURXSZLOOQR
$GGWKHIROORZLQJFRQILJXUDWLRQVHWWLQJWRWKHSRVWJUHVTODXWRFRQIILOH
ORQJHUEHPDNLQJXSGDWHVRUHQKDQFHPHQWVWRSJ$GPLQ
hot_standby = on ,I\RXDUHLQVWDOOLQJSJ$GPLQZLWKRXW3RVWJUH64/\RXFDQGRZQORDGSJ$GPLQ
max_connections = 20 #set to higher or equal to master IURPSJDGPLQRUJ:KLOHRQWKHVLWH\RXFDQRSWWRSHUXVHRQHRIWKHJXLGHV
LQWURGXFLQJSJ$GPLQ7KHWRROLVZHOORUJDQL]HGDQGIRUWKHPRVWSDUWJXLGHV
<RXGRQߞWQHHGWRUXQWKHVODYHVRQWKHVDPHSRUWDVWKHPDVWHUVR\RXFDQ LWVHOITXLWHZHOO$GYHQWXURXVXVHUVFDQDOZD\VWU\EHWDDQGDOSKDUHOHDVHVRI
RSWLRQDOO\FKDQJHWKHSRUWHLWKHUYLDSRVWJUHVTODXWRFRQISRVWJUHVTOFRQIRU SJ$GPLQ<RXUKHOSLQWHVWLQJZRXOGEHJUHDWO\DSSUHFLDWHGE\WKH3RVWJUH64/
YLDVRPHRWKHU26VSHFLILFVWDUWXSVFULSWWKDWVHWVWKHPGPORTHQYLURQPHQW FRPPXQLW\
YDULDEOHEHIRUHVWDUWXS
2YHUYLHZRI)HDWXUHV
&UHDWHDQHZILOHLQWKHGDWDIROGHUFDOOHGUHFRYHU\FRQIZLWKWKHIROORZLQJ
FRQWHQWVEXWVXEVWLWXWHWKHDFWXDOKRVWQDPH,3DGGUHVVDQGSRUWRI\RXU 7RZKHW\RXUDSSHWLWHKHUHߞVDOLVWRIRXUIDYRULWHJRRGLHVLQSJ$GPLQ0RUHDUH
PDVWHURQWKHVHFRQGOLQH7KLVILOHLVDXWRPDWLFDOO\FUHDWHGLI\RXXVHG OLVWHGLQSJ$GPLQ)HDWXUHV
SJBEDVHEDFNXS<RXZLOOKDYHWRDGGWKHWULJJHUBILOHOLQHWKRXJK 6HUYHUDQG'HVNWRSPRGH
7KHDSSOLFDWLRQBQDPHLVRSWLRQDOEXWXVHIXOLI\RXZDQWWRWUDFNWKHUHSOLFDLQ SJ$GPLQFDQEHLQVWDOOHGLQGHVNWRSPRGHRUDVDZHEVHUYHU:6*,
SRVWJUHVTOV\VWHPYLHZV DSSOLFDWLRQSJ$GPLQZDVDGHVNWRSRQO\DSSOLFDWLRQ
<RXFDQDOVRXVHrsyncLQVWHDGRIcpLI\RXZDQWWRVWRUHWKH:$/VRQD
GLIIHUHQWVHUYHU
2Q:LQGRZV
6HWWLQJ8S)XOO6HUYHU5HSOLFDWLRQ
/HWߞVJRRYHUWKHVWHSVWRUHSOLFDWHWKHZKROHVHUYHUFOXVWHU:HߞOOWDNHDGYDQWDJH
RIVWUHDPLQJUHSOLFDWLRQ5HFDOOWKDWVWUHDPLQJUHSOLFDWLRQRQO\UHTXLUHV
FRQQHFWLRQVDWWKH3RVWJUH64/GDWDEDVHOHYHOEHWZHHQWKHPDVWHUDQGVODYHV
&RQILJXULQJWKH0DVWHU
7KHVWHSVIRUVHWWLQJXSWKHPDVWHUDUH
&UHDWHDUHSOLFDWLRQDFFRXQW
$OWHUWKHIROORZLQJFRQILJXUDWLRQVHWWLQJVLQSRVWJUHVTODXWRFRQI7KHVHFDQ
EHGRQHXVLQJALTER SYSTEM set variable=valueIROORZHGE\SELECT
)LJXUH+LGHRUXQKLGHGDWDEDVHREMHFWVLQWKHSJ$GPLQEURZVHWUHH
pg_reload_conf();ZLWKRXWWKHQHHGWRWRXFKWKHSK\VLFDOFRQILJILOH
,I\RXVHOHFW6KRZ6\VWHP2EMHFWVLQWKH'LVSOD\VHFWLRQ\RXߞOOVHHWKHJXWVRI
\RXUVHUYHULQWHUQDOIXQFWLRQVV\VWHPWDEOHVKLGGHQFROXPQVLQWDEOHVDQGVR listen_addresses = *
IRUWK<RXZLOODOVRVHHWKHPHWDGDWDVWRUHGLQWKH3RVWJUH64/V\VWHPFDWDORJV wal_level = hot_standby
information_schemaFDWDORJDQGWKHpg_cataloginformation_schemaLVDQ archive_mode = on
$16,64/VWDQGDUGFDWDORJIRXQGLQRWKHUGDWDEDVHVVXFKDV0\64/DQG64/ max_wal_senders = 5
6HUYHU<RXPD\UHFRJQL]HVRPHRIWKHWDEOHVDQGFROXPQVIURPZRUNLQJZLWK wal_keep_segments = 10
RWKHUGDWDEDVHSURGXFWV
,I\RXZDQWWRXVHORJLFDOUHSOLFDWLRQWRGRSDUWLDOUHSOLFDWLRQRIRQO\VRPH
WDEOHV\RXߞOOQHHGWRVHWZDOBOHYHO ORJLFDO/RJLFDOGRHVPRUHORJJLQJWKDQ
SJ$GPLQ)HDWXUHV KRWBVWDQGE\VRZLOODOVRZRUNIRUGRLQJIXOOVHUYHUUHSOLFDWLRQ
SJ$GPLQLVFKRFNIXOORIJRRGLHV:HGRQߞWKDYHWKHVSDFHWREULQJWKHPDOOWR 7KHVHVHWWLQJVDUHGHVFULEHGLQ6HUYHU&RQILJXUDWLRQ5HSOLFDWLRQ<RXPD\
OLJKWVRZHߞOOMXVWKLJKOLJKWWKHIHDWXUHVWKDWPDQ\XVHRQDUHJXODUEDVLV ZDQWWRVHWZDOBNHHSBVHJPHQWVKLJKHULI\RXUVHUYHUVDUHIDUDSDUWDQG\RXU
SURGXFWLRQVHUYHUKDVDORWRIWUDQVDFWLRQV,I\RXDUHUXQQLQJYHUVLRQRU
$XWRJHQHUDWLQJ4XHULHVIURP7DEOH'HILQLWLRQV DERYH\RXVKRXOGXVHreplicaLQVWHDGRIhot_standbyIRUWKHZDOBOHYHO
hot_standbyLVVWLOODFFHSWHGLQIRUEDFNZDUGFRPSDWLELOLW\EXWZLOOEH
SJ$GPLQKDVWKLVPHQXRSWLRQWKDWZLOODXWRJHQHUDWHDWHPSODWHIRU6(/(&7
UHDGDVreplica
,16(57DQG83'$7(VWDWHPHQWVIURPDWDEOHGHILQLWLRQ<RXDFFHVVWKLV
UHSOLFDWLRQUHIHUWR5HSOLFDWLRQ3URJUHVV7UDFNLQJLQWKHGRFXPHQWDWLRQ IHDWXUHE\ULJKWFOLFNLQJWKHWDEOHDQGDFFHVVLQJWKH6&5,376FRQWH[WPHQX
RSWLRQDVVKRZQLQ)LJXUH
9HUVLRQLQWURGXFHGPXOWLSOHVWDQGE\VHUYHUVLQV\QFKURQRXVUHSOLFDWLRQ
IRULQFUHDVHGUHOLDELOLW\
9HUVLRQLQWURGXFHGEXLOWLQORJLFDOUHSOLFDWLRQZKLFKDOORZVWKH
UHSOLFDWLRQRILQGLYLGXDOWDEOHV7KHRWKHUEHQHILWRIORJLFDOUHSOLFDWLRQLVWKDW
DVODYHFDQKDYHGDWDEDVHVDQGWDEOHVRILWVRZQWKDWDUHQRWSDUWRI
UHSOLFDWLRQDQGWKDWFDQEHXSGDWHGRQWKHVODYH9HUVLRQDOVRLQWURGXFHG
WHPSRUDU\UHSOLFDWLRQVORWVZKLFKDOORZDSURFHVVWRFUHDWHDUHSOLFDWLRQVORW
RQDRQHWLPHEDVLVDQGKDYHLWGLVDSSHDUDIWHUWKHVHVVLRQLVRYHU7KLVLV
SDUWLFXODUO\XVHIXOIRULQLWLDOL]LQJDQHZFRS\RIWKHVHUYHUYLD
SJBEDVHEDFNXS
$OWKRXJKORJLFDOUHSOLFDWLRQLVEXLOWLQWR3RVWJUH64/IRUWKHILUVWWLPHLQ
YHUVLRQ\RXFDQXVHORJLFDOUHSOLFDWLRQLQ3RVWJUH64/DQGKLJKHU
YHUVLRQVRI3RVWJUH64/WKURXJKWKHRSHQVRXUFH3RVWJUH64/H[WHQVLRQ
SJORJLFDO,I\RXQHHGWRUHSOLFDWHEHWZHHQYHUVLRQDQGYHUVLRQV࠺
\RXߞOOQHHGWRKDYHSJORJLFDOLQVWDOOHGRQERWKYHUVLRQDQGWKHORZHU
YHUVLRQHGVHUYHU)RUORJLFDOUHSOLFDWLRQEHWZHHQYHUVLRQDQGIXWXUH )LJXUH7DEOH6FULSWVPHQX
YHUVLRQVRI3RVWJUH64/\RXFDQXVHWKHEXLOWLQORJLFDOUHSOLFDWLRQIHDWXUH
7KHߡ6(/(&76FULSWߢRSWLRQLVSDUWLFXODUO\KDQG\EHFDXVHLWZLOOFUHDWHDTXHU\
WKDWOLVWVDOOWKHFROXPQVLQWKHWDEOH,I\RXKDYHDORWRIFROXPQVLQDWDEOHDQG
7KLUG3DUW\5HSOLFDWLRQ2SWLRQV
ZDQWWRVHOHFWDODUJHVXEVHWEXWQRWDOOFROXPQVWKLVLVDJUHDWWLPHVDYHU<RX
$VDOWHUQDWLYHVWR3RVWJUH64/ߞVEXLOWLQUHSOLFDWLRQFRPPRQWKLUGSDUW\RSWLRQV FDQUHPRYHFROXPQV\RXGRQߞWQHHGLQ\RXUTXHU\IURPWKHDXWRJHQHUDWHG
DERXQG6ORQ\DQG%XFDUGRDUHWZRSRSXODURSHQVRXUFHRQHV$OWKRXJK VWDWHPHQW
3RVWJUH64/LVLPSURYLQJUHSOLFDWLRQZLWKHDFKQHZUHOHDVH6ORQ\%XFDUGRDQG
RWKHUWKLUGSDUW\UHSOLFDWLRQRSWLRQVVWLOORIIHUPRUHIOH[LELOLW\6ORQ\DQG $FFHVVLQJSVTOIURPSJ$GPLQ
%XFDUGRDOORZ\RXWRUHSOLFDWHLQGLYLGXDOGDWDEDVHVRUHYHQWDEOHVLQVWHDGRIWKH
HQWLUHVHUYHU7KH\DOVRGRQߞWUHTXLUHWKDWDOOPDVWHUVDQGVODYHVUXQWKHVDPH $OWKRXJKSJ$GPLQLVDJUHDWWRROSVTOGRHVDEHWWHUMRELQDIHZFDVHV2QHRI
3RVWJUH64/YHUVLRQDQG26%RWKDOVRVXSSRUWPXOWLPDVWHUVFHQDULRV+RZHYHU WKHPLVWKHH[HFXWLRQRIYHU\ODUJH64/ILOHVVXFKDVWKRVHFUHDWHGE\SJBGXPS
ERWKUHO\RQDGGLWLRQDOWULJJHUVDQGSRVVLEOHDGGLWLRQRIFROXPQVWRWDEOHVWR DQGRWKHUGXPSWRROV<RXFDQHDVLO\MXPSWRSVTOIURPSJ$GPLQEXWWKLV
LQLWLDWHWKHUHSOLFDWLRQDQGRIWHQGRQߞWUHSOLFDWH''/FRPPDQGVIRUUDUHDFWLRQV IHDWXUHLVQRWDYDLODEOHLQSJ$GPLQ&OLFNWKHSOXJLQPHQXDVVKRZQLQ
VXFKDVFUHDWLQJQHZWDEOHVLQVWDOOLQJH[WHQVLRQVDQGVRRQ7KXVWKH\UHTXLUH )LJXUHDQGWKHQFOLFN364/&RQVROH7KLVRSHQVDSVTOVHVVLRQFRQQHFWHGWR
PRUHPDQXDOLQWHUYHQWLRQVXFKDVWKHDGGLWLRQRIWULJJHUVDGGLWLRQDOWDEOH WKHGDWDEDVH\RXDUHFXUUHQWO\FRQQHFWHGWRLQSJ$GPLQ<RXFDQWKHQXVHWKH
ILHOGVRUYLHZV \cdDQG\iFRPPDQGVWRFKDQJHGLUHFWRU\DQGUXQWKH64/ILOH
:HXUJH\RXWRFRQVXOWDFRPSDULVRQPDWUL[RISRSXODUWKLUGSDUW\RSWLRQV
GDWDEDVHWRVHQGGDWDWR
7RXVHWKLVIHDWXUH\RXPXVWVHWwal_levelWRlogical
)LJXUHSVTOSOXJLQ 5HIHUWR/RJLFDO5HSOLFDWLRQLQ3RVWJUH64/IRUDQH[DPSOHRILWVXVH
%HFDXVHWKLVIHDWXUHUHOLHVRQDGDWDEDVHFRQQHFWLRQ\RXߞOOVHHLWGLVDEOHGXQWLO 5HPDVWHULQJ
\RXߞUHFRQQHFWHGWRDGDWDEDVH
5HPDVWHULQJSURPRWHVDVODYHWREHWKHPDVWHU9HUVLRQLQWURGXFHG
VWUHDPLQJRQO\UHPDVWHULQJZKLFKHOLPLQDWHVWKHQHHGIRUUHPDVWHULQJWR
(GLWLQJSRVWJUHVTOFRQIDQGSJBKEDFRQIIURPSJ$GPLQ FRQVXOWD:$/DUFKLYHLWFDQEHGRQHYLDVWUHDPLQJDQGVODYHVQRORQJHU
<RXFDQHGLWFRQILJXUDWLRQILOHVGLUHFWO\IURPSJ$GPLQSURYLGHGWKDW\RX QHHGWREHUHFORQHG$VRIYHUVLRQWKRXJKDUHVWDUWLVVWLOOUHTXLUHG7KLV
LQVWDOOHGWKHDGPLQSDFNH[WHQVLRQRQ\RXUVHUYHU3RVWJUH64/RQHFOLFN PD\FKDQJHLQIXWXUHUHOHDVHV
LQVWDOOHUVJHQHUDOO\FUHDWHWKHDGPLQSDFNH[WHQVLRQ,ILWߞVSUHVHQW\RXVKRXOG 3RVWJUH64/ELQDU\UHSOLFDWLRQUHSOLFDWHVRQO\FKDQJHVWKDWDUHWUDQVDFWLRQDO
VHHWKH6HUYHU&RQILJXUDWLRQPHQXHQDEOHGDVVKRZQLQ)LJXUH %HFDXVHDQ\''/FRPPDQGLVWUDQVDFWLRQDOWKHFUHDWLRQRIWDEOHVYLHZVDQG
LQVWDOODWLRQRIH[WHQVLRQVFDQEHUHSOLFDWHGDVZHOO%XWEHFDXVHXQORJJHGWDEOH
LQVHUWVDQGXSGDWHVDUHQRWWUDQVDFWLRQDOWKH\FDQQRWEHUHSOLFDWHG:KHQ
LQVWDOOLQJH[WHQVLRQV\RXVKRXOGPDNHVXUHDOOVODYHVKDYHWKHELQDULHVIRUWKH
H[WHQVLRQDQGYHUVLRQRIH[WHQVLRQ\RXDUHLQVWDOOLQJRWKHUZLVHUHSOLFDWLRQZLOO
)LJXUH3J$GPLQFRQILJXUDWLRQILOHHGLWRU
IDLOZKHQWKHCREATE EXTENSIONFRPPDQGLVH[HFXWHGRQWKHPDVWHU
,IWKHPHQXLVJUD\HGRXWDQG\RXDUHFRQQHFWHGWRD3RVWJUH64/VHUYHUHLWKHU
\RXGRQߞWKDYHWKHDGPLQSDFNLQVWDOOHGRQWKDWVHUYHURU\RXDUHQRWORJJHGLQDV (YROXWLRQRI3RVWJUH64/5HSOLFDWLRQ
DVXSHUXVHU7RLQVWDOOWKHDGPLQSDFNUXQWKH64/VWDWHPHQWCREATE EXTENSION
3RVWJUH64/ߞVVWRFNUHSOLFDWLRQUHOLHVRQ:$/VKLSSLQJ6WUHDPLQJUHSOLFDWLRQ
adminpack;RUXVHWKHJUDSKLFDOLQWHUIDFHIRULQVWDOOLQJH[WHQVLRQVDVVKRZQLQ
VODYHVVKRXOGEHUXQQLQJWKHVDPH26DQGELWQHVVELWELWDVWKHPDVWHU,W
)LJXUH'LVFRQQHFWIURPWKHVHUYHUDQGUHFRQQHFW\RXVKRXOGVHHWKHPHQX
LVDOVRUHFRPPHQGHGWKDWDOOVHUYHUVEHUXQQLQJWKHVDPHPLQRUYHUVLRQDVWKH
HQDEOHG
PDVWHUWKRXJKUXQQLQJWKHVDPHSDWFKOHYHOPLFURYHUVLRQLVQRWUHTXLUHG
7KRXJKQRWUHFRPPHQGHGWKHVODYHDQGPDVWHUFDQEHUXQQLQJDGLIIHUHQWPLQRU
YHUVLRQ,QWKLVFDVHLWߞVSUHIHUDEOHIRUWKHVODYHWREHUXQQLQJDQHZHUPLQRU
YHUVLRQWKDQWKHPDVWHU
6XSSRUWIRUEXLOWLQUHSOLFDWLRQLPSURYHGRYHUWKHIROORZLQJ3RVWJUH64/
UHOHDVHV
9HUVLRQDGGHGUHSOLFDWLRQVORWV$UHSOLFDWLRQVORWLVDFRQWUDFWEHWZHHQD
PDVWHUDQGDVODYHWKDWUHTXLUHVWKHPDVWHUWRKROGRQWR:$/VXQWLODVODYHLV
GRQHSURFHVVLQJWKHP
9HUVLRQDGGHGVHYHUDOIXQFWLRQVIRUPRQLWRULQJWKHSURJUHVVRI
$WUDQVDFWLRQRQWKHPDVWHUZLOOFRPPLWHYHQLIQRVODYHXSGDWHV7KLVLV
H[SHGLHQWIRUGLVWDQWVHUYHUVZKHUH\RXGRQߞWZDQWWUDQVDFWLRQVWRZDLW
EHFDXVHRIQHWZRUNODWHQF\EXWWKHGRZQVLGHLVWKDW\RXUGDWDVHWRQWKHVODYH
PLJKWODJEHKLQG6KRXOGWKHODJEHVHYHUHWKHVODYHPLJKWQHHGWREH
UHLQLWLDOL]HGLIWKHWUDQVDFWLRQLWQHHGVWRFRQWLQXHKDVDOUHDG\EHHQUHPRYHG
IURPWKH:$/ORJV
7RPLQLPL]HWKHULVNRI:$/VEHLQJUHPRYHGEHIRUHDOOVODYHVKDYHXVHG
WKHPYHUVLRQLQWURGXFHGUHSOLFDWLRQVORWV$UHSOLFDWLRQVORWLVDFRQWUDFW
EHWZHHQDVODYHDQGLWVPDVWHUZKHUHE\WKHPDVWHUZLOOQRWZLSHRXWDQ\
:$/ORJVWKDWDUHVWLOOQHHGHGE\DQ\UHSOLFDWLRQVORWV7KHKD]DUGLVWKDWLID
VODYHKROGLQJDUHSOLFDWLRQVORWIDLOVRUORVHVFRPPXQLFDWLRQIRUDORQJWLPH
WKHPDVWHUZLOONHHSWKH:$/6LQGHILQLWHO\DQGUXQRXWRIGLVNVSDFHDQG
VKXWGRZQ
6WUHDPLQJUHSOLFDWLRQ )LJXUH,QVWDOOLQJH[WHQVLRQVXVLQJSJ$GPLQ
7KHVODYHGRHVQRWUHTXLUHGLUHFWILOHDFFHVVEHWZHHQPDVWHUDQGVODYHV
,QVWHDGLWUHOLHVRQWKH3RVWJUH64/FRQQHFWLRQSURWRFROWRWUDQVPLWWKH &UHDWLQJ'DWDEDVH$VVHWVDQG6HWWLQJ3ULYLOHJHV
:$/V SJ$GPLQOHWV\RXFUHDWHDOONLQGVRIGDWDEDVHDVVHWVDQGDVVLJQSULYLOHJHV
&DVFDGLQJUHSOLFDWLRQ
&UHDWLQJGDWDEDVHVDQGRWKHUGDWDEDVHDVVHWV
6ODYHVFDQUHFHLYHORJVIURPQHDUE\VODYHVLQVWHDGRIGLUHFWO\IURPWKH
&UHDWLQJDQHZGDWDEDVHLQSJ$GPLQLVHDV\-XVWULJKWFOLFNWKHGDWDEDVHVHFWLRQ
PDVWHU7KLVDOORZVDVODYHWREHKDYHOLNHDPDVWHUIRUUHSOLFDWLRQSXUSRVHV
RIWKHWUHHDQGFKRRVH1HZ'DWDEDVHDVVKRZQLQ)LJXUH7KH'HILQLWLRQWDE
7KHVODYHUHPDLQVUHDGRQO\:KHQDVODYHDFWVERWKDVDUHFHLYHUDQGD
SURYLGHVDGURSGRZQPHQXIRU\RXWRVHOHFWDWHPSODWHGDWDEDVHVLPLODUWR
VHQGHULWLVFDOOHGDFDVFDGLQJVWDQGE\
ZKDWZHGLGLQߡ7HPSODWH'DWDEDVHVߢ
/RJLFDOUHSOLFDWLRQ
7KLVLVDQHZUHSOLFDWLRQRSWLRQLQYHUVLRQWKDWDOORZVWKHUHSOLFDWLRQRI
LQGLYLGXDOWDEOHVLQVWHDGRIUHTXLULQJWKHZKROHVHUYHUFOXVWHUWREH
UHSOLFDWHG,WUHOLHVRQDIHDWXUHFDOOHGORJLFDOGHFRGLQJZKLFKH[WUDFWV
FKDQJHVWRDGDWDEDVHWDEOHIURPWKH:$/ORJVLQDQHDV\WRXQGHUVWDQG
IRUPDWZLWKRXWGHWDLOHGNQRZOHGJHRIWKHGDWDEDVHߞVLQWHUQDOVWDWH/RJLFDO
GHFRGLQJKDVH[LVWHGVLQFHDQGKDVEHHQXVHGE\VRPHH[WHQVLRQVIRU
DXGLWLQJDQGSURYLGLQJUHSOLFDWLRQ7KLVQHZIHDWXUHFRPHVZLWKWKHQHZ
''/FRPPDQGVCREATE PUBLICATIONDQGCREATE SUBSCRIPTIONIRU
GHVLJQDWLQJZKDWWDEOHVWRUHSOLFDWHDQGZKDWVHUYHUVDQGFRUUHVSRQGLQJ
%HIRUHZHJHWWRRFDUULHGDZD\ZHVKRXOGLQWURGXFHVRPHFRPPRQOLQJRLQ
3RVWJUH64/UHSOLFDWLRQ
0DVWHU
7KHPDVWHUVHUYHULVWKHGDWDEDVHVHUYHUVRXUFLQJWKHGDWDEHLQJUHSOLFDWHG
DQGZKHUHDOOXSGDWHVWDNHSODFH<RXߞUHDOORZHGRQO\RQHPDVWHUZKHQ
XVLQJWKHEXLOWLQVHUYHUUHSOLFDWLRQIHDWXUHVRI3RVWJUH64/3ODQVDUHLQ
SODFHWRVXSSRUWPXOWLPDVWHUUHSOLFDWLRQVFHQDULRV:DWFKIRULWLQIXWXUH
UHOHDVHV<RXPD\DOVRKHDUWKHWHUPSXEOLVKHUXVHGWRPHDQWKHSURYLGHURI
WKHGDWD3XEOLVKHUVXEVFULEHUWHUPLQRORJ\JDLQVPRUHWUDFWLRQLQ
3RVWJUH64/IRUEXLOWLQORJLFDOUHSOLFDWLRQ
6ODYH
$VODYHVHUYHUFRQVXPHVWKHUHSOLFDWHGGDWDDQGSURYLGHVDUHSOLFDRIWKH
PDVWHU0RUHDHVWKHWLFDOO\SOHDVLQJWHUPVVXFKDVVXEVFULEHUDQGDJHQWKDYH
EHHQEDQGLHGDERXWEXWVODYHLVVWLOOWKHPRVWDSURSRV3RVWJUH64/EXLOWLQ
UHSOLFDWLRQVXSSRUWVRQO\UHDGRQO\VODYHVDWWKLVWLPH
:ULWHDKHDGORJ:$/
:$/LVWKHORJWKDWNHHSVWUDFNRIDOOWUDQVDFWLRQVRIWHQUHIHUUHGWRDVWKH
WUDQVDFWLRQORJLQRWKHUGDWDEDVHSURGXFWV7RVWDJHUHSOLFDWLRQ3RVWJUH64/
VLPSO\PDNHVWKHORJVDYDLODEOHWRWKHVODYHV2QFHVODYHVKDYHSXOOHGWKH
ORJVWKH\MXVWQHHGWRH[HFXWHWKHWUDQVDFWLRQVWKHUHLQ
)LJXUH&UHDWLQJDQHZGDWDEDVHLQSJ$GPLQ
6\QFKURQRXVUHSOLFDWLRQ
)ROORZWKHVDPHVWHSVWRFUHDWHUROHVVFKHPDVDQGRWKHUREMHFWV(DFKZLOOKDYH
LWVRZQUHOHYDQWVHWRIWDEVIRU\RXWRVSHFLI\DGGLWLRQDODWWULEXWHV $WUDQVDFWLRQRQWKHPDVWHUZLOOQRWEHFRQVLGHUHGFRPSOHWHXQWLODWOHDVWRQH
V\QFKURQRXVVODYHOLVWHGLQsynchronous_standby_namesXSGDWHVDQG
3ULYLOHJHPDQDJHPHQW UHSRUWVEDFN3ULRUWRYHUVLRQLIDQ\V\QFKURQRXVVODYHUHVSRQGVWKH
7RPDQDJHWKHSULYLOHJHVRIGDWDEDVHDVVHWVQRWKLQJEHDWVWKHSJ$GPLQ*UDQW WUDQVDFWLRQLVFRPSOHWH,QYHUVLRQDQGKLJKHUWKHQXPEHURIVWDQGE\V
:L]DUGZKLFK\RXDFFHVVIURPWKH7RROV࠱*UDQW:L]DUGPHQXRISJ$GPLQ,I WKDWPXVWUHVSRQGLVFRQILJXUDEOHXVLQJWKHsynchronous_standby_names
\RXDUHLQWHUHVWHGLQJUDQWLQJSHUPLVVLRQVRQO\IRUREMHFWVLQDVSHFLILFVFKHPD SRVWJUHVTOFRQIFRQILJXUDWLRQYDULDEOH9HUVLRQLQWURGXFHGWKHNH\ZRUGV
ULJKWFOLFNWKHVFKHPDDQGFKRRVHߡ*UDQW:L]DUGߢ7KHOLVWZLOOEHILOWHUHGWR ),567DQG$1<WKDWFDQEHDGGHGWRWKHsynchronous_standby_names
MXVWREMHFWVLQWKHVFKHPD$VZLWKPDQ\RWKHUIHDWXUHVWKLVRSWLRQLVJUD\HGRXW FRQILJXUDWLRQYDULDEOHWKDWGLFWDWHVZKLFKQRGHVQHHGWRUHSRUWEDFN),567
XQOHVV\RXDUHFRQQHFWHGWRDGDWDEDVH,WߞVDOVRVHQVLWLYHWRWKHORFDWLRQLQWKH LVWKHGHIDXOWEHKDYLRULIQRWVSHFLILHGDQGWKHEHKDYLRURI
WUHH\RXDUHRQ)RUH[DPSOHWRVHWSULYLOHJHVIRULWHPVLQWKHcensusVFKHPD $V\QFKURQRXVUHSOLFDWLRQ
VHOHFWWKHVFKHPDDQGWKHQFKRRVH*UDQW:L]DUG7KH*UDQW:L]DUGVFUHHQLV
&KDSWHU5HSOLFDWLRQDQG VKRZQLQ)LJXUH<RXFDQWKHQVHOHFWDOORUVRPHRIWKHLWHPVDQGVZLWFKWR
WKH3ULYLOHJHVWDEWRVHWWKHUROHVDQGSULYLOHJHV\RXZDQWWRJUDQW
([WHUQDO'DWD
3RVWJUH64/KDVDQXPEHURIRSWLRQVIRUVKDULQJGDWDZLWKH[WHUQDOVHUYHUVRU
GDWDVRXUFHV7KHILUVWRSWLRQLVWKHEXLOWLQUHSOLFDWLRQRSWLRQVRI3RVWJUH64/
ZKLFKDOORZ\RXWRFUHDWHDFRS\RI\RXUVHUYHUUHDG\WRUXQRQDQRWKHU
3RVWJUH64/VHUYHU7KHVHFRQGRSWLRQLVWRXVHWKLUGSDUW\DGGRQVPDQ\RI
ZKLFKDUHIUHHO\DYDLODEOHDQGWLPHWHVWHG7KHWKLUGRSWLRQLVWRXVHDIRUHLJQ
GDWDZUDSSHU)':)':VJLYH\RXWKHIOH[LELOLW\WRTXHU\IURPDZLGHDUUD\
RIH[WHUQDOGDWDVRXUFHV6LQFHYHUVLRQVRPH)':VDOVRSHUPLWXSGDWLQJ
WKHVHLQFOXGHpostgres_fdwhadoop_fdwDQGogr_fdwVHHߡ4XHU\LQJ2WKHU
7DEXODU)RUPDWVZLWKRJUBIGZߢ
5HSOLFDWLRQ2YHUYLHZ )LJXUH*UDQW:L]DUGLQSJ$GPLQ
7KHUHDVRQVIRUUHSOLFDWLQJ\RXUGDWDEDVHVGLVWLOOGRZQWRWZRDYDLODELOLW\DQG 0RUHRIWHQWKDQVHWWLQJSULYLOHJHVRQH[LVWLQJREMHFWV\RXPD\ZDQWWRVHW
VFDODELOLW\$YDLODELOLW\LVDVVXUHGE\SURYLGLQJDUHGXQGDQWVHUYHUVRWKDWLI GHIDXOWSULYLOHJHVIRUQHZREMHFWVLQDVFKHPDRUGDWDEDVH7RGRVRULJKWFOLFN
\RXUPDLQVHUYHUJRHVGRZQ\RXKDYHDQRWKHUWKDWFDQLPPHGLDWHO\DVVXPHLWV WKHVFKHPDRUGDWDEDVHVHOHFW3URSHUWLHVDQGWKHQJRWRWKH'HIDXOW3ULYLOHJHV
UROH)RUVPDOOGDWDEDVHV\RXFRXOGMXVWPDNHVXUH\RXKDYHDQRWKHUSK\VLFDO WDEDVVKRZQLQ)LJXUH
VHUYHUUHDG\DQGUHVWRUHWKHGDWDEDVHRQWRLW%XWIRUODUJHGDWDEDVHVLQWKH
WHUDE\WHVWKHUHVWRUHLWVHOIFRXOGWDNHKRXUVLIQRWGD\V7RDYRLGGRZQWLPH
\RXߞOOQHHGWRUHSOLFDWH
7KHRWKHUPRWLYDWLRQIRUUHSOLFDWLRQVLVVFDODELOLW\6XSSRVH\RXVHWXSD
GDWDEDVHWREUHHGIDQF\HOHSKDQWVKUHZVIRUSURILW$IWHUDIHZ\HDUVRIEUHHGLQJ
\RXQRZKDYHWKRXVDQGVRIHOHSKDQWVKUHZV3HRSOHDOORYHUWKHZRUOGFRPHWR
\RXUVLWHWRJDZNDQGSXUFKDVH<RXߞUHRYHUZKHOPHGE\WKHWUDIILFEXW
UHSOLFDWLRQFRPHVWR\RXUDLG<RXDUUDQJHDUHDGRQO\VODYHVHUYHUWRUHSOLFDWH
ZLWK\RXUPDLQVHUYHU7KHQ\RXGLUHFWWKHFRXQWOHVVJDZNHUVWRWKHVODYHDQG
OHWRQO\VHULRXVEX\HUVRQWRWKHPDVWHUVHUYHUWRILQDOL]HWKHLUSXUFKDVHV
5HSOLFDWLRQ-DUJRQ
relname | dirty_buffers | num_buffers
--------------+---------------+------------
facts | 0 | 736
lu_fact_types | 0 | 4
7KHPRUHRQERDUGPHPRU\\RXKDYHGHGLFDWHGWRWKHFDFKHWKHPRUHURRP
\RXߞOOKDYHWRFDFKHGDWD<RXFDQVHWWKHDPRXQWRIGHGLFDWHGPHPRU\E\
FKDQJLQJWKHshared_buffersVHWWLQJLQSRVWJUHVTOFRQI'RQߞWJRRYHUERDUG
UDLVLQJshared_buffersWRRPXFKZLOOEORDW\RXUFDFKHOHDGLQJWRPRUHWLPH
ZDVWHGVFDQQLQJWKHFDFKH
1RZDGD\VWKHUHߞVQRVKRUWDJHRIRQERDUGPHPRU\<RXFDQWDNHDGYDQWDJHRI
WKLVE\SUHFDFKLQJFRPPRQO\XVHGWDEOHVXVLQJDQH[WHQVLRQFDOOHGSJBSUHZDUP
SJBSUHZDUPOHWV\RXSULPH\RXU3RVWJUH64/E\ORDGLQJGDWDIURPFRPPRQO\
XVHGWDEOHVLQWRPHPRU\VRWKDWWKHILUVWXVHUWRKLWWKHGDWDEDVHFDQH[SHULHQFH
WKHVDPHSHUIRUPDQFHERRVWRIIHUHGE\FDFKLQJDVODWHUXVHUV$JRRGDUWLFOHWKDW
GHVFULEHVWKLVIHDWXUHLV3UHZDUPLQJ5HODWLRQDO'DWD
)LJXUH*UDQWLQJGHIDXOWSULYLOHJHVLQSJ$GPLQ
:KHQVHWWLQJSULYLOHJHVIRUDVFKHPDPDNHVXUHWRDOVRVHWWKHXVDJHSULYLOHJH
RQWKHVFKHPDWRWKHJURXSV\RXZLOOEHJLYLQJDFFHVVWR
,PSRUWDQG([SRUW
/LNHSVTOSJ$GPLQDOORZV\RXWRLPSRUWDQGH[SRUWWH[WILOHV
,PSRUWLQJILOHV
7KHLPSRUWH[SRUWIHDWXUHLVUHDOO\DZUDSSHUDURXQGWKHSVTO\copyFRPPDQG
DQGUHTXLUHVWKHWDEOHWKDWZLOOUHFHLYHWKHGDWDWRH[LVWDOUHDG\,QRUGHUWR
LPSRUWGDWDULJKWFOLFNWKHWDEOH\RXZDQWWRLPSRUWH[SRUWGDWDWR)LJXUH
&DFKLQJ VKRZVWKHPHQXWKDWFRPHVXSDIWHUZHULJKWFOLFNWKHlu_fact_typesWDEOHRQ
WKHOHIW
,I\RXH[HFXWHDFRPSOH[TXHU\WKDWWDNHVDZKLOHWRUXQVXEVHTXHQWUXQVDUH
RIWHQPXFKIDVWHU7KDQNFDFKLQJ,IWKHVDPHTXHU\H[HFXWHVLQVHTXHQFHE\WKH
VDPHXVHURUGLIIHUHQWXVHUVDQGQRFKDQJHVKDYHEHHQPDGHWRWKHXQGHUO\LQJ
GDWD\RXVKRXOGJHWEDFNWKHVDPHUHVXOW$VORQJDVWKHUHߞVVSDFHLQPHPRU\WR
FDFKHWKHGDWDWKHSODQQHUFDQVNLSUHSODQQLQJRUUHUHWULHYLQJ8VLQJFRPPRQ
WDEOHH[SUHVVLRQVDQGLPPXWDEOHIXQFWLRQVLQ\RXUTXHULHVHQFRXUDJHVFDFKLQJ
+RZGR\RXFKHFNZKDWߞVLQWKHFXUUHQWFDFKH"<RXFDQLQVWDOOWKH
pg_buffercacheH[WHQVLRQ
<RXFDQWKHQUXQDTXHU\DJDLQVWWKHpg_buffercacheYLHZDVVKRZQLQ
([DPSOH )LJXUH,PSRUWPHQXLQSJ$GPLQ
([DPSOH$UHP\WDEOHURZVLQWKHEXIIHUFDFKH" ([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ
SELECT
[Link], ,QDGGLWLRQWRLPSRUWLQJGDWD\RXFDQH[SRUW\RXUTXHULHVDVZHOOSJ$GPLQ
COUNT(CASE WHEN [Link] THEN 1 ELSE NULL END) As dirty_buffers, DOORZVH[SRUWLQJWRGHOLPLWHG&69+70/RU;0/IRUPDWV7KHSJ$GPLQ
COUNT(*) As num_buffers
FROM
H[SRUWIHDWXUHLVPXFKVLPSOHUDQGEDVLFWKDQSJ$GPLQ
pg_class AS C INNER JOIN
pg_buffercache B ON [Link] = [Link] INNER JOIN
,QSJ$GPLQWRH[SRUWZLWKGHOLPLWHUVSHUIRUPWKHIROORZLQJ
pg_database D ON [Link] = [Link] AND [Link] = current_database()
WHERE [Link] IN ('facts','lu_fact_types')
GROUP BY [Link]; 2SHQWKHTXHU\ZLQGRZ
7KHVHFRQGWLPH\RXUXQWKHTXHU\\RXVKRXOGQRWLFHDWOHDVWD
SHUIRUPDQFHVSHHGLQFUHDVHDQGVKRXOGVHHWKHIROORZLQJFDFKHGLQWKHEXIIHU
DQGWULHVWRFDWDORJVWDWLVWLFVIRUHDFKJURXSRIFROXPQVndistinctVWDWLVWLFV
DUHRQO\XVHGIRULPSURYLQJ*5283%<FODXVHV6SHFLILFDOO\WKH\DUHXVHIXO
RQO\RQTXHULHVWKDWJURXSE\DOOWKHFROXPQVLQ\RXUVWDWLVWLF
6WDWLVWLFVFUHDWHGXVLQJ&5($7(67$7,67,&6DUHVWRUHGLQWKHWDEOH
pg_statistic_extDQGFDQEHGURSSHGXVLQJ'52367$7,67,&66LPLODUWR
RWKHUVWDWLVWLFVWKH\DUHFRPSXWHGGXULQJDQ$1$/<=(UXQZKLFKKDSSHQV
GXULQJWKHV\VWHPYDFXXPDQDO\]HSURFHVV$IWHUFUHDWLQJDWDEOHLWߞVDJRRG
LGHDWRUXQDQ$1$/<=(RQLWVRWKHQHZVWDWVFDQEHXVHGLPPHGLDWHO\
5DQGRP3DJH&RVWDQG4XDOLW\RI'ULYHV
)LJXUH([SRUWPHQX $QRWKHUVHWWLQJWKDWLQIOXHQFHVWKHSODQQHULVWKHrandom_page_cost53&
UDWLRZKLFKLVWKHUHODWLYHFRVWRIGLVNDFFHVVZKHQUHWULHYLQJDUHFRUGXVLQJD
([SRUWLQJDV+70/RU;0/LVPXFKWKHVDPHH[FHSW\RXXVHWKH)LOH࠱4XLFN
VHTXHQWLDOUHDGYHUVXVUDQGRPDFFHVV*HQHUDOO\WKHIDVWHUDQGPRUHH[SHQVLYH
5HSRUWRSWLRQVHH)LJXUH
WKHSK\VLFDOGLVNWKHORZHUWKHUDWLR7KHGHIDXOWYDOXHIRU53&LVZKLFK
ZRUNVZHOOIRUPRVWPHFKDQLFDOKDUGGULYHVRQWKHPDUNHWWRGD\7KHXVHRI
VROLGVWDWHGULYHV66'VKLJKHQGVWRUDJHDUHDQHWZRUNV6$1VRUFORXG
VWRUDJHPDNHVLWZRUWKWZHDNLQJWKLVYDOXH
<RXFDQVHWWKH53&UDWLRSHUGDWDEDVHSHUVHUYHURUSHUWDEOHVSDFH$WWKH
VHUYHUOHYHOLWPDNHVPRVWVHQVHWRVHWWKHUDWLRLQWKHSRVWJUHVTOFRQIILOH,I\RX
KDYHGLIIHUHQWNLQGVRIGLVNV\RXFDQVHWWKHYDOXHVDWWKHtablespaceOHYHO
XVLQJWKHALTER TABLESPACEFRPPDQG
'HWDLOVDERXWWKLVVHWWLQJFDQEHIRXQGDW5DQGRP3DJH&RVW5HYLVLWHG7KH
DUWLFOHVXJJHVWVWKHIROORZLQJVHWWLQJV
+LJKHQG1$66$1RU
$PD]RQ(%6DQG+HURNX
L6&6,DQGRWKHUPHGLRFUH6$1VEXWYDULHVZLGHO\
66'VWR
1Y5$0RU1$1'
pg_statsJLYHVWKHSODQQHUDVHQVHRIKRZDFWXDOYDOXHVDUHGLVSHUVHGZLWKLQD
JLYHQFROXPQDQGOHWVLWSODQDFFRUGLQJO\7KHpg_statsWDEOHLVFRQVWDQWO\
XSGDWHGDVDEDFNJURXQGSURFHVV$IWHUDODUJHGDWDORDGRUDPDMRUGHOHWLRQ\RX
VKRXOGPDQXDOO\XSGDWHWKHVWDWVE\H[HFXWLQJVACUUM ANALYZEVACUUM
SHUPDQHQWO\UHPRYHVGHOHWHGURZVIURPWDEOHVANALYZEXSGDWHVWKHVWDWV
)RUFROXPQVWKDWSDUWLFLSDWHRIWHQLQMRLQVDQGDUHXVHGKHDYLO\LQWHEREFODXVHV
FRQVLGHULQFUHDVLQJWKHQXPEHURIVDPSOHGURZV
9HUVLRQLQWURGXFHGVXSSRUWIRUPXOWLFROXPQVWDWVYLDWKHQHZ&5($7(
67$7,67,&6''/FRQVWUXFW7KLVIHDWXUHDOORZV\RXWRFUHDWHVWDWVDJDLQVWD
FRPELQDWLRQRIFROXPQV$PXOWLFROXPQVWDWLVXVHIXOLI\RXKDYHFROXPQVWKDW
DUHFRUUHODWHGLQYDOXH6D\IRUH[DPSOHWKDW\RXKDYHDSDUWLFXODUNLQGRIGDWD
IRURQO\RQH\HDUDQGQRWRWKHU\HDUV,QWKDWFDVH\RXPLJKWZDQWWRFUHDWHD
FRPSRXQGVWDWIRUfact_type_idDQGyrDVVKRZQLQ([DPSOH
([DPSOH0XOWLFROXPQVWDWV
CREATE STATISTICS census.stats_facts_type_yr_dep_dist (dependencies, ndistinct)
ON fact_type_id, yr FROM [Link];
ANALYZE [Link];
$&5($7(67$7,67,&6VWDWHPHQWPXVWVSHFLI\WZRRUPRUHFROXPQVLQD
VLQJOHWDEOH([DPSOHFUHDWHVVWDWVRQWKHFROXPQVfact_type_idDQGyrLQ )LJXUH([SRUWUHSRUWRSWLRQV
WKH[Link]WDEOH7KHVWDWLVWLFVVKRXOGDOVREHQDPHGDOWKRXJKWKDWLV
RSWLRQDO,I\RXVSHFLI\DVFKHPDDVSDUWRIWKHQDPHWKHVWDWLVWLFVZLOOEH %DFNXSDQG5HVWRUH
FUHDWHGLQWKDWVFKHPDRWKHUZLVHWKH\JHWFUHDWHGLQWKHGHIDXOWVFKHPD
SJ$GPLQRIIHUVDJUDSKLFDOLQWHUIDFHWRpg_dumpDQGpg_restoreFRYHUHGLQ
<RXFDQFROOHFWWZRNLQGVRIVWDWLVWLFVDQGPXVWVSHFLI\RQHRUERWKLQ\RXU ߡ%DFNXSDQG5HVWRUHߢ,QWKLVVHFWLRQZHߞOOUHSHDWVRPHRIWKHVDPHH[DPSOHV
VWDWHPHQW XVLQJSJ$GPLQLQVWHDGRIWKHFRPPDQGOLQH
7KHdependenciesVWDWLVWLFFDWDORJVGHSHQGHQFLHVEHWZHHQFROXPQV)RU ,IVHYHUDOYHUVLRQVRI3RVWJUH64/RUSJ$GPLQDUHLQVWDOOHGRQ\RXUFRPSXWHU
H[DPSOH]LSFRGHLVVHHQRQO\ZLWK%RVWRQLQWKHcityFROXPQ LWߞVDJRRGLGHDWRPDNHVXUHWKDWWKHSJ$GPLQYHUVLRQLVXVLQJWKHYHUVLRQVRI
dependenciesVWDWLVWLFVDUHXVHGRQO\WRRSWLPL]HTXHULHVZLWKHTXDOLWLHV WKHXWLOLWLHVWKDW\RXH[SHFW&KHFNZKDWWKHELQVHWWLQJLQSJ$GPLQLVSRLQWLQJ
VXFKDVDTXHU\VSHFLI\LQJcity = 'Boston' and zip = '02109' WRLQRUGHUWRHQVXUHLWߞVWKHODWHVWDYDLODEOHDVVKRZQLQ)LJXUH
7KHndistinctVWDWLVWLFFDWDORJVKRZRIWHQFROXPQYDOXHVDUHVHHQWRJHWKHU
ZLOODOZD\VSHUIRUPDVHTXHQWLDOVFDQEHFDXVHWKHLQGH[ZHKDYHLQSODFHFDQߞW
VHUYLFHWKLVTXHU\6RLWLVLPSRUWDQWWRFRQVLGHUZKLFKLQGH[HVZLOOEHXVHIXODQG
WRZULWHTXHULHVWRWDNHDGYDQWDJHRIWKHP$QGH[SHULPHQWH[SHULPHQW
H[SHULPHQW
7DEOH6WDWLVWLFV
'HVSLWHZKDW\RXPLJKWWKLQNRUKRSHWKHTXHU\SODQQHULVQRWDPDJLFLDQ,WV
GHFLVLRQVIROORZSUHVFULEHGORJLFWKDWߞVIDUEH\RQGWKHVFRSHRIWKLVERRN7KH
UXOHVWKDWWKHSODQQHUIROORZVGHSHQGKHDYLO\RQWKHFXUUHQWVWDWHRIWKHGDWD7KH
SODQQHUFDQߞWSRVVLEO\VFDQDOOWKHWDEOHVDQGURZVSULRUWRIRUPXODWLQJLWVSODQ
7KDWZRXOGEHVHOIGHIHDWLQJ,QVWHDGLWUHOLHVRQDJJUHJDWHGVWDWLVWLFVDERXWWKH
GDWD
7KHUHIRUHKDYLQJDFFXUDWHDQGFXUUHQWVWDWVLVFUXFLDOIRUWKHSODQQHUWRPDNHWKH
ULJKWGHFLVLRQ,IVWDWVGLIIHUJUHDWO\IURPUHDOLW\WKHSODQQHUZLOORIWHQFRPHXS
ZLWKEDGSODQVWKHPRVWGHWULPHQWDORIWKHVHEHLQJXQQHFHVVDU\VHTXHQWLDOWDEOH
VFDQV*HQHUDOO\RQO\DERXWSHUFHQWRIWKHHQWLUHWDEOHLVVDPSOHGWRSURGXFH
VWDWV7KLVSHUFHQWDJHFRXOGEHHYHQORZHUIRUYHU\ODUJHWDEOHV<RXFDQFRQWURO
WKHQXPEHURIURZVVDPSOHGRQDFROXPQE\FROXPQEDVLVE\VHWWLQJWKH
STATISTICSYDOXH
)LJXUHSJ$GPLQ)LOH࠱3UHIHUHQFHV 7RJHWDVHQVHRIWKHLQIRUPDWLRQFXOOHGDQGXVHGE\WKHSODQQHUTXHU\WKH
pg_statsWDEOHDVLOOXVWUDWHGLQ([DPSOH
:$51,1* ([DPSOH'DWDGLVWULEXWLRQKLVWRJUDP
,I\RXUVHUYHULVUHPRWHRU\RXUGDWDEDVHVDUHKXJHZHUHFRPPHQGXVLQJWKHFRPPDQGOLQH SELECT
WRROVIRUEDFNXSDQGUHVWRUHLQVWHDGRISJ$GPLQWRDYRLGDGGLQJDQRWKHUOD\HURIFRPSOH[LW\ attname As colname,
WRZKDWFRXOGDOUHDG\EHDSUHWW\OHQJWK\SURFHVV$OVRNHHSLQPLQGWKDWLI\RXGRD n_distinct,
FRPSUHVVHG7$5GLUHFWRU\EDFNXSZLWKDQHZHUYHUVLRQRIpg_dump\RXQHHGWRXVHWKHVDPH most_common_vals AS common_vals,
RUODWHUYHUVLRQRIpg_restore most_common_freqs As dist_freq
FROM pg_stats
WHERE tablename = 'facts'
ORDER BY schemaname, tablename, attname;
%DFNLQJXSDQHQWLUHGDWDEDVH colname | n_distinct | common_vals | dist_freq
-------------+------------+------------------+------------------------------
,Qߡ6HOHFWLYH%DFNXS8VLQJSJBGXPSߢZHGHPRQVWUDWHGKRZWREDFNXSD fact_type_id | 68 | {135,113... | {0.0157,0.0156333,...
perc | 985 | {0.00,... | {0.1845,0.0579333,0.056...
GDWDEDVH7RUHSHDWWKHVDPHVWHSVXVLQJWKHSJ$GPLQLQWHUIDFHULJKWFOLFNWKH tract_id | 1478 | {25025090300... | {0.00116667,0.00106667,0.0...
GDWDEDVH\RXZDQWWREDFNXSDQGFKRRVH&XVWRPIRU)RUPDWDVVKRZQLQ val | 3391 | {0.000,1.000,2...| {0.2116,0.0681333,0...
yr | 2 | {2011,2010} | {0.748933,0.251067}
)LJXUH
Filter: (fact_subcats
&& '{"White alone","Black alone"}'::character varying[])
Rows Removed by Filter: 66
Planning time: 0.182 ms
Execution time: 0.108 ms
2EVHUYHWKDWZKHQenable_seqscanLVHQDEOHGRXULQGH[LVQRWEHLQJXVHGDQG
WKHSODQQHUKDVFKRVHQWRGRDVHTXHQWLDOVFDQ7KLVFRXOGEHEHFDXVHRXUWDEOHLV
VRVPDOORUEHFDXVHWKHLQGH[ZHKDYHLVQRJRRGIRUWKLVTXHU\,IZHUHSHDWWKH
TXHU\EXWWXUQRIIVHTXHQWLDOVFDQEHIRUHKDQGDVVKRZQLQ([DPSOHZH
FDQVHHWKDWZHKDYHVXFFHHGHGLQIRUFLQJWKHSODQQHUWRXVHWKHLQGH[
([DPSOH'LVDEOHVHTXHQWLDOVFDQFRHUFHLQGH[XVH
set enable_seqscan = false;
EXPLAIN (ANALYZE)
SELECT *
FROM census.lu_fact_types
WHERE fact_subcats && '{White alone, Black alone}'::varchar[];
Bitmap Heap Scan on lu_fact_types
(cost=12.02..14.04 rows=2 width=200)
(actual time=0.058..0.058 rows=2 loops=1)
Recheck Cond: (fact_subcats
&& '{"White alone","Black alone"}'::character varying[])
Heap Blocks: exact=1
-> Bitmap Index Scan on idx_lu_fact_types
(cost=0.00..12.02 rows=2 width=0)
(actual time=0.048..0.048 rows=2 loops=1)
Index Cond: (fact_subcats
&& '{"White alone","Black alone"}'::character varying[])
Planning time: 0.230 ms
Execution time: 0.119 ms
)URPWKLVSODQZHOHDUQWKDWRXULQGH[FDQEHXVHGEXWHQGVXSPDNLQJWKH
)LJXUH%DFNXSGDWDEDVH
TXHU\WDNHORQJHUEHFDXVHWKHFRVWLVPRUHWKDQGRLQJDVHTXHQWLDOVFDQ
7KHUHIRUHXQGHUQRUPDOFLUFXPVWDQFHVWKHSODQQHUZLOORSWIRUWKHVHTXHQWLDO %DFNLQJXSV\VWHPZLGHREMHFWV
VFDQ$VZHDGGPRUHGDWDWRRXUWDEOHZHߞOOSUREDEO\ILQGWKDWWKHSODQQHU
FKDQJHVVWUDWHJLHVWRDQLQGH[VFDQ SJ$GPLQSURYLGHVDJUDSKLFDOLQWHUIDFHWRpg_dumpallIRUEDFNLQJXSV\VWHP
REMHFWV7RXVHWKHLQWHUIDFHILUVWFRQQHFWWRWKHVHUYHU\RXZDQWWREDFNXS
,QFRQWUDVWWRWKHSUHYLRXVH[DPSOHVXSSRVHZHZHUHWRZULWHDTXHU\RIWKH 7KHQIURPWKHWRSPHQXFKRRVH7RROV࠱%DFNXS*OREDOV
IRUP
SJ$GPLQGRHVQߞWJLYH\RXFRQWURORYHUZKLFKJOREDOREMHFWVWREDFNXSDVWKH
SELECT * FROM census.lu_fact_types WHERE 'White alone' = ANY(fact_subcats); FRPPDQGOLQHLQWHUIDFHGRHVSJ$GPLQEDFNVXSDOOWDEOHVSDFHVDQGUROHV
,I\RXHYHUZDQWWREDFNXSWKHHQWLUHVHUYHULQYRNHpg_dumpallE\JRLQJWRWKH
:HZRXOGGLVFRYHUWKDWUHJDUGOHVVRIKRZZHVHWenable_seqscanWKHSODQQHU
WRSPHQXDQGFKRRVLQJ7RROV࠱%DFNXS6HUYHU QRWRXWRILJQRUDQFH2QHTXLFNZD\WRFKHFNLVWRGLVDEOHWKHP,IWKH\DUHXVHG
E\GHIDXOWEXWQRWXVHGZKHQ\RXGLVDEOHWKHPFRPSDUHWKHDFWXDOFRVWV
6HOHFWLYHEDFNXSRIGDWDEDVHDVVHWV EHWZHHQWKHWZRFDVHVWRFRQILUPWKDWXVLQJWKHPLVPRUHHIILFLHQWWKDQQRWXVLQJ
SJ$GPLQSURYLGHVDJUDSKLFDOLQWHUIDFHWRpg_dumpIRUVHOHFWLYHEDFNXS5LJKW WKHP
FOLFNWKHDVVHW\RXZDQWWREDFNXSDQGVHOHFW%DFNXSVHH)LJXUH<RXFDQ
EDFNXSDQHQWLUHGDWDEDVHDSDUWLFXODUVFKHPDDWDEOHRUDQ\WKLQJHOVH +RZ8VHIXO,V<RXU,QGH["
:KHQWKHSODQQHUGHFLGHVWRSHUIRUPDVHTXHQWLDOVFDQLWORRSVWKURXJKDOOWKH
URZVRIDWDEOH,WRSWVIRUWKLVURXWHZKHQLWILQGVQRLQGH[WKDWFRXOGVDWLVI\D
TXHU\FRQGLWLRQRULWFRQFOXGHVWKDWXVLQJDQLQGH[LVPRUHFRVWO\WKDQVFDQQLQJ
WKHWDEOH,I\RXGLVDEOHWKHVHTXHQWLDOVFDQVWUDWHJ\DQGWKHSODQQHUVWLOOLQVLVWV
RQXVLQJLWWKLVPHDQVWKDWLQGH[HVDUHPLVVLQJRUWKDWWKHSODQQHUFDQߞWXVHWKH
LQGH[HV\RXKDYHLQSODFHIRUWKHSDUWLFXODUTXHU\7ZRFRPPRQPLVWDNHVSHRSOH
PDNHDUHWROHDYHXVHIXOLQGH[HVRXWRIWKHLUWDEOHVRUWRSXWLQLQGH[HVWKDWFDQߞW
EHXVHGE\WKHLUTXHULHV$QHDV\ZD\WRFKHFNZKHWKHU\RXULQGH[HVDUHEHLQJ
XVHGLVWRTXHU\WKHpg_stat_user_indexesDQGpg_stat_user_tablesYLHZV
7RWDUJHWVORZTXHULHVXVHWKHpg_stat_statementsH[WHQVLRQGHVFULEHGLQ
ߡ*DWKHULQJ6WDWLVWLFVRQ6WDWHPHQWVߢ
/HWߞVVWDUWRIIZLWKDTXHU\DJDLQVWWKHWDEOHZHFUHDWHGLQ([DPSOH:HߞOO
DGGD*,1LQGH[RQWKHDUUD\FROXPQ*,1LQGH[HVDUHDPRQJWKHIHZLQGH[HV
)LJXUHSJ$GPLQVFKHPDEDFNXS
\RXFDQXVHWRLQGH[DUUD\V
7REDFNXSWKHVHOHFWHGDVVHW\RXFDQIRUJRWKHRWKHUWDEVVHH)LJXUH,Q
SJ$GPLQ\RXFDQVHOHFWLYHO\GULOOGRZQWRPRUHLWHPVE\FOLFNLQJWKH2EMHFWV CREATE INDEX idx_lu_fact_types ON census.lu_fact_types USING gin (fact_subcats);
WDEDVVKRZQLQ)LJXUH7KLVIHDWXUHLVQRW\HWSUHVHQWLQSJ$GPLQ
7RWHVWRXULQGH[ZHߞOOH[HFXWHDTXHU\WRILQGDOOURZVZLWKVXEFDWVFRQWDLQLQJ
ߡ:KLWHDORQHߢRUߡ$VLDQDORQHߢ:HH[SOLFLWO\HQDEOHGVHTXHQWLDOVFDQHYHQ
WKRXJKLWߞVWKHGHIDXOWVHWWLQJMXVWWREHVXUH7KHDFFRPSDQ\LQJEXPLAINRXWSXW
LVVKRZQLQ([DPSOH
([DPSOH$OORZSODQQHUWRFKRRVHVHTXHQWLDOVFDQ
set enable_seqscan = true;
EXPLAIN (ANALYZE)
SELECT *
FROM census.lu_fact_types
WHERE fact_subcats && '{White alone, Black alone}'::varchar[];
Seq Scan on lu_fact_types
(cost=0.00..2.85 rows=2 width=200)
actual time=0.066..0.076 rows=2 loops=1)
-RLQVDOVREHQHILWIURPSDUDOOHOL]DWLRQ,Q3RVWJUH64/QHVWHGORRSVDQGKDVK
MRLQVDUHSDUDOOHOL]DEOH
,QQHVWHGORRSVHDFKZRUNHUPDWFKHVLWVVXEVHWRIGDWDDJDLQVWDFRPSOHWH
UHIHUHQFHVHWRIGDWDVKDUHGE\DOOZRUNHUV
,QKDVKMRLQVHDFKZRUNHUEXLOGVDVHSDUDWHFRS\RIWKHKDVKWDEOHDQGMRLQVWKLV
ZLWKWKHLUSDUWLWLRQHGVKDUHRIRWKHUWDEOHV7KXVLQDKDVKMRLQZRUNHUVDUH
GRLQJUHGXQGDQWZRUNE\GRLQJDIXOOKDVK6RLQFDVHVZKHUHFUHDWLQJWKHKDVK
WDEOHLVH[SHQVLYHDSDUDOOHOKDVKMRLQLVOHVVHIILFLHQWWKDQDQRQSDUDOOHOMRLQ
,Q3RVWJUH64/PHUJHMRLQVDUHSDUDOOHOL]DEOH0HUJHMRLQVKDYHDVLPLODU
OLPLWDWLRQWRKDVKMRLQVLQWKDWRQHVLGHRIWKHMRLQLVUHSHDWHGLQLWVHQWLUHW\E\
HDFKZRUNHU
*XLGLQJWKH4XHU\3ODQQHU
7KHSODQQHUߞVEHKDYLRULVGULYHQE\WKHSUHVHQFHRILQGH[HVFRVWVHWWLQJV
VWUDWHJ\VHWWLQJVDQGLWVJHQHUDOSHUFHSWLRQRIWKHGLVWULEXWLRQRIGDWD,QWKLV
VHFWLRQZHߞOOJRRYHUYDULRXVDSSURDFKHVIRURSWLPL]LQJWKHSODQQHUߞVEHKDYLRU )LJXUHSJ$GPLQVHOHFWLYHEDFNXS2EMHFWVWDE
6WUDWHJ\6HWWLQJV 7,3
$OWKRXJKWKH3RVWJUH64/TXHU\SODQQHUGRHVQߞWDFFHSWLQGH[KLQWVDVVRPH %HKLQGWKHVFHQHVSJ$GPLQVLPSO\UXQVpg_dumpWRSHUIRUPEDFNXSV,I\RXHYHUZDQWWR
RWKHUGDWDEDVHSURGXFWVGR\RXFDQGLVDEOHYDULRXVVWUDWHJ\VHWWLQJVRQDSHU NQRZWKHDFWXDOFRPPDQGVSJ$GPLQLVXVLQJVD\IRUVFULSWLQJORRNDWWKH0HVVDJHVWDEDIWHU
\RXFOLFNWKH%DFNXSEXWWRQ<RXߞOOVHHWKHH[DFWFDOOZLWKDUJXPHQWVWRpg_dump
TXHU\RUSHUPDQHQWEDVLVWRGLVVXDGHWKHSODQQHUIURPJRLQJGRZQDQ
XQSURGXFWLYHSDWK$OOSODQQHURSWLPL]LQJVHWWLQJVDUHGRFXPHQWHGLQWKHVHFWLRQ
3ODQQHU0HWKRG&RQILJXUDWLRQRIWKHPDQXDO%\GHIDXOWDOOVWUDWHJ\VHWWLQJVDUH
HQDEOHGDUPLQJWKHSODQQHUZLWKPD[LPXPIOH[LELOLW\<RXFDQGLVDEOHYDULRXV SJ6FULSW
VWUDWHJLHVLI\RXKDYHVRPHSULRUNQRZOHGJHRIWKHGDWD.HHSLQPLQGWKDW
SJ6FULSWLVDEXLOWLQVFULSWLQJWRROLQSJ$GPLQEXWLVQRWSUHVHQWLQSJ$GPLQ
GLVDEOLQJGRHVQߞWQHFHVVDULO\PHDQWKDWWKHSODQQHUZLOOEHEDUUHGIURPXVLQJWKH
,WߞVPRVWXVHIXOIRUUXQQLQJUHSHWLWLYH64/WDVNVSJ6FULSWFDQPDNHEHWWHUXVHRI
VWUDWHJ\<RXߞUHRQO\PDNLQJDSROLWHUHTXHVWWRWKHSODQQHUWRDYRLGLW
PHPRU\DQGWKXVEHPRUHHIILFLHQWWKDQHTXLYDOHQW3RVWJUH64/IXQFWLRQV7KLV
7ZRVHWWLQJVWKDWZHRFFDVLRQDOO\GLVDEOHDUHenable_nestloopDQG LVEHFDXVHVWRUHGIXQFWLRQVPDLQWDLQDOOWKHLUZRUNLQPHPRU\DQGFRPPLWDOOWKH
enable_seqscan7KHUHDVRQLVWKDWWKHVHWZRVWUDWHJLHVWHQGWREHWKHVORZHVW UHVXOWVRIDIXQFWLRQLQDVLQJOHEDWFK,QFRQWUDVWSJ6FULSWFRPPLWVHDFK64/
WKRXJKQRWLQDOOFDVHV$OWKRXJK\RXFDQGLVDEOHWKHPWKHSODQQHUFDQVWLOOXVH LQVHUWRUXSGDWHVWDWHPHQWDVLWUXQVWKURXJKWKHVFULSW7KLVPDNHVSJ6FULSW
WKHPZKHQLWKDVQRYLDEOHDOWHUQDWLYH:KHQ\RXGRVHHWKHPEHLQJXVHGLWߞVD SDUWLFXODUO\KDQG\IRUPHPRU\KXQJU\SURFHVVHVWKDW\RXGRQߞWQHHGFRPSOHWHG
JRRGLGHDWRGRXEOHFKHFNWKDWWKHSODQQHULVXVLQJWKHPRXWRIHIILFLHQF\DQG DVVLQJOHWUDQVDFWLRQV$IWHUHDFKWUDQVDFWLRQFRPPLWVPHPRU\EHFRPHV
DYDLODEOHIRUWKHQH[WRQH<RXFDQVHHDQH[DPSOHZKHUHZHXVHSJ6FULSWIRU ORDER BY area_type_code;
Sort
EDWFKJHRFRGLQJDW8VLQJSJ6FULSWIRU*HRFRGLQJ (cost=176300.24..176300.25 rows=3 width=10)
(actual time=1647.060..1647.060 rows=3 loops=1)
7KHSJ6FULSWODQJXDJHLVOD]LO\W\SHGDQGVXSSRUWVFRQGLWLRQDOVORRSVGDWD Output: (COUNT(*)), area_type_code
JHQHUDWRUVEDVLFSULQWVWDWHPHQWVDQGUHFRUGYDULDEOHV7KHJHQHUDOV\QWD[LV Sort Key: labor.area_type_code
VLPLODUWRWKDWRI7UDQVDFW64/WKHVWRUHGSURFHGXUHODQJXDJHRI0LFURVRIW64/ Sort Method: quicksort Memory: 25kB
-> HashAggregate
6HUYHU9DULDEOHVSUHSHQGHGZLWK@FDQKROGVFDODUVRUDUUD\VLQFOXGLQJWKH (cost=176300.19..176300.22 rows=3 width=10)
UHVXOWVRI64/FRPPDQGV&RPPDQGVVXFKDVDECLAREDQGSETDQGFRQWURO (actual time=1647.025..1647.025 rows=3 loops=1)
Output: count(*), area_type_code
FRQVWUXFWVVXFKDVIF-ELSEDQGWHILEORRSVDUHSDUWRIWKHSJ6FULSWODQJXDJH Group Key: labor.area_type_code
-> Seq Scan on [Link]
/DXQFKSJ6FULSWE\RSHQLQJDUHJXODU64/TXHU\ZLQGRZ$IWHUW\SLQJLQ\RXU (cost=0.00..143986.79 rows=6462679 width=2)
VFULSWH[HFXWHLWE\FOLFNLQJWKHSJ6FULSWLFRQ (actual time=0.076..620.563 rows=6462713 loops=1)
Output: series_id, year, period, value, footnote_codes, area_type_code
:HߞOOQRZVKRZ\RXVRPHH[DPSOHVRISJ6FULSWV([DPSOHGHPRQVWUDWHV Planning time: 0.054 ms
Execution time: 1647.115 ms
KRZWRXVHSJ6FULSWUHFRUGYDULDEOHVDQGORRSVWREXLOGDFURVVWDEWDEOHXVLQJ
WKHlu_fact_typesWDEOHZHFUHDWHLQ([DPSOH7KHSJ6FULSWFUHDWHVDQ ,QERWKFDVHVWKHRXWSXWLVWKHIROORZLQJ
HPSW\WDEOHFDOOHGcensus.hisp_popZLWKQXPHULFFROXPQV
hispanic_or_latinowhite_aloneblack_or_african_american_alone count | area_type_code
--------+---------------
DQGVRRQ 3718937 | M
2105205 | N
([DPSOH&UHDWHDWDEOHXVLQJUHFRUGYDULDEOHVLQSJ6FULSW 638571 | S
DECLARE @I, @labels, @tdef; (3 rows)
SET @I = 0;
max_worker_processesQHHGVWREHJUHDWHUWKDQ]HUR
max_parallel_workersDQHZVHWWLQJLQ3RVWJUH64/QHHGVWREHJUHDWHU
WKDQ]HURDQGOHVVWKDQRUHTXDOWRmax_worker_processes
max_parallel_workers_per_gatherQHHGVWREHJUHDWHUWKDQ]HURDQGOHVV
WKDQRUHTXDOWRmax_worker_processes)RU3RVWJUH64/WKLVVHWWLQJ
PXVWDOVREHOHVVWKDQRUHTXDOWRmax_parallel_workers<RXFDQDSSO\
WKLVSDUWLFXODUVHWWLQJDWWKHVHVVLRQRUIXQFWLRQOHYHO
:KDW'RHVD3DUDOOHO4XHU\3ODQ/RRN/LNH"
+RZGR\RXNQRZLI\RXUTXHU\LVDEHQHILFLDU\RISDUDOOHOL]DWLRQ"/RRNLQWKH
SODQ3DUDOOHOL]DWLRQLVGRQHE\DSDUWRIWKHSODQQHUFDOOHGDJDWKHUQRGH6RLI
\RXVHHDJDWKHUQRGHLQ\RXUTXHU\SODQ\RXKDYHVRPHNLQGRISDUDOOHOL]DWLRQ
$JDWKHUQRGHFRQWDLQVH[DFWO\RQHSODQZKLFKLWGLYLGHVDPRQJVWZKDWDUH
FDOOHGZRUNHUV(DFKZRUNHUUXQVDVVHSDUDWHEDFNHQGSURFHVVHVHDFKSURFHVV
ZRUNLQJRQDSRUWLRQRIWKHRYHUDOOTXHU\7KHUHVXOWVRIZRUNHUVDUHFROOHFWHGE\
DZRUNHUDFWLQJDVWKHOHDGHU7KHOHDGHUGRHVWKHVDPHZRUNDVRWKHUZRUNHUV
EXWKDVWKHDGGHGUHVSRQVLELOLW\RIFROOHFWLQJDOOWKHDQVZHUVIURPIHOORZ )LJXUH*UDSKLFDOH[SODLQH[DPSOH
ZRUNHUV,IWKHJDWKHUQRGHLVWKHURRWQRGHRIDSODQWKHZKROHTXHU\ZLOOEH
UXQLQSDUDOOHO,ILWߞVORZHUGRZQRQO\WKHVXESODQLWHQFRPSDVVHVZLOOEH *UDSKLFDOH[SODLQLVGLVDEOHGLI4XHU\࠱([SODLQ࠱%XIIHUVLVHQDEOHG6RPDNH
SDUDOOHOL]HG VXUHWRXQFKHFNEXIIHUVEHIRUHWU\LQJDJUDSKLFDOH[SODLQ,QDGGLWLRQWRWKH
JUDSKLFDOH[SODLQWKH'DWD2XWSXWWDEVKRZVWKHWH[WXDOH[SODLQSODQZKLFKIRU
)RUGHEXJJLQJSXUSRVHV\RXFDQLQYRNHDVHWWLQJFDOOHG WKLVH[DPSOHORRNVOLNH
force_parallel_mode:KHQWUXHLWZLOOHQFRXUDJHWKHSODQQHUWRXVHSDUDOOHO
PRGHLIDTXHU\LVSDUDOOHOL]DEOHHYHQZKHQWKHSODQQHUFRQFOXGHVLWߞVQRWFRVW GroupAggregate (cost=111.29..151.93 rows=1478 width=20)
HIIHFWLYHWRGRVR7KLVVHWWLQJLVXVHIXOGXULQJGHEXJJLQJWRILJXUHRXWZK\D Output: ("left"((tract_id)::text, 5)), sum(hispanic_or_latino),
sum(white_alone), ...
TXHU\LVQRWSDUDOOHOL]HG'RQߞWVZLWFKRQWKLVVHWWLQJLQDSURGXFWLRQ -> Sort (cost=111.29..114.98 rows=1478 width=20)
HQYLURQPHQWWKRXJK Output: tract_id, hispanic_or_latino, white_alone,
("left"((tract_id)::text, 5))
7KHTXHULHV\RXߞYHVHHQWKXVIDULQWKLVFKDSWHUZLOOQRWWULJJHUDSDUDOOHOSODQ Sort Key: ("left"((tract_id)::text, 5))
EHFDXVHWKHFRVWRIVHWWLQJXSWKHEDFNJURXQGZRUNHUVRXWZHLJKVWKHEHQHILW7R -> Seq Scan on census.hisp_pop (cost=0.00..33.48 rows=1478 width=20)
Output: tract_id, hispanic_or_latino
FRQILUPWKDWRXUTXHU\WDNHVORQJHUZKHQIRUFHGWREHSDUDOOHOWU\WKHIROORZLQJ , white_alone, "left"((tract_id)::text, 5)
,I\RXZDQWSJ$JHQWWRUXQEDWFKMREVRQDGGLWLRQDOVHUYHUVIROORZWKHVDPH
)LJXUH*UDSKLFDOSODQZKHQXVLQJVXETXHULHVLQVWHDGRI&$6(
VWHSVH[FHSWWKDW\RXGRQߞWKDYHWRUHLQVWDOOWKH64/VFULSWSDFNDJHGZLWK
:HQRZUHZULWHWKHTXHU\XVLQJCASE<RXߞOOILQGWKDWWKHHFRQRPL]HGTXHU\ SJ$JHQW3D\SDUWLFXODUDWWHQWLRQWRWKH26SHUPLVVLRQVHWWLQJVRIWKHSJ$JHQW
VKRZQLQ([DPSOHLVJHQHUDOO\IDVWHUDQGPXFKHDVLHUWRUHDG VHUYLFHGDHPRQDFFRXQW0DNHVXUHHDFKDJHQWKDVVXIILFLHQWSULYLOHJHVWR
H[HFXWHWKHEDWFKMREVWKDW\RXZLOOEHVFKHGXOLQJ
([DPSOH8VLQJ&$6(LQVWHDGRIVXETXHULHV
SELECT T.tract_id, COUNT(*) As tot,
COUNT(CASE WHEN F.fact_type_id = 131 THEN 1 ELSE NULL END) AS type_1
FROM census.lu_tracts AS T LEFT JOIN [Link] AS F :$51,1*
ON T.tract_id = F.tract_id %DWFKMREVRIWHQIDLOLQSJ$JHQWHYHQZKHQWKH\PLJKWUXQILQHIURPWKHFRPPDQGOLQH7KLV
GROUP BY T.tract_id; LVRIWHQGXHWRSHUPLVVLRQLVVXHVSJ$JHQWDOZD\VUXQVXQGHUWKHVDPHDFFRXQWDVWKHSJ$JHQW
VHUYLFHGDHPRQ,IWKLVDFFRXQWGRHVQߞWKDYHVXIILFLHQWSULYLOHJHVRUWKHQHFHVVDU\QHWZRUN
)LJXUHVKRZVWKHJUDSKLFDOSODQRI([DPSOH SDWKPDSSLQJVMREVIDLO
6FKHGXOLQJ-REV
(DFKVFKHGXOHGMREKDVWZRSDUWVWKHH[HFXWLRQVWHSVDQGWKHVFKHGXOH:KHQ
FUHDWLQJDQHZMREVWDUWE\DGGLQJRQHRUPRUHMREVWHSV)LJXUHVKRZV
ZKDWWKHVWHSDGGHGLWVFUHHQORRNVOLNH
)LJXUH*UDSKLFDOH[SODLQZKHQXVLQJ&$6(
(YHQWKRXJKRXUUHZULWWHQTXHU\VWLOOGRHVQߞWXVHWKHfact_typeLQGH[LWߞVIDVWHU
WKDQXVLQJVXETXHULHVEHFDXVHWKHSODQQHUVFDQVWKHfactsWDEOHRQO\RQFH$
VKRUWHUSODQLVJHQHUDOO\QRWRQO\HDVLHUWRFRPSUHKHQGEXWDOVRRIWHQSHUIRUPV
EHWWHUWKDQDORQJHURQHDOWKRXJKQRWDOZD\V
8VLQJ),/7(5,QVWHDGRI&$6(
3RVWJUH64/LQWURGXFHGWKHFILTERFRQVWUXFWZKLFKZHLQWURGXFHGLQ
ߡ),/7(5&ODXVHIRU$JJUHJDWHVߢFILTERFDQRIWHQUHSODFHCASELQDJJUHJDWH
H[SUHVVLRQV1RWRQO\LVWKLVV\QWD[PRUHSOHDVDQWWRORRNDWEXWLQPDQ\
VLWXDWLRQVLWSHUIRUPVEHWWHU:HUHSHDW([DPSOHZLWKWKHHTXLYDOHQWILOWHU
YHUVLRQLQ([DPSOH
1RZZHTXHU\RXUYLHZZLWKWKLVTXHU\
([HFXWLRQWLPHLVDERXWPVRQRXUVHUYHUEHFDXVHLWGRHVQߞWUXQDQ\
FRPSXWDWLRQIRUFHUWDLQILHOGVVXFKDVnum_factsDQGnum_fact_typesILHOGV
ZHGLGQRWDVNIRU,I\RXORRNHGDWWKHSODQ\RXPD\EHVWDUWOHGWRILQGWKDWLW
QHYHUHYHQWRXFKHVWKHIDFWVWDEOHEHFDXVHLWߞVVPDUWHQRXJKWRNQRZLWGRHVQߞW
QHHGWR%XWVXSSRVHZHHQWHU
2XUH[HFXWLRQWLPHVN\URFNHWVWRPVDQGWKHSODQLVMXVWDVZHKDGLQ
)LJXUH$OWKRXJKRXUUHVXOWVLQWKLVH[DPSOHVXIIHUWKHORVVRIMXVW
PLOOLVHFRQGVLPDJLQHWDEOHVZLWKWHQVRIPLOOLRQVRIURZVDQGKXQGUHGVRI
)LJXUHSJ$GPLQVWHSHGLWVFUHHQ FROXPQV7KRVHPLOOLVHFRQGVFRXOGWUDQVODWHLQWRRYHUWLPHDWWKHRIILFHZDLWLQJ
)RUHDFKVWHS\RXFDQHQWHUDQ64/VWDWHPHQWWRUXQSRLQWWRDVKHOOVFULSWRQ IRUDTXHU\WRILQLVK
WKH26RUHYHQFXWDQGSDVWHLQDIXOOVKHOOVFULSWDVZHFRPPRQO\GR
0DNH*RRG8VHRI&$6(
,I\RXFKRRVH64/WKHFRQQHFWLRQW\SHRSWLRQEHFRPHVHQDEOHGDQGGHIDXOWVWR
ORFDO:LWKDORFDOFRQQHFWLRQWKHMREVWHSUXQVRQWKHVDPHVHUYHUDVWKH :HߞUHDOZD\VVXUSULVHGKRZIUHTXHQWO\SHRSOHIRUJHWDERXWXVLQJWKH$16,64/
SJ$JHQWDQGXVHVWKHVDPHDXWKHQWLFDWLRQXVHUQDPHDQGSDVVZRUG<RXQHHGWR CASEH[SUHVVLRQ,QPDQ\DJJUHJDWHVLWXDWLRQVDCASEFDQREYLDWHWKHQHHGIRU
DGGLWLRQDOO\VSHFLI\WKHGDWDEDVHWKDWSJ$JHQWVKRXOGFRQQHFWWRLQRUGHUWRUXQ LQHIILFLHQWVXETXHULHV:HߞOOGHPRQVWUDWHWKHSRLQWZLWKWZRHTXLYDOHQWTXHULHV
WKHMREV7KHVFUHHQRIIHUV\RXDGURSGRZQOLVWRIGDWDEDVHVWRFKRRVHIURP,I DQGWKHLUFRUUHVSRQGLQJSODQV([DPSOHXVHVVXETXHULHV
\RXFKRRVHDUHPRWHFRQQHFWLRQW\SHWKHWH[WER[IRUHQWHULQJDFRQQHFWLRQ ([DPSOH8VLQJVXETXHULHVLQVWHDGRI&$6(
VWULQJEHFRPHVHQDEOHG7\SHLQWKHIXOOFRQQHFWLRQVWULQJLQFOXGLQJFUHGHQWLDOV
SELECT T.tract_id, COUNT(*) As tot, type_1.tot AS type_1
DQGWKHGDWDEDVH:KHQ\RXFRQQHFWWRDUHPRWH3RVWJUH64/VHUYHUZLWKDQ FROM
HDUOLHUYHUVLRQRI3RVWJUH64/PDNHVXUHWKDWDOOWKH64/FRQVWUXFWV\RXXVHDUH census.lu_tracts AS T LEFT JOIN
(SELECT tract_id, COUNT(*) As tot
VXSSRUWHGRQWKDWYHUVLRQ FROM [Link]
WHERE fact_type_id = 131
,I\RXFKRRVHWRUXQEDWFKMREVWKHV\QWD[PXVWEHVSHFLILFWRWKH26UXQQLQJ GROUP BY tract_id
WKHMRE)RUH[DPSOHLI\RXUSJ$JHQWLVUXQQLQJRQ:LQGRZV\RXUEDWFKMREV ) As type_1 ON T.tract_id = type_1.tract_id LEFT JOIN
VKRXOGKDYHYDOLG'26FRPPDQGV,I\RXDUHRQ/LQX[\RXUEDWFKMREVVKRXOG [Link] AS F ON T.tract_id = F.tract_id
GROUP BY T.tract_id, type_1.tot;
KDYHYDOLGVKHOORU%DVKFRPPDQGV
)LJXUHVKRZVWKHJUDSKLFDOSODQRI([DPSOH
6WHSVUXQLQDOSKDEHWLFDORUGHUDQG\RXFDQGHFLGHZKDWNLQGVRIDFWLRQV\RX
ZDQWWRWDNHXSRQVXFFHVVRUIDLOXUHRIHDFKVWHS<RXKDYHWKHRSWLRQRI
VXETXHU\VKRXOGZRUNZLWKWKHPDLQTXHU\QRWLQGHSHQGHQWO\RILW GLVDEOLQJVWHSVWKDWVKRXOGUHPDLQGRUPDQWEXWWKDW\RXGRQߞWZDQWWRGHOHWH
EHFDXVH\RXPLJKWUHDFWLYDWHWKHPODWHU
$YRLG6(/(&7
2QFH\RXKDYHWKHVWHSVUHDG\JRDKHDGDQGVHWXSDVFKHGXOHWRUXQWKHP<RX
SELECT *LVZDVWHIXO,WߞVDNLQWRSULQWLQJRXWDSDJHGRFXPHQWZKHQ\RX FDQVHWXSLQWULFDWHVFKHGXOHVZLWKWKHVFKHGXOLQJVFUHHQ<RXFDQHYHQVHWXS
QHHGRQO\SDJHV%HVLGHVWKHREYLRXVGRZQVLGHRIDGGLQJWRQHWZRUNWUDIILF PXOWLSOHVFKHGXOHV
WKHUHDUHWZRRWKHUGUDZEDFNVWKDW\RXPLJKWQRWWKLQNRI ,I\RXLQVWDOOHGSJ$JHQWRQPXOWLSOHVHUYHUVDQGKDYHWKHPDOOSRLQWLQJWRWKH
)LUVW3RVWJUH64/VWRUHVODUJHEOREDQGWH[WREMHFWVXVLQJ72$677KH VDPHSJ$JHQWGDWDEDVHDOOWKHVHDJHQWVE\GHIDXOWZLOOH[HFXWHDOOMREV
2YHUVL]HG$WWULEXWH6WRUDJH7HFKQLTXH72$67PDLQWDLQVVLGHWDEOHVIRU ,I\RXZDQWWRUXQWKHMRERQMXVWRQHVSHFLILFPDFKLQHILOOLQWKHhost agent
3RVWJUH64/WRVWRUHWKLVH[WUDGDWDDQGPD\FKXQNDVLQJOHWH[WILHOGLQWR ILHOGZKHQFUHDWLQJWKHMRE$JHQWVUXQQLQJRQRWKHUVHUYHUVZLOOVNLSWKHMRELILW
PXOWLSOHURZV6RUHWULHYLQJDODUJHILHOGPHDQVWKDW72$67PXVWDVVHPEOHWKH GRHVQߞWPDWFKWKHLUKRVWQDPH
GDWDIURPVHYHUDOURZVRIDVLGH72$67WDEOH,PDJLQHWKHH[WUDSURFHVVLQJLI
\RXUWDEOHFRQWDLQVWH[WGDWDWKHVL]HRI:DUDQG3HDFHDQG\RXSHUIRUPDQ
XQQHFHVVDU\SELECT * 7,3
SJ$JHQWFRQVLVWVRIWZRSDUWVWKHGDWDGHILQLQJWKHMREVDQGWKHORJJLQJRIWKHMRE/RJ
6HFRQGZKHQ\RXGHILQHYLHZV\RXRIWHQZLOOLQFOXGHPRUHFROXPQVWKDQ LQIRUPDWLRQUHVLGHVLQWKHSJ$JHQWVFKHPDXVXDOO\LQWKHpostgresGDWDEDVHWKHMREDJHQWV
\RXߞOOQHHG<RXPLJKWHYHQJRVRIDUDVWRXVHSELECT *LQVLGHDYLHZ7KLVLV TXHU\WKHMREVIRUWKHQH[WMREWRUXQDQGWKHQLQVHUWUHOHYDQWORJJLQJLQIRUPDWLRQLQWKH
XQGHUVWDQGDEOHDQGSHUIHFWO\ILQH3RVWJUH64/LVVPDUWHQRXJKWROHW\RXUHTXHVW GDWDEDVH*HQHUDOO\ERWKWKH3RVWJUH64/VHUYHUKROGLQJWKHGDWDDQGWKHMREDJHQWH[HFXWLQJ
WKHMREVUHVLGHRQWKHVDPHVHUYHUEXWWKH\DUHQRWUHTXLUHGWR$GGLWLRQDOO\DVLQJOH
DOOWKHFROXPQV\RXZDQWLQ\RXUYLHZGHILQLWLRQDQGHYHQLQFOXGHFRPSOH[ 3RVWJUH64/VHUYHUFDQVHUYLFHPDQ\MREDJHQWVUHVLGLQJRQGLIIHUHQWVHUYHUV
FDOFXODWLRQVRUMRLQVZLWKRXWLQFXUULQJSHQDOW\DVORQJDVQRXVHUUXQVDTXHU\
UHIHUULQJWRLQGLYLGXDOFROXPQV
7RGULYHKRPHRXUSRLQWOHWߞVZUDSRXUFHQVXVLQDYLHZDQGXVHWKHVORZ $IXOO\IRUPHGMRELVVKRZQLQ)LJXUH
VXETXHU\H[DPSOHIURP([DPSOH
+HOSIXOSJ$JHQW4XHULHV
:LWK\RXUILQHO\KRQHG64/VNLOOV\RXFDQHDVLO\UHSOLFDWHMREVGHOHWHMREVDQG
HGLWMREVGLUHFWO\E\PHVVLQJZLWKSJ$JHQWPHWDWDEOHV-XVWEHFDUHIXO)RU
H[DPSOHWRJHWDJOLPSVHLQVLGHWKHWDEOHVFRQWUROOLQJDOORI\RXUDJHQWVDQG
MREVFRQQHFWWRWKHpostgresGDWDEDVHDQGH[HFXWHWKHTXHU\LQ([DPSOH
([DPSOH'HVFULSWLRQRISJ$JHQWWDEOHV
SELECT [Link] As table_name, [Link]
FROM
pg_class As c INNER JOIN
pg_namespace n ON [Link] = [Link] INNER JOIN
pg_description As d ON [Link] = [Link] AND [Link] = 0
WHERE [Link] = 'pgagent'
ORDER BY [Link];
table_name | description
---------------+-------------------------
pga_job | Job main entry
pga_jobagent | Active job agents
pga_jobclass | Job classification
pga_joblog | Job run logs.
pga_jobstep | Job step to be executed
pga_jobsteplog | Job step run logs.
pga_schedule | Job schedule exceptions
)LJXUH7DEXODUSODQZKHQRYHUXVLQJVXETXHULHV
$OWKRXJKSJ$GPLQDOUHDG\SURYLGHVDQLQWXLWLYHLQWHUIDFHWRSJ$JHQW
VFKHGXOLQJDQGORJJLQJ\RXPD\ILQGWKHQHHGWRJHQHUDWH\RXURZQMREUHSRUWV )LJXUHVKRZVWKHJUDSKLFDOSODQRI([DPSOHGHPRQVWUDWLQJKRZPXFK
7KLVLVHVSHFLDOO\WUXHLI\RXKDYHPDQ\MREVRU\RXZDQWWRFRPSLOHVWDWVIURP OHVVZRUNJRHVRQLQLW
\RXUMREUHVXOWV([DPSOHGHPRQVWUDWHVWKHRQHTXHU\ZHXVHRIWHQ
([DPSOH/LVWORJVWHSUHVXOWVIURPWRGD\
SELECT [Link], [Link], [Link],[Link], [Link]
FROM
pgagent.pga_jobsteplog As l INNER JOIN
pgagent.pga_jobstep As s ON [Link] = [Link] INNER JOIN
pgagent.pga_job As j ON [Link] = [Link]
WHERE jslstart > CURRENT_DATE
ORDER BY [Link], [Link], [Link] DESC; )LJXUH*UDSKLFDOSODQDIWHUUHPRYLQJVXETXHULHV
:HILQGWKLVTXHU\HVVHQWLDOIRUPRQLWRULQJEDWFKMREVEHFDXVHVRPHWLPHVDMRE .HHSLQPLQGWKDWZHߞUHQRWDVNLQJ\RXWRDYRLGVXETXHULHVHQWLUHO\:HߞUHRQO\
ZLOOUHSRUWVXFFHVVHYHQWKRXJKLWIDLOHGSJ$JHQWFDQߞWDOZD\VGLVFHUQWKH DVNLQJ\RXWRXVHWKHPMXGLFLRXVO\:KHQ\RXGRXVHWKHPSD\H[WUDDWWHQWLRQ
VXFFHVVRUIDLOXUHRIDVKHOOVFULSWRQWKH267KHjsloutputILHOGLQWKHORJV WRKRZ\RXLQFRUSRUDWHWKHPLQWRWKHPDLQTXHU\)LQDOO\UHPHPEHUWKDWD
IDVWHU,I\RXKDYHDODUJHUGDWDVHWRUZHDNHUKDUGZDUHWKHGLIIHUHQFHFRXOGEH SURYLGHVWKHVKHOORXWSXWZKLFKXVXDOO\GHWDLOVZKDWZHQWZURQJ
HYHQPRUHSURQRXQFHG
([DPSOH2YHUXVHGVXETXHULHVVLPSOLILHG
:$51,1*
SELECT T.tract_id,
COUNT(f.fact_type_id) As num_facts, ,QVRPHYHUVLRQVRISJ$JHQWUXQQLQJRQ:LQGRZVVKHOOVFULSWVRIWHQGHIDXOWWRIDLOHGHYHQ
COUNT(DISTINCT fact_type_id) As num_fact_types ZKHQWKH\VXFFHHGHG,IWKLVKDSSHQV\RXVKRXOGVHWWKHVWHSVWDWXVWRignore7KLVLVD
FROM census.lu_tracts As T LEFT JOIN [Link] As F ON T.tract_id = F.tract_id NQRZQEXJWKDWZHKRSHZLOOEHIL[HGLQDIXWXUHUHOHDVH
GROUP BY T.tract_id;
)LJXUHVKRZVWKHJUDSKLFDOSODQIRU([DPSOHZHߞOOVDYH\RXWKHH\HVRUH
RIVHHLQJWKHJQDUOHGRXWSXWRIWKHWH[WEXPLAINZKLOH)LJXUHVKRZVWKH
WDEXODURXWSXWIURPKWWSH[SODLQGHSHV]FRPUHYHDOLQJDJUHDWGHDORI
LQHIILFLHQF\
)LJXUH*UDSKLFDOSODQZKHQRYHUXVLQJVXETXHULHV
LQFRUSRUDWLQJPRUHWDEOHVLQVWHDGRIFRQVLGHULQJWKHVRPHWLPHVPRUHDSSURSULDWH
&KDSWHU'DWD7\SHV LQQHUMRLQ8QOLNHRWKHUSURJUDPPLQJODQJXDJHVWKH64/ODQJXDJHGRHVQRW
OHQGLWVHOIZHOOWREOLQGUHXVH
6HFRQGSHRSOHGRQߞWWHQGWRNHHSXSZLWKWKHODWHVWGHYHORSPHQWVLQWKHLU
3RVWJUH64/VXSSRUWVWKHZRUNKRUVHGDWDW\SHVRIDQ\GDWDEDVHQXPHULFV GLDOHFWRI64/'RQߞWEHREOLYLRXVWRDOOWKHV\QWD[VDYLQJDQGVDQLW\VDYLQJ
VWULQJVGDWHVWLPHVDQGERROHDQV%XW3RVWJUH64/VSULQWVDKHDGE\DGGLQJ DGGHQGDWKDWKDYHFRPHDORQJLQQHZYHUVLRQVRI3RVWJUH64/
VXSSRUWIRUDUUD\VWLPH]RQH࠺DZDUHGDWHWLPHVWLPHLQWHUYDOVUDQJHV-621
:ULWLQJHIILFLHQW64/WDNHVSUDFWLFH7KHUHߞVQRVXFKWKLQJDVDZURQJTXHU\DV
;0/DQGPDQ\PRUH,IWKDWߞVQRWHQRXJK\RXFDQLQYHQWFXVWRPW\SHV,QWKLV
ORQJDV\RXJHWWKHH[SHFWHGUHVXOWEXWWKHUHLVVXFKDWKLQJDVDVORZTXHU\,Q
FKDSWHUZHGRQߞWLQWHQGWRFRYHUHYHU\GDWDW\SH)RUWKDWWKHUHߞVDOZD\VWKH
WKLVVHFWLRQZHSRLQWRXWVRPHRIWKHFRPPRQPLVWDNHVZHVHHSHRSOHPDNH
PDQXDO:HVKRZFDVHGDWDW\SHVWKDWDUHXQLTXHWR3RVWJUH64/DQGQXDQFHVLQ
$OWKRXJKWKLVERRNLVDERXW3RVWJUH64/RXUUHFRPPHQGDWLRQVDUHDSSOLFDEOHWR
KRZ3RVWJUH64/KDQGOHVFRPPRQGDWDW\SHV
RWKHUUHODWLRQDOGDWDEDVHVDVZHOO
1RGDWDW\SHZRXOGEHXVHIXOZLWKRXWDFDVWRIVXSSRUWLQJIXQFWLRQVDQG
RSHUDWRUV$QG3RVWJUH64/KDVSOHQW\RIWKHP:HߞOOFRYHUWKHPRUHSRSXODU 2YHUXVLQJ6XETXHULHVLQ6(/(&7
RQHVLQWKLVFKDSWHU
$FODVVLFQHZELHPLVWDNHLVWRWKLQNRIVXETXHULHVDVLQGHSHQGHQWHQWLWLHV
8QOLNHFRQYHQWLRQDOSURJUDPPLQJODQJXDJHV64/GRHVQߞWWDNHNLQGO\WREODFN
7,3 ER[LQJߚZULWLQJDEXQFKRIVXETXHULHVLQGHSHQGHQWO\DQGWKHQDVVHPEOLQJWKHP
:KHQZHXVHWKHWHUPIXQFWLRQZHߞUHWDONLQJDERXWVRPHWKLQJWKDWߞVRIWKHIRUPf(x):KHQ PLQGOHVVO\WRJHWWKHILQDOUHVXOW<RXKDYHWRWUHDWHDFKTXHU\KROLVWLFDOO\+RZ
ZHXVHWKHWHUPRSHUDWRUZHߞUHWDONLQJDERXWVRPHWKLQJWKDWߞVV\PEROLFDQGHLWKHUXQDU\ \RXSLHFHWRJHWKHUGDWDIURPGLIIHUHQWYLHZVDQGWDEOHVLVHYHU\ELWDVLPSRUWDQW
KDYLQJRQHDUJXPHQWRUELQDU\KDYLQJWZRDUJXPHQWVVXFKDV+-*RU/:KHQXVLQJ DVKRZ\RXJRDERXWUHWULHYLQJWKHGDWDLQWKHILUVWSODFH
RSHUDWRUVNHHSLQPLQGWKDWWKHVDPHV\PEROFDQWDNHRQDGLIIHUHQWPHDQLQJZKHQDSSOLHGWR
GLIIHUHQWGDWDW\SHV)RUH[DPSOHWKHSOXVVLJQPHDQVDGGLQJIRUQXPHULFVEXWXQLRQLQJIRU 7KHXQQHFHVVDU\XVHRIVXETXHULHVDVVKRZQLQ([DPSOHLVDFRPPRQ
UDQJHV
V\PSWRPRISLHFHPHDOWKLQNLQJ
([DPSOH2YHUXVLQJVXETXHULHV
SELECT tract_id,
1XPHULFV (SELECT COUNT(*) FROM [Link] As F
WHERE F.tract_id = T.tract_id) As num_facts,
<RXZLOOILQG\RXUHYHU\GD\LQWHJHUVGHFLPDOVDQGIORDWLQJSRLQWQXPEHUVLQ (SELECT COUNT(*)
3RVWJUH64/2IWKHQXPHULFW\SHVZHZDQWWRGLVFXVVVHULDOGDWDW\SHVDQGD FROM census.lu_fact_types As Y
WHERE Y.fact_type_id IN (
QLIW\IXQFWLRQWRTXLFNO\JHQHUDWHDULWKPHWLFVHULHVRILQWHJHUV SELECT fact_type_id
FROM [Link] F
WHERE F.tract_id = T.tract_id
6HULDOV )
) As num_fact_types
6HULDODQGLWVELJJHUVLEOLQJELJVHULDODUHDXWRLQFUHPHQWLQJLQWHJHUVRIWHQXVHG FROM census.lu_tracts As T;
DVSULPDU\NH\VRIWDEOHVLQZKLFKDQDWXUDONH\LVQRWDSSDUHQW7KLVGDWDW\SH
([DPSOHFDQEHPRUHHIILFLHQWO\ZULWWHQDV([DPSOH7KLVTXHU\
JRHVE\GLIIHUHQWQDPHVLQGLIIHUHQWGDWDEDVHSURGXFWVZLWKDXWRQXPEHUEHLQJ
FRQVROLGDWLQJVHOHFWVDQGXVLQJDMRLQLVQRWRQO\VKRUWHUWKDQWKHSULRURQHEXW
shared_preload_libraries = 'pg_stat_statements' WKHPRVWFRPPRQDOWHUQDWLYHPRQLNHU:KHQ\RXFUHDWHDWDEOHDQGVSHFLI\D
FROXPQDVVHULDO3RVWJUH64/ILUVWFUHDWHVDQLQWHJHUFROXPQDQGWKHQFUHDWHVD
,QWKHFXVWRPL]HGRSWLRQVVHFWLRQRISRVWJUHVTOFRQIDGGWKHOLQHV
VHTXHQFHREMHFWQDPHGtable_name_column_name_seqORFDWHGLQWKHVDPH
VFKHPDDVWKHWDEOH,WWKHQVHWVWKHGHIDXOWRIWKHQHZLQWHJHUFROXPQWRUHDGLWV
pg_stat_statements.max = 10000
YDOXHIURPWKHVHTXHQFH,I\RXGURSWKHFROXPQ3RVWJUH64/DOVRGURSVWKH
pg_stat_statements.track = all
FRPSDQLRQVHTXHQFHREMHFW
5HVWDUW\RXUpostgresqlVHUYLFH ,Q3RVWJUH64/WKHVHTXHQFHW\SHLVDGDWDEDVHDVVHWLQLWVRZQULJKW<RXFDQ
LQVSHFWDQGHGLWWKHVHTXHQFHVXVLQJ64/ZLWKWKHALTER SEQUENCEFRPPDQG
,QDQ\GDWDEDVH\RXZDQWWRXVHIRUPRQLWRULQJHQWHU CREATE EXTENSION RUXVLQJ3*$GPLQ<RXFDQVHWWKHFXUUHQWYDOXHERXQGDU\YDOXHVERWKWKH
pg_stat_statements; XSSHUDQGORZHUERXQGVDQGHYHQKRZPDQ\QXPEHUVWRLQFUHPHQWHDFKWLPH
7KHH[WHQVLRQSURYLGHVWZRNH\IHDWXUHV 7KRXJKGHFUHPHQWLQJLVUDUH\RXFDQGRLWE\VHWWLQJWKHLQFUHPHQWYDOXHWRD
QHJDWLYHQXPEHU%HFDXVHVHTXHQFHVDUHLQGHSHQGHQWGDWDEDVHDVVHWV\RXFDQ
$YLHZFDOOHGpg_stat_statementsZKLFKVKRZVDOOWKHGDWDEDVHVWRZKLFK FUHDWHWKHPVHSDUDWHO\IURPDWDEOHXVLQJWKHCREATE SEQUENCEFRPPDQGDQG
WKHFXUUHQWO\FRQQHFWHGXVHUKDVDFFHVV \RXFDQXVHWKHVDPHVHTXHQFHDFURVVPXOWLSOHWDEOHV7KHFURVVWDEOHVKDULQJRI
WKHVDPHVHTXHQFHFRPHVLQKDQG\ZKHQ\RXߞUHDVVLJQLQJDXQLYHUVDONH\LQ
$IXQFWLRQFDOOHGpg_stat_statements_resetZKLFKIOXVKHVWKHTXHU\ORJ
\RXUGDWDEDVH
7KLVIXQFWLRQFDQEHUXQRQO\E\VXSHUXVHUV
7RXVHDQH[WDQWVHTXHQFHIRUVXEVHTXHQWWDEOHVFUHDWHDQHZFROXPQLQWKH
7KHTXHU\LQ([DPSOHOLVWVWKHILYHPRVWFRVWO\TXHULHVLQWKH WDEOHDVLQWHJHURUELJLQWߚQRWDVVHULDOߚWKHQVHWWKHGHIDXOWYDOXHRIWKHFROXPQ
postgresql_bookGDWDEDVH XVLQJWKHnextval(sequence_name)IXQFWLRQDVVKRZQLQ([DPSOH
([DPSOH([SHQVLYHTXHULHVLQGDWDEDVH ([DPSOH8VLQJH[LVWLQJVHTXHQFHIRUQHZWDEOHV
SELECT CREATE SEQUENCE s START 1;
query, calls, total_time, rows, CREATE TABLE stuff(id bigint DEFAULT nextval('s') PRIMARY KEY, name text);
100.0*shared_blks_hit/NULLIF(shared_blks_hit+shared_blks_read,0) AS hit_percent
FROM pg_stat_statements As s INNER JOIN pg_database As d On [Link] = [Link]
WHERE [Link] = 'postgresql_book'
ORDER BY total_time DESC LIMIT 5; :$51,1*
,I\RXUHQDPHDWDEOHWKDWKDVDVHULDOEDVHGRQDVHTXHQFH3RVWJUH64/ZLOOQRWDXWRPDWLFDOO\
UHQDPHWKHVHTXHQFHREMHFW7RDYRLGFRQIXVLRQ\RXVKRXOGUHQDPHWKHVHTXHQFHREMHFW
:ULWLQJ%HWWHU4XHULHV
7KHEHVWDQGHDVLHVWZD\WRLPSURYHTXHU\SHUIRUPDQFHLVWRVWDUWZLWKZHOO
ZULWWHQTXHULHV)RXURXWRIILYHTXHULHVZHHQFRXQWHUDUHQRWZULWWHQDV *HQHUDWH6HULHV)XQFWLRQ
HIILFLHQWO\DVWKH\FRXOGEH 3RVWJUH64/KDVDQLIW\IXQFWLRQFDOOHGgenerate_seriesQRWIRXQGLQRWKHU
7KHUHDSSHDUWREHWZRSULPDU\FDXVHVIRUDOOWKLVEDGTXHU\LQJ)LUVWZHVHH GDWDEDVHSURGXFWV7KHIXQFWLRQFRPHVLQWZRIRUPV2QHLVDQXPHULFYHUVLRQ
SHRSOHUHXVH64/SDWWHUQVZLWKRXWWKLQNLQJ)RUH[DPSOHLIWKH\VXFFHVVIXOO\ WKDWFUHDWHVDVHTXHQFHRILQWHJHUVLQFUHPHQWHGE\VRPHYDOXHDQGRQHWKDW
ZULWHDTXHU\XVLQJDOHIWMRLQWKH\ZLOOFRQWLQXHWRXVHOHIWMRLQZKHQ FUHDWHVDVHTXHQFHRIGDWHVRUWLPHVWDPSVLQFUHPHQWHGE\VRPHWLPHLQWHUYDO
:KDWPDNHVgenerate_seriesVRFRQYHQLHQWLVWKDWLWDOORZV\RXWRHIIHFWLYHO\
PLPLFDIRUORRSLQ64/([DPSOHGHPRQVWUDWHVWKHQXPHULFYHUVLRQ
([DPSOHGHPRQVWUDWHVWKHWHPSRUDOYHUVLRQ
([DPSOHXVHVLQWHJHUVZLWKDQRSWLRQDOVWHSSDUDPHWHU
([DPSOHJHQHUDWHBVHULHVZLWKVWHSSLQJRI
SELECT x FROM generate_series(1,51,13) As x;
x
----
1
14
27
40 )LJXUH7DEXODUH[SODLQRXWSXW
7KHGHIDXOWVWHSLV$VGHPRQVWUDWHGLQ([DPSOH\RXFDQSDVVLQDQ $OWKRXJKWKH+70/WDEOHLQ)LJXUHSURYLGHVPXFKWKHVDPHLQIRUPDWLRQDV
RSWLRQDOVWHSDUJXPHQWWRVSHFLI\KRZPDQ\VWHSVWRVNLSIRUHDFKVXFFHVVLYH RXUSODLQWH[WRXWSXWWKHFRORUFRGLQJDQGWKHEUHDNRXWRIQXPEHUVPDNHVLW
HOHPHQW7KHHQGYDOXHZLOOQHYHUH[FHHGRXUSUHVFULEHGUDQJHVRDOWKRXJKRXU HDVLHUWRGLJHVW)RUH[DPSOH\HOORZEURZQDQGUHGKLJKOLJKWSRWHQWLDO
UDQJHHQGVDWRXUODVWQXPEHULVEHFDXVHDGGLQJDQRWKHUWRRXU ERWWOHQHFNV
EXVWVWKHXSSHUERXQG 7KHURZV[FROXPQLVWKHH[SHFWHGQXPEHURIURZVZKLOHWKHURZVFROXPQ
VKRZVWKHDFWXDOQXPEHUDIWHUH[HFXWLRQ7KLVUHYHDOVWKDWDOWKRXJKRXU
SODQQHUߞVILQDOVWHSZDVH[SHFWLQJUHFRUGVZHHQGHGXSZLWKMXVWRQH%DG
7H[WXDOV URZHVWLPDWHVDUHRIWHQFDXVHGE\RXWRIGDWHWDEOHVWDWLVWLFV,WߞVDOZD\VDJRRG
7KHUHDUHWKUHHSULPLWLYHWH[WXDOW\SHVLQ3RVWJUH64/FKDUDFWHUDEEUHYLDEOHDV KDELWWRDQDO\]HWDEOHVIUHTXHQWO\WRXSGDWHWKHVWDWLVWLFVHVSHFLDOO\ULJKWDIWHUDQ
FKDUcharacter varyingDEEUHYLDEOHDVYDUFKDUDQGWH[W H[WHQVLYHXSGDWHRULQVHUW
8VHFKDURQO\ZKHQWKHYDOXHVVWRUHGDUHIL[HGOHQJWKVXFKDVSRVWDOFRGHV
SKRQHQXPEHUVDQG6RFLDO6HFXULW\QXPEHUVLQWKH86,I\RXUYDOXHLVXQGHU *DWKHULQJ6WDWLVWLFVRQ6WDWHPHQWV
WKHOHQJWKVSHFLILHG3RVWJUH64/DXWRPDWLFDOO\DGGVVSDFHVWRWKHHQG:KHQ
FRPSDUHGZLWKYDUFKDURUWH[WWKHULJKWSDGGLQJWDNHVXSPRUHVXSHUIOXRXV 7KHILUVWVWHSLQRSWLPL]LQJSHUIRUPDQFHLVWRGHWHUPLQHZKLFKTXHULHVDUH
VWRUDJHEXW\RXJHWWKHDVVXUDQFHRIDQLQYDULDEOHOHQJWK7KHUHLVDEVROXWHO\QR ERWWOHQHFNV2QHPRQLWRULQJH[WHQVLRQXVHIXOIRUJHWWLQJDKDQGOHRQ\RXUPRVW
VSHHGSHUIRUPDQFHEHQHILWRIXVLQJFKDURYHUYDUFKDURUWH[WDQGFKDUZLOO FRVWO\TXHULHVLVSJBVWDWBVWDWHPHQWV7KLVH[WHQVLRQSURYLGHVPHWULFVRQUXQQLQJ
DOZD\VWDNHXSPRUHGLVNVSDFH8VHFKDUDFWHUYDU\LQJWRVWRUHVWULQJVZLWK TXHULHVWKHPRVWIUHTXHQWO\UXQTXHULHVDQGKRZORQJHDFKWDNHV6WXG\LQJ
YDU\LQJOHQJWK:KHQGHILQLQJYDUFKDUFROXPQV\RXVKRXOGVSHFLI\WKH WKHVHPHWULFVZLOOKHOS\RXGHWHUPLQHZKHUH\RXQHHGWRIRFXV\RXURSWLPL]DWLRQ
PD[LPXPOHQJWKRIDYDUFKDU7H[WLVWKHPRVWJHQHULFRIWKHWH[WXDOGDWDW\SHV HIIRUWV
:LWKWH[W\RXFDQQRWVSHFLI\DPD[LPXPOHQJWK SJBVWDWBVWDWHPHQWVFRPHVSDFNDJHGZLWKPRVW3RVWJUH64/GLVWULEXWLRQVEXW
7KHPD[OHQJWKPRGLILHUIRUYDUFKDULVRSWLRQDO:LWKRXWLWYDUFKDUEHKDYHV PXVWEHSUHORDGHGRQVWDUWXSWRLQLWLDWHLWVGDWDFROOHFWLRQSURFHVV
DOPRVWLGHQWLFDOO\WRWH[W6XEWOHGLIIHUHQFHVGRVXUIDFHZKHQFRQQHFWLQJWR
,QSRVWJUHVTOFRQIFKDQJHshared_preload_libraries = ''WR
3RVWJUH64/YLDGULYHUV)RULQVWDQFHWKH2'%&GULYHUFDQQRWVRUWWH[WFROXPQV
%RWKYDUFKDUDQGWH[WKDYHDPD[LPXPVWRUDJHRI*IRUHDFKYDOXHߚWKDWߞVD
ORW%HKLQGWKHVFHQHVDQ\YDOXHODUJHUWKDQZKDWFDQILWLQDUHFRUGSDJHJHWV
SXVKHGWRTOAST
6RPHIRONVDGYRFDWHDEDQGRQLQJYDUFKDUDQGDOZD\VXVLQJWH[W5DWKHUWKDQ
ZDVWHVSDFHDUJXLQJDERXWLWKHUHUHDGWKHGHEDWHDW,Q'HIHQVHRI9DUFKDU;
2IWHQIRUFURVVV\VWHPFRPSDWLELOLW\\RXZDQWWRUHPRYHFDVHVHQVLWLYLW\IURP
\RXUFKDUDFWHUW\SHV7RGRWKLV\RXQHHGWRRYHUULGHFRPSDULVRQRSHUDWRUVWKDW
WDNHFDVHLQWRFRQVLGHUDWLRQ2YHUULGLQJRSHUDWRUVLVHDVLHUIRUYDUFKDUWKDQLWLV
)LJXUH*UDSKLFDOH[SODLQRXWSXW IRUWH[W:HGHPRQVWUDWHDQH[DPSOHLQ8VLQJ06$FFHVVZLWK3RVWJUH64/
<RXFDQJHWPRUHGHWDLOHGLQIRUPDWLRQDERXWHDFKSDUWE\PRXVLQJRYHUWKHQRGH ZKHUHZHVKRZKRZWRPDNHYDUFKDUEHKDYHZLWKRXWFDVHVHQVLWLYLW\DQGVWLOOEH
LQWKHGLVSOD\ DEOHWRXVHDQLQGH[
%HIRUHZUDSSLQJXSWKLVVHFWLRQZHPXVWSD\KRPDJHWRWKHWDEXODUH[SODLQSODQ
FUHDWHGE\+XEHUW/XEDF]HZVNL8VLQJKLVVLWH\RXFDQFRS\DQGSDVWHWKHWH[W
6WULQJ)XQFWLRQV
RXWSXWRI\RXUEXPLAINRXWSXWDQGLWZLOOVKRZ\RXDEHDXWLIXOO\IRUPDWWHG &RPPRQVWULQJPDQLSXODWLRQVDUHSDGGLQJlpadrpadWULPPLQJZKLWHVSDFH
WDEOHDVVKRZQLQ)LJXUH rtrimltrimtrimbtrimH[WUDFWLQJVXEVWULQJVsubstringDQG
FRQFDWHQDWLQJ||([DPSOHGHPRQVWUDWHVSDGGLQJDQG([DPSOH
GHPRQVWUDWHVWULPPLQJ
([DPSOH8VLQJOSDGDQGUSDG
SELECT
lpad('ab', 4, '0') As ab_lpad,
rpad('ab', 4, '0') As ab_rpad,
lpad('abcde', 4, '0') As ab_lpad_trunc;
ab_lpad | ab_rpad | ab_lpad_trunc
--------+---------+---------------
00ab | ab00 | abcd
lpadWUXQFDWHVLQVWHDGRISDGGLQJLIWKHVWULQJLVWRRORQJ
%\GHIDXOWWULPIXQFWLRQVUHPRYHVSDFHVEXW\RXFDQSDVVLQDQRSWLRQDO
DUJXPHQWLQGLFDWLQJRWKHUFKDUDFWHUVWRWULP
)LJXUH2QOLQH(;3/$,1VWDWLVWLFV ([DPSOH7ULPPLQJVSDFHVDQGFKDUDFWHUV
SELECT
,QWKH+70/WDE\RXߞOOVHHDQLFHO\UHIRUPDWWHGFRORUFRGHGWDEOHRIWKHSODQ a As a_before, trim(a) As a_trim, rtrim(a) As a_rt,
ZLWKSUREOHPDUHDVKLJKOLJKWHGLQYLEUDQWFRORUVDVVKRZQLQ)LJXUH,WKDV i As i_before, ltrim(i, '0') As i_lt_0,
rtrim(i, '0') As i_rt_0, trim(i, '0') As i_t_0
FROXPQVIRUH[FOXVLYHWLPHWLPHFRQVXPHGE\WKHSDUHQWVWHSDQGLQFOXVLYH FROM (
WLPHWKHWLPHRIWKHSDUHQWVWHSSOXVLWVFKLOGVWHSV SELECT repeat(' ', 4) || i || repeat(' ', 4) As a, '0' || i As i
FROM generate_series(0, 200, 50) As i Group Key: "left"((tract_id)::text, 5)
) As x; -> Bitmap Heap Scan on hisp_pop
a_before | a_trim | a_rt | i_before | i_lt_0 | i_rt_0 | i_t_0 (cost=10.25..28.61 rows=192 width=16)
---------+--------+------+----------+--------+--------+------ (actual time=0.441..0.550 rows=204 loops=1)
0 | 0 | 0 | 00 | | | Recheck Cond:
50 | 50 | 50 | 050 | 50 | 05 | 5 (((tract_id)::text >= '25025000000'::text) AND
100 | 100 | 100 | 0100 | 100 | 01 | 1 ((tract_id)::text <= '25025999999'::text))
150 | 150 | 150 | 0150 | 150 | 015 | 15 Heap Blocks: exact=15
200 | 200 | 200 | 0200 | 200 | 02 | 2 -> Bitmap Index Scan on hisp_pop_pkey
(cost=0.00..10.20 rows=192 width=0)
$KHOSIXOIXQFWLRQIRUDJJUHJDWLQJVWULQJVLVWKHVWULQJBDJJIXQFWLRQZKLFKZH (actual time=0.421..0.421 rows=204 loops=1)
Index Cond:
GHPRQVWUDWHLQ([DPSOHVDQG (((tract_id)::text >= '25025000000'::text) AND
((tract_id)::text <= '25025999999'::text))
Planning time: 4.835 ms
6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU6XEVWULQJV Execution time: 0.732 ms
7KHUHDUHDFRXSOHRIXVHIXOIXQFWLRQVLQ3RVWJUH64/IRUWHDULQJVWULQJVDSDUW 7KHSDUHQWRI([DPSOHLVWKH+DVK$JJUHJDWH,WFRQWDLQVDVXESODQRI
7KHsplit_partIXQFWLRQLVXVHIXOIRUH[WUDFWLQJDQHOHPHQWIURPDGHOLPLWHG %LWPDS+HDS6FDQZKLFKLQWXUQFRQWDLQVDVXESODQRI%LWPDS,QGH[6FDQ,Q
VWULQJDVVKRZQLQ([DPSOH+HUHZHVHOHFWWKHVHFRQGLWHPLQDVWULQJRI WKLVH[DPSOHEHFDXVHWKLVLVWKHILUVWWLPHZHߞUHUXQQLQJWKLVTXHU\RXUSODQQLQJ
LWHPVGHOLPLWHGE\SHULRGV WLPHJUHDWO\RYHUVKDGRZVWKHH[HFXWLRQWLPH+RZHYHU3RVWJUH64/FDFKHV
SODQVDQGGDWDVRLIZHZHUHWRUXQWKLVTXHU\RUDVLPLODURQHZLWKLQDVKRUW
([DPSOH*HWWLQJWKHQWKHOHPHQWRIDGHOLPLWHGVWULQJ
SHULRGRIWLPHZHVKRXOGEHUHZDUGHGZLWKDPXFKUHGXFHGSODQQLQJWLPHDQG
SELECT split_part('abc.123.z45','.',2) As x;
x DOVRSRVVLEO\UHGXFHGH[HFXWLRQWLPHLIPXFKRIWKHGDWDLWQHHGVLVDOUHDG\LQ
--- PHPRU\%HFDXVHRIFDFKLQJRXUVHFRQGUXQKDVWKHVHVWDWV
123
Planning time: 0.200 ms
7KHstring_to_arrayIXQFWLRQLVXVHIXOIRUFUHDWLQJDQDUUD\RIHOHPHQWVIURP Execution time: 0.635 ms
DGHOLPLWHGVWULQJ%\FRPELQLQJstring_to_arrayZLWKWKHunnestIXQFWLRQ
\RXFDQH[SDQGWKHUHWXUQHGDUUD\LQWRDVHWRIURZVDVVKRZQLQ([DPSOH *UDSKLFDO2XWSXWV
([DPSOH&RQYHUWLQJDGHOLPLWHGVWULQJWRDQDUUD\WRURZV ,IUHDGLQJWKHRXWSXWLVJLYLQJ\RXDKHDGDFKHVHH)LJXUHIRUWKHJUDSKLFDO
SELECT unnest(string_to_array('abc.123.z45', '.')) As x;
x
EXPLAIN (ANALYZE)RI([DPSOH
---
abc
123
z45
5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ
3RVWJUH64/ߞVUHJXODUH[SUHVVLRQVXSSRUWLVGRZQULJKWIDQWDVWLF<RXFDQUHWXUQ
PDWFKHVDVWDEOHVRUDUUD\VDQGFKRUHRJUDSKUHSODFHVDQGXSGDWHV%DFN
LWWDNHVIRUWKHSODQQHUWRFRPHXSZLWKWKHH[HFXWLRQSODQZKHUHDVWKH UHIHUHQFLQJDQGRWKHUIDLUO\DGYDQFHGVHDUFKSDWWHUQVDUHDOVRVXSSRUWHG,QWKLV
H[HFXWLRQWLPHLVHYHU\WKLQJWKDWIROORZV VHFWLRQZHߞOOSURYLGHDVPDOOVDPSOLQJ)RUPRUHLQIRUPDWLRQVHH3DWWHUQ
0DWFKLQJDQG6WULQJ)XQFWLRQV
/HWߞVQRZDGGEDFNRXUSULPDU\NH\
([DPSOHVKRZV\RXKRZWRIRUPDWSKRQHQXPEHUVVWRUHGVLPSO\DV
ALTER TABLE census.hisp_pop ADD CONSTRAINT hisp_pop_pkey PRIMARY KEY(tract_id); FRQWLJXRXVGLJLWV
1RZZHߞOOUHSHDW([DPSOHZLWKWKHSODQRXWSXWLQ([DPSOH ([DPSOH5HIRUPDWDSKRQHQXPEHUXVLQJEDFNUHIHUHQFLQJ
SELECT regexp_replace(
([DPSOH(;3/$,1$1$/<=(RXWSXWRILQGH[VWUDWHJ\SODQ '6197306254',
Index Scan using idx_hisp_pop_tract_id_pat on hisp_pop '([0-9]{3})([0-9]{3})([0-9]{4})',
(cost=0.28..8.29 rows=1 width=16) E'\(\\1\) \\2-\\3'
(actual time=0.018..0.019 rows=1 loops=1) ) As x;
Index Cond: ((tract_id)::text = '25025010103'::text) x
Planning time: 0.110 ms --------------
Execution time: 0.046 ms (619) 730-6254
7KHSODQQHUFRQFOXGHVWKDWXVLQJWKHLQGH[LVFKHDSHUWKDQDVHTXHQWLDOVFDQDQG 7KH\\1\\2HWFUHIHUWRHOHPHQWVLQRXUSDWWHUQH[SUHVVLRQ:HXVHD
VZLWFKHVWRDQLQGH[VFDQ7KHHVWLPDWHGRYHUDOOFRVWGURSVIURPWR EDFNVODVK\WRHVFDSHWKHSDUHQWKHVHV7KHE'FRQVWUXFWLV3RVWJUH64/V\QWD[
7KHVWDUWXSFRVWLVQRORQJHU]HUREHFDXVHWKHSODQQHUILUVWVFDQVWKHLQGH[WKHQ IRUGHQRWLQJWKDWWKHVWULQJWRIROORZVKRXOGEHWDNHQOLWHUDOO\
SXOOVWKHPDWFKLQJUHFRUGVIURPGDWDSDJHVRUIURPPHPRU\LILQVKDUHGEXIIHUV 6XSSRVHVRPHILHOGFRQWDLQVWH[WZLWKHPEHGGHGSKRQHQXPEHUV([DPSOH
DOUHDG\<RXߞOODOVRQRWLFHWKDWWKHSODQQHUQRORQJHUQHHGHGWRVFDQ VKRZVKRZWRH[WUDFWWKHSKRQHQXPEHUVDQGWXUQWKHPLQWRURZVDOOLQRQHVWHS
UHFRUGV7KLVJUHDWO\UHGXFHGWKHFRVW
([DPSOH5HWXUQSKRQHQXPEHUVLQSLHFHRIWH[WDVVHSDUDWHURZV
0RUHFRPSOH[TXHULHVVXFKDVLQ([DPSOHLQFOXGHDGGLWLRQDOVWHSVUHIHUUHG SELECT unnest(regexp_matches(
WRDVVXESODQVZLWKHDFKVXESODQKDYLQJLWVRZQFRVWDQGDOODGGLQJXSWRWKH 'Cell (619) 852-5083. Work (619)123-4567 , Casa 619-730-6254. Bésame mucho.',
WRWDOFRVWRIWKHSODQ7KHSDUHQWSODQLVDOZD\VOLVWHGILUVWDQGLWVFRVWDQGWLPH E'[(]{0,1}[0-9]{3}[)-.]{0,1}[\\s]{0,1}[0-9]{3}[-.]{0,1}[0-9]{4}', 'g')
) As x;
LVHTXDOWRWKHVXPRIDOOLWVVXESODQV7KHRXWSXWLQGHQWVWKHVXESODQV x
--------------
([DPSOH(;3/$,1$1$/<=(ZLWK*5283%<DQG680 (619) 852-5083
EXPLAIN (ANALYZE) (619)123-4567
SELECT left(tract_id,5) AS county_code, SUM(white_alone) As w 619-730-6254
FROM census.hisp_pop (3 rows)
WHERE tract_id BETWEEN '25025000000' AND '25025999999'
GROUP BY county_code; 7KHPDWFKLQJUXOHVIRU([DPSOHDUH
7KHRXWSXWRI([DPSOHLVVKRZQLQ([DPSOHFRQVLVWLQJRIDJURXSLQJ [(]{0,1}VWDUWVZLWK]HURRURQHRSHQSDUHQWKHVLV
DQGVXP
[0-9]{3}IROORZHGE\WKUHHGLJLWV
([DPSOH(;3/$,1$1$/<=(RXWSXWRI+DVK$JJUHJDWHVWUDWHJ\SODQ
HashAggregate [)-.]{0,1}IROORZHGE\]HURRURQHFORVHGSDUHQWKHVLVK\SKHQRUSHULRG
(cost=29.57..32.45 rows=192 width=16)
(actual time=0.664..0.664 rows=1 loops=1) [\\s]+IROORZHGE\]HURRUPRUHVSDFHV
[0-9]{4}IROORZHGE\IRXUGLJLWV ([DPSOH(;3/$,1$1$/<=(RIDVHTXHQWLDOVFDQ
EXPLAIN (ANALYZE)
regexp_matchesUHWXUQVDVWULQJDUUD\FRQVLVWLQJRIPDWFKHVRIDUHJXODU SELECT tract_id, hispanic_or_latino
H[SUHVVLRQ7KHODVWLQSXWWRRXUIXQFWLRQLVWKHflagsSDUDPHWHU:HVHWWKLV FROM census.hisp_pop
WHERE tract_id = '25025010103';
WRgZKLFKVWDQGVIRUJOREDODQGUHWXUQVDOOPDWFKHVRIDUHJXODUH[SUHVVLRQ
DVVHSDUDWHHOHPHQWV,I\RXOHDYHRXWWKLVflagsSDUDPHWHUWKHQ\RXUDUUD\ 8VLQJ(;3/$,1DORQHJLYHVXVHVWLPDWHGSODQFRVWV8VLQJ(;3/$,1LQ
ZLOORQO\FRQWDLQWKHILUVWPDWFK7KHflagsSDUDPHWHUFDQFRQVLVWRIPRUH FRQMXQFWLRQZLWK$1$/<=(JLYHVXVERWKHVWLPDWHGDQGDFWXDOFRVWVWRH[HFXWH
WKDQRQHIODJ)RUH[DPSOHLI\RXKDYHOHWWHUVLQ\RXUUHJXODUH[SUHVVLRQDQG WKHSODQ([DPSOHVKRZVWKHRXWSXWRI([DPSOH
WH[WDQG\RXZDQWWRPDNHWKHFKHFNFDVHLQVHQVLWLYHDQGJOREDO\RXZRXOG ([DPSOH(;3/$,1$1$/<=(RXWSXW
XVHWZRIODJVgi,QDGGLWLRQWRWKHJOREDOIODJRWKHUDOORZHGIODJVDUHOLVWHG Seq Scan on hisp_pop
LQ326,;(0%(''('237,216 (cost=0.00..33.48 rows=1 width=16)
(actual time=0.213..0.346 rows=1 loops=1)
Filter: ((tract_id)::text = '25025010103'::text)
unnestH[SORGHVDQDUUD\LQWRDURZVHW Rows Removed by Filter: 1477
Planning time: 0.095 ms
Execution time: 0.381 ms
7,3
,QEXPLAINSODQV\RXߞOOVHHDEUHDNGRZQE\VWHSV(DFKVWHSKDVDUHSRUWHGFRVW
7KHUHDUHPDQ\ZD\VWRFRPSRVHWKHVDPHUHJXODUH[SUHVVLRQ)RULQVWDQFH\\dLVVKRUWKDQG
IRU[0-9]%XWJLYHQWKHIHZFKDUDFWHUV\RXߞGVDYHZHSUHIHUWKHPRUHGHVFULSWLYHORQJKDQG
WKDWORRNVVRPHWKLQJOLNHcost=0.00..33.48DVVKRZQLQ([DPSOH,QWKLV
FDVHZHKDYH0.00ZKLFKLVWKHHVWLPDWHGVWDUWXSFRVWDQGWKHVHFRQGQXPEHU
33.48ZKLFKLVWKHWRWDOHVWLPDWHGFRVWRIWKHVWHS7KHVWDUWXSLVWKHWLPHEHIRUH
,I\RXRQO\FDUHDERXWWKHILUVWPDWFK\RXFDQXWLOL]HWKHsubstringIXQFWLRQ UHWULHYDORIGDWDDQGFRXOGLQFOXGHVFDQQLQJRILQGH[HVMRLQVRIWDEOHVHWF)RU
ZKLFKZLOOUHWXUQWKHILUVWPDWFKLQJYDOXHDVVKRZQLQ([DPSOH VHTXHQWLDOVFDQVWHSVWKHVWDUWXSFRVWLV]HUREHFDXVHWKHSODQQHUPLQGOHVVO\
SXOOVDOOGDWDUHWULHYDOEHJLQVULJKWDZD\
([DPSOH5HWXUQILUVWSKRQHQXPEHULQSLHFHRIWH[W
SELECT substring( .HHSLQPLQGWKDWWKHFRVWPHDVXUHLVUHSRUWHGLQDUELWUDU\XQLWVZKLFKYDULHV
'Cell (619) 852-5083. Work (619)123-4567 , Casa 619-730-6254. Bésame mucho.' EDVHGRQKDUGZDUHDQGFRQILJXUDWLRQFRVWVHWWLQJV$VVXFKLWߞVXVHIXORQO\DVDQ
from E'[(]{0,1}[0-9]{3}[)-.]{0,1}[\\s]{0,1}[0-9]{3}[-.]{0,1}[0-9]{4}') HVWLPDWHZKHQFRPSDULQJGLIIHUHQWSODQVRQWKHVDPHVHUYHU7KHSODQQHUߞVMRELV
As x;
x WRSLFNWKHSODQZLWKWKHORZHVWHVWLPDWHGRYHUDOOFRVWV
----------------
(619) 852-5083 %HFDXVHZHRSWHGWRLQFOXGHWKHANALYZEDUJXPHQWLQ([DPSOHWKHSODQQHU
(1 row) ZLOOUXQWKHTXHU\DQGZHߞUHEOHVVHGZLWKWKHDFWXDOWLPLQJVDVZHOO
,QDGGLWLRQWRWKHZHDOWKRIUHJXODUH[SUHVVLRQIXQFWLRQV\RXFDQXVHUHJXODU )URPWKHSODQLQ([DPSOHZHFDQVHHWKDWWKHSODQQHUHOHFWHGDVHTXHQWLDO
H[SUHVVLRQVZLWKWKHSIMILAR TO~RSHUDWRUV7KHIROORZLQJH[DPSOHUHWXUQV VFDQEHFDXVHLWFRXOGQߞWILQGDQ\LQGH[HV7KHDGGLWLRQDOWLGELWRILQIRUPDWLRQ
DOOGHVFULSWLRQILHOGVZLWKHPEHGGHGSKRQHQXPEHUV Rows Removed by Filter: 1477VKRZVWKHQXPEHURIURZVWKDWWKHSODQQHU
H[DPLQHGEHIRUHH[FOXGLQJWKHPIURPWKHRXWSXW
SELECT description
FROM mytable ,I\RXDUHUXQQLQJ3RVWJUH64/RUDERYHWKHRXWSXWPDNHVDGLVWLQFWLRQ
WHERE description ~ EHWZHHQSODQQLQJWLPHDQGH[HFXWLRQWLPH3ODQQLQJWLPHLVWKHDPRXQWRIWLPH
$GGLQJWKHANALYZEDUJXPHQWDVLQEXPLAIN (ANALYZE)ZLOOH[HFXWHWKH E'[(]{0,1}[0-9]{3}[)-.]{0,1}[\\s]{0,1}[0-9]{3}[-.]{0,1}[0-9]{4}';
TXHU\DQGJLYH\RXDFRPSDUDWLYHDQDO\VLVRIH[SHFWHGYHUVXVDFWXDO
EHKDYLRU
7HPSRUDOV
$GGLQJWKHVERBOSEDUJXPHQWDVLQEXPLAIN (VERBOSE)ZLOOUHSRUWWKH
3RVWJUH64/VXSSRUWIRUWHPSRUDOGDWDLVVHFRQGWRQRQH,QDGGLWLRQWRWKHXVXDO
SODQQHUߞVDFWLYLWLHVGRZQWRWKHFROXPQDUOHYHO
GDWHVDQGWLPHVW\SHV3RVWJUH64/VXSSRUWVWLPH]RQHVHQDEOLQJWKHDXWRPDWLF
$GGLQJWKHBUFFERSDUJXPHQWZKLFKPXVWEHXVHGLQFRQMXQFWLRQZLWK KDQGOLQJRIGD\OLJKWVDYLQJWLPH'67FRQYHUVLRQVE\UHJLRQ6SHFLDOL]HGGDWD
ANALYZEDVLQEXPLAIN (ANALYZE, BUFFERS)ZLOOUHSRUWVKDUHKLWV7KH W\SHVVXFKDVintervalRIIHUGDWHWLPHDULWKPHWLF3RVWJUH64/DOVRXQGHUVWDQGV
KLJKHUWKLVQXPEHUWKHPRUHUHFRUGVZHUHDOUHDG\LQPHPRU\IURPSULRU LQILQLW\DQGQHJDWLYHLQILQLW\UHOLHYLQJXVIURPKDYLQJWRFUHDWHFRQYHQWLRQVWKDW
TXHULHVPHDQLQJWKDWWKHSODQQHUGLGQRWKDYHWRJREDFNWRGLVNWRUHUHWULHYH ZHߞOOVXUHO\IRUJHW5DQJHW\SHVSURYLGHVXSSRUWIRUWHPSRUDOUDQJHVZLWKDVOHZ
WKHP RIFRPSDQLRQRSHUDWRUVIXQFWLRQVDQGLQGH[HV:HFRYHUUDQJHW\SHVLQߡ5DQJH
7\SHVߢ
$QEXPLAINWKDWSURYLGHVDOOGHWDLOVLQFOXGLQJWLPLQJRXWSXWRIFROXPQVDQG
$WODVWFRXQW3RVWJUH64/KDVQLQHWHPSRUDOGDWDW\SHV8QGHUVWDQGLQJWKHLU
EXIIHUVZRXOGORRNOLNHEXPLAIN (ANALYZE, VERBOSE, BUFFERS)
GLVWLQFWLRQVLVLPSRUWDQWLQHQVXULQJWKDW\RXFKRRVHWKHULJKWGDWDW\SHIRUWKH
your_query_here;
MRE$OOWKHW\SHVH[FHSWrangeDELGHE\$16,64/VWDQGDUGV2WKHUOHDGLQJ
7RVHHWKHUHVXOWVRIEXPLAIN (ANALYZE)RQDGDWDFKDQJLQJVWDWHPHQWVXFKDV GDWDEDVHSURGXFWVVXSSRUWVRPHEXWQRWDOORIWKHVHGDWDW\SHV2UDFOHKDVWKH
UPDATERUINSERTZLWKRXWPDNLQJWKHDFWXDOGDWDFKDQJHZUDSWKHVWDWHPHQWLQ PRVWYDULHWLHVRIWHPSRUDOW\SHV64/6HUYHUUDQNVVHFRQGDQG0\64/FRPHV
DWUDQVDFWLRQWKDW\RXDERUWSODFHBEGINEHIRUHWKHVWDWHPHQWDQGROLLBACK LQODVW
DIWHULW 3RVWJUH64/WHPSRUDOW\SHVYDU\LQDQXPEHURIZD\VWRKDQGOHGLIIHUHQW
<RXFDQXVHJUDSKLFDOH[SODLQZLWKD*8,VXFKDVSJ$GPLQ$IWHUODXQFKLQJ VLWXDWLRQV,IDW\SHLVWLPH]RQH࠺DZDUHWKHWLPHFKDQJHVLI\RXFKDQJH\RXU
SJ$GPLQFRPSRVH\RXUTXHU\DVXVXDOEXWLQVWHDGRIH[HFXWLQJLWFKRRVH VHUYHUߞVWLPH]RQH7KHW\SHVDUH
EXPLAINRUEXPLAIN (ANALYZE)IURPWKHGURSGRZQPHQX date
6WRUHVWKHPRQWKGD\DQG\HDUZLWKQRWLPH]RQHDZDUHQHVVDQGQRFRQFHSW
6DPSOH5XQVDQG2XWSXW RIKRXUVPLQXWHVRUVHFRQGV
/HWߞVWU\DQH[DPSOH)LUVWZHߞOOXVHWKHEXPLAIN (ANALYZE)FRPPDQGZLWKD timeDNDtime without time zone
WDEOHZHFUHDWHGLQ([DPSOHVDQG
6WRUHVKRXUVPLQXWHVDQGVHFRQGVZLWKQRDZDUHQHVVRIWLPH]RQHRU
,QRUGHUWRHQVXUHWKDWWKHSODQQHUGRHVQߞWXVHDQLQGH[ZHILUVWGURSWKHSULPDU\ FDOHQGDUGDWHV
NH\IURPRXUWDEOH
timestampDNDtimestamp without time zone
ALTER TABLE census.hisp_pop DROP CONSTRAINT IF EXISTS hisp_pop_pkey;
6WRUHVERWKFDOHQGDUGDWHVDQGWLPHKRXUVPLQXWHVVHFRQGVEXWGRHVQRW
'URSSLQJDOOLQGH[HVOHWVXVVHHWKHPRVWEDVLFRISODQVLQDFWLRQWKHVHTXHQWLDO FDUHDERXWWKHWLPH]RQH
VFDQVWUDWHJ\6HH([DPSOH timestamptzDNDtimestamp with time zone
$WLPH]RQH࠺DZDUHGDWHDQGWLPHGDWDW\SH,QWHUQDOO\timestamptzLV
VWRUHGLQ&RRUGLQDWHG8QLYHUVDO7LPH87&EXWLWVGLVSOD\GHIDXOWVWRWKH &KDSWHU4XHU\3HUIRUPDQFH
WLPH]RQHRIWKHVHUYHUWKHVHUYLFHFRQILJWKHGDWDEDVHWKHXVHURUWKH
VHVVLRQ<HV\RXFDQREVHUYHGLIIHUHQWWLPH]RQHVDWGLIIHUHQWOHYHOV,I\RX
7XQLQJ
LQSXWDWLPHVWDPSZLWKQRWLPH]RQHDQGFDVWLWWRRQHZLWKWKHWLPH]RQH
3RVWJUH64/DVVXPHVWKHGHIDXOWWLPH]RQHLQHIIHFW,I\RXGRQߞWVHW\RXU
WLPH]RQHLQSRVWJUHVTOFRQIWKHVHUYHUߞVGHIDXOWWDNHVHIIHFW7KLVPHDQV 6RRQHURUODWHUZHߞOODOOIDFHDTXHU\WKDWWDNHVMXVWDELWORQJHUWRH[HFXWHWKDQ
WKDWLI\RXFKDQJH\RXUVHUYHUߞVWLPH]RQH\RXߞOOVHHDOOWKHGLVSOD\HGWLPHV ZHKDYHSDWLHQFHIRU7KHEHVWDQGHDVLHVWIL[LVWRSHUIHFWWKHXQGHUO\LQJ64/
FKDQJHDIWHUWKH3RVWJUH64/VHUYHUUHVWDUWV IROORZHGE\DGGLQJLQGH[HVDQGXSGDWLQJSODQQHUVWDWLVWLFV7RJXLGH\RXLQ
WKHVHSXUVXLWV3RVWJUH64/FRPHVZLWKDEXLOWLQH[SODLQHUWKDWWHOOV\RXKRZWKH
timetzDNDtime with time zone
TXHU\SODQQHULVJRLQJWRH[HFXWH\RXU64/$UPHGZLWK\RXUNQDFNIRUZULWLQJ
7KHOHVVHUXVHGVLVWHURItimestamptz,WLVWLPH]RQH࠺DZDUHEXWGRHVQRW IODZOHVV64/\RXULQVWLQFWWRVQLIIRXWXVHIXOLQGH[HVDQGWKHLQVLJKWRIWKH
VWRUHWKHGDWH,WDOZD\VDVVXPHV'67RIWKHFXUUHQWGDWHDQGWLPH6RPH H[SODLQHU\RXVKRXOGKDYHQRWURXEOHJHWWLQJ\RXUTXHULHVWRUXQDVIDVWDV\RXU
SURJUDPPLQJODQJXDJHVZLWKQRFRQFHSWRIWLPHZLWKRXWGDWHPLJKWPDS KDUGZDUHEXGJHWZLOODOORZ
timetzWRDWLPHVWDPSZLWKVRPHDUELWUDU\GDWHVXFKDV8QL[(SRFK
UHVXOWLQJLQ\HDUEHLQJDVVXPHG
(;3/$,1
interval
7KHHDVLHVWWRROVIRUWDUJHWLQJTXHU\SHUIRUPDQFHSUREOHPVDUHWKHEXPLAINDQG
$GXUDWLRQRIWLPHLQKRXUVGD\VPRQWKVPLQXWHVDQGRWKHUV,WFRPHVLQ
EXPLAIN (ANALYZE)FRPPDQGVEXPLAINKDVEHHQDURXQGVLQFHWKHHDUO\\HDUV
KDQG\IRUGDWHWLPHDULWKPHWLF)RUH[DPSOHLIWKHZRUOGLVVXSSRVHGWRHQG
RI3RVWJUH64/2YHUWLPHWKHFRPPDQGKDVPDWXUHGLQWRDIXOOEORZQWRRO
LQH[DFWO\GD\VIURPQRZDOO\RXKDYHWRGRLVDGGDQLQWHUYDORI
FDSDEOHRIUHSRUWLQJKLJKO\GHWDLOHGLQIRUPDWLRQDERXWWKHTXHU\H[HFXWLRQ
GD\VWRWKHFXUUHQWWLPHWRJHWWKHH[DFWPRPHQWDQGSODQDFFRUGLQJO\
$ORQJWKHZD\LWDGGHGPRUHRXWSXWIRUPDWV(;3/$,1FDQHYHQGXPSWKH
tsrange RXWSXWWR;0/-621RU<$0/
$OORZV\RXWRGHILQHRSHQHGDQGFORVHGUDQJHVRItimestamp with no 3HUKDSVWKHPRVWH[FLWLQJHQKDQFHPHQWIRUWKHFDVXDOXVHUFDPHVHYHUDO\HDUV
timezone7KHW\SHFRQVLVWVRIWZRWLPHVWDPSVDQGRSHQHGFORVHGUDQJH EDFNZKHQSJ$GPLQLQWURGXFHGJUDSKLFDOH[SODLQ:LWKDKDUGDQGORQJVWDUH
TXDOLILHUV)RUH[DPSOH'[2012-01-01 14:00, 2012-01-01 \RXFDQLGHQWLI\ZKHUHWKHERWWOHQHFNVDUHLQ\RXUTXHU\ZKLFKWDEOHVDUH
15:00)'::tsrangeGHILQHVDSHULRGVWDUWLQJDWEXWHQGLQJEHIRUH PLVVLQJLQGH[HVDQGZKHWKHUWKHSDWKRIH[HFXWLRQWRRNDQXQH[SHFWHGWXUQ
5HIHUWR5DQJH7\SHVIRUGHWDLOV
(;3/$,12SWLRQV
tstzrange
7RXVHWKHQRQJUDSKLFDOYHUVLRQRIEXPLAINVLPSO\SUHIDFH\RXU64/ZLWKWKH
$OORZV\RXWRGHILQHRSHQHGDQGFORVHGUDQJHVRItimestamp with
ZRUGEXPLAINTXDOLILHGE\VRPHRSWLRQDODUJXPHQWV
timezone
EXPLAINE\LWVHOIZLOOMXVWJLYH\RXDQLGHDRIKRZWKHSODQQHULQWHQGVWR
daterange H[HFXWHWKHTXHU\ZLWKRXWUXQQLQJLW
4 | alex | H | t $OORZV\RXWRGHILQHRSHQHGDQGFORVHGUDQJHVRIGDWHV
8 | alex | H | t
12 | alex | H | f
16 | alex | H | f 7LPH=RQHV:KDW7KH\$UHDQG$UH1RW
2 | leo | T | f
6 | leo | H | f $FRPPRQPLVFRQFHSWLRQZLWK3RVWJUH64/WLPH]RQH࠺DZDUHGDWDW\SHVLVWKDW
10 | leo | H | f
14 | leo | T | f 3RVWJUH64/UHFRUGVDQH[WUDWLPHPDUNHUZLWKWKHGDWHWLPHYDOXHLWVHOI7KLVLV
1 | regina | H | f LQFRUUHFW,I\RXVDYH2012-2-14 [Link]-8EHLQJWKH3DFLILFRIIVHWIURP
5 | regina | H | f
9 | regina | T | f
87&3RVWJUH64/LQWHUQDOO\WKLQNVOLNHWKLV
13 | regina | T | f
3 | sonia | T | t &DOFXODWHWKH87&WLPHIRU7KLVLV
7 | sonia | T | t
11 | sonia | T | f
15 | sonia | T | f 6WRUHWKHYDOXH2012-02-15 [Link]
(16 rows)
)RURWKHUH[DPSOHVRIZULWLQJ3/9IXQFWLRQVLQ3/9FKHFNRXWWKH3/9 :KHQ\RXFDOOWKHGDWDEDFNIRUGLVSOD\3RVWJUH64/LQWHUQDOO\ZRUNVOLNHWKLV
ZLQGRZUHJUHVVLRQVFULSWZKLFKGHPRQVWUDWHVKRZWRFUHDWHPDQ\RIWKHEXLOWLQ 6WDUWZLWKWKHUHTXHVWHGWLPH]RQHGHIDXOWLQJWRWKHVHUYHUWLPH]RQHLIQRQH
3RVWJUH64/ZLQGRZIXQFWLRQVOHDGODJURZBQXPEHUFXPHBGLVWDQG LVUHTXHVWHG
ILUVWBYDOXHODVWBYDOXHLQ3/9
&RPSXWHWKHRIIVHWIRUWLPH]RQHIRUWKLV87&WLPHIRU
America/New_York
'HWHUPLQHWKHGDWHWLPHZLWKWKHRIIVHWZLWKDRIIVHW
EHFRPHV
6R3RVWJUH64/GRHVQߞWVWRUHWKHWLPH]RQHEXWXVHVLWRQO\WRFRQYHUWWKH
GDWHWLPHWR87&EHIRUHVWRUDJH$IWHUWKDWWKHWLPH]RQHLQIRUPDWLRQLV
GLVFDUGHG:KHQ3RVWJUH64/GLVSOD\VGDWHWLPHLWGRHVVRLQWKHGHIDXOWWLPH
]RQHGLFWDWHGE\WKHVHVVLRQXVHUGDWDEDVHRUVHUYHULQWKDWRUGHU,I\RXXVH
WLPH]RQH࠺DZDUHGDWDW\SHV\RXVKRXOGFRQVLGHUWKHFRQVHTXHQFHRIDVHUYHU
PRYHIURPRQHWLPH]RQHWRDQRWKHU6XSSRVH\RXEDVHGDVHUYHULQ1HZ<RUN
&LW\DQGVXEVHTXHQWO\UHVWRUHGWKHGDWDEDVHLQ/RV$QJHOHV$OOWLPHVWDPSVZLWK
WLPH]RQHILHOGVFRXOGVXGGHQO\GLVSOD\LQ3DFLILFWLPH7KLVLVILQHDVORQJDV
\RXDQWLFLSDWHWKLVEHKDYLRU
+HUHߞVDQH[DPSOHRIKRZVRPHWKLQJFDQJRZURQJ6XSSRVHWKDW0F'RQDOGߞV
KDGLWVVHUYHURQWKH(DVW&RDVWDQGWKHRSHQLQJWLPHIRUVWRUHVLVVWRUHGDV
timetz$QHZ0F'RQDOGߞVRSHQVXSLQ6DQ)UDQFLVFR7KHQHZIUDQFKLVHH
SKRQHV0F'RQDOGߞVKHDGTXDUWHUVWRDGGLWVVWRUHWRWKHPDVWHUGLUHFWRU\ZLWKDQ /** Get current value **/
var cval = winobj.get_func_arg_in_partition(0,
RSHQLQJWLPHRIDP7KHGDWDHQWU\GXGHHQWHUHGWKHLQIRUPDWLRQDVKHLVWROG 0,
DP7KH(DVW&RDVW3RVWJUH64/VHUYHULQWHUSUHWVWKLVWRPHDQDP(DVWHUQ winobj.SEEK_CURRENT,
DQGQRZHDUO\ULVHUVLQ6DQ)UDQFLVFRDUHOLQLQJXSDWWKHGRRUZRQGHULQJZK\ false);
for (i = 1; i < ofs; i++){
WKH\FDQߞWJHWWKHLU0F%UHDNIDVWVDWDP%HLQJKXQJU\LVRQHWKLQJEXWZHFDQ /** get next value **/
LPDJLQHPDQ\VLWXDWLRQVLQZKLFKFRQIXVLRQRYHUDGLIIHUHQFHRIWKUHHKRXUV nval = winobj.get_func_arg_in_partition(0,
i,
FRXOGPHDQOLIHRUGHDWK winobj.SEEK_CURRENT,
false);
*LYHQWKHSLWIDOOVZK\ZRXOGDQ\RQHZDQWWRXVHWLPH]RQH࠺DZDUHGDWDW\SHV" result = (cval == nval) ? true : false;
)LUVWLWGRHVVSDUH\RXIURPKDYLQJWRGRWLPH]RQHFRQYHUVLRQVPDQXDOO\)RU if (!result){
H[DPSOHLIDIOLJKWOHDYHV%RVWRQDWDPDQGDUULYHVLQ/RV$QJHOHVDWDP break;
}
DQG\RXUVHUYHULVLQ(XURSH\RXGRQߞWZDQWWRKDYHWRILJXUHRXWWKHRIIVHWIRU /** next current value is our last value **/
HDFKWLPHPDQXDOO\<RXFRXOGMXVWHQWHUWKHGDWDZLWKWKH%RVWRQDQG/RV cval = nval;
$QJHOHVORFDOWLPHV7KHUHߞVDQRWKHUFRQYLQFLQJUHDVRQWRXVHWLPH]RQH࠺DZDUH
}
GDWDW\SHVWKHDXWRPDWLFKDQGOLQJRI'67:LWKFRXQWULHVGHYLDWLQJPRUHDQG return result;
PRUHIURPRQHDQRWKHULQ'67VFKHGXOHVPDQXDOO\NHHSLQJWUDFNRI'67 $$ LANGUAGE plv8 WINDOW;
FKDQJHVIRUDJOREDOO\XVHGGDWDEDVHZRXOGUHTXLUHDGHGLFDWHGSURJUDPPHUZKR
7RGHFODUHDIXQFWLRQDVDZLQGRZIXQFWLRQLWPXVWKDYHDWINDOWGHVLJQDWRULQ
GRHVQRWKLQJEXWNHHSXSWRGDWHZLWKWKHODWHVW'67VFKHGXOHVDQGPDSWKHPWR
WKHIXQFWLRQHQYHORSHDVLQWKHODVWOLQHRI([DPSOH
JHRJUDSKLFHQFODYHV
7KHERG\RIWKHIXQFWLRQPXVWLQVSHFWHOHPHQWVRIWKHZLQGRZVHWRIGDWDDQG
+HUHߞVDQLQWHUHVWLQJH[DPSOHDWUDYHOLQJVDOHVSHUVRQFDWFKHVDIOLJKWKRPH
XVHWKHP3/9KDVDKDQGOHWRWKLVZLQGRZDQGKHOSHUPHWKRGVRXWOLQHGLQWKH
IURP6DQ)UDQFLVFRWRQHDUE\2DNODQG:KHQVKHERDUGVWKHSODQHWKHFORFNDW
3/9GRFXPHQWDWLRQ3/9:LQGRZIXQFWLRQ$3,2XUIXQFWLRQQHHGVWRORRN
WKHWHUPLQDOUHDGVDP:KHQVKHODQGVWKHFORFNLQWKH
IRUZDUGLQWKHZLQGRZIRUYDOXHVIURPWKHFXUUHQWSRVLWLRQLQWKHZLQGRZ
WHUPLQDOUHDGVDP+RZORQJZDVWKHIOLJKW"7KHNH\WRWKH
WKURXJKofsYDOXHV,IWKHVHYDOXHVDUHDOOWKHVDPHLWZLOOUHWXUQWUXHRWKHUZLVH
VROXWLRQLVWKDWWKHFKDQJHWR'67RFFXUUHGGXULQJWKHIOLJKWߚWKHFORFNVVSUDQJ
IDOVH7KHIXQFWLRQPHWKRGWKDW3/9SURYLGHVIRUVFDQQLQJYDOXHVRIDZLQGRZ
IRUZDUG:LWKWLPH]RQH࠺DZDUHWLPHVWDPSV\RXJHWPLQXWHVWRZKLFKLVD
LVget_func_arg_in_partition:HXVHWKDWWRORRNIRUZDUGDQGH[LWZLWK
SODXVLEOHDQVZHUIRUDVKRUWIOLJKWDFURVVWKH%D\:HJHWWKHZURQJDQVZHULIZH
IDOVHDVVRRQDVWKHSDWWHUQRIHTXDOLW\IDLOVRUZHߞYHUHDFKHGWKHODVWYDOXH
GRQߞWXVHWLPH]RQH࠺DZDUHWLPHVWDPSV
:HߞOOXVHWKLVIXQFWLRQWRILQGWKHZLQQHULQDVLPSOHJDPHRIFRLQWRVV(DFK
SELECT '2012-03-11 3:10 AM America/Los_Angeles'::timestamptz SOD\HUJHWVIRXUWRVVHVDQGWKHZLQQHUPXVWKDYHDUXQRIWKUHHKHDGVDVVKRZQ
- '2012-03-11 1:50 AM America/Los_Angeles'::timestamptz;
LQ([DPSOH
JLYHV\RXPLQXWHVZKHUHDV ([DPSOH3/9ZLQGRZIXQFWLRQH[DPSOHXVDJH
SELECT id, player, toss,
SELECT '2012-03-11 3:10 AM'::timestamp - '2012-03-11 1:50 AM'::timestamp; run_begin(toss,3) OVER (PARTITION BY player ORDER BY id) AS rb
FROM coin_tosses
ORDER BY player, id;
JLYHV\RXKRXUDQGPLQXWHV id | player | toss | rb
----+--------+------+----
PARALLEL = safe, /HWߞVGULYHWKHSRLQWKRPHZLWKPRUHH[DPSOHVXVLQJD%RVWRQVHUYHU)RU
INITCOND='{0,0}'
);
([DPSOH,LQSXWP\WLPHLQ/RV$QJHOHVORFDOWLPHEXWEHFDXVHP\VHUYHU
LVLQ%RVWRQ,JHWDWLPHUHWXUQHGLQ%RVWRQORFDOWLPH1RWHWKDWLWGRHVJLYHPH
:KHQ\RXUXQ([DPSOHFDOOLQJRXUQHZ3/9IXQFWLRQ\RXJHWWKHVDPH WKHRIIVHWEXWWKDWLVPHUHO\GLVSOD\LQIRUPDWLRQ7KHWLPHVWDPSLVLQWHUQDOO\
DQVZHUVDVWKHYHUVLRQZULWWHQLQ64/EXWWKH3/9YHUVLRQLVWZRWRWKUHH VWRUHGLQ87&
WLPHVIDVWHU*HQHUDOO\IRUPDWKHPDWLFDORSHUDWLRQV\RXߞOOILQGWKDW3/9
([DPSOH,QSXWWLQJWLPHLQRQHWLPH]RQHDQGRXWSXWLQDQRWKHU
IXQFWLRQVDUHWRWLPHVIDVWHUWKDQWKHLU64/FRXQWHUSDUWV
SELECT '2012-02-28 10:00 PM America/Los_Angeles'::timestamptz;
2012-02-29 [Link]-05
:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
,Q([DPSOHZHDUHJHWWLQJEDFNDWLPHVWDPSZLWKRXWWLPH]RQH6RWKH
3RVWJUH64/KDVPDQ\EXLOWLQZLQGRZIXQFWLRQVDVGLVFXVVHGLQߡ:LQGRZ DQVZHU\RXJHWZKHQ\RXUXQWKLVVDPHTXHU\ZLOOEHWKHVDPHDVPLQH
)XQFWLRQVߢ$Q\DJJUHJDWHIXQFWLRQLQFOXGLQJWKHRQHV\RXFUHDWHFDQEHXVHG UHJDUGOHVVRIZKHUHLQWKHZRUOG\RXDUH
DVZLQGRZDJJUHJDWHIXQFWLRQV7KHVHWZRSRLQWVDORQHPDNH3RVWJUH64/VWDQG
([DPSOH7LPHVWDPSZLWKWLPH]RQHWRWLPHVWDPSDWORFDWLRQ
RXWIURPPRVWRWKHUUHODWLRQDOGDWDEDVHV(YHQPRUHLPSUHVVLYHLVWKDW
SELECT '2012-02-28 10:00 PM America/Los_Angeles'::timestamptz
3RVWJUH64/DOORZV\RXWRFUHDWH\RXURZQZLQGRZIXQFWLRQV AT TIME ZONE 'Europe/Paris';
2012-02-29 [Link]
7KHRQO\FDYHDWLVWKDWPRVW3/V\RXFDQLQVWDOOLQ3RVWJUH64/ZLOOQRWDOORZ
\RXWRFUHDWHZLQGRZIXQFWLRQV,I\RXQHHGWRZULWHDZLQGRZIXQFWLRQLQ 7KHTXHU\LVDVNLQJZKDWWLPHLVLWLQ3DULVLILWߞVSPLQ/RV
3RVWJUH64/\RXFDQQRWGRLWZLWKEXLOWLQ3/3*64/RU64/ODQJXDJHV1RU $QJHOHV"1RWHWKHDEVHQFHRIWKH87&RIIVHWLQWKHUHVXOW$OVRQRWLFHKRZ\RX
FDQ\RXGRLWLQRWKHUSRSXODU3/VOLNH3/3\WKRQRU3/3HUO<RXFDQGRLWLQ& FDQVSHFLI\DWLPH]RQHZLWKLWVRIILFLDOQDPHUDWKHUWKDQMXVWDQRIIVHW9LVLW
EXWWKDWUHTXLUHVFRPSLODWLRQ<RXFDQDOVRWRVRPHH[WHQWGRLWLQDODQJXDJH :LNLSHGLDIRUDOLVWRIRIILFLDOWLPH]RQHQDPHV
OLNH3/53/9RQWKHRWKHUKDQGIXOO\VXSSRUWVZULWLQJZLQGRZIXQFWLRQV
DQGLVIDLUO\HIILFLHQWLQPDQ\FDVHVMXVWDVIDVWDVDZLQGRZIXQFWLRQZULWWHQLQ 'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
&EXWXQOLNH&GRHVQߞWUHTXLUHFRPSLODWLRQRI\RXUIXQFWLRQFRGH
7KHLQFOXVLRQRIDWHPSRUDOLQWHUYDOGDWDW\SHJUHDWO\HDVHVGDWHDQGWLPH
:KDWPDNHVZULWLQJZLQGRZIXQFWLRQVLQ3/9SRVVLEOHLVWKDW3/9FRPHV DULWKPHWLFLQ3RVWJUH64/:LWKRXWLWZHߞGKDYHWRFUHDWHDQRWKHUIDPLO\RI
SDFNDJHGZLWKDplv8.window_object()KHOSHUIXQFWLRQWKDWUHWXUQVDKDQGOHWR IXQFWLRQVRUXVHDQHVWLQJRIIXQFWLRQVDVPDQ\RWKHUGDWDEDVHVGR:LWK
WKHFXUUHQWZLQGRZREMHFW7KLVREMHFWLQFOXGHVPHWKRGVIRULQVSHFWLQJDQG LQWHUYDOVZHFDQDGGDQGVXEWUDFWWLPHVWDPSGDWDVLPSO\E\XVLQJWKHDULWKPHWLF
DFFHVVLQJHOHPHQWVZLWKLQWKHZLQGRZ RSHUDWRUVZHߞUHLQWLPDWHO\IDPLOLDUZLWK7KHIROORZLQJH[DPSOHVGHPRQVWUDWH
,Q([DPSOHZHߞOOFUHDWHDZLQGRZIXQFWLRQWKDWIRUHDFKURZUHWXUQVWUXH RSHUDWRUVDQGIXQFWLRQVXVHGZLWKGDWHDQGWLPHGDWDW\SHV
LILWߞVWKHEHJLQQLQJRIDUXQDQGIDOVHRWKHUZLVH5XQVRUVWUHDNVDUHVHTXHQFHV 7KHDGGLWLRQRSHUDWRU+DGGVDQLQWHUYDOWRDWLPHVWDPS
RILGHQWLFDORXWFRPH7KHIXQFWLRQOHWVWKHFDOOHUGHFLGHKRZPDQ\URZV
FRQVWLWXWHDߡUXQߢWKURXJKWKHofsDUJXPHQW SELECT '2012-02-10 11:00 PM'::timestamp + interval '1 hour';
([DPSOH3/9ZLQGRZIXQFWLRQWRIODJUHSHDWLQJGDWDYDOXHV
2012-02-11 [Link]
CREATE FUNCTION run_begin(arg anyelement, ofs int) RETURNS boolean AS $$
var winobj = plv8.get_window_object();
var result = true; <RXFDQDOVRDGGLQWHUYDOV
SELECT '23 hours 20 minutes'::interval + '1 hour'::interval; ([DPSOH3/&RIIHHYDOLGDWLRQRIHPDLOIXQFWLRQ
CREATE OR REPLACE FUNCTION
[Link] validate_email(email text) returns boolean as
$$
re = /\S+@\S+\.\S+/
7KHVXEWUDFWLRQRSHUDWRU-VXEWUDFWVDQLQWHUYDOIURPDWHPSRUDOW\SH return [Link] email
$$
SELECT '2012-02-10 11:00 PM'::timestamptz - interval '1 hour'; LANGUAGE plcoffee IMMUTABLE STRICT PARALLEL SAFE;
VWDUWXSIRUODWHUXVH %\GHIDXOWgenerate_seriesDVVXPHVtimestamptzLI\RXGRQߞWH[SOLFLWO\FDVW
:HIHG([DPSOHWKURXJKDQRQOLQHFRQYHUWHUDQGDGGHGDreturnVWDWHPHQW YDOXHVWRtimestamp
WRJHQHUDWHLWV&RIIHH6FULSWFRXQWHUSDUWLQ([DPSOH
CREATE EXTENSION plls;
$UUD\V
$UUD\VSOD\DQLPSRUWDQWUROHLQ3RVWJUH64/7KH\DUHSDUWLFXODUO\XVHIXOLQ 7KH3/9IDPLO\RIODQJXDJHVKDVPDQ\NH\TXDOLWLHVWKDWPDNHWKHPVWDQG
DSDUWIURP3/SJ64/VRPHRIZKLFK\RXߞOOILQGRQO\LQRWKHUKLJKHQG
EXLOGLQJDJJUHJDWHIXQFWLRQVIRUPLQJINDQGANYFODXVHVDQGKROGLQJ
SURFHGXUDOODQJXDJHVOLNH3/5
LQWHUPHGLDU\YDOXHVIRUPRUSKLQJWRRWKHUGDWDW\SHV,Q3RVWJUH64/HYHU\GDWD
W\SHKDVDFRPSDQLRQDUUD\W\SH,I\RXGHILQH\RXURZQGDWDW\SH3RVWJUH64/ *HQHUDOO\IDVWHUQXPHULFSURFHVVLQJWKDQ64/DQG3/SJ64/
FUHDWHVDFRUUHVSRQGLQJDUUD\W\SHLQWKHEDFNJURXQGIRU\RX)RUH[DPSOH
integerKDVDQLQWHJHUDUUD\W\SHinteger[]characterKDVDFKDUDFWHUDUUD\ 7KHDELOLW\WRFUHDWHZLQGRZIXQFWLRQV<RXFDQߞWGRWKLVXVLQJ64/
3/SJ64/RU3/3\WKRQ<RXFDQLQ3/5DQG&WKRXJK
W\SHcharacter[]DQGVRIRUWK:HߞOOVKRZ\RXVRPHXVHIXOIXQFWLRQVWR
FRQVWUXFWDUUD\VVKRUWRIW\SLQJWKHPLQPDQXDOO\:HZLOOWKHQSRLQWRXWVRPH 7KHDELOLW\WRFUHDWHWULJJHUVDQGDJJUHJDWHIXQFWLRQV
KDQG\IXQFWLRQVIRUDUUD\PDQLSXODWLRQV<RXFDQJHWWKHFRPSOHWHOLVWLQJRI
6XSSRUWIRUSUHSDUHGVWDWHPHQWVVXEWUDQVDFWLRQVLQQHUIXQFWLRQVFODVVHVDQG
DUUD\IXQFWLRQVDQGRSHUDWRUVLQWKH2IILFLDO0DQXDO$UUD\)XQFWLRQVDQG
WU\FDWFKHUURUKDQGOLQJ
2SHUDWRUV
7KHDELOLW\WRG\QDPLFDOO\JHQHUDWHH[HFXWDEOHFRGHXVLQJDQevalIXQFWLRQ
$UUD\&RQVWUXFWRUV -621VXSSRUWDOORZLQJIRUORRSLQJRYHUDQGILOWHULQJRI-621REMHFWV
7KHPRVWUXGLPHQWDU\ZD\WRFUHDWHDQDUUD\LVWRW\SHWKHHOHPHQWV
$FFHVVWRIXQFWLRQVIURPDOFRPPDQGV
SELECT ARRAY[2001, 2002, 2003] As yrs; &RPSDWLELOLW\ZLWK1RGHMV1RGHMVXVHUVDQGRWKHUXVHUVZKRZDQWWRXVH
-DYDVFULSWIRUEXLOGLQJQHWZRUNDSSOLFDWLRQVZLOODSSUHFLDWHWKDW3/9DQG
,IWKHHOHPHQWVRI\RXUDUUD\FDQEHH[WUDFWHGIURPDTXHU\\RXFDQXVHWKHPRUH
1RGHMVDUHEXLOWRQWKHVDPH*RRJOH9HQJLQHDQGWKDWPDQ\RIWKHOLEUDULHV
VRSKLVWLFDWHGFRQVWUXFWRUIXQFWLRQarray() DYDLODEOHIRU1RGHMVZLOOZRUNODUJHO\XQFKDQJHGZKHQXVHGLQ3/9
7KHUHLVDQH[WHQVLRQFDOOHGplv8xWKDWPDNHVXVLQJ1RGHMVPRGXOHVDQG
SELECT array(
SELECT DISTINCT date_part('year', log_ts) PRGXOHV\RXEXLOGHDVLHUWRUHXVHLQ3/9
FROM logs
ORDER BY date_part('year', log_ts) <RXFDQILQGVHYHUDOH[DPSOHVRQRXUVLWHRI3/9XVH6RPHLQYROYHGFRS\LQJ
); IDLUO\ODUJHERGLHVRI-DYD6FULSWFRGHWKDWZHSXOOHGIURPWKHZHEDQGZUDSSHG
LQD3/9ZUDSSHUDVGHWDLOHGLQ8VLQJ3/9WR%XLOG-6216HOHFWRUV7KH
$OWKRXJKWKHarrayIXQFWLRQKDVWREHXVHGZLWKDTXHU\UHWXUQLQJDVLQJOH 3/9IDPLO\PDWHVSHUIHFWO\ZLWKZHEDSSOLFDWLRQVEHFDXVHPXFKRIWKHVDPH
FROXPQ\RXFDQVSHFLI\DFRPSRVLWHW\SHDVWKHRXWSXWWKHUHE\DFKLHYLQJ FOLHQWVLGH-DYD6FULSWORJLFFDQEHUHXVHG0RUHLPSRUWDQWLWPDNHVDJUHDWDOO
PXOWLFROXPQUHVXOWV:HGHPRQVWUDWHWKLVLQߡ&XVWRPDQG&RPSRVLWH'DWD SXUSRVHODQJXDJHIRUGHYHORSLQJQXPHULFIXQFWLRQVXSGDWLQJGDWDDQGVRRQ
7\SHVߢ
<RXFDQFDVWDVWULQJUHSUHVHQWDWLRQRIDQDUUD\WRDQDUUD\ZLWKV\QWD[RIWKH %DVLF)XQFWLRQV
IRUP
2QHRIWKHJUHDWEHQHILWVRI3/9LVWKDW\RXFDQXVHDQ\-DYD6FULSWIXQFWLRQLQ
SELECT '{Alex,Sonia}'::text[] As name, '{46,43}'::smallint[] As age; \RXU3/9IXQFWLRQVZLWKPLQLPDOFKDQJH)RUH[DPSOH\RXߞOOILQGPDQ\
GRZQORDGWKHPIURPRXU3RVWJUHV2Q/LQH-RXUQDOVLWHIRU3RVWJUH64/ERWK name | age
-------------+--------
ELWDQGELW {Alex,Sonia} | {46,43}
:KHQ\RXDGG3/9ELQDULHVWR\RXU3RVWJUH64/VHWXS\RXJHWQRWRQHEXW
WKUHH-DYD6FULSWUHODWHGODQJXDJHV <RXFDQFRQYHUWGHOLPLWHGVWULQJVWRDQDUUD\ZLWKWKHstring_to_array
IXQFWLRQDVGHPRQVWUDWHGLQ([DPSOH
3/9SOY
([DPSOH&RQYHUWLQJDGHOLPLWHGVWULQJWRDQDUUD\
7KLVLVWKHEDVLFODQJXDJHWKDWVHUYHVDVWKHEDVLVIRUWKHRWKHUWZR-DYD6FULSW
SELECT string_to_array('[Link]', '.') As estados;
ODQJXDJHV estados
----------
3/&RIIHH6FULSWSOFRIIHH {CA,MA,TX}
(1 row)
7KLVODQJXDJHOHWV\RXZULWHIXQFWLRQVLQ&RIIHH6FULSW&RIIHH6FULSWLV
-DYD6FULSWZLWKDPRUHVXFFLQFWV\QWD[VWUXFWXUHWKDWUHVHPEOHV3\WKRQ/LNH array_aggLVDQDJJUHJDWHIXQFWLRQWKDWFDQWDNHDVHWRIDQ\GDWDW\SHDQG
3\WKRQLWUHOLHVRQLQGHQWDWLRQWRLPSDUWFRQWH[WEXWGRHVDZD\ZLWK FRQYHUWLWWRDQDUUD\DVGHPRQVWUDWHGLQ([DPSOH
DQQR\LQJFXUO\EUDFHV ([DPSOH8VLQJDUUD\BDJJ
3//LYH6FULSWSOOV SELECT array_agg(log_ts ORDER BY log_ts) As x
FROM logs
3//LYH6FULSWDOORZV\RXWRZULWHIXQFWLRQVLQ/LYH6FULSWDIRUNRI WHERE log_ts BETWEEN '2011-01-01'::timestamptz AND '2011-01-15'::timestamptz;
x
&RIIHH6FULSW/LYH6FULSWLVVLPLODUWR&RIIHH6FULSWEXWZLWKVRPHDGGHG ------------------------------------------
V\QWDFWLFFRQGLPHQWV7KLVDUWLFOHSURPRWHV/LYH6FULSWDVDVXSHULRU {'2011-01-01', '2011-01-13', '2011-01-14'}
DOWHUQDWLYHWR&RIIHH6FULSW5HDVRQVWR6ZLWFKIURP&RIIHH6FULSWWR
/LYH6FULSW,IDQ\WKLQJ/LYH6FULSWGRHVKDYHPRUH3\WKRQ)DQG+DVNHOO 3RVWJUH64/LQWURGXFHGarray_aggIXQFWLRQVXSSRUWIRUDUUD\V,QSULRU
IHDWXUHVWKDQ&RIIHH6FULSW,I\RXߞUHORRNLQJIRUDODQJXDJHWKDWKDVDOLJKWHU YHUVLRQVLI\RXZDQWHGWRDJJUHJDWHURZVRIDUUD\VZLWKDUUD\BDJJ\RXߞGJHWDQ
IRRWSULQWWKDQ3/3\WKRQDQGLVWUXVWHG\RXPLJKWZDQWWRJLYH/LYH6FULSWD HUURUDUUD\BDJJVXSSRUWIRUDUUD\VPDNHVLWPXFKHDVLHUWREXLOG
WU\ PXOWLGLPHQVLRQDODUUD\VIURPRQHGLPHQVLRQDODUUD\VDVVKRZQLQ([DPSOH
3/&RIIHH6FULSWDQG3//LYH6FULSWDUHFRPSLOHGXVLQJWKHVDPH3/9OLEUDU\
7KHLUIXQFWLRQDOLW\LVWKHUHIRUHLGHQWLFDOWRWKDWRI3/9,QIDFW\RXFDQHDVLO\ ([DPSOH&UHDWLQJPXOWLGLPHQVLRQDODUUD\VIURPRQHGLPHQVLRQDODUUD\V
FRQYHUWEDFNWR3/9LIWKH\GRQߞWVXLW\RXUWDVWHEXGV$OOWKUHHODQJXDJHVDUH SELECT array_agg(f.t)
FROM ( VALUES ('{Alex,Sonia}'::text[]),
WUXVWHG7KLVPHDQVWKH\FDQߞWDFFHVV26ILOHV\VWHPVEXWWKH\FDQEHXVHGE\ ('{46,43}'::text[] ) ) As f(t);
QRQVXSHUXVHUVWRFUHDWHIXQFWLRQV array_agg
----------------------
([DPSOHKDVWKHFRPPDQGVWRLQVWDOOWKHWKUHHODQJXDJHVXVLQJH[WHQVLRQV {{Alex,Sonia},{46,43}}
(1 row)
)RUHDFKGDWDEDVHZKHUH\RXߞGOLNHWRLQVWDOOWKHVXSSRUW\RXPXVWUXQWKHVH
OLQHV<RXQHHGQRWLQVWDOODOOWKUHHLI\RXFKRRVHQRWWR ,QRUGHUWRDJJUHJDWHDUUD\VWKH\PXVWEHRIWKHVDPHGDWDW\SHDQGWKHVDPH
([DPSOH,QVWDOOLQJ3/9IDPLO\RIODQJXDJHV GLPHQVLRQ7RIRUFHWKDWLQ([DPSOHZHFDVWWKHDJHVWRWH[W:HDOVRKDYH
CREATE EXTENSION plv8;
WKHVDPHQXPEHURILWHPVLQWKHDUUD\VEHLQJDJJUHJDWHGWZRSHRSOHDQGWZR
CREATE EXTENSION plcoffee; DJHV$UUD\VZLWKWKHVDPHQXPEHURIHOHPHQWVDUHFDOOHGEDODQFHGDUUD\V
&DOOLQJ3\WKRQIXQFWLRQVLVQRGLIIHUHQWIURPFDOOLQJIXQFWLRQVZULWWHQLQRWKHU
8QQHVWLQJ$UUD\VWR5RZV ODQJXDJHV,Q([DPSOHZHXVHWKHIXQFWLRQZHFUHDWHGLQ([DPSOHWR
RXWSXWWKHUHVXOWZLWKWKUHHVHDUFKWHUPV
$FRPPRQIXQFWLRQXVHGZLWKDUUD\VLVunnestZKLFKDOORZV\RXWRH[SDQGWKH
([DPSOH8VLQJ3\WKRQIXQFWLRQVLQDTXHU\
HOHPHQWVRIDQDUUD\LQWRDVHWRIURZVDVGHPRQVWUDWHGLQ([DPSOH
SELECT search_term, left(postgresql_help_search(search_term),125) AS result
([DPSOH([SDQGLQJDUUD\VZLWKXQQHVW FROM (VALUES ('regexp_match'),('pg_trgm'),('tsvector')) As x(search_term);
SELECT unnest('{XOX,OXO,XOX}'::char(3)[]) As tic_tac_toe;
tic_tac_toe 5HFDOOWKDW3/3\WKRQLVDQXQWUXVWHGODQJXDJHZLWKRXWDWUXVWHGFRXQWHUSDUW
--- 7KLVPHDQVRQO\VXSHUXVHUVFDQZULWHIXQFWLRQVXVLQJ3/3\WKRQDQGWKH
XOX IXQFWLRQFDQLQWHUDFWZLWKWKHILOHV\VWHPRIWKH26([DPSOHWDNHV
OXO
XOX DGYDQWDJHRIWKHXQWUXVWHGQDWXUHRI3/3\WKRQWRUHWULHYHILOHOLVWLQJVIURPD
GLUHFWRU\.HHSLQPLQGWKDWIURPWKHSHUVSHFWLYHRIWKH26D3/3\WKRQ
$OWKRXJK\RXFDQDGGPXOWLSOHXQQHVWVWRDVLQJOHSELECTLIWKHQXPEHURI IXQFWLRQUXQVXQGHUWKHFRQWH[WRIWKHpostgresXVHUDFFRXQWFUHDWHGGXULQJ
UHVXOWDQWURZVIURPHDFKDUUD\LVQRWEDODQFHG\RXPD\JHWVRPHKHDG LQVWDOODWLRQVR\RXQHHGWREHVXUHWKDWWKLVDFFRXQWKDVDGHTXDWHDFFHVVWRWKH
VFUDWFKLQJUHVXOWV UHOHYDQWGLUHFWRULHV
$EDODQFHGXQQHVWDVVKRZQLQ([DPSOH\LHOGVWKUHHURZV ([DPSOH/LVWLQJILOHVLQGLUHFWRULHV
([DPSOH8QQHVWLQJEDODQFHGDUUD\V CREATE OR REPLACE FUNCTION list_incoming_files()
RETURNS SETOF text AS
SELECT
$$
unnest('{three,blind,mice}'::text[]) As t,
import os
unnest('{1,2,3}'::smallint[]) As i;
return [Link]('/incoming')
t |i
$$
------+-
LANGUAGE 'plpython2u' VOLATILE SECURITY DEFINER;
three |1
blind |2
mice |3 5XQWKHIXQFWLRQLQ([DPSOHZLWKWKHIROORZLQJTXHU\
3RVWJUH64/DXWRPDWLFDOO\FRQYHUWV3RVWJUH64/GDWDW\SHVWR3\WKRQGDWDW\SHV ([DPSOH8QQHVWLQJXQEDODQFHGDUUD\VZLWKPXOWLDUJXPHQWXQQHVW
DQGEDFN3/3\WKRQLVFDSDEOHRIUHWXUQLQJDUUD\VDQGFRPSRVLWHW\SHV<RXFDQ SELECT * FROM unnest('{blind,mouse}'::text[], '{1,2,3}'::int[]) AS f(t,i);
t | i
XVH3/3\WKRQWRZULWHWULJJHUVDQGFUHDWHDJJUHJDWHIXQFWLRQV:HߞYH -------+---
GHPRQVWUDWHGVRPHRIWKHVHLQWKH3RVWJUHV2Q/LQH-RXUQDOLQ3/3\WKRQ blind | 1
([DPSOHV mouse | 2
<NULL> | 3
3\WKRQDOORZV\RXWRSHUIRUPIHDWVWKDWDUHQߞWSRVVLEOHLQ3/SJ64/,Q
([DPSOHZHGHPRQVWUDWHKRZWRZULWHD3/3\WKRQIXQFWLRQWRGRDWH[W $UUD\6OLFLQJDQG6SOLFLQJ
VHDUFKRIWKHRQOLQH3RVWJUH64/GRFXPHQWVLWH
3RVWJUH64/DOVRVXSSRUWVDUUD\VOLFLQJXVLQJWKHstart:endV\QWD[,WUHWXUQV
([DPSOH6HDUFKLQJ3RVWJUH64/GRFXPHQWVXVLQJ3/3\WKRQ DQRWKHUDUUD\WKDWLVDVXEDUUD\RIWKHRULJLQDO)RUH[DPSOHWRUHWXUQQHZDUUD\V
CREATE OR REPLACE FUNCTION postgresql_help_search(param_search text) WKDWMXVWFRQWDLQHOHPHQWVWKURXJKRIHDFKRULJLQDODUUD\W\SH
RETURNS text AS
$$
import urllib, re SELECT fact_subcats[2:4] FROM census.lu_fact_types;
response = [Link](
'[Link] + param_search
) 7RJOXHWZRDUUD\VWRJHWKHUHQGWRHQGXVHWKHFRQFDWHQDWLRQRSHUDWRU||
raw_html = [Link]()
result = SELECT fact_subcats[1:2] || fact_subcats[3:4] FROM census.lu_fact_types;
raw_html[raw_html.find("<!-- docbot goes here -->") :
raw_html.find("<!-- pgContentWrap -->") - 1]
result = [Link]('<[^<]+?>', '', result).strip() <RXFDQDOVRDGGDGGLWLRQDOHOHPHQWVWRDQH[LVWLQJDUUD\DVIROORZV
return result
$$ SELECT '{1,2,3}'::integer[] || 4 || 5;
LANGUAGE plpython2u SECURITY DEFINER STABLE;
,PSRUWVWKHOLEUDULHVZHߞOOEHXVLQJ 7KHUHVXOWLV{1,2,3,4,5}
3HUIRUPVDVHDUFKDIWHUFRQFDWHQDWLQJWKHVHDUFKWHUP
5HDGVWKHUHVSRQVHDQGVDYHVWKHUHWULHYHG+70/WRDYDULDEOHFDOOHG 5HIHUHQFLQJ(OHPHQWVLQDQ$UUD\
raw_html
(OHPHQWVLQDUUD\VDUHPRVWFRPPRQO\UHIHUHQFHGXVLQJWKHLQGH[RIWKH
6DYHVWKHSDUWRIWKHraw_htmlWKDWVWDUWVZLWK<!-- docbot goes here --
HOHPHQW3RVWJUH64/DUUD\LQGH[HVVWDUWDW,I\RXWU\WRDFFHVVDQHOHPHQW
>DQGHQGVMXVWEHIRUHWKHEHJLQQLQJRI<!-- pgContentWrap -->LQWRD
DERYHWKHXSSHUERXQG\RXZRQߞWJHWDQHUURUߚRQO\NULLZLOOEHUHWXUQHG7KH
QHZYDULDEOHFDOOHGresult QH[WH[DPSOHJUDEVWKHILUVWDQGODVWHOHPHQWRIRXUDUUD\FROXPQ
5HPRYHVOHDGLQJDQGWUDLOLQJ+70/V\PEROVDQGZKLWHVSDFH
5HWXUQVresult SELECT
fact_subcats[1] AS primero, Dupd_tsFROXPQ,WXSGDWHVWKHupd_tsILHOGWRWKHFXUUHQWWLPHEHIRUH
fact_subcats[array_upper(fact_subcats, 1)] As segundo
FROM census.lu_fact_types; UHWXUQLQJWKHFKDQJHGUHFRUG
7KLVLVDQHZIHDWXUHLQWURGXFHGLQYHUVLRQWKDWDOORZVXVWROLPLWWKH
:HXVHGWKHarray_upperIXQFWLRQWRJHWWKHXSSHUERXQGRIWKHDUUD\7KH ILULQJRIWKHWULJJHUVRLWKDSSHQVRQO\LIVSHFLILHGFROXPQVKDYHFKDQJHG
VHFRQGUHTXLUHGSDUDPHWHURIWKHIXQFWLRQLQGLFDWHVWKHGLPHQVLRQ,QRXUFDVH 3ULRUWRYHUVLRQWKHWULJJHUZRXOGILUHRQDQ\XSGDWHDQG\RXZRXOGQHHG
RXUDUUD\LVRQHGLPHQVLRQDOEXW3RVWJUH64/GRHVVXSSRUWPXOWLGLPHQVLRQDO WRSHUIRUPDFROXPQZLVHFRPSDULVRQXVLQJOLD.some_columnDQG
DUUD\V NEW.some_columnWRGHWHUPLQHZKDWFKDQJHG7KLVIHDWXUHLVQRWVXSSRUWHG
IRUINSTEAD OFWULJJHUV
$UUD\&RQWDLQPHQW&KHFNV
3RVWJUH64/KDVVHYHUDORSHUDWRUVIRUZRUNLQJZLWKDUUD\GDWD:HDOUHDG\VDZ :ULWLQJ3/3\WKRQ)XQFWLRQV
WKHFRQFDWHQDWLRQRSHUDWRU||IRUFRPELQLQJPXOWLSOHDUUD\VLQWRRQHRUDGGLQJ
DQHOHPHQWWRDQDUUD\LQߡ$UUD\6OLFLQJDQG6SOLFLQJߢ$UUD\VDOVRVXSSRUWWKH 3\WKRQLVDVOLFNODQJXDJHZLWKDYDVWQXPEHURIDYDLODEOHOLEUDULHV3RVWJUH64/
IROORZLQJFRPSDULVRQRSHUDWRUV=<><>@><@DQG&&7KHVHRSHUDWRUV LVWKHRQO\GDWDEDVHZHNQRZRIWKDWOHWV\RXFRPSRVHIXQFWLRQVXVLQJ3\WKRQ
UHTXLUHERWKVLGHVRIWKHRSHUDWRUWREHDUUD\VRIWKHVDPHDUUD\GDWDW\SH,I\RX 3RVWJUH64/VXSSRUWVERWK3\WKRQDQG3\WKRQ
KDYHD*L67RU*,1LQGH[RQ\RXUDUUD\FROXPQWKHFRPSDULVRQRSHUDWRUVFDQ
XWLOL]HWKHP
&$87,21
7KHRYHUODSRSHUDWRU&&UHWXUQVtrueLIWZRDUUD\VKDYHDQ\HOHPHQWVLQ $OWKRXJK\RXFDQLQVWDOOERWKplpython2uDQGplpython3uLQWKHVDPHGDWDEDVH\RXFDQߞW
FRPPRQ([DPSOHZLOOOLVWDOOUHFRUGVLQRXUWDEOHZKHUHWKHIDFWBVXEFDWV XVHERWKGXULQJWKHVDPHVHVVLRQ7KLVPHDQVWKDW\RXFDQߞWZULWHDTXHU\WKDWFDOOVERWK
plpython2uDQGplpython3uIXQFWLRQV<RXPD\HQFRXQWHUDWKLUGH[WHQVLRQFDOOHG
FRQWDLQVHOHPHQWVOCCUPANCY STATUSRUFor rent plpythonuWKLVLVDQDOLDVIRUplpython2uDQGLVOHIWDURXQGIRUEDFNZDUGFRPSDWLELOLW\
([DPSOH$UUD\RYHUODSVRSHUDWRU
SELECT fact_subcats
FROM census.lu_fact_types ,QRUGHUWRXVH3/3\WKRQ\RXILUVWQHHGWRLQVWDOO3\WKRQRQ\RXUVHUYHU)RU
WHERE fact_subcats && '{OCCUPANCY STATUS,For rent}'::varchar[];
fact_subcats
:LQGRZVDQG0DF3\WKRQLQVWDOOHUVDUHDYDLODEOH)RU/LQX[8QL[V\VWHPV
----------------------------------------------------------- 3\WKRQELQDULHVDUHXVXDOO\DYDLODEOHYLDWKHYDULRXVGLVWULEXWLRQV)RUGHWDLOV
{S01,"OCCUPANCY STATUS","Total housing units"...} VHH3/3\WKRQ$IWHULQVWDOOLQJ3\WKRQLQVWDOOWKH3RVWJUH64/3\WKRQH[WHQVLRQ
{S02,"OCCUPANCY STATUS","Total housing units"...}
{S03,"OCCUPANCY STATUS","Total housing units"...}
{S10,"VACANCY STATUS","Vacant housing units","For rent"...} CREATE EXTENSION plpython2u;
(4 rows) CREATE EXTENSION plpython3u;
EHW,QWKLVVHFWLRQZHߞOOGHPRQVWUDWHKRZWRZULWHDEDVLFWULJJHUIXQFWLRQLQ
3/SJ64/
5DQJH7\SHV
:HSURFHHGLQWZRVWHSV)LUVWZHZULWHWKHWULJJHUIXQFWLRQ6HFRQGZH
5DQJHGDWDW\SHVUHSUHVHQWGDWDZLWKDEHJLQQLQJDQGDQHQG3RVWJUH64/DOVR
H[SOLFLWO\DWWDFKWKHWULJJHUIXQFWLRQWRWKHDSSURSULDWHWULJJHU7KHVHFRQGVWHSLV
UROOHGRXWPDQ\RSHUDWRUVDQGIXQFWLRQVWRLGHQWLI\RYHUODSSLQJUDQJHVFKHFNWR
DSRZHUIXOIHDWXUHRI3RVWJUH64/WKDWGHFRXSOHVWKHIXQFWLRQKDQGOLQJWKH
VHHZKHWKHUDYDOXHIDOOVLQVLGHWKHUDQJHDQGFRPELQHDGMDFHQWVPDOOHUUDQJHV
WULJJHUIURPWKHWULJJHULWVHOI<RXFDQDWWDFKWKHVDPHWULJJHUIXQFWLRQWR
LQWRODUJHUUDQJHV3ULRUWRUDQJHW\SHVZHKDGWRNOXGJHRXURZQIXQFWLRQV
PXOWLSOHWULJJHUVDGGLQJDQRWKHUOHYHORIUHXVHQRWIRXQGLQRWKHUGDWDEDVHV
7KHVHRIWHQZHUHFOXPV\DQGVORZDQGGLGQߞWDOZD\VSURGXFHWKHH[SHFWHG
%HFDXVHHDFKWULJJHUIXQFWLRQFDQVWDQGRQLWVRZQ\RXKDYH\RXUFKRLFHRI
UHVXOWV:HߞYHEHHQVRKDSS\ZLWKUDQJHVWKDWZHߞYHFRQYHUWHGDOORIRXU
ODQJXDJHVDQGPL[LQJLVFRPSOHWHO\2.)RUDVLQJOHWULJJHULQJHYHQW\RXFDQ
WHPSRUDOWDEOHVWRXVHWKHPZKHUHSRVVLEOH:HKRSH\RXVKDUHRXUMR\
VHWXSPXOWLSOHWULJJHUVHDFKZLWKIXQFWLRQVZULWWHQLQDGLIIHUHQWODQJXDJH)RU
H[DPSOH\RXFDQKDYHDWULJJHUHPDLODFOLHQWZULWWHQLQ3/3\WKRQ8RU 5DQJHW\SHVUHSODFHWKHQHHGWRXVHWZRVHSDUDWHILHOGVWRUHSUHVHQWUDQJHV
3/3HUO8DQGDQRWKHUWULJJHUZULWHWRDORJWDEOHZLWK3/SJ64/ 6XSSRVHZHZDQWDOOLQWHJHUVEHWZHHQ࠺DQGEXWQRWLQFOXGLQJ7KHUDQJH
$EDVLFWULJJHUIXQFWLRQDQGDFFRPSDQ\LQJWULJJHULVGHPRQVWUDWHGLQ UHSUHVHQWDWLRQZRXOGEH[-2,2)7KHVTXDUHEUDFNHWLQGLFDWHVDUDQJHWKDWLV
([DPSOH FORVHGRQWKDWHQGZKHUHDVDSDUHQWKHVLVLQGLFDWHVDUDQJHWKDWLVRSHQRQWKDW
HQG7KXV[-2,2)LQFOXGHVH[DFWO\IRXULQWHJHUV࠺࠺6LPLODUO\
([DPSOH7ULJJHUIXQFWLRQWRWLPHVWDPSQHZDQGFKDQJHGUHFRUGV
CREATE OR REPLACE FUNCTION trig_time_stamper() RETURNS trigger AS 7KHUDQJH(-2,2]LQFOXGHVIRXULQWHJHUV-1, 0, 1, 2
$$
BEGIN 7KHUDQJH(-2,2)LQFOXGHVWKUHHLQWHJHUV-1, 0, 1
NEW.upd_ts := CURRENT_TIMESTAMP;
RETURN NEW; 7KHUDQJH[-2,2]LQFOXGHVILYHLQWHJHUV-2, -1, 0, 1, 2
END;
$$
LANGUAGE plpgsql VOLATILE;
'LVFUHWH9HUVXV&RQWLQXRXV5DQJHV
CREATE TRIGGER trig_1
BEFORE INSERT OR UPDATE OF session_state, session_id
3RVWJUH64/PDNHVDGLVWLQFWLRQEHWZHHQGLVFUHWHDQGFRQWLQXRXVUDQJHV$
ON web_sessions UDQJHRILQWHJHUVRUGDWHVLVGLVFUHWHEHFDXVH\RXFDQHQXPHUDWHHDFKYDOXH
FOR EACH ROW EXECUTE PROCEDURE trig_time_stamper(); ZLWKLQWKHUDQJH7KLQNRIGRWVRQDQXPEHUOLQH$UDQJHRIQXPHULFVRU
'HILQHVWKHWULJJHUIXQFWLRQ7KLVIXQFWLRQFDQEHXVHGRQDQ\WDEOHWKDWKDV WLPHVWDPSVLVFRQWLQXRXVEHFDXVHDQLQILQLWHQXPEHURIYDOXHVOLHVEHWZHHQWKH
HQGSRLQWV 25017 | 74.7697097102419689
25021 | 73.8824162064128504
$GLVFUHWHUDQJHKDVPXOWLSOHUHSUHVHQWDWLRQV2XUHDUOLHUH[DPSOHRI[-2,2)FDQ 25027 | 73.5955049035237656
EHUHSUHVHQWHGLQWKHIROORZLQJZD\VDQGVWLOOLQFOXGHWKHVDPHQXPEHURIYDOXHV /HWߞVJRLQWRRYHUGULYHDQGHQJDJHRXUQHZIXQFWLRQDVDZLQGRZDJJUHJDWHDV
LQWKHUDQJH[-2,1], (-3,1], (-3,2), [-2,2)2IWKHVHIRXU VKRZQLQ([DPSOH
UHSUHVHQWDWLRQVWKHRQHZLWK[)LVFRQVLGHUHGWKHFDQRQLFDOIRUP7KHUHߞV
([DPSOH7RSILYHPRVWUDFLDOO\GLYHUVHFHQVXVWUDFWVZLWKDYHUDJHV
QRWKLQJPDJLFDODERXWFORVHGRSHQUDQJHVH[FHSWWKDWLIHYHU\RQHDJUHHVWR
WITH X AS (SELECT
XVLQJWKDWUHSUHVHQWDWLRQIRUGLVFUHWHUDQJHVZHFDQHDVLO\FRPSDUHDPRQJPDQ\ tract_id,
UDQJHVZLWKRXWKDYLQJWRZRUU\ILUVWDERXWFRQYHUWLQJRSHQWRFORVHRUYLFH left(tract_id,5) As county,
YHUVD3RVWJUH64/FDQRQLFDOL]HVDOOGLVFUHWHUDQJHVIRUERWKVWRUDJHDQGGLVSOD\ geom_mean(val) OVER (PARTITION BY tract_id) As div_tract,
ROW_NUMBER() OVER (PARTITION BY tract_id) As rn,
6RLI\RXHQWHUDGDWHUDQJHDV(2014-1-5,2014-2-1]3RVWJUH64/UHZULWHVLW geom_mean(val) OVER(PARTITION BY left(tract_id,5)) As div_county
DV[2014-01-06,2014-02-02) FROM census.vw_facts WHERE category = 'Population' AND short_name != 'white_alone'
)
SELECT tract_id, county, div_tract, div_county
FROM X
%XLOWLQ5DQJH7\SHV WHERE rn = 1
ORDER BY div_tract DESC, div_county DESC LIMIT 5;
3RVWJUH64/FRPHVZLWKVL[EXLOWLQUDQJHW\SHVIRUQXPEHUVDQGGDWHWLPHV tract_id | county | div_tract | div_county
------------+--------+----------------------+---------------------
int4rangeint8range
25025160101 | 25025 | 302.6815688785928786 | 85.1549046212833364
$UDQJHRILQWHJHUV,QWHJHUUDQJHVDUHGLVFUHWHDQGVXEMHFWWR 25027731900 | 25027 | 265.6136902148147729 | 73.5955049035237656
25021416200 | 25021 | 261.9351057509603296 | 73.8824162064128504
FDQRQLFDOL]DWLRQ 25025130406 | 25025 | 260.3241378371627137 | 85.1549046212833364
25017342500 | 25017 | 257.4671462282508267 | 74.7697097102419689
numrange
$FRQWLQXRXVUDQJHRIGHFLPDOVIORDWLQJSRLQWQXPEHUVRUGRXEOHSUHFLVLRQ
QXPEHUV :ULWLQJ3/SJ64/)XQFWLRQV
:KHQ\RXUIXQFWLRQDOQHHGVRXWJURZ64/WXUQLQJWR3/SJ64/LVDFRPPRQ
daterange
SUDFWLFH3/SJ64/VXUSDVVHV64/LQWKDW\RXFDQGHFODUHORFDOYDULDEOHVXVLQJ
$GLVFUHWHGDWHUDQJHRIFDOHQGDUGDWHVZLWKRXWWLPH]RQHDZDUHQHVV DECLAREDQG\RXFDQLQFRUSRUDWHFRQWUROIORZ
tsrangetstzrange
%DVLF3/SJ64/)XQFWLRQ
$FRQWLQXRXVGDWHDQGWLPHWLPHVWDPSUDQJHDOORZLQJIRUIUDFWLRQDO
VHFRQGVtstrangeLVQRWWLPH]RQH࠺DZDUHtstzrangeLVWLPH]RQH࠺DZDUH 7RGHPRQVWUDWHV\QWD[GLIIHUHQFHVIURP64/LQ([DPSOHZHUHZULWH
([DPSOHDVD3/SJ64/IXQFWLRQ
)RUQXPEHUOLNHUDQJHVLIHLWKHUWKHVWDUWSRLQWRUWKHHQGSRLQWLVOHIWEODQN
3RVWJUH64/UHSODFHVLWZLWKDQXOO)RUSUDFWLFDOLW\\RXFDQLQWHUSUHWWKHQXOOWR ([DPSOH)XQFWLRQWRUHWXUQDWDEOHXVLQJ3/SJ64/
UHSUHVHQWHLWKHU-infinityRQWKHOHIWRUinfinityRQWKHULJKW,QDFWXDOLW\ CREATE FUNCTION select_logs_rt(param_user_name varchar)
RETURNS TABLE (log_id int, user_name varchar(50),
\RXߞUHERXQGE\WKHVPDOOHVWDQGODUJHVWYDOXHVIRUWKHSDUWLFXODUGDWDW\SH6RD description text, log_ts timestamptz) AS
int4rangeRI(,)ZRXOGEH[-2147483648,2147483647) $$
2XUVWDWHWUDQVLWLRQIXQFWLRQWDNHVWZRLQSXWVWKHSUHYLRXVVWDWHSDVVHGLQDVDQ )RUWHPSRUDOUDQJHV-infinityDQGinfinityDUHYDOLGXSSHUDQGORZHU
DUUD\ZLWKWZRHOHPHQWVDQGWKHnextDGGHGLQWKHVXPPDWLRQ,IWKHnext ERXQGV
DUJXPHQWHYDOXDWHVWRNULLRU]HURWKHVWDWHIXQFWLRQUHWXUQVWKHSULRUVWDWH ,QDGGLWLRQWRWKHEXLOWLQUDQJHW\SHV\RXFDQFUHDWH\RXURZQUDQJHW\SHV
2WKHUZLVHLWUHWXUQVDQHZDUUD\LQZKLFKWKHILUVWHOHPHQWLVWKHVXPRIWKHORJV :KHQ\RXGR\RXFDQVHWWKHUDQJHWREHHLWKHUGLVFUHWHRUFRQWLQXRXV
DQGWKHVHFRQGHOHPHQWLVWKHUXQQLQJFRXQW
:HDOVRQHHGDILQDOIXQFWLRQVKRZQLQ([DPSOHWKDWGLYLGHVWKHVXPIURP 'HILQLQJ5DQJHV
WKHVWDWHWUDQVLWLRQE\WKHFRXQW
$UDQJHUHJDUGOHVVRIW\SHLVDOZD\VFRPSULVHGRIWZRHOHPHQWVRIWKHVDPH
([DPSOH*HRPHWULFPHDQDJJUHJDWHILQDOIXQFWLRQ W\SHZLWKWKHERXQGLQJFRQGLWLRQGHQRWHGE\EUDFNHWVRUSDUHQWKHVHVDVVKRZQ
CREATE OR REPLACE FUNCTION geom_mean_final(numeric[2]) LQ([DPSOH
RETURNS numeric AS
$$ ([DPSOH'HILQLQJUDQJHVZLWKFDVWV
SELECT CASE WHEN $1[2] > 0 THEN exp($1[1]/$1[2]) ELSE 0 END;
$$ SELECT '[2013-01-05,2013-08-13]'::daterange;
LANGUAGE sql IMMUTABLE PARALLEL SAFE; SELECT '(2013-01-05,2013-08-13]'::daterange;
SELECT '(0,)'::int8range;
SELECT '(2013-01-05 10:00,2013-08-13 14:00]'::tsrange;
1RZZHVWLWFKDOOWKHVXEIXQFWLRQVWRJHWKHULQRXUDJJUHJDWHGHILQLWLRQDVVKRZQ
[2013-01-05,2013-08-14)
LQ([DPSOH1RWHWKDWRXUDJJUHJDWHKDVDQLQLWLDOFRQGLWLRQWKDWLVWKHVDPH [2013-01-06,2013-08-14)
GDWDW\SHDVWKHRQHUHWXUQHGE\RXUVWDWHIXQFWLRQ [1,)
("2013-01-05 [Link]","2013-08-13 [Link]"]
([DPSOH*HRPHWULFPHDQDJJUHJDWHDVVHPEOLQJWKHSLHFHV $GDWHUDQJHEHWZHHQDQGLQFOXVLYH1RWHWKH
CREATE AGGREGATE geom_mean(numeric) ( FDQRQLFDOL]DWLRQRQWKHXSSHUERXQG
SFUNC=geom_mean_state, $GDWHUDQJHJUHDWHUWKDQDQGOHVVWKDQRUHTXDOWR
STYPE=numeric[],
FINALFUNC=geom_mean_final, 1RWLFHWKHFDQRQLFDOL]DWLRQ
PARALLEL = safe, $OOLQWHJHUVJUHDWHUWKDQ1RWHWKHFDQRQLFDOL]DWLRQ
INITCOND='{0,0}'
); $WLPHVWDPSJUHDWHUWKDQ$0DQGOHVVWKDQRUHTXDOWR
30
/HWߞVWDNHRXUQHZIXQFWLRQIRUDWHVWGULYH,Q([DPSOHZHFRPSXWHD
KHXULVWLFUDWLQJIRUUDFLDOGLYHUVLW\DQGOLVWWKHWRSILYHPRVWUDFLDOO\GLYHUVH
FRXQWLHVLQ0DVVDFKXVHWWV 7,3
([DPSOH7RSILYHPRVWUDFLDOO\GLYHUVHFRXQWLHVXVLQJJHRPHWULFPHDQ 'DWHWLPHVLQ3RVWJUH64/FDQWDNHRQWKHYDOXHVRI-infinityDQGinfinity)RUXQLIRUPLW\
DQGLQNHHSLQJZLWKFRQYHQWLRQZHVXJJHVWWKDW\RXDOZD\VXVH>IRUWKHIRUPHUDQGIRUWKH
SELECT left(tract_id,5) As county, geom_mean(val) As div_county
ODWWHUDVLQ[-infinity, infinity)
FROM census.vw_facts
WHERE category = 'Population' AND short_name != 'white_alone'
GROUP BY county
ORDER BY div_county DESC LIMIT 5;
county | div_county 5DQJHVFDQDOVREHGHILQHGXVLQJUDQJHFRQVWUXFWRUIXQFWLRQVZKLFKJRE\WKH
-------+--------------------- VDPHQDPHDVWKHUDQJHDQGFDQWDNHWZRRUWKUHHDUJXPHQWV+HUHߞVDQH[DPSOH
25025 | 85.1549046212833364
25013 | 79.5972921427888918
SELECT daterange('2013-01-05','infinity','[]');
7KHWKLUGDUJXPHQWGHQRWHVWKHERXQG,IRPLWWHGWKHRSHQFORVH[)FRQYHQWLRQ LANGUAGE 'sql' STABLE PARALLEL SAFE;
LVXVHGE\GHIDXOW:HVXJJHVWWKDW\RXDOZD\VLQFOXGHWKHWKLUGHOHPHQWIRU 8VLQJDFRPSRVLWHW\SH
FODULW\ CREATE OR REPLACE FUNCTION select_logs_so(param_user_name varchar)
RETURNS SETOF logs AS
$$
'HILQLQJ7DEOHVZLWK5DQJHV SELECT * FROM logs WHERE user_name = $1;
$$
7HPSRUDOUDQJHVDUHSRSXODU6XSSRVH\RXKDYHDQemploymentWDEOHWKDWVWRUHV LANGUAGE 'sql' STABLE PARALLEL SAFE;
HPSOR\PHQWKLVWRU\,QVWHDGRIFUHDWLQJVHSDUDWHFROXPQVIRUVWDUWDQGHQGGDWHV &DOODOOWKHVHIXQFWLRQVXVLQJ
\RXFDQGHVLJQDWDEOHDVVKRZQLQ([DPSOH,QWKHH[DPSOHZHDGGHGDQ
LQGH[WRWKHperiodFROXPQWRVSHHGXSTXHULHVXVLQJRXUUDQJHFROXPQ SELECT * FROM select_logs_xxx('alex');
([DPSOH7DEOHZLWKGDWHUDQJH
CREATE TABLE employment (id serial PRIMARY KEY, employee varchar(20), :ULWLQJ64/$JJUHJDWH)XQFWLRQV
period daterange);
CREATE INDEX ix_employment_period ON employment USING gist (period);
<HV,Q3RVWJUH64/\RXDUHDEOHWRDXWKRU\RXURZQDJJUHJDWHIXQFWLRQVWR
INSERT INTO employment (employee,period) H[SDQGEH\RQGWKHXVXDODJJUHJDWHV0,10$&2817$9*HWF:H
VALUES GHPRQVWUDWHE\FUHDWLQJDQDJJUHJDWHIXQFWLRQWRFRPSXWHWKHJHRPHWULFPHDQ
('Alex','[2012-04-24, infinity)'::daterange),
('Sonia','[2011-04-24, 2012-06-01)'::daterange), $JHRPHWULFPHDQLVWKHQWKURRWRIDSURGXFWRIQSRVLWLYHQXPEHUV
('Leo','[2012-06-20, 2013-04-20)'::daterange), (x1*x2*x3...xn)(1/n),WKDVYDULRXVXVHVLQILQDQFHHFRQRPLFVDQG
('Regina','[2012-06-20, 2013-04-20)'::daterange);
VWDWLVWLFV$JHRPHWULFPHDQVXEVWLWXWHVIRUWKHPRUHFRPPRQDULWKPHWLFPHDQ
$GGD*L67LQGH[RQWKHUDQJHILHOG ZKHQWKHQXPEHUVUDQJHDFURVVYDVWO\GLIIHUHQWVFDOHV$PRUHVXLWDEOH
FRPSXWDWLRQDOIRUPXODXVHVORJDULWKPVWRWUDQVIRUPDPXOWLSOLFDWLYHSURFHVVWR
5DQJH2SHUDWRUV DQDGGLWLYHRQHEXP(SUM(LN(x))/n):HߞOOEHXVLQJWKLVPHWKRGLQRXU
H[DPSOH
7ZRUDQJHRSHUDWRUVWHQGWREHXVHGPRVWRIWHQRYHUODS&&DQGFRQWDLQV@>
7KRVHDUHWKHRQHVZHߞOOFRYHU7RVHHWKHIXOOFDWDORJRIUDQJHRSHUDWRUVJRWR 7REXLOGRXUJHRPHWULFPHDQDJJUHJDWHZHQHHGWZRVXEIXQFWLRQVDVWDWH
5DQJH2SHUDWRUV WUDQVLWLRQIXQFWLRQWRVXPWKHORJVVHH([DPSOHDQGDILQDOIXQFWLRQWR
H[SRQHQWLDWHWKHORJV:HߞOODOVRVSHFLI\DQLQLWLDOFRQGLWLRQRI]HURZKHQZH
2YHUODSRSHUDWRU DVVHPEOHHYHU\WKLQJWRJHWKHU
$VWKHQDPHVXJJHVWVWKHRYHUODSRSHUDWRU&&UHWXUQVtrueLIWZRUDQJHVKDYH ([DPSOH*HRPHWULFPHDQDJJUHJDWHVWDWHIXQFWLRQ
DQ\YDOXHVLQFRPPRQ([DPSOHGHPRQVWUDWHVWKLVRSHUDWRUDQGSXWVWRXVH CREATE OR REPLACE FUNCTION geom_mean_state(prev numeric[2], next numeric)
RETURNS numeric[2] AS
WKHstring_aggIXQFWLRQIRUDJJUHJDWLQJWKHOLVWRIHPSOR\HHVLQWRDVLQJOHWH[W $$
ILHOG SELECT
CASE
([DPSOH:KRZRUNHGZLWKZKRP" WHEN $2 IS NULL OR $2 = 0 THEN $1
SELECT ELSE ARRAY[COALESCE($1[1],0) + ln($2), $1[2] + 1]
[Link], END;
string_agg(DISTINCT [Link], ', ' ORDER BY [Link]) As colleagues $$
LANGUAGE sql IMMUTABLE PARALLEL SAFE;
7RFDOOWKHIXQFWLRQH[HFXWHVRPHWKLQJOLNH FROM employment As e1 INNER JOIN employment As e2
ON [Link] && [Link]
WHERE [Link] <> [Link]
SELECT write_to_log('alex', 'Logged in at 11:59 AM.') As new_id; GROUP BY [Link];
employee | colleagues
6LPLODUO\\RXFDQXSGDWHGDWDZLWKDQ64/IXQFWLRQDQGUHWXUQDVFDODURUYRLG ---------+-------------------
Alex | Leo, Regina, Sonia
DVVKRZQLQ([DPSOH Leo | Alex, Regina
Regina | Alex, Leo
([DPSOH64/IXQFWLRQWRXSGDWHDUHFRUG Sonia | Alex
CREATE OR REPLACE FUNCTION
update_logs(log_id int, param_user_name varchar, param_description text) &RQWDLQVDQGFRQWDLQHGLQRSHUDWRUV
RETURNS void AS
$$ ,QWKHFRQWDLQVRSHUDWRU@>WKHILUVWDUJXPHQWLVDUDQJHDQGWKHVHFRQGLVD
UPDATE logs SET user_name = $2, description = $3
, log_ts = CURRENT_TIMESTAMP WHERE log_id = $1; YDOXH,IWKHVHFRQGLVZLWKLQWKHILUVWWKHFRQWDLQVRSHUDWRUUHWXUQVWUXH
$$ ([DPSOHGHPRQVWUDWHVLWVXVH
LANGUAGE 'sql' VOLATILE;
([DPSOH:KRLVFXUUHQWO\ZRUNLQJ"
7RH[HFXWH
SELECT employee FROM employment WHERE period @> CURRENT_DATE GROUP BY employee;
SELECT update_logs(12, 'alex', 'Fell back asleep.');
employee
--------
)XQFWLRQVLQDOPRVWDOOODQJXDJHVFDQUHWXUQVHWV64/IXQFWLRQVDUHQR Alex
H[FHSWLRQ7KHUHDUHWKUHHFRPPRQDSSURDFKHVWRGRLQJWKLVWKH$16,64/
VWDQGDUGRETURNS TABLEV\QWD[OUTSDUDPHWHUVDQGFRPSRVLWHGDWDW\SHV7KH 7KHUHYHUVHRIWKHFRQWDLQVRSHUDWRULVWKHFRQWDLQHGRSHUDWRU<@ZKRVHILUVW
RETURNS TABLEDSSURDFKLVFORVHVWWRZKDW\RXߞOOILQGLQRWKHUGDWDEDVH DUJXPHQWLVWKHYDOXHDQGWKHVHFRQGWKHUDQJH
SURGXFWV,Q([DPSOHZHGHPRQVWUDWHKRZWRZULWHWKHVDPHIXQFWLRQWKUHH
ZD\V
-621
([DPSOH([DPSOHVRIIXQFWLRQUHWXUQLQJVHWV
3RVWJUH64/SURYLGHV-621-DYD6FULSW2EMHFW1RWDWLRQDQGPDQ\VXSSRUW
8VLQJRETURNS TABLE IXQFWLRQV-621KDVEHFRPHWKHPRVWSRSXODUGDWDLQWHUFKDQJHIRUPDWIRUZHE
CREATE OR REPLACE FUNCTION select_logs_rt(param_user_name varchar) DSSOLFDWLRQV9HUVLRQVLJQLILFDQWO\EHHIHGXS-621VXSSRUWZLWKQHZ
RETURNS TABLE (log_id int, user_name varchar(50),
description text, log_ts timestamptz) AS IXQFWLRQVIRUH[WUDFWLQJHGLWLQJDQGFDVWLQJWRRWKHUGDWDW\SHV9HUVLRQ
$$ LQWURGXFHGWKH-621%GDWDW\SHDELQDU\IRUPRI-621WKDWFDQDOVRWDNH
SELECT log_id, user_name, description, log_ts FROM logs WHERE user_name = $1;
$$
DGYDQWDJHRILQGH[HV9HUVLRQLQWURGXFHGPRUHIXQFWLRQVIRUMVRQELQFOXGLQJ
LANGUAGE 'sql' STABLE PARALLEL SAFE; IXQFWLRQVIRUVHWWLQJHOHPHQWVLQDMVRQEREMHFW9HUVLRQLQWURGXFHGWKH
8VLQJOUTSDUDPHWHUV MVRQEBLQVHUWIXQFWLRQIRULQVHUWLQJHOHPHQWVLQWRDQH[LVWLQJMVRQEDUUD\RU
CREATE OR REPLACE FUNCTION select_logs_out(param_user_name varchar, OUT log_id int DGGLQJDQHZNH\YDOXH
, OUT user_name varchar, OUT description text, OUT log_ts timestamptz)
RETURNS SETOF record AS
$$ ,QVHUWLQJ-621'DWD
SELECT * FROM logs WHERE user_name = $1;
$$ 7RFUHDWHDWDEOHWRVWRUH-621GHILQHDFROXPQDVDjsonW\SH
CREATE TABLE persons (id serial PRIMARY KEY, person json);
8QWUXVWHG
([DPSOHLQVHUWV-621GDWD3RVWJUH64/DXWRPDWLFDOO\YDOLGDWHVWKHLQSXW $QXQWUXVWHGODQJXDJHFDQLQWHUDFWZLWKWKH26,WFDQH[HFXWH26IXQFWLRQV
WRPDNHVXUHZKDW\RXDUHDGGLQJLVYDOLG-6215HPHPEHUWKDW\RXFDQߞWVWRUH DQGFDOOZHEVHUYLFHV2QO\VXSHUXVHUVKDYHWKHSULYLOHJHRIDXWKRULQJ
LQYDOLG-621LQD-621FROXPQQRUFDQ\RXFDVWLQYDOLG-621WRD-621GDWD IXQFWLRQVLQDQXQWUXVWHGODQJXDJH+RZHYHUDVXSHUXVHUFDQJUDQW
W\SH SHUPLVVLRQWRDQRWKHUUROHWRUXQDQXQWUXVWHGIXQFWLRQ%\FRQYHQWLRQ
([DPSOH3RSXODWLQJD-621ILHOG ODQJXDJHVWKDWDUHXQWUXVWHGHQGLQWKHOHWWHU83/3HUO83/3\WKRQ8
HWF%XWHQGLQJLQ8LVQRWDUHTXLUHPHQW)RUH[DPSOH3/5LVVXFKDQ
INSERT INTO persons (person)
VALUES ( H[FHSWLRQ
'{
"name":"Sonia",
"spouse":
{ :ULWLQJ)XQFWLRQVZLWK64/
"name":"Alex",
"parents": $OWKRXJK64/LVPRVWO\DODQJXDJHIRULVVXLQJTXHULHVLWFDQDOVREHXVHGWR
{ ZULWHIXQFWLRQV,Q3RVWJUH64/XVLQJDQH[LVWLQJSLHFHRI64/IRUWKHIXQFWLRQ
"father":"Rafael",
"mother":"Ofelia"
LVIDVWDQGHDV\WDNH\RXUH[LVWLQJ64/VWDWHPHQWVDGGDIXQFWLRQDOKHDGHUDQG
}, IRRWHUDQG\RXߞUHGRQH%XWWKHHDVHFRPHVDWDSULFH<RXFDQߞWXVHFRQWURO
"phones": IHDWXUHVOLNHFRQGLWLRQDOEUDQFKHVORRSLQJRUGHILQLQJYDULDEOHV0RUH
[
{ UHVWULFWLYHO\\RXFDQߞWUXQG\QDPLF64/VWDWHPHQWVWKDW\RXDVVHPEOHRQWKHIO\
"type":"work", XVLQJDUJXPHQWVSDVVHGLQWRWKHIXQFWLRQ
"number":"619-722-6719"
}, 2QWKHSRVLWLYHVLGHWKHTXHU\SODQQHUFDQSHHNLQWRDQ64/IXQFWLRQDQG
{
"type":"cell",
RSWLPL]HH[HFXWLRQߚDSURFHVVFDOOHGLQOLQLQJ4XHU\SODQQHUVWUHDWRWKHU
"number":"619-852-5083" ODQJXDJHVDVEODFNER[HV2QO\64/IXQFWLRQVFDQEHLQOLQHGZKLFKOHWVWKHP
} WDNHDGYDQWDJHRILQGH[HVDQGFROODSVHUHSHWLWLYHFRPSXWDWLRQV
]
},
"children": %DVLF64/)XQFWLRQ
[
{ ([DPSOHVKRZVDSULPLWLYH64/IXQFWLRQWKDWLQVHUWVDURZLQWRDWDEOHDQG
"name":"Brandon",
"gender":"M" UHWXUQVDVFDODUYDOXH
},
{ ([DPSOH64/IXQFWLRQWKDWUHWXUQVWKHLGHQWLILHURIDQLQVHUWHGUHFRUG
"name":"Azaleah", CREATE OR REPLACE FUNCTION write_to_log(param_user_name varchar,
"girl":true, param_description text)
"phones": [] RETURNS integer AS
} $$
] INSERT INTO logs(user_name, description) VALUES($1, $2)
}' RETURNING log_id;
); $$
LANGUAGE 'sql' VOLATILE;
4XHU\LQJ-621
7,3
7KH3RVWJUH64/CREATE AGGREGATEVWUXFWXUHZDVH[SDQGHGWRLQFOXGHVXSSRUWIRU
7KHHDVLHVWZD\WRWUDYHUVHWKHKLHUDUFK\RID-621REMHFWLVE\XVLQJSRLQWHU
FUHDWLQJPRYLQJDJJUHJDWHVZKLFKDUHXVHIXOZLWKZLQGRZIXQFWLRQVWKDWPRYHWKHZLQGRZ V\PEROV([DPSOHVKRZVVRPHFRPPRQXVDJH
6HH3RVWJUH64/&5($7($**5(*$7(IRUGHWDLOV
([DPSOH4XHU\LQJWKH-621ILHOG
SELECT person->'name' FROM persons;
SELECT person->'spouse'->'parents'->'father' FROM persons;
7,3 <RXFDQDOVRZULWHWKHTXHU\XVLQJDSDWKDUUD\DVLQWKHIROORZLQJH[DPSOH
,Q3RVWJUH64/DJJUHJDWHVZHUHH[SDQGHGWRLQFOXGHVXSSRUWIRUSDUDOOHOL]DWLRQ7KLVZDV
DFFRPSOLVKHGWKURXJKWKHparallelSURSHUW\ZKLFKFDQWDNHWKHYDOXHVRIsafeunsafeRU SELECT person#>array['spouse','parents','father'] FROM persons;
restricted,IWKHparallelSURSHUW\LVOHIWRXWWKHDJJUHJDWHLVPDUNHGDVSDUDOOHOXQVDIH,Q
DGGLWLRQWRWKHparallelVHWWLQJcombinefuncserialfuncDQGdeserialfuncSURSHUWLHV
ZHUHDGGHGWRVXSSRUWSDUDOOHODJJUHJDWHV5HIHUWR64/&UHDWH$JJUHJDWHIRUGHWDLOV 1RWLFHWKDW\RXPXVWXVHWKH!SRLQWHUV\PEROLIZKDWFRPHVDIWHULVDSDWK
DUUD\
7RSHQHWUDWH-621DUUD\VVSHFLI\WKHDUUD\LQGH[-621DUUD\VLV]HURLQGH[HG
$JJUHJDWHVQHHGQRWGHSHQGRQDVLQJOHFROXPQ,I\RXQHHGPRUHWKDQRQH XQOLNH3RVWJUH64/DUUD\VZKRVHLQGH[HVVWDUWDW
FROXPQIRU\RXUDJJUHJDWHDQH[DPSOHLVDEXLOWLQFRYDULDQFHIXQFWLRQVHH
+RZWR&UHDWH0XOWL&ROXPQ$JJUHJDWHVIRUJXLGDQFH SELECT person->'children'->0->'name' FROM persons;
64/ODQJXDJHIXQFWLRQVDUHHDV\WRZULWH<RXGRQߞWKDYHIDQF\FRQWUROIORZ
FRPPDQGVWRZRUU\DERXWDQG\RXSUREDEO\KDYHDJRRGJUDVSRI64/WREHJLQ $QGWKHSDWKDUUD\HTXLYDOHQW
ZLWK:KHQLWFRPHVWRZULWLQJDJJUHJDWHV\RXFDQJHWSUHWW\IDUZLWKWKH64/
SELECT person#>array['children','0','name'] FROM persons;
ODQJXDJHDORQH:HGHPRQVWUDWHDJJUHJDWHVLQߡ:ULWLQJ64/$JJUHJDWH
)XQFWLRQVߢ $OOTXHULHVLQWKHSULRUH[DPSOHVUHWXUQWKHYDOXHDV-621SULPLWLYHVQXPEHUV
VWULQJVERROHDQV7RUHWXUQWKHWH[WUHSUHVHQWDWLRQDGGDQRWKHUJUHDWHUWKDQ
7UXVWHGDQG8QWUXVWHG/DQJXDJHV VLJQDVLQWKHIROORZLQJH[DPSOHV
)XQFWLRQODQJXDJHVFDQEHHLWKHUWUXVWHGRUXQWUXVWHG0DQ\ߚEXWQRWDOOߚ
SELECT person->'spouse'->'parents'->>'father' FROM persons;
ODQJXDJHVRIIHUERWKDWUXVWHGDQGXQWUXVWHGYHUVLRQ7KHWHUPWUXVWHGFRQQRWHV SELECT person#>>array['children','0','name'] FROM persons;
WKDWWKHODQJXDJHFDQGRQRKDUPWRWKHXQGHUO\LQJRSHUDWLQJV\VWHPE\GHQ\LQJ
LWDFFHVVWRWKHNH\26RSHUDWLRQV,QVKRUW ,I\RXDUHFKDLQLQJWKH!RSHUDWRURQO\WKHYHU\ODVWRQHFDQEHD!!RSHUDWRU
7UXVWHG 7KHMVRQBDUUD\BHOHPHQWVIXQFWLRQWDNHVD-621DUUD\DQGUHWXUQVHDFKHOHPHQW
$WUXVWHGODQJXDJHODFNVDFFHVVWRWKHVHUYHUߞVILOHV\VWHPEH\RQGWKHGDWD RIWKHDUUD\DVDVHSDUDWHURZDVLQ([DPSOH
FOXVWHU,WWKHUHIRUHFDQQRWH[HFXWH26FRPPDQGV8VHUVRIDQ\OHYHOFDQ ([DPSOHMVRQBDUUD\BHOHPHQWVWRH[SDQG-621DUUD\
FUHDWHIXQFWLRQVLQDWUXVWHGODQJXDJH/DQJXDJHVVXFKDV64/3/SJ64/ SELECT json_array_elements(person->'children')->>'name' As name FROM persons;
3/3HUODQG3/9DUHWUXVWHG name
-------
Brandon
Azaleah IXQFWLRQWKDW\RXDXWKRU
(2 rows)
<RXFDQZULWHDJJUHJDWHVLQDOPRVWDQ\ODQJXDJH64/LQFOXGHG$QDJJUHJDWHLV
JHQHUDOO\FRPSULVHGRIRQHRUPRUHIXQFWLRQV,WPXVWKDYHDWOHDVWDVWDWH
127( WUDQVLWLRQIXQFWLRQWRSHUIRUPWKHFRPSXWDWLRQXVXDOO\WKLVIXQFWLRQUXQV
:HVWURQJO\HQFRXUDJH\RXWRXVHSRLQWHUV\PEROVZKHQGULOOLQJGRZQLQWRD-621REMHFW UHSHDWHGO\WRFUHDWHRQHRXWSXWURZIURPWZRLQSXWURZV<RXFDQDOVRVSHFLI\
7KHV\QWD[LVPRUHVXFFLQFWDQG\RXFDQXVHWKHVDPHRSHUDWRUVDVIRU-621%ZKLFKZHߞOO RSWLRQDOIXQFWLRQVWRPDQDJHLQLWLDODQGILQDOVWDWHV<RXFDQDOVRXVHDGLIIHUHQW
FRYHUVKRUWO\3RVWJUH64/GRHVRIIHUIXQFWLRQDOHTXLYDOHQWVLI\RXQHHGWKHP
MVRQBH[WUDFWBSDWKLVDYDULDGLFIXQFWLRQIXQFWLRQVZLWKDQXQOLPLWHGQXPEHURIDUJXPHQWV ODQJXDJHIRUHDFKRIWKHVXEIXQFWLRQV:HKDYHYDULRXVH[DPSOHVRIEXLOGLQJ
7KHILUVWDUJXPHQWLVDOZD\VWKH-621REMHFW\RXDUHWU\LQJWRQDYLJDWHVXEVHTXHQW DJJUHJDWHVXVLQJ3/SJ64/3/3\WKRQDQG64/LQWKHDUWLFOH3RVWJUH64/
SDUDPHWHUVDUHWKHNH\YDOXHIRUHDFKWLHURIWKHKLHUDUFK\7KHHTXLYDOHQWWR!!DQG!!LV
MVRQBH[WUDFWBSDWKBWH[W
$JJUHJDWHV
5HJDUGOHVVRIZKLFKODQJXDJH\RXXVHWRFRGHWKHIXQFWLRQVWKHJOXHWKDWEULQJV
WKHPDOOWRJHWKHULVWKHCREATE AGGREGATEFRPPDQG
2XWSXWWLQJ-621
CREATE AGGREGATE my_agg (input data type) (
,QDGGLWLRQWRTXHU\LQJ-621GDWD\RXFDQFRQYHUWRWKHUGDWDWR-621,QWKHVH SFUNC=state function name,
QH[WH[DPSOHVZHߞOOGHPRQVWUDWHWKHXVHRI-621EXLOWLQIXQFWLRQVWRFUHDWH STYPE=state type,
FINALFUNC=final function name,
-621REMHFWV INITCOND=initial state value, SORTOP=sort_operator
);
([DPSOHGHPRQVWUDWHVWKHXVHRIrow_to_jsonWRFRQYHUWDVXEVHWRI
FROXPQVLQHDFKUHFRUGIURPWKHWDEOHZHFUHDWHGDQGORDGHGLQ([DPSOH
7KHILQDOIXQFWLRQLVRSWLRQDOEXWLIVSHFLILHGLWPXVWWDNHDVLQSXWWKHUHVXOWRI
([DPSOH&RQYHUWLQJURZVWRLQGLYLGXDO-621REMHFWVUHTXLUHVYHUVLRQ WKHVWDWHIXQFWLRQ7KHVWDWHIXQFWLRQDOZD\VWDNHVDGDWDW\SHDVWKHLQSXWDORQJ
RUODWHU ZLWKWKHUHVXOWRIWKHODVWFDOOWRWKHVWDWHIXQFWLRQ6RPHWLPHVWKLVUHVXOWLVZKDW
SELECT row_to_json(f) As x \RXZDQWDVWKHUHVXOWRIWKHDJJUHJDWHIXQFWLRQDQGVRPHWLPHV\RXZDQWWRUXQ
FROM (
SELECT id, json_array_elements(person->'children')->>'name' As cname FROM persons
DILQDOIXQFWLRQWRPDVVDJHWKHUHVXOW7KHLQLWLDOFRQGLWLRQLVDOVRRSWLRQDO
) As f; :KHQWKHLQLWLDOFRQGLWLRQYDOXHLVSUHVHQWWKHFRPPDQGXVHVLWWRLQLWLDOL]HWKH
x VWDWHYDOXH
--------------------------
{"id":1,"cname":"Brandon"} 7KHRSWLRQDOVRUWRSHUDWRUFDQVHUYHDVWKHDVVRFLDWHGVRUWRSHUDWRUIRUDMINRU
{"id":1,"cname":"Azaleah"}
(2 rows) MAXOLNHDJJUHJDWH,WLVXVHGWRWDNHDGYDQWDJHRILQGH[HV,WLVMXVWDQRSHUDWRU
QDPHVXFKDV>DQG<,WVKRXOGEHXVHGRQO\ZKHQWKHWZRIROORZLQJVWDWHPHQWV
7RRXWSXWHDFKURZLQRXUpersonsWDEOHDV-621
DUHHTXLYDOHQW
SELECT row_to_json(f) As jsoned_row FROM persons As f;
SELECT agg(col) FROM sometable;
7KHXVHRIDURZDVDQRXWSXWILHOGLQDTXHU\LVDIHDWXUHXQLTXHWR3RVWJUH64/ SELECT col FROM sometable ORDER BY col USING sortop LIMIT 1;
,WߞVKDQG\IRUFUHDWLQJFRPSOH[-621REMHFWV:HGHVFULEHLWIXUWKHULQ
ߡ&RPSRVLWH7\SHVLQ4XHULHVߢDQG([DPSOHGHPRQVWUDWHVWKHXVHRI
LJQRUHG array_aggDQGarray_to_jsonWRRXWSXWDVHWRIURZVDVDVLQJOH-621REMHFW
<RXFDQDOVRDGRUQDWULJJHUZLWKDWHENFRQGLWLRQWRFRQWUROZKLFKURZVEHLQJ ,QYHUVLRQZHKDYHDWRXUGLVSRVDOWKHjson_aggIXQFWLRQ:HGHPRQVWUDWH
XSGDWHGZLOOILUHWKHWULJJHURUDQUPDATE OF columns_listFODXVHWRKDYHWKH LWVXVHLQ([DPSOH
WULJJHUILUHRQO\LIFHUWDLQFROXPQVDUHXSGDWHG7RJDLQDPRUHQXDQFHG
XQGHUVWDQGLQJRIWKHLQWHUSOD\EHWZHHQWULJJHUVDQGWKHXQGHUO\LQJVWDWHPHQW %LQDU\-621MVRQE
VHHWKHRIILFLDOGRFXPHQWDWLRQ2YHUYLHZRI7ULJJHU%HKDYLRU:HDOVR 1HZLQ3RVWJUH64/LVWKHjsonbGDWDW\SH,WLVKDQGOHGWKURXJKWKHVDPH
GHPRQVWUDWHGDYLHZEDVHGWULJJHULQ([DPSOH
RSHUDWRUVDVWKRVHIRUWKHjsonW\SHDQGVLPLODUO\QDPHGIXQFWLRQVSOXVVHYHUDO
3RVWJUH64/RIIHUVVSHFLDOL]HGIXQFWLRQVWRKDQGOHWULJJHUV7KHVHDUHFDOOHG DGGLWLRQDORQHVjsonbSHUIRUPDQFHLVPXFKEHWWHUWKDQjsonSHUIRUPDQFH
WULJJHUIXQFWLRQVDQGEHKDYHOLNHDQ\RWKHUIXQFWLRQDQGKDYHWKHVDPHEDVLF EHFDXVHjsonbGRHVQߞWQHHGWREHUHSDUVHGGXULQJRSHUDWLRQV7KHUHDUHDFRXSOH
VWUXFWXUH:KHUHWKH\GLIIHULVLQWKHLQSXWSDUDPHWHUDQGWKHRXWSXWW\SH$ RINH\GLIIHUHQFHVEHWZHHQWKHjsonbDQGjsonGDWDW\SHV
WULJJHUIXQFWLRQQHYHUWDNHVDQDUJXPHQWEHFDXVHLQWHUQDOO\WKHIXQFWLRQDOUHDG\
KDVDFFHVVWRWKHGDWDDQGFDQPRGLI\LW jsonbLVLQWHUQDOO\VWRUHGDVDELQDU\REMHFWDQGGRHVQRWPDLQWDLQWKH
IRUPDWWLQJRIWKHRULJLQDO-621WH[WDVWKHjsonGDWDW\SHGRHV6SDFHVDUHQߞW
$WULJJHUIXQFWLRQDOZD\VRXWSXWVDGDWDW\SHFDOOHGDtrigger%HFDXVH
SUHVHUYHGQXPEHUVFDQDSSHDUVOLJKWO\GLIIHUHQWDQGDWWULEXWHVEHFRPH
3RVWJUH64/WULJJHUIXQFWLRQVDUHQRGLIIHUHQWIURPDQ\RWKHUIXQFWLRQ\RXFDQ
UHXVHWKHVDPHWULJJHUIXQFWLRQDFURVVGLIIHUHQWWULJJHUV7KLVLVXVXDOO\QRWWKH VRUWHG)RUH[DPSOHDQXPEHULQSXWDVe-5ZRXOGEHFRQYHUWHGWRLWVGHFLPDO
FDVHIRURWKHUGDWDEDVHVZKHUHHDFKWULJJHULVZHGGHGWRLWVRZQKDQGOHUFRGH UHSUHVHQWDWLRQ
,Q3RVWJUH64/HDFKWULJJHUPXVWKDYHH[DFWO\RQHDVVRFLDWHGWULJJHULQJ jsonbGRHVQRWDOORZGXSOLFDWHNH\VDQGVLOHQWO\SLFNVRQHZKHUHDVWKHjson
IXQFWLRQWRKDQGOHWKHILULQJ7RDSSO\PXOWLSOHWULJJHULQJIXQFWLRQV\RXPXVW W\SHSUHVHUYHVGXSOLFDWHV7KLVLVGHPRQVWUDWHGLQ0LFKDHO3DTXLHUߞVDUWLFOH
FUHDWHPXOWLSOHWULJJHUVDJDLQVWWKHVDPHHYHQW7KHDOSKDEHWLFDORUGHURIWKH ߡ0DQLSXODWLQJMVRQEGDWDE\DEXVLQJRINH\XQLTXHQHVVߢ
WULJJHUQDPHGHWHUPLQHVWKHRUGHURIILULQJ(DFKWULJJHUZLOOKDYHDFFHVVWRWKH
jsonbFROXPQVFDQEHGLUHFWO\LQGH[HGXVLQJWKH*,1LQGH[PHWKRGFRYHUHG
UHYLVHGGDWDIURPWKHSUHYLRXVWULJJHU,IDQ\WULJJHULVVXHVDUROOEDFNDOOGDWD
LQߡ,QGH[HVߢZKHUHDVjsonUHTXLUHVDIXQFWLRQDOLQGH[WRH[WUDFWNH\
DPHQGHGE\HDUOLHUWULJJHUVILUHGE\WKHVDPHHYHQWZLOOUROOEDFN
HOHPHQWV
<RXFDQXVHDOPRVWDQ\ODQJXDJHWRFUHDWHWULJJHUIXQFWLRQVZLWK64/EHLQJWKH
QRWDEOHH[FHSWLRQ3/SJ64/LVE\IDUWKHPRVWSRSXODUODQJXDJH:H 7RGHPRQVWUDWHWKHVHFRQFHSWVZHߞOOFUHDWHDQRWKHUpersonsWDEOHUHSODFLQJWKH
GHPRQVWUDWHZULWLQJWULJJHUIXQFWLRQVXVLQJ3/SJ64/LQߡ:ULWLQJ7ULJJHU jsonFROXPQZLWKDjsonb
)XQFWLRQVLQ3/SJ64/ߢ
CREATE TABLE persons_b (id serial PRIMARY KEY, person jsonb);
$JJUHJDWHV 7RLQVHUWGDWDLQWRRXUQHZWDEOHZHZRXOGUHSHDW([DPSOH
0RVWRWKHUGDWDEDVHVOLPLW\RXWR$16,64/EXLOWLQDJJUHJDWHIXQFWLRQVVXFKDV 6RIDUZRUNLQJZLWK-621DQGELQDU\-621KDVEHHQWKHVDPH'LIIHUHQFHV
MINMAXAVGSUMDQGCOUNT,Q3RVWJUH64/\RXGRQߞWKDYHWKLVOLPLWDWLRQ,I DSSHDUZKHQ\RXTXHU\7RPDNHWKHELQDU\-621UHDGDEOH3RVWJUH64/
\RXQHHGDPRUHHVRWHULFDJJUHJDWHIXQFWLRQ\RXߞUHZHOFRPHWRZULWH\RXURZQ FRQYHUWVLWWRDFDQRQLFDOWH[WUHSUHVHQWDWLRQDVVKRZQLQ([DPSOH
%HFDXVH\RXFDQXVHDQ\DJJUHJDWHIXQFWLRQLQ3RVWJUH64/DVDZLQGRZ
([DPSOHMVRQEYHUVXVMVRQRXWSXW
IXQFWLRQVHHߡ:LQGRZ)XQFWLRQVߢ\RXJHWWZLFHWKHXVHRXWRIDQ\DJJUHJDWH
SELECT person As b FROM persons_b WHERE id = 1; )XQFWLRQVWKDWFKDQJHQRQWHPSWDEOHGDWDDFFHVVVHTXHQFHVRUVWDWH
SELECT person As j FROM persons WHERE id = 1;
b
VKRXOGEHPDUNHGDV816$)(7KH\SUHYHQWWKHTXHU\IURPEHLQJUXQLQ
--------------------------------------------------------------------------------- SDUDOOHOPRGHDQGWKHUHIRUHULVNLQJWKHFRUUXSWLRQRIWKHWDEOHVRURWKHU
{"name": "Sonia", V\VWHPVWDWH
"spouse": {"name": "Alex", "phones": [{"type": "work", "number": "619-722-6719"},
{"type": "cell", "number": "619-852-5083"}],
"parents": {"father": "Rafael", "mother": "Ofelia"}}, RESTRICTED
"children": [{"name": "Brandon", "gender": "M"},
{"girl": true, "name": "Azaleah", "phones": []}]}
<RXPD\ZDQWWRXVHWKLVYDOXHIRUIXQFWLRQVWKDWXVHWHPSRUDU\WDEOHV
(1 row) SUHSDUHGVWDWHPHQWVRUFOLHQWFRQQHFWLRQVWDWH7KLVYDOXHGRHVQRW
j SUHYHQWDTXHU\IURPUXQQLQJLQSDUDOOHOPRGHEXWSURFHVVLQJRIWKHVH
---------------------------------------------
{ IXQFWLRQVFDQKDSSHQRQO\RQWKHOHDGTXHU\
"name":"Sonia",
"spouse":
,QPDQ\RIWKHH[DPSOHVLQWKLVFKDSWHUZHߞOOEHLQFOXGLQJ3$5$//(/
{ PRGHRSWLRQV,I\RXDUHUXQQLQJORZHUWKDQYHUVLRQOHDYHRXWWKH
"name":"Alex", SDUDOOHOFODXVHV
"parents":
{
"father":"Rafael",
"mother":"Ofelia"
7ULJJHUVDQG7ULJJHU)XQFWLRQV
},
"phones":
1RZRUWK\GDWDEDVHVKRXOGODFNWULJJHUVZKLFKDXWRPDWLFDOO\GHWHFWDQGKDQGOH
[ FKDQJHVLQGDWD3RVWJUH64/DOORZV\RXWRDWWDFKWULJJHUVWRWDEOHVYLHZVDQG
{ HYHQ''/HYHQWVOLNHFUHDWLRQRIDQHZWDEOH
"type":"work",
"number":"619-722-6719"+ 7ULJJHUVFDQDFWXDWHDWERWKWKHVWDWHPHQWOHYHODQGWKHURZOHYHO6WDWHPHQW
},
{
WULJJHUVUXQRQFHSHU64/VWDWHPHQWZKHUHDVURZWULJJHUVUXQIRUHDFKURZ
"type":"cell", DIIHFWHGE\WKH64/)RUH[DPSOHLI\RXH[HFXWHDQUPDATEVWDWHPHQWWKDW
"number":"619-852-5083"+
}
DIIHFWVURZVDVWDWHPHQWOHYHOXSGDWHWULJJHUZLOOILUHRQO\RQFHZKHUHDV
] WKHURZOHYHOWULJJHUFDQILUHXSWRWLPHV
},
"children": <RXFDQIXUWKHUUHILQHWKHWLPLQJRIWKHWULJJHUE\PDNLQJDGLVWLQFWLRQEHWZHHQ
[ BEFOREAFTERDQGINSTEAD OFWULJJHUV$BEFOREWULJJHUILUHVSULRUWRWKH
{
"name":"Brandon", H[HFXWLRQRIWKHVWDWHPHQWJLYLQJ\RXDFKDQFHWRFDQFHORUEDFNXSGDWDEHIRUH
"gender":"M" WKHFKDQJH$QAFTERWULJJHUILUHVDIWHUVWDWHPHQWH[HFXWLRQJLYLQJ\RXD
},
{ FKDQFHWRUHWULHYHWKHQHZGDWDYDOXHVAFTERWULJJHUVDUHRIWHQXVHGIRUORJJLQJ
"name":"Azaleah", RUUHSOLFDWLRQSXUSRVHVINSTEAD OFWULJJHUVH[HFXWHLQOLHXRIWKHVWDWHPHQW
"girl":true,
"phones": [] <RXFDQDWWDFKBEFOREDQGAFTERWULJJHUVRQO\WRWDEOHVDQGHYHQWVDQG
} INSTEAD OFWULJJHUVRQO\WRYLHZV
]
} 7ULJJHUIXQFWLRQVWKDWFKDQJHYDOXHVRIDURZVKRXOGEHFDOOHGRQO\LQWKH
(1 row)
BEFOREHYHQWEHFDXVHLQWKHAFTERHYHQWDOOXSGDWHVWRWKHNEWUHFRUGZLOOEH
DUH18//7KHSODQQHUVNLSVHYDOXDWLQJWKHIXQFWLRQDOWRJHWKHUZLWKDQ\ jsonbUHIRUPDWVLQSXWDQGUHPRYHVZKLWHVSDFH$OVRWKHRUGHURIDWWULEXWHV
18//LQSXWV:KHQZULWLQJ64/IXQFWLRQVEHFDXWLRXV LVQRWPDLQWDLQHGIURPWKHLQVHUW
ZKHQPDUNLQJDIXQFWLRQDV675,&7EHFDXVHLWFRXOGSUHYHQWWKHSODQQHU jsonPDLQWDLQVLQSXWZKLWHVSDFHDQGWKHRUGHURIDWWULEXWHV
IURPWDNLQJDGYDQWDJHRILQGH[HV5HDGRXUDUWLFOH675,&7RQ64/ jsonbKDVVLPLODUO\QDPHGIXQFWLRQVDVjsonSOXVVRPHDGGLWLRQDORQHV6RIRU
)XQFWLRQVIRUPRUHGHWDLOV H[DPSOHWKHjsonIDPLO\RIIXQFWLRQVVXFKDVjson_extract_path_textDQG
COST json_eachDUHPDWFKHGLQjsonbE\jsonb_extract_path_textjsonb_each
HWF+RZHYHUWKHHTXLYDOHQWRSHUDWRUVDUHWKHVDPHVR\RXZLOOILQGWKDWWKH
7KLVLVDUHODWLYHPHDVXUHRIFRPSXWDWLRQDOLQWHQVLYHQHVV64/DQG
H[DPSOHVLQߡ4XHU\LQJ-621ߢZRUNODUJHO\WKHVDPHZLWKRXWFKDQJHIRUWKH
3/SJ64/IXQFWLRQVGHIDXOWWR100DQG&IXQFWLRQVWR17KLVDIIHFWVWKH
jsonbW\SHߚMXVWUHSODFHWKHWDEOHQDPHDQGjson_array_elementsZLWK
RUGHUWKDWWKHSODQQHUZLOOIROORZZKHQHYDOXDWLQJWKHIXQFWLRQLQDWHERE
jsonb_array_elements
FODXVHDQGWKHOLNHOLKRRGRIFDFKLQJ7KHKLJKHU\RXVHWWKHFRVWWKHPRUH
FRPSXWDWLRQWKHSODQQHUZLOODVVXPHWKHIXQFWLRQQHHGV ,QDGGLWLRQWRWKHRSHUDWRUVVXSSRUWHGE\jsonjsonbKDVDGGLWLRQDOFRPSDUDWRU
RSHUDWRUVIRUHTXDOLW\=FRQWDLQV@>FRQWDLQHG<@NH\H[LVWV?DQ\RI
ROWS
DUUD\RINH\VH[LVWV?|DQGDOORIDUUD\RINH\VH[LVWV?&
$SSOLHVRQO\WRIXQFWLRQVUHWXUQLQJVHWVRIUHFRUGV7KHYDOXHSURYLGHVDQ
6RIRUH[DPSOHWROLVWDOOSHRSOHWKDWKDYHDFKLOGQDPHG%UDQGRQXVHWKH
HVWLPDWHRIKRZPDQ\URZVZLOOEHUHWXUQHG7KHSODQQHUZLOOWDNHWKLVYDOXH
FRQWDLQVRSHUDWRUDVGHPRQVWUDWHGLQ([DPSOH
LQWRFRQVLGHUDWLRQZKHQFRPLQJXSZLWKWKHEHVWVWUDWHJ\
([DPSOHMVRQEFRQWDLQVRSHUDWRU
SECURITY DEFINER SELECT person->>'name' As name
7KLVFDXVHVH[HFXWLRQWRWDNHSODFHZLWKLQWKHVHFXULW\FRQWH[WRIWKHRZQHU FROM persons_b
WHERE person @> '{"children":[{"name":"Brandon"}]}';
RIWKHIXQFWLRQ,IRPLWWHGWKHIXQFWLRQH[HFXWHVXQGHUWKHFRQWH[WRIWKH name
XVHUFDOOLQJWKHIXQFWLRQ7KLVTXDOLILHULVXVHIXOIRUJLYLQJSHRSOHULJKWVWR -----
Sonia
XSGDWHDWDEOHYLDDIXQFWLRQZKHQWKH\GRQRWKDYHGLUHFWXSGDWHSULYLOHJHV
7KHVHDGGLWLRQDORSHUDWRUVSURYLGHYHU\IDVWFKHFNVZKHQ\RXFRPSOHPHQWWKHP
PARALLEL
ZLWKD*,1LQGH[RQWKHjsonbFROXPQ
1HZLQ3RVWJUH64/7KLVTXDOLILHUDOORZVWKHSODQQHUWRUXQLQSDUDOOHO
PRGH%\GHIDXOWDIXQFWLRQLVPDUNHGDV3$5$//(/816$)(ZKLFK CREATE INDEX ix_persons_jb_person_gin ON persons_b USING gin (person);
SUHYHQWVDQ\TXHULHVFRQWDLQLQJWKHIXQFWLRQIURPEHLQJGLVWULEXWHGLQWR
VHSDUDWHZRUNSURFHVVHV5HIHUWR3DUDOOHO6DIHW\<RXUFKRLFHVDUH :HGRQߞWKDYHHQRXJKUHFRUGVLQRXUSXQ\WDEOHIRUWKHLQGH[WRNLFNLQEXWIRU
PRUHURZV\RXߞGVHHWKDW([DPSOHXWLOL]HVWKHLQGH[
SAFE
7KLVDOORZVSDUDOOHOXVHDQGLVJHQHUDOO\DVDIHFKRLFHIRU,0087$%/(
(GLWLQJ-621%GDWD
IXQFWLRQVRUIXQFWLRQVWKDWGRQߞWXSGDWHGDWDRUFKDQJHWUDQVDFWLRQVWDWH
RURWKHUYDULDEOHV 3RVWJUH64/LQWURGXFHGQDWLYHMVRQEFRQFDWHQDWLRQ||DQGVXEWUDFWLRQ
RSHUDWRUV-#-DVZHOODVFRPSDQLRQIXQFWLRQVIRUVHWWLQJGDWD7KHVH
UNSAFE
RSHUDWRUVGRQRWH[LVWIRUWKHMVRQGDWDW\SH7REHDEOHWRDFFRPSOLVKWKHVHWDVNV ,Q3RVWJUH64/DQGDERYHWKHQDPHGQRWDWLRQFRQYHQWLRQLVname => 'Wooly',QDQG
EHORZ\RXZRXOGXVHname := 'Wooly')RUEDFNZDUGFRPSDWLELOLW\WKHROGV\QWD[RI
LQSULRUYHUVLRQV\RXߞGKDYHWROHDQRQߡ:ULWLQJ3/93/&RIIHH6FULSWDQG
arg1_name := arg1_valueLVVWLOOVXSSRUWHGLQDQGDERYHEXWPD\EHUHPRYHGLQWKH
3//LYH6FULSW)XQFWLRQVߢWRGRWKHZRUN IXWXUH
7KHFRQFDWHQDWLRQRSHUDWRUFDQEHXVHGWRDGGDQGUHSODFHDWWULEXWHVRIDMVRQE
REMHFW,Q([DPSOHZHDGGDQDGGUHVVDWWULEXWHWRWKH*RPH]IDPLO\DQG
)XQFWLRQDOGHILQLWLRQVRIWHQLQFOXGHDGGLWLRQDOTXDOLILHUVWRRSWLPL]HH[HFXWLRQ
XVHWKHRETURNINGFRQVWUXFWFRYHUHGLQߡ5HWXUQLQJ$IIHFWHG5HFRUGVWRWKH
DQGWRHQIRUFHVHFXULW\
8VHUߢWRUHWXUQWKHXSGDWHGYDOXH7KHQHZYDOXHKDVDQDGGUHVVDWWULEXWH
([DPSOH8VLQJ-621%__WRDGGDGGUHVV LANGUAGE
UPDATE persons_b 7KHODQJXDJHPXVWEHRQHLQVWDOOHGLQ\RXUGDWDEDVH2EWDLQDOLVWZLWKWKH
SET person = person || '{"address": "Somewhere in San Diego, CA"}'::jsonb SELECT lanname FROM pg_language;TXHU\
WHERE person @> '{"name":"Sonia"}'
RETURNING person;
profile VOLATILITY
-------------------------------------------------------------------------------
{"name": "Sonia", ... "address": "Somewhere in San Diego, CA", "children": ...}
7KLVVHWWLQJFOXHVWKHTXHU\SODQQHUDVWRZKHWKHURXWSXWVFDQEHFDFKHGDQG
(1 row) XVHGDFURVVPXOWLSOHFDOOV<RXUFKRLFHVDUH
UPDATE 1
IMMUTABLE
%HFDXVH-621%UHTXLUHVWKDWNH\VEHXQLTXHLI\RXWU\WRDGGDGXSOLFDWHNH\
7KHIXQFWLRQZLOODOZD\VUHWXUQWKHVDPHRXWSXWIRUWKHVDPHLQSXW
WKHRULJLQDOYDOXHZLOOEHUHSODFHGLQVWHDG6RWRXSGDWHZLWKDQHZDGGUHVVZH
7KLQNRIDULWKPHWLFIXQFWLRQV2QO\LPPXWDEOHIXQFWLRQVFDQEHXVHGLQ
ZRXOGUHSHDWWKHH[HUFLVHLQ([DPSOHEXWUHSODFLQJ6RPHZKHUHLQ6DQ
WKHGHILQLWLRQRILQGH[HV
'LHJR&$ZLWKVRPHWKLQJHOVH
,IZHGHFLGHGZHQRORQJHUZDQWHGDQDGGUHVVZHFRXOGXVHWKH-DVVKRZQLQ STABLE
([DPSOH 7KHIXQFWLRQZLOOUHWXUQWKHVDPHYDOXHIRUWKHVDPHLQSXWVZLWKLQWKH
([DPSOH8VLQJ-621%WRUHPRYHDQHOHPHQW VDPHTXHU\
UPDATE persons_b VOLATILE
SET person = person - 'address'
WHERE person @> '{"name":"Sonia"}'; 7KHIXQFWLRQFDQUHWXUQGLIIHUHQWYDOXHVZLWKHDFKFDOOHYHQZLWKWKH
VDPHLQSXWV7KLQNRIIXQFWLRQVWKDWFKDQJHGDWDRUGHSHQGRQ
7KHVLPSOH-RSHUDWRUZRUNVIRUILUVWOHYHOHOHPHQWVEXWZKDWLI\RXZDQWHGWR
HQYLURQPHQWVHWWLQJVOLNHV\VWHPWLPH7KLVLVWKHGHIDXOW
UHPRYHDQDWWULEXWHIURPDSDUWLFXODUPHPEHU"7KLVLVZKHQ\RXߞGXVHWKH#-
RSHUDWRU#-WDNHVDQDUUD\RIWH[WYDOXHVWKDWGHQRWHVWKHSDWKRIWKHHOHPHQW\RX .HHSLQPLQGWKDWWKHYRODWLOLW\VHWWLQJLVPHUHO\DKLQWWRWKHSODQQHU7KH
ZDQWWRUHPRYH,Q([DPSOHZHUHPRYHWKHgirlGHVLJQDWRURI$]DOHDK GHIDXOWYDOXHRIVOLATILEHQVXUHVWKDWWKHSODQQHUZLOODOZD\VUHFRPSXWH
WKHUHVXOW,I\RXXVHRQHRIWKHRWKHUYDOXHVWKHSODQQHUFDQVWLOOFKRRVHWR
([DPSOH8VLQJ-621%WRUHPRYHQHVWHGHOHPHQW IRUJRFDFKLQJVKRXOGLWGHFLGHWKDWUHFRPSXWLQJLVPRUHFRVWHIIHFWLYH
UPDATE persons_b
SET person = person #- '{children,1,girl}'::text[] STRICT
WHERE person @> '{"name":"Sonia"}'
RETURNING person->'children'->1; $IXQFWLRQPDUNHGZLWKWKLVTXDOLILHUZLOODOZD\VUHWXUQ18//LIDQ\LQSXWV
RETURNS some type | set of some type | TABLE (..) AS {"name": "Azaleah", "phones": []}
$$
BODY of function :KHQUHPRYLQJHOHPHQWVIURPDQDUUD\\RXQHHGWRGHQRWHWKHLQGH[%HFDXVH
$$
LANGUAGE language_of_function
-DYD6FULSWLQGH[HVVWDUWDWWRUHPRYHDQHOHPHQWIURPWKHVHFRQGFKLOGZHXVH
1LQVWHDGRI,IZHZDQWHGWRUHPRYH$]DOHDKHQWLUHO\ZHZRXOGKDYHXVHG
$UJXPHQWVFDQKDYHGHIDXOWYDOXHVZKLFKDOORZWKHFDOOHURIWKHIXQFWLRQWR '{children,1}'::text[]
RPLWWKHP2SWLRQDODUJXPHQWVPXVWEHSRVLWLRQHGDIWHUQRQRSWLRQDODUJXPHQWV
LQWKHIXQFWLRQGHILQLWLRQ 7RDGGDJHQGHUDWWULEXWHRUUHSODFHRQHWKDWZDVSUHYLRXVO\VHWZHFDQXVHWKH
jsonb_setIXQFWLRQDVVKRZQLQ([DPSOH
$UJXPHQWQDPHVDUHRSWLRQDOEXWDUHXVHIXOEHFDXVHWKH\OHW\RXUHIHUWRDQ
DUJXPHQWE\QDPHLQVLGHWKHIXQFWLRQERG\)RUH[DPSOHWKLQNRIDIXQFWLRQWKDW ([DPSOH8VLQJWKHMVRQEBVHWIXQFWLRQWRFKDQJHDQHVWHGYDOXH
LVGHILQHGWRWDNHWKUHHLQSXWDUJXPHQWVWZREHLQJRSWLRQDO UPDATE persons_b
SET person = jsonb_set(person,'{children,1,gender}'::text[],'"F"'::jsonb, true)
WHERE person @> '{"name":"Sonia"}';
big_elephant(ear_size numeric, skin_color text DEFAULT 'blue',
name text DEFAULT 'Dumbo') jsonb_setWDNHVWKUHHDUJXPHQWVRIIRUPjsonb_set(jsonb_to_update,
text_array_path, new_jsonb_value,allow_creation),I\RXVHW
<RXFDQUHIHUWRWKHDUJXPHQWVE\QDPHear_sizeskin_colorHWFLQVLGHWKH
allow_creationWRfalseZKHQWKHSURSHUW\GLGQRWDOUHDG\H[LVWWKHVWDWHPHQW
ERG\RIWKHIXQFWLRQ,IWKH\DUHQRWQDPHG\RXQHHGWRUHIHUWRWKHDUJXPHQWV
ZLOOUHWXUQDQHUURU
LQVLGHWKHIXQFWLRQE\WKHLURUGHULQWKHDUJXPHQWOLVWDQG
,I\RXQDPHWKHDUJXPHQWV\RXDOVRKDYHWKHRSWLRQRIXVLQJQDPHGQRWDWLRQ
ZKHQFDOOLQJWKHIXQFWLRQ ;0/
7KH;0/GDWDW\SHVLPLODUWR-621LVߡFRQWURYHUVLDOߢLQDUHODWLRQDOGDWDEDVH
big_elephant(name => 'Wooly', ear_size => 1.2)
EHFDXVHLWYLRODWHVWKHSULQFLSOHVRIQRUPDOL]DWLRQ1RQHWKHOHVVDOORIWKHKLJK
HQGUHODWLRQDOGDWDEDVHSURGXFWV,%0'%2UDFOH64/6HUYHUVXSSRUW;0/
<RXFDQDOZD\VXVHWKHSRVLWLRQDOQRWDWLRQbig_elephant(1.2, 'blue',
3RVWJUH64/DOVRMXPSHGRQWKHEDQGZDJRQDQGRIIHUVSOHQW\RIIXQFWLRQVWR
'Wooly')HYHQLIIXQFWLRQDUJXPHQWVDUHQDPHG1DPHGQRWDWLRQLVXVHIXOLI\RX
ERRW:HߞYHDXWKRUHGPDQ\DUWLFOHVRQZRUNLQJZLWK;0/LQ3RVWJUH64/
KDYHDIXQFWLRQWKDWWDNHVVHYHUDODUJXPHQWVDQGPDQ\RIWKHDUJXPHQWVDUH
3RVWJUH64/FRPHVSDFNDJHGZLWKIXQFWLRQVIRUJHQHUDWLQJPDQLSXODWLQJDQG
RSWLRQDO%\XVLQJQDPHGQRWDWLRQ\RXFDQRYHUULGHDGHIDXOWYDOXHDQGNHHS
SDUVLQJ;0/GDWD7KHVHDUHRXWOLQHGLQ;0/)XQFWLRQV8QOLNHWKHjsonbW\SH
RWKHUGHIDXOWVUHJDUGOHVVRIWKHRUGHULQZKLFKWKHDUJXPHQWVDUHGHILQHG<RX
WKHUHLVFXUUHQWO\QRGLUHFWLQGH[VXSSRUWIRULW6R\RXQHHGWRXVHIXQFWLRQDO
DOVRGRQߞWQHHGWRVWDWHWKHDUJXPHQWVLQWKHRUGHUWKH\DSSHDULQWKHIXQFWLRQ
LQGH[HVWRLQGH[VXESDUWVVLPLODUWRZKDW\RXFDQGRZLWKWKHSODLQjsonW\SH
GHILQLWLRQ,QWKHbig_elephantH[DPSOHZHZHUHDEOHWRDFFHSWWKHGHIDXOWVNLQ
FRORURIEOXHDQGRYHUULGHWKHGHIDXOWQDPHHYHQWKRXJKnameDSSHDUVODVWLQWKH
DUJXPHQWOLVW,IZHZHUHWRFDOOWKHIXQFWLRQVLPSO\E\WKHRUGHURIDUJXPHQWV ,QVHUWLQJ;0/'DWD
ZHFRXOGQߞWVNLSRYHUskin_colorLIZHZDQWHGWRRYHUULGHWKHnameDUJXPHQW :KHQ\RXFUHDWHDFROXPQRIWKHxmlGDWDW\SH3RVWJUH64/DXWRPDWLFDOO\
HQVXUHVWKDWRQO\YDOLG;0/YDOXHVSRSXODWHWKHURZV7KLVLVZKDWGLVWLQJXLVKHV
DQ;0/FROXPQIURPMXVWDQ\WH[WFROXPQ+RZHYHUWKH;0/LVQRWYDOLGDWHG
7,3 DJDLQVWDQ\'RFXPHQW7\SH'HILQLWLRQ'7'RU;0/6FKHPD'HILQLWLRQ
;6'HYHQLILWLVVSHFLILHGLQWKH;0/GRFXPHQW7RIUHVKHQXSRQZKDW
FRQVWLWXWHVYDOLG;0/([DPSOHVKRZV\RXKRZWRDSSHQG;0/GDWDWRD &KDSWHU:ULWLQJ)XQFWLRQV
WDEOHE\GHFODULQJDFROXPQDVxmlDQGLQVHUWLQJLQWRLWDVXVXDO
([DPSOH3RSXODWHDQ;0/ILHOG
CREATE TABLE families (id serial PRIMARY KEY, profile xml); ,Q3RVWJUH64/DVLQPRVWGDWDEDVHV\RXFDQVWULQJDVHULHVRI64/VWDWHPHQWV
INSERT INTO families(profile) WRJHWKHUDQGWUHDWWKHPDVDXQLWHYHQFXVWRPL]LQJHDFKUXQE\SDVVLQJ
VALUES (
'<family name="Gomez">
DUJXPHQWV'LIIHUHQWGDWDEDVHVDVFULEHGLIIHUHQWQDPHVIRUWKLVXQLWVWRUHG
<member><relation>padre</relation><name>Alex</name></member> SURFHGXUHVXVHUGHILQHGIXQFWLRQVDQGVRRQ3RVWJUH64/VLPSO\UHIHUVWRWKHP
<member><relation>madre</relation><name>Sonia</name></member> DVIXQFWLRQV
<member><relation>hijo</relation><name>Brandon</name></member>
<member><relation>hija</relation><name>Azaleah</name></member> $VLGHIURPPDUVKDOOLQJ64/VWDWHPHQWVIXQFWLRQVRIWHQDGGWKHFDSDELOLW\WR
</family>');
FRQWUROWKHH[HFXWLRQRIWKH64/XVLQJ3/V3RVWJUH64/RIIHUVDULFKFKRLFHRI
(DFK;0/YDOXHFRXOGKDYHDGLIIHUHQW;0/VWUXFWXUH7RHQIRUFHXQLIRUPLW\ ODQJXDJHVIRUZULWLQJIXQFWLRQV64/&3/SJ64/3/3HUODQG3/3\WKRQDUH
\RXFDQDGGDFKHFNFRQVWUDLQWFRYHUHGLQߡ&KHFN&RQVWUDLQWVߢWRWKH;0/ RIWHQSDFNDJHGZLWKLQVWDOOHUV<RXߞOODOVRILQG3/9ZKLFKDOORZV\RXWRZULWH
FROXPQ([DPSOHHQVXUHVWKDWDOOfamilyKDVDWOHDVWRQHrelation SURFHGXUDOIXQFWLRQVLQ-DYD6FULSW3/9LVDIDYRULWHIRUZHEGHYHORSHUVDQGD
HOHPHQW7KH'/family/member/relation'LV;3DWKV\QWD[DEDVLFZD\WR GDUOLQJFRPSDQLRQWRWKHEXLOWLQ-621DQG-621%GDWDW\SHVFRYHUHGLQ
UHIHUWRHOHPHQWVDQGRWKHUSDUWVRI;0/ ߡ-621ߢ
([DPSOH(QVXUHWKDWDOOUHFRUGVKDYHDWOHDVWRQHPHPEHUUHODWLRQ <RXFDQDOVRLQVWDOODGGLWLRQDOODQJXDJHVVXFKDV3/53/-DYD3/VK
ALTER TABLE families ADD CONSTRAINT chk_has_relation 3/764/DQGHYHQH[SHULPHQWDORQHVJHDUHGIRUKLJKHQGGDWDSURFHVVLQJDQG
CHECK (xpath_exists('/family/member/relation', profile)); DUWLILFLDOLQWHOOLJHQFHVXFKDV3/6FKHPHRU3/2SHQ&/<RXFDQILQGDOLVWLQJ
,IZHWKHQWU\WRLQVHUWVRPHWKLQJOLNH RIDYDLODEOHODQJXDJHVLQ3URFHGXUDO/DQJXDJHV
1H[WUXQ
<RXߞOOILQGWITH ORDINALITYRIWHQXVHGZLWKIXQFWLRQVOLNHgenerate_series
unnestDQGRWKHUIXQFWLRQVWKDWH[SDQGRXWFRPSRVLWHW\SHVDQGDUUD\V,WFDQ CREATE EXTENSION hunspell_en_us SCHEMA pg_catalog;
EHXVHGZLWKDQ\VHWUHWXUQLQJIXQFWLRQLQFOXGLQJRQHV\RXFUHDWH\RXUVHOI
)URPSVTOLI\RXQRZUXQ([DPSOH\RXߞOOVHHGHWDLOVRIWKHKXQVSHOO
([DPSOHGHPRQVWUDWHVWITH ORDINALITYXVHGLQFRQMXQFWLRQZLWKWKH
FRQILJXUDWLRQDQGGLFWLRQDU\ZHMXVWLQVWDOOHG
WHPSRUDOYDULDQWRIWKHgenerate_seriesIXQFWLRQ
([DPSOH)76FRQILJXUDWLRQKXQVSHOO
([DPSOH1XPEHULQJUHVXOWVIURPVHWUHWXUQLQJIXQFWLRQV
\dF+ english_hunspell;
SELECT dt.* Text search configuration "pg_catalog.english_hunspell"
FROM generate_series('2016-01-01'::date,'2016-12-31'::date,interval '1 month') Parser: "pg_catalog.default"
WITH ORDINALITY As dt; Token | Dictionaries
dt | ordinality ----------------+-------------------------------
-----------------------+----------- asciihword | english_hunspell,english_stem
2016-01-01 [Link]-05 | 1 asciiword | english_hunspell,english_stem
2016-02-01 [Link]-05 | 2 email | simple
2016-03-01 [Link]-05 | 3 file | simple
2016-04-01 [Link]-04 | 4 float | simple
2016-05-01 [Link]-04 | 5 host | simple
2016-06-01 [Link]-04 | 6 hword | english_hunspell,english_stem
2016-07-01 [Link]-04 | 7 hword_asciipart | english_hunspell,english_stem
2016-08-01 [Link]-04 | 8 hword_numpart | simple
2016-09-01 [Link]-04 | 9 hword_part | english_hunspell,english_stem
2016-10-01 [Link]-04 | 10 int | simple
2016-11-01 [Link]-04 | 11 numhword | simple
2016-12-01 [Link]-05 | 12 numword | simple
(12 rows) sfloat | simple
uint | simple
WITH ORDINALITYDOZD\VDGGVDQDGGLWLRQDOFROXPQDWWKHHQGRIWKHUHVXOW url | simple
url_path | simple
FDOOHGRUGLQDOLW\DQGWITH ORDINALITYFDQRQO\DSSHDULQWKHFROMFODXVHRI version | simple
DQ64/VWDWHPHQW<RXDUHIUHHWRUHQDPHWKHRUGLQDOLW\FROXPQ word | english_hunspell,english_stem
<RXߞOORIWHQILQGWITH ORDINALITYSDLUHGZLWKWKHLATERALFRQVWUXFW,Q
5 mons | 2012-11-01 [Link]-04
:$51,1* 132 days | 2012-05-12 [Link]-04
132 days | 2012-09-21 [Link]-04
.HHSLQPLQGWKDWQRWDOO)76FRQILJXUDWLRQVLQVWDOOLQWKHVDPHZD\5HDGWKHLQVWUXFWLRQV [Link] | 2012-01-01 [Link]-05
[Link] | 2012-07-21 [Link]-04
/DWHUDOLVDOVRKHOSIXOIRUXVLQJYDOXHVIURPWKHOHIWKDQGVLGHWROLPLWWKHQXPEHU
&RQWUDVWWKDWRXWSXWWRWKHEXLOWLQ(QJOLVKFRQILJXUDWLRQLQ([DPSOHZKLFK
RIURZVUHWXUQHGIURPWKHULJKWKDQGVLGH([DPSOHXVHVLATERALWRUHWXUQ
JLYHV\RXWKHGLFWLRQDULHVXVHGE\WKH(QJOLVKFRQILJXUDWLRQ
IRUHDFKVXSHUXVHUZKRKDVXVHGRXUVLWHZLWKLQWKHODVWGD\VWKHODVWILYH
([DPSOH)76(QJOLVKFRQILJXUDWLRQ ORJLQVDQGZKDWWKH\ZHUHXSWR7DEOHVXVHGLQWKLVH[DPSOHZHUHFUHDWHGLQ
\dF+ english; ߡ7<3(2)ߢDQGߡ%DVLF7DEOH&UHDWLRQߢ
Text search configuration "pg_catalog.english"
Parser: "pg_catalog.default" ([DPSOH8VLQJ/$7(5$/WROLPLWURZVIURPDMRLQHGWDEOH
Token | Dictionaries
----------------+-------------- SELECT u.user_name, [Link], l.log_ts
asciihword | english_stem FROM
asciiword | english_stem super_users AS u CROSS JOIN LATERAL (
email | simple SELECT description, log_ts
file | simple FROM logs
float | simple WHERE
host | simple log_ts > CURRENT_TIMESTAMP - interval '100 days' AND
hword | english_stem logs.user_name = u.user_name
hword_asciipart | english_stem ORDER BY log_ts DESC LIMIT 5
hword_numpart | simple ) AS l;
hword_part | english_stem
int | simple $OWKRXJK\RXFDQDFKLHYHWKHVDPHUHVXOWVE\XVLQJZLQGRZIXQFWLRQVODWHUDO
numhword | simple MRLQV\LHOGIDVWHUUHVXOWVZLWKPRUHVXFFLQFWV\QWD[
numword | simple
sfloat | simple <RXFDQXVHPXOWLSOHODWHUDOMRLQVLQ\RXU64/DQGHYHQFKDLQWKHPLQVHTXHQFH
uint | simple DV\RXZRXOGZKHQMRLQLQJPRUHWKDQWZRVXETXHULHV<RXFDQVRPHWLPHVJHW
url | simple
url_path | simple DZD\ZLWKRPLWWLQJWKHLATERALNH\ZRUGWKHTXHU\SDUVHULVVPDUWHQRXJKWR
version | simple ILJXUHRXWDODWHUDOMRLQLI\RXKDYHDFRUUHODWHGH[SUHVVLRQ%XWZHDGYLVHWKDW
word | english_stem
\RXDOZD\VLQFOXGHWKHNH\ZRUGIRUWKHVDNHRIFODULW\$OVR\RXߞOOJHWDQHUURU
7KHRQO\GLIIHUHQFHEHWZHHQWKHWZRLVWKDWKXQVSHOOGUDZVIURPDQDGGLWLRQDO LI\RXZULWH\RXUVWDWHPHQWDVVXPLQJWKHXVHRIDODWHUDOMRLQEXWUXQWKH
GLFWLRQDU\ VWDWHPHQWRQDSUHODWHUDOYHUVLRQ3RVWJUH64/:LWKRXWWKHNH\ZRUG3RVWJUH64/
1RWVXUHZKLFKFRQILJXUDWLRQLVWKHGHIDXOW"5XQ PLJKWHQGXSSHUIRUPLQJDMRLQZLWKXQLQWHQGHGUHVXOWV
2WKHUGDWDEDVHSURGXFWVDOVRRIIHUODWHUDOMRLQVDOWKRXJKWKH\GRQߞWDELGHE\WKH
SHOW default_text_search_config; $16,PRQLNHU,Q2UDFOH\RXߞGXVHDWDEOHSLSHOLQHFRQVWUXFW,Q64/6HUYHU
\RXߞGXVHCROSS APPLYRUOUTER APPLY
7RUHSODFHWKHGHIDXOWZLWKDQRWKHUUXQ
1H[WZHDGGDQGFRPSXWHDWVYHFWRUFROXPQWRWKHILOPWDEOHDVVKRZQLQ *HWDOLVWRIDOOWDEOHVWKDWKDYHFKLOGWDEOHVEXWQRSDUHQWWDEOH
([DPSOH 7KLVLVWKHUHFXUVLYHSDUWLWJHWVDOOFKLOGUHQRIWDEOHVLQtbls
([DPSOH$GGWVYHFWRUFROXPQDQGSRSXODWHZLWKZHLJKWV 7KHQDPHVRIWKHFKLOGWDEOHVVWDUWZLWKWKHSDUHQWDOQDPH
ALTER TABLE film ADD COLUMN fts tsvector; 5HWXUQSDUHQWVDQGDOOFKLOGWDEOHV%HFDXVHZHVRUWE\WDEOHQDPHZKLFK
UPDATE film SUHSHQGVWKHSDUHQWQDPHDOOFKLOGWDEOHVZLOOIROORZWKHLUSDUHQWVLQWKHLU
SET fts =
setweight(to_tsvector(COALESCE(title,'')),'A') || RXWSXW
setweight(to_tsvector(COALESCE(description,'')),'B');
CREATE INDEX ix_film_fts_gin ON film USING gin (fts);
([DPSOHYHFWRUL]HVWKHWLWOHDQGGHVFULSWLRQFROXPQVDQGVWRUHVWKHYHFWRU /DWHUDO-RLQV
LQDQHZO\FUHDWHGWVYHFWRUFROXPQ7RVSHHGXSVHDUFKHVZHDGGD*,1LQGH[ LATERALLVDQHZ$16,64/FRQVWUXFWLRQLQYHUVLRQ+HUHߞVWKHPRWLYDWLRQ
RQWKHWVYHFWRUFROXPQ*,1LVDORVVOHVVLQGH[<RXFDQDOVRDGGD*L67LQGH[ EHKLQGLWVXSSRVH\RXSHUIRUPMRLQVRQWZRWDEOHVRUVXETXHULHVQRUPDOO\WKH
RQDYHFWRUFROXPQ*L67LVORVV\DQGVORZHUWRVHDUFKEXWEXLOGVTXLFNHUDQG SDLUSDUWLFLSDWLQJLQWKHMRLQDUHLQGHSHQGHQWXQLWVDQGFDQߞWUHDGGDWDIURPHDFK
WDNHVXSOHVVGLVNVSDFH:HH[SORUHLQGH[HVLQPRUHGHWDLOLQߡ,QGH[HVߢ RWKHU)RUH[DPSOHWKHIROORZLQJLQWHUDFWLRQZRXOGJHQHUDWHDQHUURUEHFDXVH
%\SRSXODWLQJWKHIWVFROXPQZHߞYHLQWURGXFHGWZRQHZFRQVWUXFWVWKH [Link] = 2011LVQRWDFROXPQRQWKHULJKWKDQGVLGHRIWKHMRLQ
setweightIXQFWLRQDQGWKHFRQFDWHQDWLRQRSHUDWRU||WRWVYHFWRU
SELECT *
7RGLVWLQJXLVKWKHUHODWLYHLPSRUWDQFHRIGLIIHUHQWOH[HPHV\RXFRXOGDVVLJQD FROM
[Link] L
,Q([DPSOHZHPRYHGDWDIURPRXUSDUHQWWDEOHWRRXUQHZFKLOG-DQ ZHLJKWWRHDFK7KHZHLJKWVPXVWEH$%&RU'ZLWK$UDQNLQJKLJKHVWLQ
)HEWDEOH7KHONLYNH\ZRUGLVGHVFULEHGLQߡ5HVWULFWLQJ'(/(7( LPSRUWDQFH,Q([DPSOHZHDVVLJQHG$WROH[HPHVFXOOHGIURPWKHWLWOHDQG
83'$7(DQG6(/(&7IURP,QKHULWHG7DEOHVߢDQGWKHRETURNINGNH\ZRUGLQ %WROH[HPHVIURPWKHGHVFULSWLRQ,IRXUVHDUFKWHUPPDWFKHVDOH[HPHIURPWKH
ߡ5HWXUQLQJ$IIHFWHG5HFRUGVWRWKH8VHUߢ WLWOHZHGHHPWKHPDWFKWREHPRUHUHOHYDQWWKDQDPDWFKIURPWKHGHVFULSWLRQ
RIWKHPRYLH
([DPSOH:ULWDEOH&7(PRYLQJGDWDIURPRQHEUDQFKWRDQRWKHU
WITH t AS ( 769HFWRUVFDQEHIRUPHGIURPRWKHUWVYHFWRUVXVLQJWKHFRQFDWHQDWLRQ||
DELETE FROM ONLY logs_2011 WHERE log_ts < '2011-03-01' RETURNING * RSHUDWRU:HXVHGLWKHUHWRFRPELQHWKHWLWOHDQGGHVFULSWLRQLQWRDVLQJOH
)
INSERT INTO logs_2011_01_02 SELECT * FROM t; WVYHFWRU7KLVZD\ZKHQZHVHDUFKZHKDYHWRFRQWHQGZLWKRQO\DVLQJOH
FROXPQ
5HFXUVLYH&7( 6KRXOGGDWDFKDQJHLQRQHRIWKHEDVLVFROXPQVIRUPLQJWKHWVYHFWRU\RXPXVW
UHYHFWRUL]H7RDYRLGKDYLQJWRPDQXDOO\UXQWRBWVYHFWRUHYHU\WLPHGDWD
7KHRIILFLDOGRFXPHQWDWLRQIRU3RVWJUH64/GHVFULEHVLWEHVWߡ7KHRSWLRQDO
FKDQJHVFUHDWHDWULJJHUWKDWUHVSRQGVWRXSGDWHV,QWKHWULJJHUXVHWKHKDQG\
RECURSIVEPRGLILHUFKDQJHV&7(IURPDPHUHV\QWDFWLFFRQYHQLHQFHLQWRD
WVYHFWRUBXSGDWHBWULJJHUIXQFWLRQDVVKRZQLQ([DPSOH
IHDWXUHWKDWDFFRPSOLVKHVWKLQJVQRWRWKHUZLVHSRVVLEOHLQVWDQGDUG64/ߢ$
PRUHLQWHUHVWLQJ&7(LVRQHWKDWXVHVDUHFXUVLYHO\GHILQLQJFRQVWUXFWWREXLOGDQ ([DPSOH7ULJJHUWRDXWRPDWLFDOO\XSGDWHWVYHFWRU
H[SUHVVLRQ3RVWJUH64/UHFXUVLYH&7(VXWLOL]HUNION ALLWRFRPELQHWDEOHVD CREATE TRIGGER trig_tsv_film_iu
BEFORE INSERT OR UPDATE OF title, description ON film FOR EACH ROW
NLQGRIFRPELQDWLRQWKDWFDQEHGRQHUHSHDWHGO\DVWKHTXHU\DGGVWKHWDEOHV EXECUTE PROCEDURE tsvector_update_trigger(fts,'pg_catalog.english',
RYHUDQGRYHU title,description);
7RWXUQDEDVLF&7(WRDUHFXUVLYHRQHDGGWKHRECURSIVEPRGLILHUDIWHUWKH ([DPSOHUHDFWVWRDQLQVHUWRUXSGDWHLQWKHWLWOHRUGHVFULSWLRQE\
WITHWITH RECURSIVEFDQFRQWDLQDPL[RIUHFXUVLYHDQGQRQUHFXUVLYHWDEOH UHYHFWRULQJWKHIWVFROXPQ2QHVKRUWFRPLQJWKRXJKWVYHFWRUBXSGDWHBWULJJHU
H[SUHVVLRQV,QPRVWRWKHUGDWDEDVHVWKHRECURSIVENH\ZRUGLVQRWQHFHVVDU\WR GRHVQRWVXSSRUWZHLJKWLQJ
GHQRWHUHFXUVLRQ
$FRPPRQXVHRIUHFXUVLYH&7(VLVWRUHSUHVHQWPHVVDJHWKUHDGVDQGRWKHUWUHH 764XHULHV
OLNHVWUXFWXUHV:HKDYHDQH[DPSOHRIWKLVLQ5HFXUVLYH&7(WR'LVSOD\7UHH $)76RUDQ\WH[WVHDUFKIRUWKDWPDWWHUKDVWZRFRPSRQHQWVWKHVHDUFKHGWH[W
6WUXFWXUHV DQGWKHVHDUFKWHUPV)RU)76WRZRUNERWKPXVWEHYHFWRUL]HG:HKDYH
,Q([DPSOHZHTXHU\WKHV\VWHPFDWDORJWROLVWWKHFDVFDGLQJWDEOH DOUHDG\VHHQKRZWRYHFWRUL]HWKHVHDUFKHGWH[WWRFUHDWHWVYHFWRUFROXPQV:H
UHODWLRQVKLSVZHKDYHLQRXUGDWDEDVH QRZVKRZ\RXKRZWRYHFWRUL]HWKHVHDUFKWHUPV
([DPSOH5HFXUVLYH&7( )76UHIHUVWRYHFWRUL]HGVHDUFKWHUPVDVWVTXHULHVDQG3RVWJUH64/RIIHUV
WITH RECURSIVE tbls AS (
VHYHUDOIXQFWLRQVWKDWZLOOFRQYHUWSODLQWH[WVHDUFKWHUPVWRWVTXHULHV
SELECT WRBWVTXHU\SODLQWRBWVTXHU\DQGSKUDVHWRBWVTXHU\7KHODWWHULVDQHZIXQFWLRQLQ
[Link] As tableoid, DQGWDNHVWKHRUGHULQJRIZRUGVLQWKHVHDUFKWHUPLQWRFRQVLGHUDWLRQ
[Link] AS schemaname,
[Link] AS tablename WVTXHULHVDUHQRUPDOO\FUHDWHGRQWKHIO\UDWKHUWKDQEHLQJVWRUHGLQDWDEOH
FROM
pg_class c LEFT JOIN +RZHYHULI\RXDUHEXLOGLQJDV\VWHPZKHUHSHRSOHFDQVDYHWKHLUTXHULHVDQG
UXQWKHP\RXFRXOGGHILQHDWVTXHU\FROXPQLQDWDEOH FROM cte
WHERE cnt_tracts > 100
([DPSOHVKRZVWKHRXWSXWXVLQJWKHWRBWVTXHU\IXQFWLRQVDJDLQVWWZR GROUP BY county_code, cnt_tracts;
FRQILJXUDWLRQVWKHGHIDXOW(QJOLVKFRQILJXUDWLRQDQGWKH+XQVSHOOFRQILJXUDWLRQ
cteLVWKHQDPHRIWKH&7(LQ([DPSOHGHILQHGXVLQJDSELECTVWDWHPHQW
([DPSOH764XHU\FRQVWUXFWLRQVWRBTXHU\ WRFRQWDLQWKUHHFROXPQVtract_idcounty_codeDQGcnt_tracts7KHPDLQ
SELECT to_tsquery('business & analytics'); SELECTUHIHUVWRWKH&7(
to_tsquery
----------------- <RXFDQVWXIIDVPDQ\&7(VDV\RXOLNHVHSDUDWHGE\FRPPDVLQWRWKHWITH
'busi' & 'analyt'
SELECT to_tsquery('english_hunspell','business & analytics'); FODXVHDVVKRZQLQ([DPSOH7KHRUGHURIWKH&7(VPDWWHUVLQWKDW&7(V
to_tsquery GHILQHGODWHUFDQFDOO&7(VGHILQHGHDUOLHUEXWQRWYLFHYHUVD
--------------------------------
('business' | 'busy') & 'analyt' ([DPSOH0XOWLSOH&7(V
WITH
%RWKH[DPSOHVDUHDNLQWRVHDUFKLQJIRUWH[WFRQWDLQLQJWKHZRUGVEXVLQHVVDQG cte1 AS (
DQDO\WLFV7KHDQGRSHUDWRU&PHDQVWKDWERWKZRUGVPXVWDSSHDULQWKH SELECT
tract_id,
VHDUFKHGWH[W7KHRURSHUDWRU|PHDQVRQHRUERWKRIWKHZRUGVPXVWDSSHDULQ substring(tract_id,1, 5) As county_code,
WKHVHDUFKHGWH[W,IWKHFRQILJXUDWLRQLQXVHILQGVPXOWLSOHVWHPVIRUDZRUG COUNT(*) OVER (PARTITION BY substring(tract_id,1,5)) As cnt_tracts
WKH\DUHVWLWFKHGWRJHWKHUE\WKHRURSHUDWRU FROM census.lu_tracts
),
cte2 AS (
SELECT
:$51,1* MAX(tract_id) As last_tract,
county_code,
<RXVKRXOGXVHWKHVDPH)76FRQILJXUDWLRQDVWKHRQH\RXXVHGWREXLOGWKHWVYHFWRU cnt_tracts
FROM cte1
WHERE cnt_tracts < 8 GROUP BY county_code, cnt_tracts
)
$VOLJKWYDULDQWRIWRBWVTXHU\LVSODLQBWRWVTXHU\7KLVIXQFWLRQDXWRPDWLFDOO\ SELECT c.last_tract, f.fact_type_id, [Link]
LQVHUWVWKHDQGRSHUDWRUEHWZHHQZRUGVIRU\RXVDYLQJ\RXDIHZNH\FOLFNV6HH FROM [Link] As f INNER JOIN cte2 c ON f.tract_id = c.last_tract;
([DPSOH
([DPSOH764XHU\FRQVWUXFWLRQVSODLQWRBTXHU\
:ULWDEOH&7(V
SELECT plainto_tsquery('business analytics'); 7KHZULWDEOH&7(H[WHQGVWKH&7(WRDOORZIRUXSGDWHGHOHWHDQGLQVHUW
plainto_tsquery VWDWHPHQWV:HߞOOUHYLVLWRXUORJVWDEOHVWKDWZHFUHDWHGLQ([DPSOHDGGLQJ
-----------------
'busi' & 'analyt' DQRWKHUFKLOGWDEOHDQGSRSXODWLQJLW
1DPLQJRXUZLQGRZwtZLQGRZ
5DQNLQJ5HVXOWV 8VLQJRXUZLQGRZQDPHLQVWHDGRIUHW\SLQJ
)76LQFOXGHVIXQFWLRQVIRUUDQNLQJUHVXOWV7KHVHIXQFWLRQVDUHWVBUDQNDQG %RWKLEADDQGLAGWDNHDQRSWLRQDOVWHSDUJXPHQWWKDWGHILQHVKRZPDQ\URZV
WVBUDQNBFGWVBUDQNFRQVLGHUVRQO\WKHIUHTXHQF\RIWHUPVDQGZHLJKWVZKLOH
WRVNLSIRUZDUGRUEDFNZDUGWKHVWHSFDQEHSRVLWLYHRUQHJDWLYHLEADDQGLAG
WVBUDQNBFGFGVWDQGVIRUFRYHUDJHGHQVLW\DOVRFRQVLGHUVWKHSRVLWLRQRIWKH
UHWXUQNULLZKHQWU\LQJWRUHWULHYHURZVRXWVLGHWKHZLQGRZSDUWLWLRQ7KLVLVD
VHDUFKWHUPZLWKLQWKHVHDUFKHGWH[W,IOH[HPHVDUHIRXQGFORVHUWRJHWKHUWKH
SRVVLELOLW\WKDW\RXDOZD\VKDYHWRDFFRXQWIRU
UHVXOWUDQNVKLJKHUWVBUDQNBFGLVPHDQLQJIXORQO\LI\RXKDYHSRVLWLRQPDUNHUV
LQ\RXUWVYHFWRURWKHUZLVHLWUHWXUQV]HUR7KHIUHTXHQF\ZLWKZKLFKDVHDUFK ,Q3RVWJUH64/DQ\DJJUHJDWHIXQFWLRQ\RXFUHDWHFDQEHXVHGDVDZLQGRZ
FXUUHQWURZLQWKHZLQGRZRUSDUWLWLRQ7KHFODVVLFH[DPSOHXVHVWKH WHUPDSSHDUVDOVRGHSHQGVRQSRVLWLRQPDUNHUV6RWKHWVBUDQNIXQFWLRQZLOO
ROW_NUMBERIXQFWLRQWRVHTXHQWLDOO\QXPEHUURZV,Q([DPSOHZH FRQVLGHURQO\ZHLJKWVLISRVLWLRQDOPDUNHUVDUHPLVVLQJ%\GHIDXOWWVBUDQNDQG
GHPRQVWUDWHKRZWRQXPEHURXUFHQVXVWUDFWVLQDOSKDEHWLFDORUGHU7RDUULYHDW WVBUDQNBFGDSSO\WKHZHLJKWVDQGUHVSHFWLYHO\IRU'&%DQG
WKHURZQXPEHUROW_NUMBERFRXQWVDOOURZVXSWRDQGLQFOXGLQJWKHFXUUHQWURZ $([DPSOHIROORZVWKHGHIDXOWRUGHU
EDVHGRQWKHRUGHUGLFWDWHGE\WKHORDER BY ([DPSOH5DQNLQJVHDUFKUHVXOWV
([DPSOH1XPEHULQJXVLQJWKH52:B180%(5ZLQGRZIXQFWLRQ SELECT title, left(description,50) As description,
ts_rank(fts,ts)::numeric(10,3) AS r
SELECT ROW_NUMBER() OVER (ORDER BY tract_name) As rnum, tract_name FROM film, to_tsquery('english','love & (wait | indian | mad)') AS ts
FROM census.lu_tracts WHERE fts @@ ts AND title > ''
ORDER BY rnum LIMIT 4; ORDER BY r DESC;
rnum | tract_name title | description | r
-----+------------------------------------------------- --------------+----------------------------------------------------+------
1 | Census Tract 1, Suffolk County, Massachusetts INDIAN LOVE | A Insightful Saga of a Mad Scientist And a Mad Sci | 0.999
2 | Census Tract 1001, Suffolk County, Massachusetts LAWRENCE LOVE | A Fanciful Yarn of a Database Administrator And a | 0.252
3 | Census Tract 1002, Suffolk County, Massachusetts (2 rows)
4 | Census Tract 1003, Suffolk County, Massachusetts
/HWߞVVXSSRVHZHZLVKWRUHWULHYHDILHOGRQO\LIWKHVHDUFKWHUPVDSSHDULQWKH
,Q([DPSOHZHDOVRKDYHDQORDER BYIRUWKHHQWLUHTXHU\'RQߞWJHW WLWOH)RUWKLVVLWXDWLRQZHZRXOGDVVLJQWRWKHWLWOHILHOGDQGWRDOORWKHUV
FRQIXVHGEHWZHHQWKLVDQGWKHORDER BYWKDWߞVVSHFLILFWRWKHZLQGRZIXQFWLRQ ([DPSOHUHSHDWV([DPSOHSDVVLQJLQDQDUUD\RIZHLJKWV
<RXFDQFRPELQHORDER BYZLWKPARTITION BYUHVWDUWLQJWKHRUGHULQJIRUHDFK ([DPSOH5DQNLQJVHDUFKUHVXOWVXVLQJFXVWRPZHLJKWV
SDUWLWLRQ([DPSOHUHWXUQVWRRXUH[DPSOHRIFRXQW\FRGHV SELECT
left(title,40) As title,
([DPSOH&RPELQLQJ3$57,7,21%<DQG25'(5%< ts_rank('{0,0,0,1}'::numeric[],fts,ts)::numeric(10,3) AS r,
SELECT tract_id, val, ts_rank_cd('{0,0,0,1}'::numeric[],fts,ts)::numeric(10,3) As rcd
SUM(val) OVER (PARTITION BY left(tract_id,5) ORDER BY val) As sum_county_ordered FROM film, to_tsquery('english', 'love & (wait | indian | mad )') AS ts
FROM [Link] WHERE fts @@ ts AND title > ''
WHERE fact_type_id = 2 ORDER BY r DESC;
ORDER BY left(tract_id,5), val; title | r | rcd
tract_id | val | sum_county_ordered --------------+-------+------
-------------+----------+----------------- INDIAN LOVE | 0.991 | 1.000
25001014100 | 226.000 | 226.000 LAWRENCE LOVE | 0.000 | 0.000
25001011700 | 971.000 | 1197.000 (2 rows)
25001010208 | 984.000 | 2181.000
: 1RWLFHKRZLQ([DPSOHWKHVHFRQGHQWU\KDVDUDQNLQJRI]HUREHFDXVHWKH
25003933200 | 564.000 | 564.000
25003934200 | 593.000 | 1157.000
WLWOHGRHVQRWFRQWDLQDOOWKHZRUGVWRVDWLVI\WKHWVTXHU\
25003931300 | 606.000 | 1763.000
:
127(
7KHNH\REVHUYDWLRQWRPDNHLQWKHRXWSXWLVKRZWKHVXPFKDQJHVIURPURZWR
,ISHUIRUPDQFHLVDFRQFHUQ\RXVKRXOGH[SOLFLWO\GHFODUHWKH)76FRQILJXUDWLRQLQTXHULHV
URZ7KHORDER BYFODXVHPHDQVWKDWWKHVXPZLOOEHWDNHQRQO\IURPWKH LQVWHDGRIDOORZLQJWKHGHIDXOWEHKDYLRU$VQRWHGLQ6RPH)767ULFNVE\2OHJ%DUWXQRY\RX
EHJLQQLQJRIWKHSDUWLWLRQWRWKHFXUUHQWURZJLYLQJ\RXDUXQQLQJWRWDOZKHUH FDQDFKLHYHWZLFHWKHVSHHGE\XVLQJto_tsquery('english','social & (science |
WKHORFDWLRQRIWKHFXUUHQWURZLQWKHOLVWLVGLFWDWHGE\WKHORDER BYFODXVH)RU scientist)')LQOLHXRIto_tsquery('social & (science | scientist)')
DJJUHJDWHIXQFWLRQ)RUHDFKURZ3RVWJUH64/VXEPLWVDOOWKHURZVLQWKH
)XOO7H[W6WULSSLQJ ZLQGRZWRWKHAVGDJJUHJDWLRQDQGRXWSXWVWKHYDOXHDVSDUWRIWKHURZ%HFDXVH
RXUZLQGRZKDVPXOWLSOHURZVWKHUHVXOWRIWKHDJJUHJDWLRQLVUHSHDWHG1RWLFH
%\GHIDXOWYHFWRUL]DWLRQDGGVPDUNHUVORFDWLRQRIWKHOH[HPHVZLWKLQWKH WKDWZLWKZLQGRZIXQFWLRQVZHZHUHDEOHWRSHUIRUPDQDJJUHJDWLRQZLWKRXW
YHFWRUDQGRSWLRQDOO\ZHLJKWV$%&',I\RXUVHDUFKHVFDUHRQO\ZKHWKHUD GROUP BY)XUWKHUPRUHZHZHUHDEOHWRUHMRLQWKHDJJUHJDWHGUHVXOWEDFNZLWK
SDUWLFXODUWHUPFDQEHIRXQGUHJDUGOHVVRIZKHUHLWLVLQWKHWH[WKRZIUHTXHQWO\ WKHRWKHUYDULDEOHVZLWKRXWXVLQJDIRUPDOMRLQ
LWRFFXUVRULWVSURPLQHQFH\RXFDQGHFOXWWHU\RXUYHFWRUVXVLQJWKHVWULS
IXQFWLRQ7KLVVDYHVGLVNVSDFHDQGJDLQVVRPHVSHHG([DPSOHFRPSDUHV <RXFDQXVHDOO64/DJJUHJDWHIXQFWLRQVDVZLQGRZIXQFWLRQV,QDGGLWLRQ
ZKDWDQXQVWULSSHGYHUVXVVWULSSHGYHFWRUORRNVOLNH \RXߞOOILQGROWRANKLEADDQGRWKHUVOLVWHGLQ:LQGRZ)XQFWLRQV
([DPSOH8QVWULSSHGYHUVXVVWULSSHGYHFWRU
SELECT fts
3$57,7,21%<
FROM film <RXFDQUXQDZLQGRZIXQFWLRQRYHUURZVFRQWDLQLQJSDUWLFXODUYDOXHVLQVWHDGRI
WHERE film_id = 1;
'academi':1A 'battl':15B 'canadian':20B 'dinosaur':2A 'drama':5B 'epic':4B XVLQJWKHZKROHWDEOH7KLVUHTXLUHVWKHDGGLWLRQRIDPARTITION BYFODXVH
'feminist':8B 'mad':11B 'must':14B 'rocki':21B 'scientist':12B 'teacher':17B ZKLFKLQVWUXFWV3RVWJUH64/WRWDNHWKHDJJUHJDWHRYHUWKHLQGLFDWHGURZV,Q
SELECT strip(fts)
FROM film ([DPSOHZHUHSHDWZKDWZHGLGLQ([DPSOHEXWSDUWLWLRQRXUZLQGRZ
WHERE film_id = 1; E\FRXQW\FRGHZKLFKLVDOZD\VWKHILUVWILYHFKDUDFWHUVRIWKHtract_id
'academi' 'battl' 'canadian' 'dinosaur' 'drama' 'epic' 'feminist' 'mad'
'must' 'rocki' 'scientist' 'teacher'
FROXPQ7KXVWKHURZVLQHDFKFRXQW\FRGHDUHDYHUDJHGVHSDUDWHO\
([DPSOH3DUWLWLRQLQJRXUZLQGRZE\FRXQW\FRGH
.HHSLQPLQGWKDWDOWKRXJKDVWULSSHGYHFWRULVIDVWHUWRVHDUFKDQGWDNHVXSOHVV
SELECT tract_id, val, AVG(val) OVER (PARTITION BY left(tract_id,5)) As val_avg_county
GLVNVSDFHPDQ\RSHUDWRUVDQGIXQFWLRQVFDQQRWEHXVHGLQFRQMXQFWLRQZLWK FROM [Link]
WKHP)RULQVWDQFHEHFDXVHDVWULSSHGYHFWRUKDVQRPDUNHUVGLVWDQFHRSHUDWRUV WHERE fact_type_id = 2 ORDER BY tract_id;
FDQQRWEHXVHG tract_id | val | val_avg_county
------------+----------+----------------------
25001010100 | 1765.000 | 1709.9107142857142857
25001010206 | 1366.000 | 1709.9107142857142857
)XOO7H[W6XSSRUWIRU-621DQG-621% 25001010208 | 984.000 | 1709.9107142857142857
:
1HZLQYHUVLRQDUHts_headlineDQGto_tsvectorZKLFKWDNHDVLQSXWMVRQ 25003900100 | 1920.000 | 1438.2307692307692308
DQGMVRQEGDWD7KHIXQFWLRQVZRUNMXVWOLNHWKHWH[WRQHVH[FHSWWKH\FRQVLGHU 25003900200 | 1968.000 | 1438.2307692307692308
RQO\WKHYDOXHVRIMVRQMVRQEGDWDDQGQRWWKHNH\VRUMVRQPDUNXS([DPSOH 25003900300 | 1211.000 | 1438.2307692307692308
:
DSSOLHVWKHIXQFWLRQWRWKHMVRQSHUVRQFROXPQRIWKHWDEOHZHFUHDWHGLQ
([DPSOH
25'(5%<
([DPSOH&RQYHUWLQJMVRQMVRQEWRWVYHFWRU
SELECT to_tsvector(person) :LQGRZIXQFWLRQVDOVRDOORZDQORDER BYLQWKHOVERFODXVH:LWKRXWJHWWLQJ
FROM persons WHERE id=1; WRRDEVWUXVHWKHEHVWZD\WRWKLQNDERXWWKLVLVWKDWDOOWKHURZVLQWKHZLQGRZ
to_tsvector
----------------------------------------------------------------------------------
ZLOOEHRUGHUHGDVLQGLFDWHGE\ORDER BYDQGWKHZLQGRZIXQFWLRQZLOOFRQVLGHU
'-5083':19 '-6719':13 '-722':12 '-852':18 '619':11,17 'alex':3 'azaleah':25 RQO\URZVWKDWUDQJHIURPWKHILUVWURZLQWKHZLQGRZXSWRDQGLQFOXGLQJWKH
'brandon':21 'cell':15 'm':23 'ofelia':7 'rafael':5 'sonia':1 'work':9
sonia | 75 | 72 (1 row)
(4 rows)
7RDSSO\WKLVIXQFWLRQWRWKHMVRQEWDEOHpersons_bVZDSRXWWKHpersonsWDEOH
IRUpersons_b6LPLODUWRWKHWRBWVYHFWRUIRUWH[WWKHVHIXQFWLRQVDOVRKDYHD
:LQGRZ)XQFWLRQV YDULDQWWKDWWDNHVWKH)76FRQILJXUDWLRQWRXVHDVWKHLUILUVWDUJXPHQW7RPDNH
:LQGRZIXQFWLRQVDUHDFRPPRQ$16,64/IHDWXUH$ZLQGRZIXQFWLRQKDVWKH EHVWXVHRIWKHVHIXQFWLRQVFUHDWHDWVYHFWRUFROXPQLQ\RXUWDEOHDQGSRSXODWH
SUHVFLHQFHWRVHHDQGXVHGDWDEH\RQGWKHFXUUHQWURZKHQFHWKHWHUPZLQGRZ$ WKHILHOGXVLQJHLWKHUDWULJJHURUXSGDWHDVQHHGHG
ZLQGRZGHILQHVZKLFKRWKHUURZVQHHGWREHFRQVLGHUHGLQDGGLWLRQWRWKH $OVRDYDLODEOHQRZIRUMVRQDQGMVRQELVWKHts_headlineIXQFWLRQZKLFKWDJV
FXUUHQWURZ:LQGRZVOHW\RXDGGDJJUHJDWHLQIRUPDWLRQWRHDFKURZRI\RXU DV+70/DOOPDWFKLQJWH[WLQWKHMVRQGRFXPHQW([DPSOHIODJVDOO
RXWSXWZKHUHWKHDJJUHJDWLRQLQYROYHVRWKHUURZVLQWKHVDPHZLQGRZ:LQGRZ UHIHUHQFHVWR5DIDHOLQWKHGRFXPHQW
IXQFWLRQVVXFKDVrow_numberDQGrankDUHXVHIXOIRURUGHULQJ\RXUGDWDLQ
([DPSOH7DJPDWFKLQJZRUGV
VRSKLVWLFDWHGZD\VWKDWXVHURZVRXWVLGHWKHVHOHFWHGUHVXOWVEXWZLWKLQD
SELECT ts_headline(person->'spouse'->'parents', 'rafael'::tsquery)
ZLQGRZ FROM persons_b WHERE id=1;
{"father": "<b>Rafael</b>", "mother": "Ofelia"}
:LWKRXWZLQGRZIXQFWLRQV\RXߞGKDYHWRUHVRUWWRXVLQJMRLQVDQGVXETXHULHVWR (1 row)
SROOQHLJKERULQJURZV2QWKHVXUIDFHZLQGRZIXQFWLRQVYLRODWHWKHVHWEDVHG
SULQFLSOHRI64/EXWZHPROOLI\WKHSXULVWE\FODLPLQJWKDWWKH\DUHPHUHO\ 1RWHWKHEROG+70/WDJVDURXQGWKHPDWFKLQJYDOXH
VKRUWKDQG<RXFDQILQGPRUHGHWDLOVDQGH[DPSOHVLQ:LQGRZ)XQFWLRQV
([DPSOHJLYHV\RXDTXLFNVWDUW8VLQJDZLQGRZIXQFWLRQZHFDQREWDLQ &XVWRPDQG&RPSRVLWH'DWD7\SHV
ERWKWKHGHWDLOGDWDDQGWKHDYHUDJHYDOXHIRUDOOUHFRUGVZLWKfact_type_idRI
LQRQHVLQJOHSELECT1RWHWKDWWKHWHEREFODXVHLVDOZD\VHYDOXDWHGEHIRUH 7KLVVHFWLRQGHPRQVWUDWHVKRZWRGHILQHDQGXVHDFXVWRPW\SH7KHcomposite
WKHZLQGRZIXQFWLRQ DNDrecordrowREMHFWW\SHLVRIWHQXVHGWREXLOGDQREMHFWWKDWLVWKHQFDVWWR
DFXVWRPW\SHRUDVDUHWXUQW\SHIRUIXQFWLRQVQHHGLQJWRUHWXUQPXOWLSOH
([DPSOH7KHEDVLFZLQGRZ FROXPQV
SELECT tract_id, val, AVG(val) OVER () as val_avg
FROM [Link]
WHERE fact_type_id = 86; $OO7DEOHV$UH&XVWRP'DWD7\SHV
tract_id | val | val_avg
------------+----------+---------------------- 3RVWJUH64/DXWRPDWLFDOO\FUHDWHVFXVWRPW\SHVIRUDOOWDEOHV)RUDOOLQWHQWVDQG
25001010100 | 2942.000 | 4430.0602165087956698
25001010206 | 2750.000 | 4430.0602165087956698
SXUSRVHV\RXFDQXVHFXVWRPW\SHVMXVWDV\RXZRXOGDQ\RWKHUEXLOWLQW\SH6R
25001010208 | 2003.000 | 4430.0602165087956698 ZHFRXOGFRQFHLYDEO\FUHDWHDWDEOHWKDWKDVDFROXPQW\SHWKDWLVDQRWKHUWDEOHߞV
25001010304 | 2421.000 | 4430.0602165087956698 FXVWRPW\SHDQGZHFDQJRHYHQIXUWKHUDQGPDNHDQDUUD\RIWKDWW\SH:H
:
GHPRQVWUDWHWKLVߡWXUGXFNHQߢLQ([DPSOH
7KHOVERVHWVWKHERXQGDU\RIWKHZLQGRZ,QWKLVH[DPSOHEHFDXVHWKH ([DPSOH7XUGXFNHQ
SDUHQWKHVHVFRQWDLQQRFRQVWUDLQWWKHZLQGRZFRYHUVDOOWKHURZVLQRXUWHERE CREATE TABLE chickens (id integer PRIMARY KEY);
6RWKHDYHUDJHLVFDOFXODWHGDFURVVDOOURZVZLWKfact_type_id = 867KH CREATE TABLE ducks (id integer PRIMARY KEY, chickens chickens[]);
CREATE TABLE turkeys (id integer PRIMARY KEY, ducks ducks[]);
FODXVHDOVRPRUSKHGRXUFRQYHQWLRQDOAVGDJJUHJDWHIXQFWLRQLQWRDZLQGRZ
INSERT INTO ducks VALUES (1, ARRAY[ROW(1)::chickens, ROW(1)::chickens]); 7KHLQSXWVRIWKHVHIXQFWLRQVGLIIHUIURPRWKHUDJJUHJDWHIXQFWLRQV7KHFROXPQ
INSERT INTO turkeys VALUES (1, array(SELECT d FROM ducks d));
EHLQJDJJUHJDWHGLVWKHFROXPQLQWKHORDER BYFODXVHVRIWKHWITHIN GROUP
:HFUHDWHDQLQVWDQFHRIDFKLFNHQZLWKRXWDGGLQJLWWRWKHchickenWDEOHLWVHOI PRGLILHUV7KHFROXPQLVQRWGLUHFWLQSXWWRWKHIXQFWLRQDVZHߞUHXVHGWR
KHQFHZHߞUHDEOHWRUHSHDWidZLWKLPSXQLW\:HWDNHRXUDUUD\RIWZRFKLFNHQV VHHLQJ
VWXIIWKHPLQWRRQHGXFNDQGDGGLWWRWKHducksWDEOH:HWDNHWKHGXFNZH 7KHSHUFHQWLOHIXQFWLRQVKDYHDQRWKHUYDULDQWWKDWDFFHSWVDQDUUD\RISHUFHQWLOHV
DGGHGDQGVWXIILWLQWRWKHturkeysWDEOH OHWWLQJ\RXUHWULHYHPXOWLSOHSHUFHQWLOHVDOOLQRQHFDOO([DPSOHFRPSXWHV
)LQDOO\OHWߞVVHHZKDWZHKDYHLQRXUWXUNH\ WKHPHGLDQWKHSHUFHQWLOHDQGWKHKLJKHVWVFRUH
([DPSOH&RPSXWHPXOWLSOHSHUFHQWLOHV
SELECT * FROM turkeys; SELECT
student,
output percentile_cont('{0.5,0.60,1}'::float[])
-------------------------- WITHIN GROUP (ORDER BY score) AS cont_median,
id | ducks percentile_disc('{0.5,0.60,1}'::float[])
---+---------------------- WITHIN GROUP (ORDER BY score) AS disc_median,
1 | {"(1,\"{(1),(1)}\")"} COUNT(*) As num_scores
FROM test_scores
GROUP BY student
:HFDQDOVRUHSODFHVXEHOHPHQWVRIRXUWXUGXFNHQ7KLVQH[WH[DPSOHUHSODFHV ORDER BY student;
RXUVHFRQGFKLFNHQLQRXUILUVWWXUNH\ZLWKDGLIIHUHQWFKLFNHQ student | cont_median | disc_median | num_scores
--------+----------------+-------------+------------
alex | {78,79.2,84} | {77,79,84} | 8
UPDATE turkeys SET ducks[1].chickens[2] = ROW(3)::chickens
leo | {72,73.6,84} | {72,72,84} | 8
WHERE id = 1 RETURNING *;
regina | {76,76.8,90} | {76,77,90} | 9
sonia | {73.5,75.6,86} | {72,75,86} | 8
output (4 rows)
--------------------------
id | ducks $VZLWKDOODJJUHJDWHV\RXFDQFRPELQHWKHVHIXQFWLRQVZLWKPRGLILHUV
---+----------------------
1 | {"(1,\"{(1),(3)}\")"} ([DPSOHFRPELQHVWITHIN GROUPZLWKFILTER
([DPSOH&RPSXWHPHGLDQVFRUHIRUWZRVXEMHFWV
:HXVHGWKHRETURNINGFODXVHDVGLVFXVVHGLQߡ5HWXUQLQJ$IIHFWHG5HFRUGVWR SELECT
WKH8VHUߢWRRXWSXWWKHFKDQJHGUHFRUG student,
percentile_disc(0.5) WITHIN GROUP (ORDER BY score)
$Q\FRPSOH[URZRUFROXPQUHJDUGOHVVRIKRZFRPSOH[FDQEHFRQYHUWHGWRD FILTER (WHERE subject = 'algebra') AS algebra,
percentile_disc(0.5) WITHIN GROUP (ORDER BY score)
MVRQRUMVRQEFROXPQOLNHVR FILTER (WHERE subject = 'physics') AS physics
FROM test_scores
SELECT id, to_jsonb(ducks) AS ducks_jsonb GROUP BY student
FROM turkeys; ORDER BY student;
student | algebra | physics
id | ducks_jsonb --------+---------+--------
---+------------------------------------------------ alex | 74 | 79
1 | [{"id": 1, "chickens": [{"id": 1}, {"id": 3}]}] leo | 80 | 72
(1 row) regina | 68 | 83
jojo | {74,74} | {83,79} 3RVWJUH64/LQWHUQDOO\NHHSVWUDFNRIREMHFWGHSHQGHQFLHV7KH[Link]
jdoe | {75,78} | {72,72}
robe | {68,77} | {83,85} FROXPQLVGHSHQGHQWRQWKHchickensWDEOH7KH[Link]FROXPQLV
lhsu | {84,80} | {72,72} GHSHQGHQWRQWKHducksWDEOH<RXZRQߞWEHDEOHWRGURSWKHchickensWDEOH
FILTERZRUNVIRUDOODJJUHJDWHIXQFWLRQVQRWMXVWDJJUHJDWHIXQFWLRQVEXLOWLQWR ZLWKRXWVSHFLI\LQJCASCADERUILUVWGURSSLQJWKH[Link]FROXPQ,I
3RVWJUH64/ \RXGRDCASCADEWKH[Link]FROXPQZLOOEHJRQHDQGZLWKRXW
ZDUQLQJ\RXUWXUNH\VZLOOKDYHQRFKLFNHQVLQWKHLUGXFNV
3HUFHQWLOHVDQG0RGH
%XLOGLQJ&XVWRP'DWD7\SHV
1HZLQ3RVWJUH64/DUHVWDWLVWLFDOIXQFWLRQVIRUFRPSXWLQJSHUFHQWLOH
PHGLDQDNDSHUFHQWLOHDQGPRGH7KHVHIXQFWLRQVDUHSHUFHQWLOHBGLVF $OWKRXJK\RXFDQHDVLO\FUHDWHFRPSRVLWHW\SHVMXVWE\FUHDWLQJDWDEOHDWVRPH
SHUFHQWLOHGLVFUHWHSHUFHQWLOHBFRQWSHUFHQWLOHFRQWLQXRXVDQGPRGH SRLQW\RXߞOOSUREDEO\ZDQWWREXLOG\RXURZQIURPVFUDWFK)RUH[DPSOHOHWߞV
EXLOGDFRPSOH[QXPEHUGDWDW\SHZLWKWKHIROORZLQJVWDWHPHQW
7KHWZRSHUFHQWLOHIXQFWLRQVGLIIHULQKRZWKH\KDQGOHHYHQFRXQWV)RUWKH
GLVFUHWHIXQFWLRQWKHILUVWYDOXHHQFRXQWHUHGLVWDNHQVRWKHRUGHULQJRIWKHGDWD CREATE TYPE complex_number AS (r double precision, i double precision);
PDWWHUV)RUWKHFRQWLQXRXVFDVHYDOXHVZLWKLQWKHVDPHSHUFHQWLOHDUHDYHUDJHG
0HGLDQLVPHUHO\WKHSHUFHQWLOHWKHUHIRUHLWGRHVQRWGHVHUYHDVHSDUDWH :HFDQWKHQXVHWKLVFRPSOH[QXPEHUDVDFROXPQW\SH
IXQFWLRQRILWVRZQ7KHPRGHIXQFWLRQILQGVWKHPRVWFRPPRQYDOXH6KRXOG
CREATE TABLE circuits (circuit_id serial PRIMARY KEY, ac_volt complex_number);
WKHUHEHPRUHWKDQRQHPRGHWKHILUVWRQHHQFRXQWHUHGLVUHWXUQHGWKHUHIRUH
RUGHULQJPDWWHUVDVVKRZQLQ([DPSOH
:HFDQWKHQTXHU\RXUWDEOHZLWKVWDWHPHQWVVXFKDV
([DPSOH&RPSXWHPHGLDQDQGPRGHVFRUHV
SELECT SELECT circuit_id, (ac_volt).* FROM circuits;
student,
percentile_cont(0.5) WITHIN GROUP (ORDER BY score) As cont_median, RUDQHTXLYDOHQW
percentile_disc(0.5) WITHIN GROUP (ORDER BY score) AS disc_median,
mode() WITHIN GROUP (ORDER BY score) AS mode,
COUNT(*) As num_scores SELECT circuit_id, (ac_volt).r, (ac_volt).i FROM circuits;
FROM test_scores
GROUP BY student
ORDER BY student;
student | cont_median | disc_median | mode | num_scores :$51,1*
--------+-------------+-------------+------+------------ 3X]]OHGE\WKHSDUHQWKHVHVVXUURXQGLQJac_volt",I\RXOHDYHWKHPRXW3RVWJUH64/ZLOO
alex | 78 | 77 | 74 | 8 UDLVHWKHHUURUmissing FROM-clause entry for table “ac_volt”EHFDXVHLWDVVXPHV
leo | 72 | 72 | 72 | 8
ac_voltZLWKRXWSDUHQWKHVHVUHIHUVWRDWDEOH
regina | 76 | 76 | 68 | 9
sonia | 73.5 | 72 | 72 | 8
(4 rows)
([DPSOHFRPSXWHVERWKWKHGLVFUHWHDQGWKHFRQWLQXRXVPHGLDQVFRUH &RPSRVLWHVDQG18//V
ZKLFKFRXOGGLIIHUZKHQVWXGHQWVKDYHDQHYHQQXPEHURIVFRUHV 18//LVDFRQIXVLQJFRQFHSWLQWKH$16,64/6WDQGDUGSULPDULO\EHFDXVH
NULL != NULL:KHQZRUNLQJZLWK18//VLQVWHDG\RXQHHGWRXVH,618//
,612718//RU127somevalue,618//:LWKQRQFRPSRVLWHW\SHV 7KHFILTERFODXVHHTXLYDOHQWIRU([DPSOHLVVKRZQLQ([DPSOH
something IS NULLLVJHQHUDOO\WKHDQWLWKHVLVWRsomething IS NOT NULL ([DPSOH),/7(5XVHGZLWK$9*DJJUHJDWH
7KLVLVQRWWKHFDVHZLWKFRPSRVLWHVKRZHYHU SELECT student,
AVG(score) FILTER (WHERE subject ='algebra') As algebra,
3RVWJUH64/DELGHVE\WKH$16,64/VWDQGDUGVSHFVZKHQGHDOLQJZLWK18//V
AVG(score) FILTER (WHERE subject ='physics') As physics
7KHVSHFVUHTXLUHWKDWLQRUGHUIRUDFRPSRVLWHWREH,618//DOOHOHPHQWVRI FROM test_scores
WKHFRPSRVLWHPXVWEH18//+HUHLVZKHUHFRQIXVLRQFDQHQWHU,QRUGHUIRUD GROUP BY student;
FRPSRVLWHWREHFRQVLGHUHG,612718//HYHU\HOHPHQWLQWKHFRPSRVLWHPXVW ,QWKHFDVHRIDYHUDJHVDQGVXPVDQGPDQ\RWKHUDJJUHJDWHVWKHCASEDQG
UHWXUQWUXHIRU,612718//
FILTERDUHHTXLYDOHQW7KHEHQHILWLVWKDWFILTERLVDOLWWOHFOHDUHULQSXUSRVH
DQGIRUODUJHGDWDVHWVLVIDVWHU+RZHYHUWKHUHDUHVRPHDJJUHJDWHVߚVXFKDV
%XLOGLQJ2SHUDWRUVDQG)XQFWLRQVIRU&XVWRP7\SHV array_aggZKLFKFRQVLGHUVNULLILHOGVߚZKHUHWKHCASEVWDWHPHQWJLYHV\RX
$IWHU\RXEXLOGDFXVWRPW\SHVXFKDVDFRPSOH[QXPEHUQDWXUDOO\\RXߞOOZDQW H[WUDNULLYDOXHV\RXGRQߞWZDQW,Q([DPSOHZHWU\WRJHWWKHOLVWRI
WRFUHDWHIXQFWLRQVDQGRSHUDWRUVIRULW:HߞOOGHPRQVWUDWHEXLOGLQJD+RSHUDWRU VFRUHVIRUHDFKVXEMHFWRILQWHUHVWIRUHDFKVWXGHQWXVLQJWKHCASE .. WHEN..
IRUWKHcomplex_numberZHFUHDWHG)RUPRUHGHWDLOVDERXWEXLOGLQJIXQFWLRQV DSSURDFK
VHH&KDSWHU$VVWDWHGHDUOLHUDQRSHUDWRULVDV\PERODOLDVIRUDIXQFWLRQWKDW ([DPSOH&$6(:+(1XVHGLQDUUD\BDJJ
WDNHVRQHRUWZRDUJXPHQWV<RXFDQILQGPRUHGHWDLOVDERXWZKDWV\PEROVDQG SELECT student,
VHWVRIV\PEROVDUHDOORZHGLQ&5($7(23(5$725 array_agg(CASE WHEN subject ='algebra' THEN score ELSE NULL END) As algebra,
array_agg(CASE WHEN subject ='physics' THEN score ELSE NULL END) As physics
,QDGGLWLRQWREHLQJDQDOLDVDQRSHUDWRUFRQWDLQVRSWLPL]DWLRQLQIRUPDWLRQWKDW FROM test_scores
FDQEHXVHGE\WKHTXHU\RSWLPL]HUWRGHFLGHKRZLQGH[HVVKRXOGEHXVHGKRZ GROUP BY student;
student | algebra | physics
EHVWWRQDYLJDWHWKHGDWDDQGZKLFKRSHUDWRUH[SUHVVLRQVDUHHTXLYDOHQW0RUH --------+---------------------------+-------------------------------
GHWDLOVDERXWWKHVHRSWLPL]DWLRQVDQGKRZHDFKFDQKHOSWKHRSWLPL]HUDUHLQ jojo | {74,NULL,NULL,NULL,74,..} | {NULL,83,NULL,NULL,NULL,79,..}
jdoe | {75,NULL,NULL,NULL,78,..} | {NULL,72,NULL,NULL,NULL,72..}
2SHUDWRU2SWLPL]DWLRQ robe | {68,NULL,NULL,NULL,77,..} | {NULL,83,NULL,NULL,NULL,85,..}
7KHILUVWVWHSWRFUHDWLQJDQRSHUDWRULVWRFUHDWHDIXQFWLRQDVVKRZQLQ lhsu | {84,NULL,NULL,NULL,80,..} | {NULL,72,NULL,NULL,NULL,72,..}
(4 rows)
([DPSOH
([DPSOH$GGIXQFWLRQIRUFRPSOH[QXPEHU 2EVHUYHWKDWLQ([DPSOHZHJHWDEXQFKRINULLILHOGVLQRXUDUUD\V:H
FRXOGZRUNDURXQGWKLVLVVXHZLWKVRPHFOHYHUXVHRIVXEVHOHFWVEXWPRVWRI
CREATE OR REPLACE FUNCTION add(complex_number, complex_number)
RETURNS complex_number AS WKRVHZLOOEHPRUHYHUERVHDQGVORZHUWKDQWKHFILTERDOWHUQDWLYHVKRZQLQ
$$ ([DPSOH
SELECT
((COALESCE(($1).r,0) + COALESCE(($2).r,0)), ([DPSOH),/7(5XVHGZLWKDUUD\BDJJ
(COALESCE(($1).i,0) + COALESCE(($2).i,0)))::complex_number;
$$ SELECT student,
language sql; array_agg(score) FILTER (WHERE subject ='algebra') As algebra,
array_agg(score) FILTER (WHERE subject ='physics') As physics
7KHQH[WVWHSLVWRFUHDWHDV\PEROLFRSHUDWRUWRZUDSWKHIXQFWLRQDVLQ FROM test_scores
GROUP BY student;
([DPSOH student | algebra | physics
--------+---------+--------
SELECT ([DPSOHRSHUDWRUIRUFRPSOH[QXPEHU
'Housing',
array_agg(s$sql$ || lpad(i::text,2,'0') CREATE OPERATOR + (
|| ') As fact_subcats,' PROCEDURE = add,
|| quote_literal('s' || lpad(i::text,2,'0')) || ' As short_name LEFTARG = complex_number,
FROM staging.factfinder_import RIGHTARG = complex_number,
WHERE s' || lpad(I::text,2,'0') || $sql$ ~ '^[a-zA-Z]+' $sql$, ';' COMMUTATOR = +
) );
FROM generate_series(1,51) As I;
EXECUTE var_sql; :HFDQWKHQWHVWRXUQHZ+RSHUDWRU
END
$$; SELECT (1,2)::complex_number + (3,-10)::complex_number;
8VHRIGROODUTXRWLQJVRZHGRQߞWQHHGWRHVFDSH
LQ+RXVLQJ6LQFHWKH'2
FRPPDQGLVDOVRZUDSSHGLQGROODUVZHQHHGWRXVHDQDPHGGHOLPLWHU
ZKLFKRXWSXWV(4,-8)
LQVLGH:HFKRVH$sql$
$OWKRXJKZHGLGQߞWGHPRQVWUDWHLWKHUH\RXFDQRYHUORDGIXQFWLRQVDQG
8VHstring_aggWRIRUPDVHWRI64/VWDWHPHQWVDVDVLQJOHVWULQJRIWKH
RSHUDWRUVWRWDNHGLIIHUHQWW\SHVDVLQSXWV)RUH[DPSOH\RXFDQFUHDWHDQadd
IRUPINSERT INTO lu_fact_type(...) SELECT ... WHERE s01 ~ '[a-
IXQFWLRQDQGFRPSDQLRQ+RSHUDWRUWKDWWDNHVDcomplex_numberDQGDQ
zA-Z]+';
([HFXWHWKH64/ integer
7KHDELOLW\WREXLOGFXVWRPW\SHVDQGRSHUDWRUVSXVKHV3RVWJUH64/WRWKH
,Q([DPSOHZHDUHXVLQJWKHGROODUTXRWLQJV\QWD[FRYHUHGLQߡ'ROODU
ERXQGDU\RIDIXOOIOHGJHGGHYHORSPHQWHQYLURQPHQWEULQJLQJXVHYHUFORVHUWR
4XRWLQJߢIRUWKHERG\RIWKH'2IXQFWLRQDQGVRPHIUDJPHQWVRIWKH64/
RXUXWRSLDZKHUHHYHU\WKLQJLVWDEOHGULYHQ
VWDWHPHQWVLQVLGHWKHIXQFWLRQ6LQFHZHXVHGROODUTXRWLQJWRGHILQHWKHZKROH
ERG\RIWKH'2DVZHOODVLQWHUQDOO\ZHQHHGWRXVHQDPHGGROODUTXRWLQJIRUDW
OHDVWRQHSDUW7KHVDPHGROODUTXRWLQJQHVWHGDSSURDFKFDQEHXVHGIRUIXQFWRQ
GHILQLWLRQVDVZHOO
),/7(5&ODXVHIRU$JJUHJDWHV
1HZLQYHUVLRQLVWKHFILTERFODXVHIRUDJJUHJDWHVUHFHQWO\VWDQGDUGL]HGLQ
$16,64/7KLVUHSODFHVWKHVWDQGDUGCASE WHENFODXVHIRUUHGXFLQJWKH
QXPEHURIURZVLQFOXGHGLQDQDJJUHJDWLRQ)RUH[DPSOHVXSSRVH\RXXVHG
CASE WHENWREUHDNRXWDYHUDJHWHVWVFRUHVE\VWXGHQWDVVKRZQLQ([DPSOH
([DPSOH&$6(:+(1XVHGLQ$9*
SELECT student,
AVG(CASE WHEN subject ='algebra' THEN score ELSE NULL END) As algebra,
AVG(CASE WHEN subject ='physics' THEN score ELSE NULL END) As physics
FROM test_scores
GROUP BY student;
'2
&KDSWHU7DEOHV&RQVWUDLQWV
7KHDOFRPPDQGDOORZV\RXWRLQMHFWDSLHFHRISURFHGXUDOFRGHLQWR\RXU64/
DQG,QGH[HV RQWKHIO\<RXFDQWKLQNRILWDVDRQHWLPHDQRQ\PRXVIXQFWLRQ$VDQH[DPSOH
ZHߞOOORDGWKHGDWDFROOHFWHGLQ([DPSOHLQWRSURGXFWLRQWDEOHVIURPRXU
VWDJLQJWDEOH:HߞOOXVH3/SJ64/IRURXUSURFHGXUDOVQLSSHWEXW\RXߞUHIUHHWR
XVHRWKHUODQJXDJHV
7DEOHVFRQVWLWXWHWKHEXLOGLQJEORFNVRIUHODWLRQDOGDWDEDVHVWRUDJH6WUXFWXULQJ
WDEOHVVRWKDWWKH\IRUPPHDQLQJIXOUHODWLRQVKLSVLVWKHNH\WRUHODWLRQDOGDWDEDVH )LUVWZHߞOOFUHDWHWKHWDEOH
GHVLJQ,Q3RVWJUH64/FRQVWUDLQWVHQIRUFHUHODWLRQVKLSVEHWZHHQWDEOHV7R
set search_path=census;
GLVWLQJXLVKDWDEOHIURPMXVWDKHDSRIGDWDZHHVWDEOLVKLQGH[HV0XFKOLNHWKH DROP TABLE IF EXISTS lu_fact_types CASCADE;
LQGH[HV\RXILQGDWWKHHQGRIERRNVRUWKHWHQDQWOLVWDWWKHHQWUDQFHVWRJUDQG CREATE TABLE lu_fact_types (
fact_type_id serial,
RIILFHEXLOGLQJVLQGH[HVSRLQWWRORFDWLRQVLQWKHWDEOHVR\RXGRQߞWKDYHWR category varchar(100),
VFRXUWKHWDEOHIURPWRSWRERWWRPHYHU\WLPH\RXߞUHORRNLQJIRUVRPHWKLQJ fact_subcats varchar(255)[],
short_name varchar(50),
,QWKLVFKDSWHUZHLQWURGXFHV\QWD[IRUFUHDWLQJWDEOHVDQGDGGLQJURZV:HWKHQ CONSTRAINT pk_lu_fact_types PRIMARY KEY (fact_type_id)
PRYHRQWRFRQVWUDLQWVWRHQVXUHWKDW\RXUGDWDGRHVQߞWJHWRXWRIOLQH)LQDOO\ );
ZHVKRZ\RXKRZWRDGGLQGH[HVWR\RXUWDEOHVWRH[SHGLWHVHDUFKHV
7KHQZHߞOOXVHDOWRSRSXODWHLWDVVKRZQLQ([DPSOH&$6&$'(ZLOO
,QGH[LQJDWDEOHLVDVPXFKDSURJUDPPLQJWDVNDVLWLVDQH[SHULPHQWDO
IRUFHWKHGURSRIDQ\UHODWHGREMHFWVVXFKDVIRUHLJQNH\FRQVWUDLQWVDQGYLHZV
HQGHDYRU$PLVDSSURSULDWHGLQGH[LVZRUVHWKDQXVHOHVV1RWDOOLQGH[HVDUH
VREHFDXWLRXVZKHQXVLQJ&$6&$'(
FUHDWHGHTXDO$OJRULWKPLVWVKDYHGHYLVHGGLIIHUHQWNLQGVRILQGH[HVIRUGLIIHUHQW
GDWDW\SHVDQGGLIIHUHQWTXHU\W\SHVDOOLQDQDWWHPSWWRVFUDSHWKDWODVWPRUVHO ([DPSOHJHQHUDWHVDVHULHVRIINSERT INTO SELECTVWDWHPHQWV7KH64/
RIVSHHGIURPDTXHU\ DOVRSHUIRUPVDQXQSLYRWRSHUDWLRQWRFRQYHUWFROXPQDUGDWDLQWRURZV
7DEOHV :$51,1*
([DPSOHLVRQO\DSDUWLDOOLVWLQJRIWKHFRGHQHHGHGWREXLOGlu_factBW\SHV)RUWKHIXOO
,QDGGLWLRQWRRUGLQDU\GDWDWDEOHV3RVWJUH64/RIIHUVVHYHUDONLQGVRIWDEOHVWKDW FRGHUHIHUWRWKHEXLOGLQJBFHQVXVBWDEOHVVTOILOHWKDWLVSDUWRIWKHERRNFRGHDQGGDWD
DUHUDWKHUXQFRPPRQWHPSRUDU\XQORJJHGLQKHULWHGW\SHGDQGIRUHLJQ GRZQORDG
FRYHUHGLQ&KDSWHU
%DVLF7DEOH&UHDWLRQ ([DPSOH8VLQJ'2WRJHQHUDWHG\QDPLF64/
DO language plpgsql
([DPSOHVKRZVWKHWDEOHFUHDWLRQV\QWD[ZKLFKLVVLPLODUWRZKDW\RXߞOOILQG $$
LQDOO64/GDWDEDVHV DECLARE var_sql text;
BEGIN
([DPSOH%DVLFWDEOHFUHDWLRQ var_sql := string_agg(
$sql$
CREATE TABLE logs ( INSERT INTO lu_fact_types(category, fact_subcats, short_name)
([DPSOH4XHU\WR-621XVLQJMVRQBDJJ log_id serial PRIMARY KEY,
user_name varchar(50),
SELECT json_agg(f) As cats description text,
FROM ( log_ts timestamp with time zone NOT NULL DEFAULT current_timestamp
SELECT MAX(fact_type_id) As max_type, category );
FROM census.lu_fact_types CREATE INDEX idx_logs_log_ts ON logs USING btree (log_ts);
GROUP BY category
) As f; serialLVWKHGDWDW\SHXVHGWRUHSUHVHQWDQLQFUHPHQWLQJDXWRQXPEHU
$GGLQJDVHULDOFROXPQDXWRPDWLFDOO\DGGVDQDFFRPSDQ\LQJVHTXHQFH
'ROODU4XRWLQJ REMHFWWRWKHGDWDEDVHVFKHPD$VHULDOGDWDW\SHLVDOZD\VDQLQWHJHUZLWK
,QVWDQGDUG$16,64/VLQJOHTXRWHV
VXUURXQGVWULQJOLWHUDOV6KRXOG\RX WKHGHIDXOWYDOXHVHWWRWKHQH[WYDOXHRIWKHVHTXHQFHREMHFW(DFKWDEOH
KDYHDVLQJOHTXRWHLQWKHVWULQJLWVHOIVXFKDVODVWQDPHVOLNH2ߞ1DQSRVVHVLYHV XVXDOO\KDVMXVWRQHVHULDOFROXPQZKLFKRIWHQVHUYHVDVWKHSULPDU\NH\
OLNHPRQߞVSODFHRUFRQWUDFWLRQVOLNHFDQߞW\RXQHHGWRHVFDSHLWZLWKDQRWKHU )RUYHU\ODUJHWDEOHV\RXVKRXOGRSWIRUWKHUHODWHGbigserial
7KHHVFDSHFKDUDFWHULVDQRWKHUVLQJOHTXRWHSODFHGLQIURQWRIWKHVLQJOHTXRWH varcharLVVKRUWKDQGIRUߡFKDUDFWHUYDU\LQJߢDYDULDEOHOHQJWKVWULQJVLPLODU
\RXߞUHWU\LQJWRHVFDSH6D\\RXߞUHZULWLQJDQLQVHUWVWDWHPHQWZKHUH\RXFRSLHG WRZKDW\RXZLOOILQGLQRWKHUGDWDEDVHV<RXGRQߞWQHHGWRVSHFLI\D
DODUJHSDVVDJHIURPDQRYHO$IIL[LQJ\HWDQRWKHUVLQJOHTXRWHWRDOOH[LVWLQJ PD[LPXPOHQJWKLI\RXGRQߞWvarcharZLOOEHDOPRVWLGHQWLFDOWRWKHWH[W
VLQJOHTXRWHVLVERWKWHGLRXVWRDGGDQGFKDOOHQJLQJWRUHDG$IWHUDOOWZRVLQJOH GDWDW\SH
TXRWHVORRNDZIXOO\OLNHRQHGRXEOHTXRWHZKLFKLVDQRWKHUFKDUDFWHUHQWLUHO\ textLVDVWULQJRILQGHWHUPLQDWHOHQJWK,WߞVQHYHUIROORZHGE\DOHQJWK
3RVWJUH64/OHWV\RXHVFDSHVLQJOHTXRWHVLQVWULQJVRIDQ\OHQJWKE\VXUURXQGLQJ UHVWULFWLRQ
WKHPZLWKWZRVHTXHQWLDOGROODUVLJQVKHQFHWKHQDPHGROODUTXRWLQJ timestamp with time zoneVKRUWKDQGtimestamptzLVDGDWHDQGWLPH
GDWDW\SHDOZD\VVWRUHGLQ87&,WGLVSOD\VGDWHDQGWLPHLQWKHVHUYHUߞV
'ROODUTXRWLQJLVDOVRXVHIXOLQVLWXDWLRQVZKHUH\RXߞUHWU\LQJWRH[HFXWHDSLHFH
RZQWLPH]RQHXQOHVV\RXWHOOLWWRRWKHUZLVH6HHߡ7LPH=RQHV:KDW7KH\
RI64/G\QDPLFDOO\VXFKDVexec(some sql),Q([DPSOHZHHQFORVHGWKH
$UHDQG$UH1RWߢIRUDPRUHWKRURXJKGLVFXVVLRQ
ERG\RIDWULJJHUXVLQJGROODUTXRWLQJ
1HZLQYHUVLRQLVWKH,'(17,7<TXDOLILHUIRUDFROXPQ,'(17,7<LVD
,I\RXDUHZULWLQJDQ64/VWDWHPHQWWKDWJOXHVWZRVHQWHQFHVZLWKPDQ\VLQJOH
PRUHVWDQGDUGFRPSOLDQWZD\RIJHQHUDWLQJDQDXWRQXPEHUIRUDWDEOHFROXPQ
TXRWHVWKH$16,VWDQGDUGZD\ZRXOGEHWRHVFDSHDVLQWKHIROORZLQJ
<RXFRXOGWXUQWKHH[LVWLQJORJBLGFROXPQWRWKHQHZ,'(17,7<FRQVWUXFW
SELECT 'It''s O''Neil''s play. ' || 'It''ll start at two o''clock.' XVLQJDVHTXHQFHREMHFW
,IZHDOUHDG\KDGGDWDLQWKHWDEOHZHߞGQHHGWRSUHYHQWWKHQXPEHULQJIURP
7KHSDLURIGROODUVLJQVUHSODFHVWKHVLQJOHTXRWHDQGHVFDSHVDOOVLQJOHTXRWHV
VWDUWLQJDWZLWKDVWDWHPHQWOLNHWKLV
ZLWKLQ
$YDULDQWRIGROODUTXRWLQJLVQDPHGGROODUTXRWLQJ:HFRYHUWKLVLQWKH ALTER TABLE logs
IROORZLQJVHFWLRQ ALTER COLUMN log_id RESTART WITH 2000;
,IZHZHUHVWDUWLQJZLWKDQHZWDEOHZHߞGFUHDWHLWDVVKRZQLQ([DPSOH WKHUHVXOW
XVLQJ,'(17,7<LQVWHDGRIVHULDO
x
([DPSOH%DVLFWDEOHFUHDWLRQXVLQJ,'(17,7< ------------------------------------------------------------------
CREATE TABLE logs ( (86,Population,"{D001,Total:}",d001)
log_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, (87,Population,"{D002,Total:,""Not Hispanic or Latino:""}",d002)
user_name varchar(50),
description text, ,QVWHDGRIHUURULQJRXWWKHSUHFHGLQJH[DPSOHUHWXUQVWKHFDQRQLFDO
log_ts timestamp with time zone NOT NULL DEFAULT current_timestamp
); UHSUHVHQWDWLRQRIDlu_fact_typeGDWDW\SH&RPSRVLWHVFDQVHUYHDVLQSXWWR
VHYHUDOXVHIXOIXQFWLRQVDPRQJZKLFKDUHarray_aggDQGhstoreDIXQFWLRQ
7KHVWUXFWXUHRI([DPSOHLVPXFKWKHVDPHDVZKDWZHVDZLQ([DPSOH
SDFNDJHGZLWKWKHKVWRUHH[WHQVLRQWKDWFRQYHUWVDURZLQWRDNH\YDOXHSDLU
EXWPRUHYHUERVH
REMHFW
8QGHUZKDWFDVHVZRXOG\RXSUHIHUWRXVH,'(17,7<RYHUVHULDO"7KHPDLQ
,I\RXDUHEXLOGLQJZHEDSSOLFDWLRQV\RXFDQWDNHDGYDQWDJHRIWKHEXLOWLQ
EHQHILWRIWKH,'(17,7<FRQVWUXFWLVWKDWDQLGHQWLW\LVDOZD\VWLHGWRDVSHFLILF
-621DQG-621%VXSSRUWZHFRYHUHGLQߡ-621ߢDQGXVHDFRPELQDWLRQRI
WDEOHVRLQFUHPHQWLQJDQGUHVHWWLQJWKHYDOXHLVPDQDJHGZLWKWKHWDEOH$VHULDO
array_aggDQGarray_to_jsonWRRXWSXWDTXHU\DVDVLQJOH-621REMHFWDV
RQWKHRWKHUKDQGFUHDWHVDVHTXHQFHREMHFWWKDWPD\RUPD\QRWEHUHXVHGE\
RWKHUWDEOHVDQGQHHGVWREHGURSSHGPDQXDOO\ZKHQLWߞVQRORQJHUQHHGHG,I VKRZQLQ([DPSOH,Q3RVWJUH64/\RXFDQXVHjson_agg6HH
\RXZDQWHGWRUHVHWWKHQXPEHURIDVHULDO\RXߞGQHHGWRPRGLI\WKHUHODWHG ([DPSOH
6(48(1&(REMHFWZKLFKPHDQVNQRZLQJZKDWWKHQDPHRILWLV ([DPSOH4XHU\WR-621RXWSXW
7KHVHULDODSSURDFKLVVWLOOXVHIXOLI\RXQHHGWRUHXVHDQDXWRQXPEHUJHQHUDWRU SELECT array_to_json(array_agg(f)) As cat
FROM (
DFURVVPDQ\WDEOHV,QWKDWFDVHWKRXJK\RXߞGFUHDWHWKHVHTXHQFHREMHFW SELECT MAX(fact_type_id) As max_type, category
VHSDUDWHIURPWKHWDEOHDQGVHWWKHWDEOHFROXPQGHIDXOWWRWKHQH[WYDOXHRIWKH FROM census.lu_fact_types
GROUP BY category
VHTXHQFH,QWHUQDOO\WKHQHZ,'(17,7<FRQVWUXFWEHKDYHVPXFKWKHVDPHE\ ) As f;
FUHDWLQJEHKLQGWKHVFHQHVDVHTXHQFHREMHFWEXWSUHYHQWLQJWKDWVHTXHQFHREMHFW
7KLVZLOOJLYH\RXDQRXWSXWRI
IURPEHLQJHGLWHGGLUHFWO\
cats
----------------------------------------------------
[{"max_type":102,"category":"Population"},
,QKHULWHG7DEOHV {"max_type":153,"category":"Housing"}]
3RVWJUH64/VWDQGVDORQHDVWKHRQO\GDWDEDVHSURGXFWRIIHULQJLQKHULWHGWDEOHV 'HILQHVDVXETXHU\ZLWKQDPHffFDQWKHQEHXVHGWRUHIHUHQFHHDFKURZLQ
:KHQ\RXVSHFLI\WKDWDWDEOHWKHFKLOGWDEOHLQKHULWVIURPDQRWKHUWDEOHWKH WKHVXETXHU\
SDUHQWWDEOH3RVWJUH64/FUHDWHVWKHFKLOGWDEOHZLWKLWVRZQFROXPQVSOXVDOO
$JJUHJDWHHDFKURZRIVXETXHU\LQJXVLQJDUUD\BDJJDQGWKHQFRQYHUWWKH
WKHFROXPQVRIWKHSDUHQWWDEOH3RVWJUH64/ZLOOUHPHPEHUWKLVSDUHQWFKLOG
DUUD\WRMVRQZLWKDUUD\BWRBMVRQ
UHODWLRQVKLSVRWKDWDQ\VXEVHTXHQWVWUXFWXUDOFKDQJHVWRWKHSDUHQWDXWRPDWLFDOO\
SURSDJDWHWRLWVFKLOGUHQ3DUHQWFKLOGWDEOHGHVLJQLVSHUIHFWIRUSDUWLWLRQLQJ\RXU ,QYHUVLRQWKHjson_aggIXQFWLRQUHSODFHVWKHFKDLQRIarray_to_jsonDQG
GDWD:KHQ\RXTXHU\WKHSDUHQWWDEOH3RVWJUH64/DXWRPDWLFDOO\LQFOXGHVDOO array_aggRIIHULQJERWKFRQYHQLHQFHDQGVSHHG,Q([DPSOHZHUHSHDW
URZVLQWKHFKLOGWDEOHV1RWHYHU\WUDLWRIWKHSDUHQWSDVVHVGRZQWRWKHFKLOG ([DPSOHXVLQJjson_aggDQGERWKH[DPSOHVZLOOKDYHWKHVDPHRXWSXW
1RWDEO\SULPDU\NH\FRQVWUDLQWVIRUHLJQNH\FRQVWUDLQWVXQLTXHQHVV
UHDOO\ZDQWHGWRVSHOOWKHFRORUVDVJLYHQWRXVZHFRXOGXVHFRGHOLNHWKDWJLYHQ FRQVWUDLQWVDQGLQGH[HVDUHQHYHULQKHULWHG&KHFNFRQVWUDLQWVDUHLQKHULWHGEXW
LQ([DPSOH FKLOGUHQFDQKDYHWKHLURZQFKHFNFRQVWUDLQWVLQDGGLWLRQWRWKHRQHVWKH\LQKHULW
([DPSOH21&21)/,&7'283'$7( IURPWKHLUSDUHQWVVHH([DPSOH
INSERT INTO colors(color, hex) ([DPSOH,QKHULWHGWDEOHFUHDWLRQ
VALUES('Blue', '0000FF'), ('Red', 'FF0000'), ('Green', '00FF00') CREATE TABLE logs_2011 (PRIMARY KEY (log_id)) INHERITS (logs);
ON CONFLICT(lower(color)) CREATE INDEX idx_logs_2011_log_ts ON logs_2011 USING btree(log_ts);
DO UPDATE SET color = [Link], hex = [Link]; ALTER TABLE logs_2011
ADD CONSTRAINT chk_y2011
,Q([DPSOHZHVSHFLILHGWKHFRQIOLFWZKLFKPDWFKHVWKHH[SUHVVLRQRID CHECK (
FRQVWUDLQWRUXQLTXHLQGH[VRXVLQJVRPHWKLQJOLNHupper(color)ZRXOGQRW log_ts >= '2011-1-1'::timestamptz AND log_ts < '2012-1-1'::timestamptz
);
ZRUNVLQFHWKHFRORUVWDEOHKDVQRPDWFKLQJLQGH[IRUWKDWH[SUHVVLRQ
:HGHILQHDFKHFNFRQVWUDLQWWROLPLWGDWDWRWKH\HDU+DYLQJWKHFKHFN
,QWKHFDVHRI,16(5721&21)/,&7'283'$7(\RXQHHGWRVSHFLI\WKH
FRQVWUDLQWLQSODFHDOORZVWKHTXHU\SODQQHUWRVNLSLQKHULWHGWDEOHVWKDWGR
FRQIOLFWLQJFRQGLWLRQRU&21675$,17QDPH,IXVLQJDFRQVWUDLQW\RXߞGXVH
QRWVDWLVI\WKHTXHU\FRQGLWLRQ
ON CONFLICT ON CONSTRAINT constraint_name_hereDVVKRZQLQ
([DPSOH $QHZIHDWXUHLQ3RVWJUH64/LVLQKHULWDQFHEHWZHHQORFDODQGIRUHLJQWDEOHV
HDFKW\SHFDQQRZLQKHULWIURPWKHRWKHU7KLVLVDOOLQSXUVXLWRIPDNLQJ
([DPSOH21&21)/,&7'283'$7(
VKDUGLQJHDVLHU
INSERT INTO colors(color, hex)
VALUES('Blue', '0000FF'), ('Red', 'FF0000'), ('Green', '00FF00')
ON CONFLICT ON CONSTRAINT colors_pkey 3DUWLWLRQHG7DEOHV
DO UPDATE SET color = [Link], hex = [Link];;
1HZLQYHUVLRQDUHSDUWLWLRQHGWDEOHV3DUWLWLRQHGWDEOHVDUHPXFKOLNH
7KH'2SDUWRIWKH,16(57FRQVWUXFWZLOORQO\KDSSHQLIWKHUHLVDSULPDU\NH\
LQKHULWHGWDEOHVLQWKDWWKH\DOORZSDUWLWLRQLQJRIGDWDDFURVVPDQ\WDEOHVDQGWKH
XQLTXHLQGH[RUXQLTXHNH\FRQVWUDLQWHUURUWULJJHUHG+RZHYHUHUURUVVXFKDV
SODQQHUFDQFRQGLWLRQDOO\VNLSWDEOHVWKDWGRQߞWVDWLVI\DTXHU\FRQGLWLRQ
GDWDW\SHRQHVRUFKHFNFRQVWUDLQWVZLOOIDLODQGQHYHUEHSURFHVVHGE\'2
,QWHUQDOO\WKH\DUHLPSOHPHQWHGPXFKWKHVDPHEXWXVHDGLIIHUHQW''/V\QWD[
83'$7(
$OWKRXJKSDUWLWLRQHGWDEOHVUHSODFHWKHIXQFWLRQDOLW\RILQKHULWHGWDEOHVLQPDQ\
&RPSRVLWH7\SHVLQ4XHULHV FDVHVWKH\DUHQRWFRPSOHWHUHSODFHPHQWV+HUHDUHVRPHNH\GLIIHUHQFHV
EHWZHHQLQKHULWHGWDEOHVDQGSDUWLWLRQWDEOHV
3RVWJUH64/DXWRPDWLFDOO\FUHDWHVGDWDW\SHVRIDOOWDEOHV%HFDXVHGDWDW\SHV
GHULYHGIURPWDEOHVFRQWDLQRWKHUGDWDW\SHVWKH\DUHRIWHQFDOOHGFRPSRVLWHGDWD $SDUWLWLRQHGWDEOHJURXSLVFUHDWHGXVLQJWKHGHFODUDWLYHSDUWLWLRQV\QWD[
W\SHVRUMXVWFRPSRVLWHV7KHILUVWWLPH\RXVHHDTXHU\ZLWKFRPSRVLWHV\RX CREATE TABLE .. PARTITION BY RANGE ..
PLJKWEHVXUSULVHG,QIDFW\RXPLJKWFRPHDFURVVWKHLUYHUVDWLOLW\E\DFFLGHQW :KHQSDUWLWLRQVDUHXVHGGDWDFDQEHLQVHUWHGLQWRWKHFRUHWDEOHDQGLV
ZKHQPDNLQJDW\SRLQDQ64/VWDWHPHQW7U\WKHIROORZLQJTXHU\ UHURXWHGDXWRPDWLFDOO\WRWKHPDWFKLQJSDUWLWLRQ7KLVLVQRWWKHFDVHZLWK
LQKHULWHGWDEOHVZKHUH\RXHLWKHUQHHGWRLQVHUWGDWDLQWRWKHFKLOGWDEOHRU
SELECT x FROM census.lu_fact_types As x LIMIT 2;
KDYHDWULJJHUWKDWUHURXWHVGDWDWRWKHFKLOGWDEOHV
$WILUVWJODQFH\RXPLJKWWKLQNWKDWZHOHIWRXWD.*E\DFFLGHQWEXWFKHFNRXW $OOWDEOHVLQDSDUWLWLRQPXVWKDYHWKHVDPHH[DFWFROXPQV7KLVLVXQOLNH
LQKHULWHGWDEOHVZKHUHFKLOGWDEOHVDUHDOORZHGWRKDYHDGGLWLRQDOFROXPQV 99 | asian_alone
100 | native_hawaiian_and_other_pacific_islander_alone
WKDWDUHQRWLQWKHSDUHQWWDEOHV 101 | some_other_race_alone
102 | two_or_more_races
(DFKSDUWLWLRQHGWDEOHEHORQJVWRDVLQJOHSDUWLWLRQHGJURXS,QWHUQDOO\WKDW
PHDQVLWFDQKDYHRQO\RQHSDUHQWWDEOH,QKHULWHGWDEOHVRQRWKHUKDQGFDQ
LQKHULWFROXPQVIURPPXOWLSOHWDEOHV 836(57V,16(5721&21)/,&783'$7(
1HZLQYHUVLRQLVWKH,16(5721&21)/,&7FRQVWUXFWZKLFKLVRIWHQ
7KHSDUHQWRIWKHSDUWLWLRQFDQߞWKDYHSULPDU\NH\VXQLTXHNH\VRULQGH[HV
UHIHUUHGWRDVDQ836(577KLVIHDWXUHLVXVHIXOLI\RXGRQߞWNQRZDUHFRUG
DOWKRXJKWKHFKLOGSDUWLWLRQVFDQ7KLVLVGLIIHUHQWIURPWKHLQKHULWDQFHWDEOHV
DOUHDG\H[LVWVLQDWDEOHDQGUDWKHUWKDQKDYLQJWKHLQVHUWIDLO\RXZDQWLWWR
ZKHUHWKHSDUHQWDQGHDFKFKLOGFDQKDYHDSULPDU\NH\WKDWQHHGVRQO\WREH
HLWKHUXSGDWHWKHH[LVWLQJUHFRUGRUGRQRWKLQJ
XQLTXHZLWKLQWKHWDEOHQRWQHFHVVDULO\DFURVVDOOWKHLQKHULWHGFKLOGUHQ
7KLVIHDWXUHUHTXLUHVDXQLTXHNH\SULPDU\NH\XQLTXHLQGH[RUH[FOXVLRQ
8QOLNHLQKHULWHGWDEOHVWKHSDUHQWSDUWLWLRQHGWDEOHFDQߞWKDYHDQ\URZVRILWV
FRQVWUDLQWLQSODFHWKDWZKHQYLRODWHG\RXߞGZDQWGLIIHUHQWEHKDYLRUOLNH
RZQ$OOLQVHUWVDUHUHGLUHFWHGWRDPDWFKLQJFKLOGSDUWLWLRQDQGZKHQQR
XSGDWLQJWKHH[LVWLQJUHFRUGRUQRWGRLQJDQ\WKLQJ7RGHPRQVWUDWHLPDJLQHZH
PDWFKLQJFKLOGSDUWLWLRQLVDYDLODEOHDQHUURULVWKURZQ
KDYHDWDEOHRIFRORUVWRFUHDWH
:HߞOOUHFUHDWHWKHlogsWDEOHIURP([DPSOHDVDSDUWLWLRQHGWDEOHDQGFUHDWH
CREATE TABLE colors(color varchar(50) PRIMARY KEY, hex varchar(6));
WKHFKLOGWDEOHVXVLQJSDUWLWLRQV\QWD[LQVWHDGRIWKHLQKHULWDQFHVKRZQLQ INSERT INTO colors(color, hex)
([DPSOH VALUES('blue', '0000FF'), ('red', 'FF0000');
)LUVWZHߞOOGURSRXUH[LVWLQJORJVWDEOHDQGDOOLWVFKLOGWDEOHV
:HWKHQJHWDQHZEDWFKRIFRORUVWRDGGWRRXUWDEOHEXWVRPHPD\EHSUHVHQW
DROP TABLE IF EXISTS logs CASCADE;
DOUHDG\,IZHGRDUHJXODULQVHUWZHߞGJHWDSULPDU\NH\YLRODWLRQZKHQZHWULHG
WRDGGFRORUVDOUHDG\LQWKHWDEOH:KHQZHUXQ([DPSOHZHJHWRQO\RQH
)RUDSDUWLWLRQHGWDEOHVHWWKHSDUHQWWDEOHPXVWEHQRWHGDVDSDUWLWLRQHGWDEOH UHFRUGLQVHUWHGWKHgreenWKDWLVQRWDOUHDG\LQRXUWDEOHDQGHDFKVXEVHTXHQW
WKURXJKWKHPARTITION BYV\QWD[DVVKRZQLQ([DPSOH&RQWUDVWWKDWWR UXQZRXOGUHVXOWLQQRUHFRUGVEHLQJLQVHUWHG
([DPSOHZKHUHZHMXVWVWDUWZLWKDUHJXODUWDEOHGHILQLWLRQ$OVRQRWHWKDW ([DPSOH21&21)/,&7'2127+,1*
ZHGRQRWGHILQHDSULPDU\NH\EHFDXVHSULPDU\NH\VDUHQRWVXSSRUWHGIRUWKH INSERT INTO colors(color, hex)
SDUHQWSDUWLWLRQWDEOH VALUES('blue', '0000FF'), ('red', 'FF0000'), ('green', '00FF00')
ON CONFLICT DO NOTHING ;
([DPSOH%DVLFWDEOHFUHDWLRQIRUSDUWLWLRQ
CREATE TABLE logs ( 6RPHRQHFRXOGFRPHDQGSXWLQDGLIIHUHQWFDVH'Blue'LQRXUV\VWHPDQGZHߞG
log_id int GENERATED BY DEFAULT AS IDENTITY, WKHQKDYHWZRGLIIHUHQWFDVHGEOXHV7RUHPHG\WKLVZHFDQSXWDXQLTXHLQGH[
user_name varchar(50),
description text,
RQRXUWDEOH
log_ts timestamp with time zone NOT NULL DEFAULT current_timestamp
) PARTITION BY RANGE (log_ts); CREATE UNIQUE INDEX uidx_colors_lcolor ON colors USING btree(lower(color));
6LPLODUWRLQKHULWDQFHZHFUHDWHFKLOGWDEOHVRIWKHSDUWLWLRQH[FHSWLQVWHDGRI
$VEHIRUHLIZHWULHGWRLQVHUWD'Blue'ZHߞGEHSUHYHQWHGIURPGRLQJVRDQG
XVLQJ&+(&.FRQVWUDLQWVWRGHQRWHDOORZHGGDWDLQWKHFKLOGWDEOHZHXVHWKH
WKH21&21)/,&7'2127+,1*ZRXOGUHVXOWLQQRWKLQJKDSSHQLQJ,IZH
DOUHDG\EHHQPRYHGSUHYLRXVO\ FOR VALUES FROM''/FRQVWUXFW:HUHSHDWWKHH[HUFLVHIURP([DPSOHLQ
([DPSOHEXWXVLQJWKHFOR VALUES FROMFRQVWUXFWLQVWHDGRIINHERITS
'(/(7(86,1* ([DPSOH&UHDWHDFKLOGSDUWLWLRQ
2IWHQZKHQ\RXGHOHWHGDWDIURPDWDEOH\RXߞOOZDQWWRGHOHWHWKHGDWDEDVHGRQ CREATE TABLE logs_2011 PARTITION OF logs
FOR VALUES FROM ('2011-1-1') TO ('2012-1-1') ;
LWVSUHVHQFHLQDQRWKHUVHWRIGDWD6SHFLI\WKLVDGGLWLRQDOVHWZLWKWKHUSING CREATE INDEX idx_logs_2011_log_ts ON logs_2011 USING btree(log_ts);
SUHGLFDWH7KHQLQWKHWHEREFODXVH\RXFDQXVHERWKGDWDVHWVLQWKHUSINGDQG ALTER TABLE logs_2011 ADD CONSTRAINT pk_logs_2011 PRIMARY KEY (log_id) ;
LQWKHFROMWRGHILQHFRQGLWLRQVIRUGHOHWLRQ0XOWLSOHWDEOHVFDQEHLQFOXGHGLQ 'HILQHWKHQHZWDEOHDVDSDUWLWLRQRIlogs
USINGVHSDUDWHGE\FRPPDV([DPSOHGHOHWHVDOOUHFRUGVIURPFHQVXVIDFWV 'HILQHWKHVHWRIGDWDWREHVWRUHGLQWKLVSDUWLWLRQ&KLOGSDUWLWLRQVPXVWQRW
WKDWFRUUHVSRQGWRDIDFWW\SHRIshort_name = 's01' KDYHRYHUODSSLQJUDQJHVVRLI\RXWU\WRGHILQHDUDQJHWKDWRYHUODSVDQ
H[LVWLQJUDQJHWKH&5($7(7$%/(FRPPDQGZLOOIDLOZLWKDQHUURU
([DPSOH'(/(7(86,1* &KLOGSDUWLWLRQVFDQKDYHLQGH[HVDQGSULPDU\NH\V$VZLWKLQKHULWDQFHWKH
DELETE FROM [Link] SULPDU\NH\LVQRWHQIRUFHGDFURVVWKHZKROHSDUWLWLRQVHWRIWDEOHV
USING census.lu_fact_types As ft
WHERE facts.fact_type_id = ft.fact_type_id AND ft.short_name = 's01';
1RZLIZHZHUHWRLQVHUWGDWDDVIROORZV
7KHVWDQGDUGVFRPSOLDQWZD\ZRXOGEHWRXVHDFOXQNLHUINH[SUHVVLRQLQWKH
INSERT INTO logs(user_name, description ) VALUES ('regina', 'Sleeping');
WHERE
:HߞGJHWDQHUURUVXFKDV
5HWXUQLQJ$IIHFWHG5HFRUGVWRWKH8VHU
ERROR: no partition of relation "logs" found for row
7KHRETURNINGSUHGLFDWHLVVXSSRUWHGE\$16,64/VWDQGDUGVEXWQRW DETAIL: Partition key of the failing row contains
FRPPRQO\IRXQGLQRWKHUUHODWLRQDOGDWDEDVHV:HVKRZDQH[DPSOHLQ (log_ts) = (2017-05-25 [Link].057101-04).
([DPSOHZKHUHZHUHWXUQWKHUHFRUGVGHOHWHGRETURNINGFDQDOVREHXVHG
IRULQVHUWVDQGXSGDWHV)RULQVHUWVLQWRWDEOHVZLWKDVHULDONH\RETURNINGLV ,IZHWKHQFUHDWHDSDUWLWLRQWDEOHIRUWKHFXUUHQW\HDU
LQYDOXDEOHEHFDXVHLWUHWXUQVWKHNH\YDOXHRIWKHQHZURZVߚVRPHWKLQJ\RX
CREATE TABLE logs_gt_2011 PARTITION OF logs
ZRXOGQߞWNQRZSULRUWRWKHTXHU\H[HFXWLRQ$OWKRXJKRETURNINGLVRIWHQ FOR VALUES FROM ('2012-1-1') TO (unbounded);
DFFRPSDQLHGE\*IRUDOOILHOGV\RXFDQOLPLWWKHILHOGVDVZHGRLQ([DPSOH
8QOLNH([DPSOHZHRSWHGWRXVHWKH3$57,7,21UDQJHNH\ZRUG
([DPSOH5HWXUQLQJFKDQJHGUHFRUGVRIDQ83'$7(ZLWK5(7851,1* unboundedZKLFKDOORZVRXUSDUWLWLRQWREHXVHGIRUIXWXUHGDWHV
UPDATE census.lu_fact_types AS f 5HSHDWLQJRXULQVHUWQRZZHFDQVHHE\SELECT * FROM logs_gt_2011;WKDW
SET short_name = replace(replace(lower(f.fact_subcats[4]),' ','_'),':','')
WHERE f.fact_subcats[3] = 'Hispanic or Latino:' AND f.fact_subcats[4] > ''
RXUGDWDJRWUHURXWHGWRWKHQHZSDUWLWLRQ
RETURNING fact_type_id, short_name;
fact_type_id | short_name
,QWKHUHDOZRUOG\RXZRXOGQHHGWRFUHDWHLQGH[HVDQGSULPDU\NH\VRQWKHQHZ
-------------+------------------------------------------------- FKLOGIRUTXHU\HIILFLHQF\
96 | white_alone
97 | black_or_african_american_alone 6LPLODUWRWKHZD\LQKHULWDQFHZRUNVZKHQZHTXHU\WKHSDUHQWWDEOHDOO
98 | american_indian_and_alaska_native_alone
SDUWLWLRQVWKDWGRQߞWVDWLVI\WKHGDWHILOWHUDUHVNLSSHGDVVKRZQLQ([DPSOH IXQFWLRQVFDQDSSHDULQWKHSELECT
([DPSOH3ODQQHUVNLSSLQJRWKHUSDUWLWLRQV ,QWHUZHDYLQJVRPHVHWUHWXUQLQJIXQFWLRQVLQWRDQDOUHDG\FRPSOLFDWHGTXHU\
EXPLAIN ANALYZE SELECT * FROM logs WHERE log_ts > '2017-05-01'; FRXOGSURGXFHUHVXOWVEH\RQGZKDW\RXH[SHFWEHFDXVHWKHVHIXQFWLRQVXVXDOO\
Append (cost=0.00..15.25 rows=140 width=162)
UHVXOWLQWKHFUHDWLRQRIQHZURZV<RXPXVWDQWLFLSDWHWKLVLI\RXߞOOEHXVLQJWKH
(actual time=0.008..0.009 rows=1 loops=1)
-> Seq Scan on logs_gt_2011 (cost=0.00..15.25 rows=140 width=162) UHVXOWVDVDVXETXHU\,Q([DPSOHZHGHPRQVWUDWHURZFUHDWLRQUHVXOWLQJ
(actual time=0.008..0.008 rows=1 loops=1) IURPXVLQJDWHPSRUDOYHUVLRQRIgenerate_series7KHH[DPSOHXVHVDWDEOH
Filter: (log_ts > '2017-05-01 [Link]-04'::timestamp with time zone)
Planning time: 0.152 ms WKDWZHFRQVWUXFWZLWK
Execution time: 0.022 ms
CREATE TABLE interval_periods (i_type interval);
,I\RXDUHXVLQJWKH364/SDFNDJHGZLWK3RVWJUH64/\RXZLOOJHWPRUH INSERT INTO interval_periods (i_type)
LQIRUPDWLRQZKHQ\RXXVHWKHGHVFULEHWDEOHFRPPDQGWKDWGHWDLOVWKHSDUWLWLRQ VALUES ('5 months'), ('132 days'), ('4862 hours');
UDQJHVRIWKHSDUHQWWDEOH
([DPSOH6HWUHWXUQLQJIXQFWLRQLQ6(/(&7
\d+ logs SELECT i_type,
generate_series('2012-01-01'::date,'2012-12-31'::date,i_type) As dt
FROM interval_periods;
Table "[Link]"
i_type | dt
:
-----------+-----------------------
Partition key: RANGE (log_ts)
5 months | 2012-01-01 [Link]-05
Partitions: logs_2011
5 months | 2012-06-01 [Link]-04
FOR VALUES FROM ('2011-01-01 [Link]-05') TO ('2012-01-01 [Link]-05'),
5 months | 2012-11-01 [Link]-04
logs_gt_2011
132 days | 2012-01-01 [Link]-05
FOR VALUES FROM ('2012-01-01 [Link]-05') TO (UNBOUNDED)
132 days | 2012-05-12 [Link]-04
132 days | 2012-09-21 [Link]-04
4862 hours | 2012-01-01 [Link]-05
8QORJJHG7DEOHV 4862 hours | 2012-07-21 [Link]-04
)RUHSKHPHUDOGDWDWKDWFRXOGEHUHEXLOWLQWKHHYHQWRIDGLVNIDLOXUHRUGRHVQߞW
QHHGWREHUHVWRUHGDIWHUDFUDVK\RXPLJKWSUHIHUKDYLQJPRUHVSHHGWKDQ 5HVWULFWLQJ'(/(7(83'$7(DQG6(/(&7IURP,QKHULWHG
UHGXQGDQF\7KHUNLOGGEDPRGLILHUDOORZV\RXWRFUHDWHXQORJJHGWDEOHVDV 7DEOHV
VKRZQLQ([DPSOH7KHVHWDEOHVZLOOQRWEHSDUWRIDQ\ZULWHDKHDGORJV
:KHQ\RXTXHU\IURPDWDEOHWKDWKDVFKLOGWDEOHVWKHTXHU\DXWRPDWLFDOO\GULOOV
7KHELJDGYDQWDJHRIDQXQORJJHGWDEOHLVWKDWZULWLQJGDWDWRLWLVPXFKIDVWHU
GRZQLQWRWKHFKLOGUHQFUHDWLQJDXQLRQRIDOOWKHFKLOGUHFRUGVVDWLVI\LQJWKH
WKDQWRDORJJHGWDEOHߚ࠺WLPHVIDVWHULQRXUH[SHULHQFH
TXHU\FRQGLWLRQDELETEDQGUPDATEZRUNWKHVDPHZD\GULOOLQJGRZQWKH
,I\RXDFFLGHQWDOO\XQSOXJWKHSRZHUFRUGRQWKHVHUYHUDQGWKHQWXUQWKHSRZHU KLHUDUFK\IRUYLFWLPV6RPHWLPHVWKLVLVQRWGHVLUDEOHEHFDXVH\RXZDQWGDWDWR
EDFNRQWKHUROOEDFNSURFHVVZLOOZLSHFOHDQDOOGDWDLQXQORJJHGWDEOHV FRPHRQO\IURPWKHWDEOH\RXVSHFLILHGZLWKRXWWKHNLGVWDJJLQJDORQJ
$QRWKHUFRQVHTXHQFHRIPDNLQJDWDEOHXQORJJHGLVWKDWLWVGDWDZRQߞWEHDEOHWR
SDUWLFLSDWHLQ3RVWJUH64/UHSOLFDWLRQ$SJBGXPSRSWLRQDOVRDOORZV\RXWRVNLS 7KLVLVZKHUHWKHONLYNH\ZRUGFRPHVLQKDQG\:HVKRZDQH[DPSOHRILWVXVH
WKHEDFNLQJXSRIXQORJJHGGDWD LQ([DPSOHZKHUHZHZDQWWRGHOHWHRQO\WKRVHUHFRUGVIURPWKH
SURGXFWLRQWDEOHWKDWKDYHQߞWPLJUDWHGWRWKHORJWDEOH:LWKRXWWKHONLY
([DPSOH8QORJJHGWDEOHFUHDWLRQ
PRGLILHUZHߞGHQGXSGHOHWLQJUHFRUGVIURPWKHFKLOGWDEOHWKDWPLJKWKDYH
SELECT tract_name FROM census.lu_tracts WHERE tract_name ILIKE '%duke%'; CREATE UNLOGGED TABLE web_sessions (
session_id text PRIMARY KEY,
tract_name add_ts timestamptz,
------------------------------------------------ upd_ts timestamptz,
Census Tract 2001, Dukes County, Massachusetts session_state xml);
Census Tract 2002, Dukes County, Massachusetts
Census Tract 2003, Dukes County, Massachusetts 7KHUHDUHDIHZRWKHUVDFULILFHV\RXKDYHWRPDNHZLWKXQORJJHGWDEOHV3ULRUWR
Census Tract 2004, Dukes County, Massachusetts 3RVWJUH64/XQORJJHGWDEOHVGLGQߞWVXSSRUW*L67LQGH[HVVHHߡ3RVWJUH64/
Census Tract 9900, Dukes County, Massachusetts
6WRFN,QGH[HVߢZKLFKDUHFRPPRQO\XVHGIRUPRUHDGYDQFHGGDWDW\SHVVXFK
DVDUUD\VUDQJHVMVRQIXOOWH[WDQGVSDWLDO8QORJJHGWDEOHVLQDQ\YHUVLRQZLOO
$1<$UUD\6HDUFK DFFRPPRGDWHWKHFRPPRQ%7UHHDQG*,1LQGH[HV
3RVWJUH64/KDVDFRQVWUXFWFDOOHG$1<WKDWFDQEHXVHGLQFRQMXQFWLRQZLWK 3ULRUWR3RVWJUH64/\RXFRXOGQߞWHDVLO\FRQYHUWDQ81/2**('WDEOHWRD
DUUD\VFRPELQHGZLWKDFRPSDUDWRURSHUDWRURUFRPSDUDWRUNH\ZRUG,IDQ\ ORJJHGRQH7RGRVRLQYHUVLRQHQWHU
HOHPHQWRIWKHDUUD\PDWFKHVDURZWKDWURZLVUHWXUQHG
ALTER TABLE some_table SET LOGGED;
+HUHLVDQH[DPSOH
2IWHQ\RXߞOOILQG\RXUVHOIQHHGLQJWRHQVXUHXQLTXHQHVVIRURQO\DVXEVHWRI\RXU
6KRUWKDQG&DVWLQJ URZV3RVWJUH64/GRHVQRWRIIHUFRQGLWLRQDOXQLTXHFRQVWUDLQWVEXW\RXFDQ
$16,64/GHILQHVDFRQVWUXFWFDOOHGCASTWKDWDOORZV\RXWRPRUSKRQHGDWD DFKLHYHWKHVDPHHIIHFWE\XVLQJDSDUWLDOXQLTXHQHVVLQGH[6HHߡ3DUWLDO
W\SHWRDQRWKHU)RUH[DPSOHCAST('2011-1-11' AS date)FDVWVWKHWH[W ,QGH[HVߢ
2011-1-1WRDGDWH3RVWJUH64/KDVVKRUWKDQGIRUGRLQJWKLVXVLQJDSDLURI
&KHFN&RQVWUDLQWV LQGH[HV
&KHFNFRQVWUDLQWVDUHFRQGLWLRQVWKDWPXVWEHPHWIRUDILHOGRUDVHWRIILHOGVIRU <RXQHHGWRUXQREFRESH MATERIALIZED VIEWWRUHEXLOGWKHFDFKH
HDFKURZ7KHTXHU\SODQQHUWDNHVDGYDQWDJHRIFKHFNFRQVWUDLQWVE\VNLSSLQJ 3RVWJUH64/GRHVQߞWSHUIRUPDXWRPDWLFUHFDFKLQJRIDQ\NLQG<RXQHHGWR
WDEOHVWKDWGRQߞWPHHWWKHFKHFNFRQVWUDLQWVRXWULJKW:HVDZDQH[DPSOHRID UHVRUWWRPHFKDQLVPVVXFKDVcrontabSJ$JHQWMREVRUWULJJHUVWRDXWRPDWH
FKHFNFRQVWUDLQWLQ([DPSOH7KDWSDUWLFXODUH[DPSOHSUHYHQWVWKHSODQQHU DQ\NLQGRIUHIUHVK:HKDYHDQH[DPSOHXVLQJWULJJHUVLQ&DFKLQJ'DWDZLWK
IURPKDYLQJWRVFDQURZVIDLOLQJWRVDWLVI\WKHGDWHUDQJHVSHFLILHGLQDTXHU\ 0DWHULDOL]HG9LHZVDQG6WDWHPHQW/HYHO7ULJJHUV
<RXFDQH[HUFLVHVRPHFUHDWLYLW\LQ\RXUFKHFNFRQVWUDLQWVEHFDXVH\RXFDQXVH
IXQFWLRQVDQG%RROHDQH[SUHVVLRQVWREXLOGFRPSOLFDWHGPDWFKLQJFRQGLWLRQV 5HIUHVKLQJPDWHULDOL]HGYLHZVLQYHUVLRQLVDEORFNLQJRSHUDWLRQPHDQLQJ
)RUH[DPSOHWKHIROORZLQJFRQVWUDLQWUHTXLUHVDOOXVHUQDPHVLQWKHORJVWDEOHVWR WKDWWKHYLHZZLOOQRWEHDFFHVVLEOHGXULQJWKHUHIUHVKSURFHVV,QYHUVLRQ
EHORZHUFDVH \RXFDQOLIWWKLVTXDUDQWLQHE\DGGLQJWKHCONCURRENTLYNH\ZRUGWR\RXU
5()5(6+FRPPDQGSURYLGHGWKDW\RXKDYHHVWDEOLVKHGDXQLTXHLQGH[RQ
ALTER TABLE logs ADD CONSTRAINT chk CHECK (user_name = lower(user_name)); \RXUYLHZ7KHWUDGHRIILVFRQFXUUHQWUHIUHVKHVFRXOGWDNHORQJHUWR
FRPSOHWH
7KHRWKHUQRWHZRUWK\DVSHFWRIFKHFNFRQVWUDLQWVLVWKDWXQOLNHSULPDU\NH\
IRUHLJQNH\DQGXQLTXHNH\FRQVWUDLQWVWKH\LQKHULWIURPSDUHQWWDEOHV
+DQG\&RQVWUXFWLRQV
([FOXVLRQ&RQVWUDLQWV ,QRXUPDQ\\HDUVRIZULWLQJ64/ZHKDYHFRPHWRDSSUHFLDWHWKHOLWWOHWKLQJV
([FOXVLRQFRQVWUDLQWVDOORZ\RXWRLQFRUSRUDWHDGGLWLRQDORSHUDWRUVWRHQIRUFH WKDWPDNHEHWWHUXVHRIRXUW\SLQJ2QO\3RVWJUH64/RIIHUVVRPHRIWKHJHPVZH
XQLTXHQHVVWKDWFDQߞWEHVDWLVILHGE\WKHHTXDOLW\RSHUDWRU([FOXVLRQFRQVWUDLQWV SUHVHQWLQWKLVVHFWLRQ2IWHQWKLVPHDQVWKDWWKHFRQVWUXFWLRQLVQRW$16,
DUHHVSHFLDOO\XVHIXOLQSUREOHPVLQYROYLQJVFKHGXOLQJ FRPSOLDQW,IWK\*RGGHPDQGVVWULFWREVHUYDQFHWRWKH$16,64/VWDQGDUGV
DEVWDLQIURPWKHVKRUWFXWVWKDWZHߞOOEHVKRZLQJ
3RVWJUH64/LQWURGXFHGWKHUDQJHGDWDW\SHVWKDWDUHSHUIHFWFDQGLGDWHVIRU
H[FOXVLRQFRQVWUDLQWV<RXߞOOILQGDILQHH[DPSOHRIXVLQJH[FOXVLRQFRQVWUDLQWV
IRUUDQJHGDWDW\SHVDW:DLWLQJIRU5DQJH'DWD7\SHV
',67,1&721
([FOXVLRQFRQVWUDLQWVDUHJHQHUDOO\HQIRUFHGXVLQJ*L67LQGH[HVEXW\RXFDQ 2QHRIRXUIDYRULWHVLVDISTINCT ON,WEHKDYHVOLNHDISTINCTEXWZLWKWZR
FUHDWHFRPSRXQGLQGH[HVWKDWLQFRUSRUDWH%7UHHDVZHOO%HIRUH\RXGRWKLV HQKDQFHPHQWV\RXFDQVSHFLI\ZKLFKFROXPQVWRFRQVLGHUDVGLVWLQFWDQGWRVRUW
\RXQHHGWRLQVWDOOWKHEWUHHBJLVWH[WHQVLRQ$FODVVLFXVHRIDFRPSRXQG WKHUHPDLQLQJFROXPQV2QHOLWWOHZRUGߚONߚUHSODFHVQXPHURXVOLQHVRI
H[FOXVLRQFRQVWUDLQWLVIRUVFKHGXOLQJUHVRXUFHV DGGLWLRQDOFRGHWRDFKLHYHWKHVDPHUHVXOW
+HUHߞVDQH[DPSOHXVLQJH[FOXVLRQFRQVWUDLQWV6XSSRVH\RXKDYHDIL[HG ,Q([DPSOHZHGHPRQVWUDWHKRZWRJHWWKHGHWDLOVRIWKHILUVWWUDFWIRUHDFK
QXPEHURIFRQIHUHQFHURRPVLQ\RXURIILFHDQGJURXSVPXVWERRNWKHPLQ FRXQW\
DGYDQFH6HHKRZZHߞGSUHYHQWGRXEOHERRNLQJLQ([DPSOHDQGKRZZH ([DPSOH',67,1&721
DUHDEOHWRXVHWKHRYHUODSRSHUDWRU&&IRURXUWHPSRUDOFRPSDULVRQDQGWKH SELECT DISTINCT ON (left(tract_id, 5))
XVXDOHTXDOLW\RSHUDWRUIRUWKHURRPQXPEHU left(tract_id, 5) As county, tract_id, tract_name
FROM census.lu_tracts
([DPSOH3UHYHQWRYHUODSSLQJERRNLQJVIRUWKHVDPHURRP ORDER BY county, tract_id;
)RUVSHHGLHUDFFHVVWRDPDWHULDOL]HGYLHZZLWKDODUJHQXPEHURIUHFRUGV\RX CREATE TABLE schedules(id serial primary key, room int, time_slot tstzrange);
ALTER TABLE schedules ADD CONSTRAINT ex_schedules
PD\ZDQWWRFRQWUROWKHSK\VLFDOVRUWRIWKHGDWD7KHHDVLHVWZD\LVWRLQFOXGH EXCLUDE USING gist (room WITH =, time_slot WITH &&);
DQORDER BYZKHQ\RXFUHDWHWKHYLHZ$OWHUQDWLYHO\\RXFDQDGGDFOXVWHU
LQGH[WRWKHYLHZ)LUVWFUHDWHDQLQGH[LQWKHSK\VLFDOVRUWRUGHU\RXZDQWWR -XVWDVZLWKXQLTXHQHVVFRQVWUDLQWV3RVWJUH64/DXWRPDWLFDOO\FUHDWHVD
KDYH7KHQUXQWKHCLUSTERFRPPDQGSDVVLQJLWWKHLQGH[DVVKRZQLQ FRUUHVSRQGLQJLQGH[RIWKHW\SHVSHFLILHGLQWKHFRQVWUDLQWGHFODUDWLRQ
([DPSOH $UUD\VDUHDQRWKHUSRSXODUW\SHZKHUH(;&/86,21FRQVWUDLQWVFRPHLQKDQG\
([DPSOH&OXVWHULQJDQGUHFOXVWHULQJDYLHZRQDQLQGH[ /HWߞVVXSSRVH\RXKDYHDVHWRIURRPVWKDW\RXQHHGWRDVVLJQWRDJURXSRI
CLUSTER census.vw_facts_2011_materialized USING ix;
SHRSOH:HߞOOFDOOWKHVHURRPߡEORFNVߢ)RUH[SHGLHQF\\RXGHFLGHWRVWRUHRQH
CLUSTER census.vw_facts_2011_materialized; UHFRUGSHUSDUW\EXW\RXZDQWWRHQVXUHWKDWWZRSDUWLHVDUHQHYHUJLYHQWKH
VDPHURRP6R\RXVHWXSDWDEOHDVIROORZV
1DPHWKHLQGH[WRFOXVWHURQ1HHGHGRQO\GXULQJYLHZFUHDWLRQ
(DFKWLPH\RXUHIUHVK\RXPXVWUHFOXVWHUWKHGDWD CREATE TABLE room_blocks(block_id integer primary key, rooms int[]);
7KHDGYDQWDJHRIXVLQJORDER BYLQWKHPDWHULDOL]HGYLHZRYHUXVLQJWKH
&/867(5DSSURDFKLVWKDWWKHVRUWLVPDLQWDLQHGZLWKHDFKREFRESH 7RHQVXUHWKDWQRWZREORFNVKDYHDURRPLQFRPPRQ\RXFDQVHWXSDQ
H[FOXVLRQFRQVWUDLQWSUHYHQWLQJEORFNVIURPRYHUODSSLQJWZREORFNVKDYLQJWKH
MATERIALIZED VIEWFDOODOOHYLDWLQJWKHQHHGWRUHFOXVWHU7KHGRZQVLGHLVWKDW
VDPHURRP([FOXVLRQFRQVWUDLQWVXQIRUWXQDWHO\ZRUNRQO\ZLWK*L67LQGH[HV
ORDER BYJHQHUDOO\DGGVPRUHSURFHVVLQJWLPHWRWKHREFRESHVWHSRIWKHYLHZ
DQGEHFDXVH*,67LQGH[HVGRQߞWH[LVWIRUDUUD\VRXWRIWKHER[\RXQHHGWR
<RXVKRXOGWHVWWKHHIIHFWRIORDER BYRQSHUIRUPDQFHRIREFRESHEHIRUHXVLQJ LQVWDOODQDGGLWLRQDOH[WHQVLRQEHIRUH\RXFDQGRWKLVDVVKRZQLQ([DPSOH
LW2QHZD\WRWHVWLVMXVWWRUXQWKHXQGHUO\LQJTXHU\RIWKHYLHZZLWKDQORDER
([DPSOH3UHYHQWRYHUODSSLQJDUUD\EORFNV
BYFODXVH
CREATE EXTENSION IF NOT EXISTS intarray;
7RUHIUHVKWKHYLHZLQ3RVWJUH64/XVH ALTER TABLE room_blocks
ADD CONSTRAINT ex_room_blocks_rooms
EXCLUDE USING gist(rooms WITH &&);
REFRESH MATERIALIZED VIEW census.vw_facts_2011_materialized;
7KHLQWDUUD\H[WHQVLRQSURYLGHV*L67LQGH[VXSSRUWIRULQWHJHUDUUD\VLQW
7KHYLHZFDQQRWEHTXHULHGZKLOHWKH5()5(6+0$7(5,$/,=('9,(:VWHS LQW$IWHULQWDUUD\LVLQVWDOOHG\RXFDQWKHQXVH*L67ZLWKDUUD\VDQGFUHDWH
LVUXQQLQJ H[FOXVLRQFRQVWUDLQWVRQLQWHJHUDUUD\V
,Q3RVWJUH64/WRDOORZWKHYLHZWREHTXHULHGZKLOHLWߞVUHIUHVKLQJ\RXFDQ
XVH
,QGH[HV
REFRESH MATERIALIZED VIEW CONCURRENTLY census.vw_facts_2011_materialized; 3RVWJUH64/FRPHVZLWKDODYLVKIUDPHZRUNIRUFUHDWLQJDQGILQHWXQLQJLQGH[HV
7KHDUWRI3RVWJUH64/LQGH[LQJFRXOGILOODWRPHDOOE\LWVHOI3RVWJUH64/LV
&XUUHQWOLPLWDWLRQVRIPDWHULDOL]HGYLHZVLQFOXGH SDFNDJHGZLWKVHYHUDOW\SHVRILQGH[HV,I\RXILQGWKHVHLQDGHTXDWH\RXFDQ
<RXFDQߞWXVHCREATE OR REPLACEWRHGLWDQH[LVWLQJPDWHULDOL]HGYLHZ<RX GHILQHQHZLQGH[RSHUDWRUVDQGPRGLILHUVWRVXSSOHPHQW,IVWLOOXQVDWLVILHG
PXVWGURSDQGUHFUHDWHWKHYLHZHYHQIRUWKHPRVWWULYLDORIFKDQJHV8VH \RXߞUHIUHHWRLQYHQW\RXURZQLQGH[W\SH
DROP MATERIALIZED VIEW name_of_view$QQR\LQJO\\RXߞOOORVHDOO\RXU 3RVWJUH64/DOVRDOORZV\RXWRPL[DQGPDWFKGLIIHUHQWLQGH[W\SHVLQWKHVDPH
WDEOHZLWKWKHH[SHFWDWLRQWKDWWKHSODQQHUZLOOFRQVLGHUWKHPDOO)RULQVWDQFH 3RVWJUH64/KDVDQRWKHUDSSURDFKIRUXSGDWLQJYLHZVFDOOHGUXOHVZKLFK
RQHFROXPQFRXOGXVHD%7UHHLQGH[ZKLOHDQDGMDFHQWFROXPQXVHVD*L67 SUHGDWHVWKHLQWURGXFWLRQRIINSTEAD OFWULJJHUVYLHZVXSSRUW<RXFDQVHHDQ
LQGH[ZLWKERWKLQGH[HVFRQWULEXWLQJWRVSHHGXSWKHTXHULHV7RGHOYHPRUHLQWR H[DPSOHXVLQJUXOHVLQ'DWDEDVH$EVWUDFWLRQZLWK8SGDWDEOH9LHZV
WKHPHFKDQLFVRIKRZWKHSODQQHUWDNHVDGYDQWDJHRILQGH[HVYLVLW%LWPDS,QGH[
<RXFDQVWLOOXVHUXOHVWRXSGDWHYLHZGDWDEXWINSTEAD OFWULJJHUVDUH
6FDQ6WUDWHJ\
SUHIHUUHGQRZ,QWHUQDOO\3RVWJUH64/VWLOOXVHVUXOHVWRGHILQHWKHYLHZDYLHZ
<RXFDQFUHDWHLQGH[HVRQWDEOHVZLWKWKHH[FHSWLRQRIIRUHLJQWDEOHVDVZHOODV LVQRWKLQJEXWDQINSTEAD OF SELECTUXOHRQDYLUWXDOWDEOHDQGWRLPSOHPHQW
PDWHULDOL]HGYLHZV VLQJOHWDEOHXSGDWDEOHYLHZV7KHGLIIHUHQFHEHWZHHQXVLQJDWULJJHUDQGDUXOHLV
WKDWDUXOHUHZULWHVWKHXQGHUO\LQJTXHU\DQGDWULJJHUJHWVFDOOHGIRUHDFKYLUWXDO
URZ$VVXFKUXOHVEHFRPHRYHUZKHOPLQJO\GLIILFXOWWRZULWHDQGXQGHUVWDQG
:$51,1*
ZKHQPDQ\WDEOHVDUHLQYROYHG5XOHVDUHDOVROLPLWHGEHFDXVHWKH\FDQEH
,QGH[QDPHVPXVWEHXQLTXHZLWKLQDJLYHQVFKHPD ZULWWHQRQO\LQ64/QRWLQRWKHUSURFHGXUDOODQJXDJHV
0DWHULDOL]HG9LHZV
3RVWJUH64/6WRFN,QGH[HV
0DWHULDOL]HGYLHZVFDFKHWKHIHWFKHGGDWD7KLVKDSSHQVZKHQ\RXILUVWFUHDWH
7RWDNHIXOODGYDQWDJHRIDOOWKDW3RVWJUH64/KDVWRRIIHU\RXߞOOZDQWWR
WKHYLHZDVZHOODVZKHQ\RXUXQWKHREFRESH MATERIALIZED VIEWFRPPDQG
XQGHUVWDQGWKHYDULRXVW\SHVRILQGH[HVDQGVLWXDWLRQVZKHUHWKH\ZLOODLGRU
7RXVHPDWHULDOL]HGYLHZV\RXQHHGDWOHDVWYHUVLRQ
KDUP)ROORZLQJLVDOLVWRIVWRFNLQGH[HV
%7UHH 7KHPRVWFRQYLQFLQJFDVHVIRUXVLQJPDWHULDOL]HGYLHZVDUHZKHQWKHXQGHUO\LQJ
TXHU\WDNHVDORQJWLPHDQGZKHQKDYLQJWLPHO\GDWDLVQRWFULWLFDO<RXRIWHQ
%7UHHLVDJHQHUDOSXUSRVHLQGH[FRPPRQLQUHODWLRQDOGDWDEDVHV<RXFDQ HQFRXQWHUWKHVHVFHQDULRVZKHQEXLOGLQJRQOLQHDQDO\WLFDOSURFHVVLQJ2/$3
XVXDOO\JHWE\ZLWK%7UHHDORQHLI\RXGRQߞWZDQWWRH[SHULPHQWZLWK DSSOLFDWLRQV
DGGLWLRQDOLQGH[W\SHV,I3RVWJUH64/DXWRPDWLFDOO\FUHDWHVDQLQGH[IRU\RX
RU\RXGRQߞWERWKHUVSHFLI\LQJWKHLQGH[PHWKRG%7UHHZLOOEHFKRVHQ,WLV 8QOLNHQRQPDWHULDOL]HGYLHZV\RXFDQDGGLQGH[HVWRPDWHULDOL]HGYLHZVWR
FXUUHQWO\WKHRQO\LQGH[LQJPHWKRGIRUSULPDU\NH\VDQGXQLTXHNH\V VSHHGXSWKHUHDG
([DPSOHGHPRQVWUDWHVKRZWRPDNHDPDWHULDOL]HGYHUVLRQRIWKHYLHZLQ
%5,1
([DPSOH
%ORFNUDQJHLQGH[%5,1LVDQLQGH[W\SHLQWURGXFHGLQ3RVWJUH64/
([DPSOH0DWHULDOL]HGYLHZ
,WߞVGHVLJQHGVSHFLILFDOO\IRUYHU\ODUJHWDEOHVZKHUHXVLQJDQLQGH[VXFKDV
CREATE MATERIALIZED VIEW census.vw_facts_2011_materialized AS
%7UHHZRXOGWDNHXSWRRPXFKVSDFHDQGQRWILWLQPHPRU\7KHDSSURDFK SELECT fact_type_id, val, yr, tract_id FROM [Link] WHERE yr = 2011;
RI%5,1LVWRWUHDWDUDQJHRISDJHVDVRQHXQLW%5,1LQGH[HVDUHPXFK
VPDOOHUWKDQ%7UHHDQGRWKHULQGH[HVDQGIDVWHUWREXLOG%XWWKH\DUH &UHDWHDQLQGH[RQDPDWHULDOL]HGYLHZDV\RXZRXOGGRRQDUHJXODUWDEOHDV
VORZHUWRXVHDQGFDQߞWEHXVHGIRUSULPDU\NH\VRUFHUWDLQRWKHUVLWXDWLRQV VKRZQLQ([DPSOH
([DPSOH$GGLQGH[WRPDWHULDOL]HGYLHZ
*L67
CREATE UNIQUE INDEX ix
*HQHUDOL]HG6HDUFK7UHH*L67LVDQLQGH[RSWLPL]HGIRU)76VSDWLDOGDWD ON census.vw_facts_2011_materialized (tract_id, fact_type_id, yr);
LANGUAGE plpgsql VOLATILE; VFLHQWLILFGDWDXQVWUXFWXUHGGDWDDQGKLHUDUFKLFDOGDWD$OWKRXJK\RXFDQߞW
+DQGOHVGHOHWHV'HOHWHRQO\UHFRUGVZLWKPDWFKLQJNH\VLQWKHOLDUHFRUG XVHLWWRHQIRUFHXQLTXHQHVV\RXFDQFUHDWHWKHVDPHHIIHFWE\XVLQJLWLQDQ
+DQGOHVLQVHUWV H[FOXVLRQFRQVWUDLQW
+DQGOHVXSGDWHV8VHWKHOLDUHFRUGWRGHWHUPLQHZKLFKUHFRUGVWRXSGDWH *L67LVDORVV\LQGH[LQWKHVHQVHWKDWWKHLQGH[LWVHOIZLOOQRWVWRUHWKH
NEWUHFRUGKDVWKHQHZGDWD YDOXHRIZKDWLWߞVLQGH[LQJEXWPHUHO\DERXQGLQJYDOXHVXFKDVDER[IRUD
8SGDWHURZVRQO\LIDWOHDVWRQHRIWKHFROXPQVIURPWKHIDFWVWDEOHKDV SRO\JRQ7KLVFUHDWHVWKHQHHGIRUDQH[WUDORRNXSVWHSLI\RXQHHGWR
FKDQJHG UHWULHYHWKHYDOXHRUGRDPRUHILQHWXQHGFKHFN
1H[WZHELQGWKHWULJJHUIXQFWLRQWRWKHYLHZDVVKRZQLQ([DPSOH *,1
([DPSOH%LQGWULJJHUIXQFWLRQWRYLHZ *HQHUDOL]HG,QYHUWHG,QGH[*,1LVJHDUHGWRZDUGWKHEXLOWLQIXOOWH[W
CREATE TRIGGER trig_01_vw_facts_ins_upd_del VHDUFKDQGELQDU\MVRQGDWDW\SHRI3RVWJUH64/0DQ\RWKHUH[WHQVLRQV
INSTEAD OF INSERT OR UPDATE OR DELETE ON census.vw_facts VXFKDVKVWRUHDQGSJBWUJPDOVRXWLOL]HLW*,1LVDGHVFHQGHQWRI*L67EXW
FOR EACH ROW EXECUTE PROCEDURE census.trig_vw_facts_ins_upd_del();
ZLWKRXWWKHORVVLQHVV*,1ZLOOFORQHWKHYDOXHVLQWKHFROXPQVWKDWDUHSDUW
7KHELQGLQJV\QWD[LVXQFKDUDFWHULVWLFDOO\(QJOLVKOLNH RIWKHLQGH[,I\RXHYHUQHHGDTXHU\OLPLWHGWRFRYHUHGFROXPQV*,1LV
IDVWHUWKDQ*L67+RZHYHUWKHH[WUDUHSOLFDWLRQUHTXLUHGE\*,1PHDQVWKH
1RZZKHQZHXSGDWHGHOHWHRULQVHUWLQWRRXUYLHZZHXSGDWHWKHXQGHUO\LQJ
LQGH[LVODUJHUDQGXSGDWLQJWKHLQGH[LVVORZHUWKDQDFRPSDUDEOH*L67
factsWDEOHLQVWHDG
LQGH[$OVREHFDXVHHDFKLQGH[URZLVOLPLWHGWRDFHUWDLQVL]H\RXFDQߞWXVH
*,1WRLQGH[ODUJHREMHFWVVXFKDVODUJHKVWRUHGRFXPHQWVRUWH[W,IWKHUHLV
UPDATE census.vw_facts SET yr = 2012
WHERE yr = 2011 AND tract_id = '25027761200'; DSRVVLELOLW\\RXߞOOEHLQVHUWLQJDSDJHPDQXDOLQWRDILHOGRIDWDEOH
GRQߞWXVH*,1WRLQGH[WKDWFROXPQ
8SRQDVXFFHVVIXOXSGDWH3RVWJUH64/UHWXUQVWKHIROORZLQJPHVVDJH <RXFDQILQGDZRQGHUIXOH[DPSOHRI*,1LQ:DLWLQJIRU)DVWHU
/,.(,/,.($VRIYHUVLRQ\RXFDQLQGH[UHJXODUH[SUHVVLRQVWKDW
Query returned successfully: 56 rows affected, 40 ms execution time.
OHYHUDJHWKH*,1EDVHGSJBWUJPH[WHQVLRQ
,IZHWU\WRXSGDWHDILHOGQRWLQRXUXSGDWHURZFRPSDULVRQWKHXSGDWHZLOOQRW 63*L67
WDNHSODFH
6SDFH3DUWLWLRQHG*HQHUDOL]HG6HDUFK7UHH63*L67FDQEHXVHGLQWKH
UPDATE census.vw_facts SET short_name = 'test'; VDPHVLWXDWLRQVDV*L67EXWFDQEHIDVWHUIRUFHUWDLQNLQGVRIGDWD
GLVWULEXWLRQ3RVWJUH64/ߞVQDWLYHJHRPHWULFGDWDW\SHVVXFKDVSRLQWDQG
:LWKDPHVVDJH ER[DQGWKHWH[WGDWDW\SHZHUHWKHILUVWWRVXSSRUW63*L67,QYHUVLRQ
VXSSRUWH[WHQGHGWRUDQJHW\SHV
Query returned successfully: 0 rows affected, 931 ms execution time.
KDVK
$OWKRXJKWKLVH[DPSOHFUHDWHGDVLQJOHWULJJHUIXQFWLRQWRKDQGOHPXOWLSOH +DVKLQGH[HVZHUHSRSXODUSULRUWRWKHDGYHQWRI*L67DQG*,1*HQHUDO
HYHQWVZHFRXOGKDYHMXVWDVHDVLO\FUHDWHGDVHSDUDWHWULJJHUDQGWULJJHU FRQVHQVXVUDWHV*L67DQG*,1DERYHKDVKLQWHUPVRIERWKSHUIRUPDQFHDQG
IXQFWLRQIRUHDFKHYHQW WUDQVDFWLRQVDIHW\7KHZULWHDKHDGORJSULRUWR3RVWJUH64/GLGQRWWUDFN
KDVKLQGH[HVWKHUHIRUH\RXFRXOGQߞWXVHWKHPLQVWUHDPLQJUHSOLFDWLRQ ON x.fact_type_id = y.fact_type_id;
VHWXSV$OWKRXJKKDVKLQGH[HVZHUHUHOHJDWHGWROHJDF\VWDWXVIRUVRPHWLPH
7RPDNHWKLVYLHZXSGDWDEOHZLWKDWULJJHU\RXFDQGHILQHRQHRUPRUHINSTEAD
WKH\JRWVRPHORYHLQ3RVWJUH64/,QWKDWYHUVLRQWKH\JDLQHG
OFWULJJHUV:HILUVWGHILQHWKHWULJJHUIXQFWLRQWRKDQGOHWKHWULIHFWDINSERT
WUDQVDFWLRQDOVDIHW\DQGVRPHSHUIRUPDQFHLPSURYHPHQWVWKDWPDGHWKHP
UPDATEDELETE,QDGGLWLRQ3RVWJUH64/VXSSRUWVWULJJHUVRQWKHTRUNCATE
PRUHHIILFLHQWWKDQ%7UHHLQVRPHFDVHV
HYHQW<RXFDQXVHDQ\ODQJXDJHWRZULWHWKHIXQFWLRQH[FHSWSQLDQG\RXߞUH
%7UHH*L67%7UHH*,1 IUHHWRQDPHLWZKDWHYHU\RXOLNH:HFKRVH3/SJ64/LQ([DPSOH
,I\RXZDQWWRH[SORUHLQGH[HVEH\RQGZKDW3RVWJUH64/LQVWDOOVE\GHIDXOW ([DPSOH7ULJJHUIXQFWLRQIRUYZBIDFWVWRLQVHUWXSGDWHGHOHWH
HLWKHURXWRIQHHGRUFXULRVLW\VWDUWZLWKWKHFRPSRVLWH%7UHH*L67RU% CREATE OR REPLACE FUNCTION census.trig_vw_facts_ins_upd_del() RETURNS trigger AS
7UHH*,1LQGH[HVERWKDYDLODEOHDVH[WHQVLRQVDQGLQFOXGHGZLWKPRVW $$
BEGIN
3RVWJUH64/GLVWULEXWLRQV IF (TG_OP = 'DELETE') THEN
DELETE FROM [Link] AS f
7KHVHK\EULGVVXSSRUWWKHVSHFLDOL]HGRSHUDWRUVRI*L67RU*,1EXWDOVR WHERE
RIIHULQGH[DELOLW\RIWKHHTXDOLW\RSHUDWRUOLNH%7UHHLQGH[HV<RXߞOOILQG f.tract_id = OLD.tract_id AND [Link] = [Link] AND
WKHPLQGLVSHQVDEOHZKHQ\RXZDQWWRFUHDWHDFRPSRXQGLQGH[FRPSULVHGRI f.fact_type_id = OLD.fact_type_id;
RETURN OLD;
PXOWLSOHFROXPQVFRQWDLQLQJERWKVLPSOHDQGFRPSOH[W\SHV)RUH[DPSOH END IF;
\RXFDQKDYHDFRPSRXQGLQGH[WKDWFRQVLVWVRIDFROXPQRISODLQWH[WDQGD IF (TG_OP = 'INSERT') THEN
INSERT INTO [Link](tract_id, yr, fact_type_id, val, perc)
FROXPQRIIXOOWH[W1RUPDOO\FRPSOH[W\SHVVXFKDVIXOOWH[WOWUHH SELECT NEW.tract_id, [Link], NEW.fact_type_id, [Link], [Link];
JHRPHWULFDQGVSDWLDOW\SHVFDQXVHRQO\*,1RU*L67LQGH[HVDQGWKXVFDQ RETURN NEW;
QHYHUEHFRPELQHGZLWKVLPSOHUW\SHVWKDWFDQRQO\XVH%7UHH7KHVH END IF;
IF (TG_OP = 'UPDATE') THEN
FRPERPHWKRGVDOORZ\RXWRFRPELQHFROXPQVLQGH[HGZLWK*,67ZLWK IF
FROXPQVLQGH[HGZLWK%7UHHLQDVLQJOHLQGH[ ROW(OLD.fact_type_id, OLD.tract_id, [Link], [Link], [Link]) !=
ROW(NEW.fact_type_id, NEW.tract_id, [Link], [Link], [Link])
$OWKRXJKQRWSDFNDJHGZLWK3RVWJUH64/RWKHULQGH[HVFDQEHIRXQGLQ THEN
H[WHQVLRQVIRU3RVWJUH64/0RVWSRSXODURWKHUVDUHWKH92'.$DQG580D UPDATE [Link] AS f
SET
YDULDQWEDVHGRQ*,1LQGH[PHWKRGW\SHVZKLFKZLOOZRUNZLWK3RVWJUH64/ tract_id = NEW.tract_id,
DQGXS580LVPRVWVXLWHGIRUZRUNZLWKFRPSOH[W\SHVVXFKDVIXOOWH[W yr = [Link],
fact_type_id = NEW.fact_type_id,
DQGLVUHTXLUHGLI\RXQHHGLQGH[VXSSRUWIRUIXOOWH[WSKUDVHVHDUFKHV,WDOVR val = [Link],
RIIHUVDGGLWLRQDOGLVWDQFHRSHUDWRUV perc = [Link]
WHERE
$QRWKHUUHFHQWDGGLWLRQLVSJURRQJDD3RVWJUH64/H[WHQVLRQFXUUHQWO\ f.tract_id = OLD.tract_id AND
VXSSRUWHGIRU3RVWJUH64/DQG,WEULQJVWKHSRZHURIWKHJURRQJDIXOO [Link] = [Link] AND
f.fact_type_id = OLD.fact_type_id;
WH[WHQJLQHDQGFROXPQVWRUHWR3RVWJUH64/3*5RRQJDLQFOXGHVZLWKLWDQ RETURN NEW;
LQGH[FDOOHGSJURRQJDDQGFRPSDQLRQRSHUDWRUV3*5RRQJDVXSSRUWVLQGH[LQJ ELSE
RIUHJXODUWH[WWRSURGXFHIXOOWH[WOLNHIXQFWLRQDOLW\ZLWKRXWQHHGLQJWRKDYHD RETURN NULL;
END IF;
IXOOWH[WYHFWRUDVWKHEXLOWLQ3RVWJUH64/)76UHTXLUHV3*5RRQJDDOVRPDNHV END IF;
,/,.(DQG/,.(
VRPHWKLQJ
LQGH[DEOHVLPLODUWRWKHSJBWUJPH[WHQVLRQ,Q END;
$$
DWDQ\DWWHPSWVWRDGGUHFRUGVRXWVLGHWKHYLHZDQGWRXSGDWHUHFRUGVWKDWZLOO DGGLWLRQLWVXSSRUWVLQGH[LQJRIWH[WDUUD\VDQG-621%7KHUHDUHELQDULHV
SXWWKHPRXWVLGHWKHYLHZ,QRXUH[DPSOHYLHZRXUJRDOLVWROLPLW DYDLODEOHIRU/LQX[0DFDQG:LQGRZV
YZBIDFWVBWRDOORZLQVHUWVRQO\RIGDWDDQGGLVDOORZXSGDWHVRIWKH\U
WRVRPHWKLQJRWKHUWKDQ7RDGGWKLVUHVWULFWLRQZHUHYLVHRXUYLHZ 2SHUDWRU&ODVVHV
GHILQLWLRQDVVKRZQLQ([DPSOH
0RVWRI\RXZLOOVNDWHWKURXJK\RXULQGH[FDSDGHVZLWKRXWHYHUQHHGLQJWR
([DPSOH6LQJOHWDEOHYLHZ:,7+&+(&.237,21 NQRZZKDWRSHUDWRUFODVVHVRSFODVVHVIRUVKRUWDUHDQGZK\WKH\PDWWHUIRU
CREATE OR REPLACE VIEW census.vw_facts_2011 AS LQGH[HV%XWLI\RXIDOWHU\RXߞOOQHHGWRXQGHUVWDQGRSFODVVHVWRWURXEOHVKRRWWKH
SELECT fact_type_id, val, yr, tract_id FROM [Link]
WHERE yr = 2011 WITH CHECK OPTION; SHUHQQLDOTXHVWLRQߡ:K\LVWKHSODQQHUQRWWDNLQJDGYDQWDJHRIP\LQGH["ߢ
1RZWU\WRUXQDQXSGDWHVXFKDV ,QGH[DUFKLWHFWVLQWHQGIRUWKHLULQGH[HVWRZRUNRQO\DJDLQVWFHUWDLQGDWDW\SHV
DQGZLWKVSHFLILFFRPSDULVRQRSHUDWRUV$QH[SHUWLQLQGH[LQJUDQJHVFRXOG
UPDATE census.vw_facts_2011 SET yr = 2012 WHERE val > 2942; REVHVVRYHUWKHRYHUODSRSHUDWRU&&ZKHUHDVDQH[SHUWLQLQGH[LQJWH[W
VHDUFKHVPD\ILQGOLWWOHPHDQLQJLQDQRYHUODS$OLQJXLVWWU\LQJWRLQGH[
<RXߞOOJHWDQHUURU ORJRJUDSKLFODQJXDJHVVXFKDV&KLQHVHSUREDEO\KDVOLWWOHXVHIRULQHTXDOLWLHV
ZKHUHDVDOLQJXLVWWU\LQJWRLQGH[DOSKDEHWLFODQJXDJHVZRXOGILQG$WR=
ERROR: New row violates WITH CHECK OPTION for view "vw_facts_2011" VRUWLQJLQGLVSHQVDEOH
DETAIL: Failing row contains (1, 25001010500, 2012, 2985.000, 100.00).
3RVWJUH64/JURXSVRSHUDWRUVLQWRRSHUDWRUFODVVHV)RUH[DPSOHWKHint4_ops
8VLQJ7ULJJHUVWR8SGDWH9LHZV RSHUDWRUFODVVLQFOXGHVWKHRSHUDWRUV= < > > <WREHDSSOLHGDJDLQVWWKHGDWD
9LHZVFDQHQFDSVXODWHMRLQVDPRQJWDEOHV:KHQDYLHZGUDZVIURPPRUHWKDQ W\SHRIint4FRPPRQO\NQRZQDVDQLQWHJHU7KHSJBRSFODVVV\VWHPWDEOH
RQHWDEOHXSGDWLQJWKHXQGHUO\LQJGDWDZLWKDVLPSOHFRPPDQGLVQRORQJHU SURYLGHVDFRPSOHWHOLVWLQJRIDYDLODEOHRSHUDWRUFODVVHVERWKIURP\RXURULJLQDO
SRVVLEOH'UDZLQJGDWDIURPPRUHWKDQRQHWDEOHLQWURGXFHVLQKHUHQWDPELJXLW\ LQVWDOODQGIURPH[WHQVLRQV$SDUWLFXODULQGH[ZLOOZRUNRQO\DJDLQVWDJLYHQVHW
ZKHQ\RXߞUHWU\LQJWRXSGDWHWKHXQGHUO\LQJGDWDDQG3RVWJUH64/LVQRWDERXW RIRSFODVVHV7RVHHWKLVFRPSOHWHOLVW\RXFDQHLWKHURSHQXSSJ$GPLQDQGORRN
WRPDNHDQDUELWUDU\GHFLVLRQIRU\RX)RULQVWDQFHLI\RXKDYHDYLHZWKDWMRLQV XQGHURSHUDWRUFODVVHVRUH[HFXWHWKHTXHU\LQ([DPSOHWRJHWD
DWDEOHRIFRXQWULHVZLWKDWDEOHRISURYLQFHVDQGWKHQGHFLGHWRGHOHWHRQHRIWKH FRPSUHKHQVLYHYLHZ
URZV3RVWJUH64/ZRQߞWNQRZZKHWKHU\RXLQWHQGWRGHOHWHRQO\DFRXQWU\D ([DPSOH:KLFKGDWDW\SHVDQGRSHUDWRUFODVVHVGRHV%7UHHVXSSRUW"
SURYLQFHRUDSDUWLFXODUFRXQWU\SURYLQFHSDLULQJ1RQHWKHOHVV\RXFDQVWLOO SELECT [Link] AS index_method, [Link] AS opclass_name,
PRGLI\WKHXQGHUO\LQJGDWDWKURXJKWKHYLHZXVLQJWULJJHUV [Link]::regtype AS indexed_type, [Link] AS is_default
FROM pg_am am INNER JOIN pg_opclass opc ON [Link] = [Link]
/HWߞVVWDUWE\FUHDWLQJDYLHZWKDWSXOOVURZVIURPWKHIDFWVWDEOHDQGDORRNXS WHERE [Link] = 'btree'
ORDER BY index_method, indexed_type, opclass_name;
WDEOHDVVKRZQLQ([DPSOH index_method | opclass_name | indexed_type | is_default
-------------+---------------------+--------------+------------
([DPSOH&UHDWLQJYLHZYZBIDFWV btree | bool_ops | boolean | t
CREATE OR REPLACE VIEW census.vw_facts AS ൲
SELECT btree | text_ops | text | t
y.fact_type_id, [Link], y.fact_subcats, y.short_name, btree | text_pattern_ops | text | f
x.tract_id, [Link], [Link], [Link] btree | varchar_ops | text | f
FROM [Link] As x INNER JOIN census.lu_fact_types As y btree | varchar_pattern_ops | text | f
: GDWDZKHQ\RXXVHWKHYLHZ)XUWKHUPRUHXQGHUVRPHFLUFXPVWDQFHV\RXDUH
,Q([DPSOHZHOLPLWRXUUHVXOWWR%7UHH1RWLFHWKDWRQHRSFODVVSHU EDUUHGIURPDFFHVVWRWKHYLHZGXULQJDUHIUHVK
LQGH[HGGDWDW\SHLVPDUNHGDVWKHGHIDXOW:KHQ\RXFUHDWHDQLQGH[ZLWKRXW 9HUVLRQDOORZVXVHUVWRDFFHVVPDWHULDOL]HGYLHZVGXULQJUHIUHVKHV,WDOVR
VSHFLI\LQJWKHRSFODVV3RVWJUH64/FKRRVHVWKHGHIDXOWRSFODVVIRUWKHLQGH[ LQWURGXFHGWKHWITH CHECK OPTIONPRGLILHUZKLFKSUHYHQWVLQVHUWVDQG
*HQHUDOO\WKLVLVJRRGHQRXJKEXWQRWDOZD\V XSGDWHVRXWVLGHWKHVFRSHRIWKHYLHZ
)RULQVWDQFH%7UHHDJDLQVWtext_opsDNDvarchar_opsGRHVQߞWLQFOXGHWKH
~~RSHUDWRUWKHLIKERSHUDWRUVRQRQHRI\RXULIKEVHDUFKHVFDQXVHDQLQGH[ 6LQJOH7DEOH9LHZV
LQWKHtext_opsRSFODVV,I\RXSODQRQGRLQJPDQ\ZLOGFDUGVHDUFKHVRQ 7KHVLPSOHVWYLHZGUDZVIURPDVLQJOHWDEOH$OZD\VLQFOXGHWKHSULPDU\NH\LI
varcharRUtextFROXPQV\RXߞGEHEHWWHURIIH[SOLFLWO\FKRRVLQJWKH \RXLQWHQGWRZULWHGDWDEDFNWRWKHWDEOHDVVKRZQLQ([DPSOH
text_pattern_opsvarchar_pattern_opsRSFODVVIRU\RXULQGH[7RVSHFLI\ ([DPSOH6LQJOHWDEOHYLHZ
WKHRSFODVVMXVWDSSHQGWKHRSFODVVDIWHUWKHFROXPQQDPHDVLQ
CREATE OR REPLACE VIEW census.vw_facts_2011 AS
SELECT fact_type_id, val, yr, tract_id FROM [Link] WHERE yr = 2011;
CREATE INDEX idx1 ON census.lu_tracts USING btree (tract_name text_pattern_ops);
$VRIYHUVLRQ\RXFDQDOWHUWKHGDWDLQWKLVYLHZE\XVLQJINSERTUPDATE
RUDELETEFRPPDQGV8SGDWHVDQGGHOHWHVZLOODELGHE\DQ\WHEREFRQGLWLRQ
127( \RXKDYHDVSDUWRI\RXUYLHZ)RUH[DPSOHWKHIROORZLQJTXHU\ZLOOGHOHWHRQO\
<RXZLOOQRWLFHWKDWWKHOLVWFRQWDLQVERWKvarchar_opsDQGtext_opsEXWWKH\PDSRQO\WR UHFRUGVZKRVHvalueLV
textcharacter varyingGRHVQߞWKDYH%7UHHRSHUDWRUVRILWVRZQEHFDXVHLWLVHVVHQWLDOO\
WH[WZLWKDOHQJWKFRQVWUDLQWvarchar_opsDQGvarchar_pattern_opsDUHMXVWDOLDVHVIRU
text_opsDQGtext_pattern_opsWRVDWLVI\WKHGHVLUHRIVRPHWRPDLQWDLQWKLVV\PPHWU\RI DELETE FROM census.vw_facts_2011 WHERE val = 0;
RSFODVVHVVWDUWLQJZLWKWKHQDPHRIWKHW\SHWKH\VXSSRUW
$QGWKHIROORZLQJZLOOQRWXSGDWHDQ\UHFRUGVEHFDXVHWKHYLHZH[SOLFLWO\
LQFOXGHVRQO\UHFRUGVIRU
)LQDOO\UHPHPEHUWKDWHDFKLQGH[\RXFUHDWHZRUNVDJDLQVWRQO\DVLQJOH
RSFODVV,I\RXZRXOGOLNHDQLQGH[RQDFROXPQWRFRYHUPXOWLSOHRSFODVVHV\RX UPDATE census.vw_facts_2011 SET val = 1 WHERE yr = 2012;
PXVWFUHDWHVHSDUDWHLQGH[HV7RDGGWKHGHIDXOWLQGH[text_opsWRDWDEOHUXQ
%HDZDUHWKDW\RXFDQLQVHUWGDWDWKDWSODFHVLWRXWVLGHRIWKHYLHZߞVWHERERU
CREATE INDEX idx2 ON census.lu_tracts USING btree (tract_name); XSGDWHGDWDVRLWLVQRORQJHUYLVLEOHIURPWKHYLHZDVVKRZQLQ([DPSOH
([DPSOH9LHZXSGDWHWKDWUHVXOWVLQGDWDQRORQJHUYLVLEOHLQYLHZ
1RZ\RXKDYHWZRLQGH[HVDJDLQVWWKHVDPHFROXPQ7KHUHߞVQROLPLWWRWKH UPDATE census.vw_facts_2011 SET yr = 2012 WHERE yr = 2011;
QXPEHURILQGH[HV\RXFDQEXLOGDJDLQVWDVLQJOHFROXPQ7KHSODQQHUZLOO
FKRRVHidx2IRUEDVLFHTXDOLW\TXHULHVDQGidx1IRUFRPSDULVRQVXVLQJ/,.( 7KHXSGDWHRI([DPSOHGRHVQRWYLRODWHWKHWHEREFRQGLWLRQ%XWRQFH
H[HFXWHG\RXZRXOGKDYHHPSWLHG\RXUYLHZ)RUWKHVDNHRIVDQLW\\RXPD\
<RXߞOOILQGRSHUDWRUFODVVHVGHWDLOHGLQWKH2SHUDWRU&ODVVHVVHFWLRQRIWKH
ILQGLWGHVLUDEOHWRSUHYHQWXSGDWHVRULQVHUWVWKDWOHDYHGDWDLQYLVLEOHWRIXUWKHU
RIILFLDOGRFXPHQWDWLRQ:HDOVRVWURQJO\UHFRPPHQGWKDW\RXUHDGRXUDUWLFOHIRU
TXHULHV9HUVLRQLQWURGXFHGWKHWITH CHECK OPTIONWRDFFRPSOLVKWKLV
WLSVRQWURXEOHVKRRWLQJLQGH[LVVXHV:K\LV0\,QGH[1RW8VHG"
,QFOXGHWKLVPRGLILHUZKHQFUHDWLQJWKHYLHZDQG3RVWJUH64/ZLOOIRUHYHUEDON
)XQFWLRQDO,QGH[HV
&KDSWHU64/7KH3RVWJUH64/ 3RVWJUH64/OHWV\RXDGGLQGH[HVWRIXQFWLRQVRIFROXPQV)XQFWLRQDOLQGH[HV
:D\ SURYHWKHLUXVHIXOQHVVLQPL[HGFDVHWH[WXDOGDWD3RVWJUH64/LVDFDVHVHQVLWLYH
GDWDEDVH7RSHUIRUPDFDVHLQVHQVLWLYHVHDUFK\RXFRXOGFUHDWHDIXQFWLRQDO
LQGH[
VKRUWKDQGVWRDYDQWJDUGHIHDWXUHVWKDWEUHDNWKHERXQGVRIWUDGLWLRQDO64/,Q
WKLVFKDSWHUZHߞOOFRYHUVRPH64/WLGELWVQRWRIWHQIRXQGLQRWKHUGDWDEDVHV 7KLVQH[WH[DPSOHXVHVWKHVDPHIXQFWLRQWRXSSHUFDVHWKHIXOOQDPHFROXPQ
)RUWKLVFKDSWHU\RXVKRXOGKDYHDZRUNLQJNQRZOHGJHRI64/RWKHUZLVH\RX EHIRUHFRPSDULQJ6LQFHZHFUHDWHGWKHLQGH[ZLWKWKHVDPHupper(fullname)
PD\QRWDSSUHFLDWHWKHODERUVDYLQJDPXVHERXFKHWKDW3RVWJUH64/EULQJVWRWKH H[SUHVVLRQWKHSODQQHUZLOOEHDEOHWRXVHWKHLQGH[IRUWKLVTXHU\
WDEOH
SELECT fullname FROM featnames_short WHERE upper(fullname) LIKE 'S%';
9LHZV :$51,1*
:HOOGHVLJQHGUHODWLRQDOGDWDEDVHVVWRUHGDWDLQQRUPDOL]HGIRUP7RDFFHVVWKLV $OZD\VXVHWKHVDPHIXQFWLRQDOH[SUHVVLRQZKHQTXHU\LQJWRHQVXUHXVHRIWKHLQGH[
GDWDDFURVVVFDWWHUHGWDEOHV\RXZULWHTXHULHVWRMRLQXQGHUO\LQJWDEOHV:KHQ
\RXILQG\RXUVHOIZULWLQJWKHVDPHTXHU\RYHUDQGRYHUDJDLQFUHDWHDYLHZ
6LPSO\SXWDYLHZLVQRWKLQJPRUHWKDQDTXHU\SHUPDQHQWO\VWRUHGLQWKH 3DUWLDO,QGH[HV
GDWDEDVH
3DUWLDOLQGH[HVVRPHWLPHVFDOOHGILOWHUHGLQGH[HVDUHLQGH[HVWKDWFRYHURQO\
6RPHSXULVWVKDYHDUJXHGWKDWRQHVKRXOGDOZD\VTXHU\DYLHZQHYHUWDEOHV URZVILWWLQJDSUHGHILQHGWHEREFRQGLWLRQ)RULQVWDQFHLI\RXKDYHDWDEOHRI
7KLVPHDQV\RXPXVWFUHDWHDYLHZIRUHYHU\WDEOHWKDW\RXLQWHQGWRTXHU\ URZVEXW\RXFDUHDERXWDIL[HGVHWRI\RXߞUHEHWWHURII
GLUHFWO\7KHDGGHGOD\HURILQGLUHFWLRQHDVHVPDQDJHPHQWRISHUPLVVLRQVDQG FUHDWLQJSDUWLDOLQGH[HV7KHUHVXOWLQJLQGH[HVFDQEHIDVWHUEHFDXVHPRUHFDQILW
IDFLOLWDWHVDEVWUDFWLRQRIWDEOHGDWD:HILQGWKLVWREHVRXQGDGYLFHEXWOD]LQHVV LQWR5$0SOXV\RXߞOOVDYHDELWRIGLVNVSDFHRQWKHLQGH[LWVHOI
JHWVWKHEHWWHURIXV
3DUWLDOLQGH[HVOHW\RXSODFHXQLTXHQHVVFRQVWUDLQWVRQO\RQVRPHURZVRIWKH
9LHZVLQ3RVWJUH64/KDYHHYROYHGRYHUWKH\HDUV9HUVLRQXQYHLOHG GDWD3UHWHQGWKDW\RXPDQDJHQHZVSDSHUVXEVFULEHUVZKRVLJQHGXSLQWKHSDVW
DXWRPDWLFDOO\XSGDWDEOHYLHZV,I\RXUYLHZGUDZVIURPDVLQJOHWDEOHDQG\RX \HDUVDQGZDQWWRHQVXUHWKDWQRERG\LVJHWWLQJPRUHWKDQRQHSDSHUGHOLYHUHG
LQFOXGHWKHSULPDU\NH\DVDQRXWSXWFROXPQ\RXFDQLVVXHDQXSGDWHFRPPDQG SHUGD\:LWKGZLQGOLQJLQWHUHVWLQSULQWPHGLDRQO\DERXWRI\RXU
GLUHFWO\DJDLQVW\RXUYLHZ'DWDLQWKHXQGHUO\LQJWDEOHZLOOIROORZVXLW VXEVFULEHUVKDYHDFXUUHQWVXEVFULSWLRQ<RXGRQߞWFDUHDERXWVXEVFULEHUVEHLQJ
9HUVLRQDOVRLQWURGXFHGPDWHULDOL]HGYLHZV:KHQ\RXPDUNDYLHZDV GXSOLFDWHGZKRKDYHVWRSSHGJHWWLQJQHZVSDSHUVEHFDXVHWKH\ߞUHQRWRQWKH
PDWHULDOL]HGLWZLOOUHTXHU\WKHGDWDRQO\ZKHQ\RXLVVXHWKHREFRESH FDUULHUVߞOLVWDQ\ZD\<RXUWDEOHORRNVOLNHWKLV
FRPPDQG7KHXSVLGHLVWKDW\RXߞUHQRWZDVWLQJUHVRXUFHVUXQQLQJFRPSOH[
CREATE TABLE subscribers (
TXHULHVUHSHDWHGO\WKHGRZQVLGHLVWKDW\RXPLJKWQRWKDYHWKHPRVWXSWRGDWH
id serial PRIMARY KEY, <RXFDQRSHQXSWKHSODQQHUDQGFRQILUPWKDWWKHSODQQHULQGHHGXVHG\RXU
name varchar(50) NOT NULL, type varchar(50),
is_active boolean);
LQGH[
:HDGGDSDUWLDOLQGH[WRJXDUDQWHHXQLTXHQHVVRQO\IRUFXUUHQWVXEVFULEHUV 0XOWLFROXPQ,QGH[HV
CREATE UNIQUE INDEX uq ON subscribers USING btree(lower(name)) WHERE is_active;
<RXߞYHDOUHDG\VHHQPDQ\H[DPSOHVRIPXOWLFROXPQDNDFRPSRXQGLQGH[HVLQ
WKLVFKDSWHUEXW\RXFDQDOVRFUHDWHIXQFWLRQDOLQGH[HVXVLQJPRUHWKDQRQH
XQGHUO\LQJFROXPQ+HUHLVDQH[DPSOHRIDPXOWLFROXPQLQGH[
:$51,1*
CREATE INDEX idx ON subscribers
)XQFWLRQVXVHGLQWKHLQGH[ߞVWHEREFRQGLWLRQPXVWEHLPPXWDEOH7KLVPHDQV\RXFDQߞWXVH
USING btree (type, upper(name) varchar_pattern_ops);
WLPHIXQFWLRQVOLNHCURRENT_DATERUGDWDIURPRWKHUWDEOHVRURWKHUURZVRIWKHLQGH[HG
WDEOHWRGHWHUPLQHZKHWKHUDUHFRUGVKRXOGEHLQGH[HG
7KH3RVWJUH64/SODQQHUXVHVDVWUDWHJ\FDOOHGELWPDSLQGH[VFDQWKDW
DXWRPDWLFDOO\WULHVWRFRPELQHLQGH[HVRQWKHIO\RIWHQIURPVLQJOHFROXPQ
2QHZDUQLQJZHVWUHVVLVWKDWZKHQ\RXTXHU\WKHGDWDLQRUGHUIRUWKHLQGH[WR LQGH[HVWRDFKLHYHWKHVDPHJRDODVDPXOWLFROXPQLQGH[,I\RXߞUHXQDEOHWR
EHFRQVLGHUHGE\WKHSODQQHUWKHFRQGLWLRQVXVHGZKHQFUHDWLQJWKHLQGH[PXVW SUHGLFWKRZ\RXߞOOEHTXHU\LQJFRPSRXQGILHOGVLQWKHIXWXUH\RXPD\EHEHWWHU
EHDSDUWRI\RXUWHEREFRQGLWLRQDQGDQ\IXQFWLRQVXVHGLQWKHLQGH[PXVWDOVR RIIFUHDWLQJVLQJOHFROXPQLQGH[HVDQGOHWWKHSODQQHUGHFLGHKRZWRFRPELQH
EHXVHGLQWKHTXHU\ILOWHU7KLVLQGH[LVERWK3$57,$/DQGIXQFWLRQDOEHFDXVH WKHPGXULQJVHDUFK
ZKDWLWLQGH[HVLVupper(name)QRWname$QHDV\ZD\WRQRWKDYHWRZRUU\ ,I\RXKDYHDPXOWLFROXPQ%7UHHLQGH[RQtypeDQGupper(name)WKHUHLVQR
DERXWWKLVLVWRXVHDYLHZ%DFNWRRXUVXEVFULEHUVH[DPSOHFUHDWHDYLHZDV QHHGIRUDQLQGH[RQMXVWtypeEHFDXVHWKHSODQQHUFDQVWLOOXVHWKHFRPSRXQG
IROORZV LQGH[IRUFDVHVLQZKLFK\RXMXVWQHHGWRILOWHUE\type$OWKRXJKWKHSODQQHU
FDQXVHWKHLQGH[HYHQLIWKHFROXPQV\RXDUHTXHU\LQJDUHQRWWKHILUVWLQWKH
CREATE OR REPLACE VIEW vw_subscribers_current AS
SELECT id, lower(name) As name FROM subscribers WHERE is_active = true;
LQGH[TXHU\LQJE\WKHILUVWFROXPQLQDQLQGH[LVPXFKPRUHHIILFLHQWWKDQ
TXHU\LQJE\MXVWVHFRQGDU\FROXPQV
7KHQDOZD\VTXHU\WKHYLHZLQVWHDGRIWKHWDEOHPDQ\SXULVWVDGYRFDWHQHYHU 7KHSODQQHUFDQDOVRHPSOR\DVWUDWHJ\FDOOHGDQLQGH[RQO\VFDQZKLFKHQDEOHV
TXHU\LQJWDEOHVGLUHFWO\DQ\ZD\$YLHZLVDVDYHGTXHU\WKDWLVWUDQVSDUHQWWR WKHSODQQHUWRXVHMXVWWKHLQGH[DQGQRWWKHWDEOHLIWKHLQGH[FRQWDLQVDOOWKH
WKHSODQQHU$Q\TXHU\GRQHRQDYLHZZLOOLQFOXGHWKHYLHZߞV:+(5( FROXPQVQHHGHGWRVDWLVI\DTXHU\6RLI\RXFRPPRQO\ILOWHUE\WKHVDPHVHWRI
FRQGLWLRQVDQGIXQFWLRQDODGGLWLRQVDVZHOODVZKDWRWKHUDGGLWLRQVWKHTXHU\ ILHOGVDQGRXWSXWWKRVHDFRPSRXQGLQGH[FDQLPSURYHVSHHGVLQFHLWFDQVNLS
DGGV7KHYLHZZHFUHDWHGGRHVWZRWKLQJVWRPDNHLQGH[HVDYDLODEOHWRTXHULHV WKHWDEOH.HHSLQPLQGWKDWWKHPRUHFROXPQV\RXKDYHLQDQLQGH[WKHIDWWHU
7KHYLHZUHSODFHVWKHQDPHFROXPQZLWKORZHUQDPHVRWKDWZKHQZHGRD \RXULQGH[DQGWKHOHVVRILWWKDWFDQHDVLO\ILWLQ5$0'RQߞWJRRYHUERDUGZLWK
TXHU\DJDLQVWQDPHZLWKWKHYLHZLWߞVVKRUWKDQGIRUORZHUQDPHDJDLQVWWKH FRPSRXQGLQGH[HV
XQGHUO\LQJWDEOH7KHYLHZDOVRHQDEOHVis_active = trueZKLFKPHDQVDQ\
TXHU\DJDLQVWWKHYLHZZLOODXWRPDWLFDOO\KDYHWKDWFRQGLWLRQLQLWDQGEHDEOHWR
XVHWKH3$57,$/LQGH[