0% found this document useful (0 votes)
95 views194 pages

PostgreSQL: Up and Running Guide

This document provides publishing details for the third edition of the book "PostgreSQL: Up and Running" including the cover image, authors, publisher, and revision history. The cover image features an elephant shrew, a small African mammal. The book is published by O'Reilly Media and provides a practical guide to the advanced open source database PostgreSQL. It was first released in October 2017 and written by database experts Regina Obe and Leo Hsu.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
95 views194 pages

PostgreSQL: Up and Running Guide

This document provides publishing details for the third edition of the book "PostgreSQL: Up and Running" including the cover image, authors, publisher, and revision history. The cover image features an elephant shrew, a small African mammal. The book is published by O'Reilly Media and provides a practical guide to the advanced open source database PostgreSQL. It was first released in October 2017 and written by database experts Regina Obe and Leo Hsu.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

LPSRUWDQWWRWKHZRUOG7ROHDUQPRUHDERXWKRZ\RXFDQKHOSJRWR

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
0DFURVFHOLGHVSURERVFLGHXV DQLQVHFWLYRURXVPDPPDOQDWLYHWR$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 XVH2QOLQHHGLWLRQVDUHDOVRDYDLODEOHIRUPRVWWLWOHV KWWSRUHLOO\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 $FWLRQ 0DQQLQJ DQGSJ5RXWLQJ$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
0DQQLQJ DQGSJ5RXWLQJ$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

1RWXVLQJ3RVWJUH64/\HW"7KLVERRNLVSURSDJDQGDߚWKHJRRGNLQG(DFKGD\ DYRLGLQJ6(/(&7 $YRLG6(/(&7


\RXFRQWLQXHWRXVHDGDWDEDVHZLWKOLPLWHG64/FDSDELOLWLHV\RXKDQGLFDS
&$6(XVDJHFRQVLGHUDWLRQV0DNH*RRG8VHRI&$6(
\RXUVHOI(DFKGD\WKDW\RXߞUHZHGGHGWRDSURSULHWDU\V\VWHP\RXߞUHEOHHGLQJ
GROODUV ),/7(5XVDJHFRQVLGHUDWLRQV8VLQJ),/7(5,QVWHDGRI&$6(
)LQDOO\LI\RXUZRUNKDVQRWKLQJWRGRZLWKGDWDEDVHVRU,7RULI\RXߞYHMXVW
RYHUXVLQJVXETXHULHVLQ6(/(&72YHUXVLQJ6XETXHULHVLQ6(/(&7
JUDGXDWHGIURPNLQGHUJDUWHQWKHFXWHSLFWXUHRIWKHHOHSKDQWVKUHZRQWKHFRYHU
2YHUXVLQJ6XETXHULHVLQ6(/(&7
VKRXOGEHZRUWK\RIWKHSULFHDORQH
ZULWLQJIXQFWLRQV

)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

Constant width bold DERXW3RVWJUH64/'DWDEDVH2EMHFWV9LHZV

6KRZVFRPPDQGVRURWKHUWH[WWKDWVKRXOGEHW\SHGOLWHUDOO\E\WKHXVHU DYRLGLQJ6(/(&7 ZLWKLQ$YRLG6(/(&7

Constant width italic PDWHULDOL]HG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/9LHZV0DWHULDOL]HG


6KRZVWH[WWKDWVKRXOGEHUHSODFHGZLWKXVHUVXSSOLHGYDOXHVRUE\YDOXHV 9LHZV0DWHULDOL]HG9LHZV
GHWHUPLQHGE\FRQWH[W
SURWHFWLQJDJDLQVWXSGDWHVLQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/

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
:$/ ZULWHDKHDGORJ 5HSOLFDWLRQ-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+VX 2ߞ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 6DIDUL IRUPHUO\6DIDUL%RRNV2QOLQH LVDPHPEHUVKLSEDVHGWUDLQLQJDQG
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(

87& &RRUGLQDWHG8QLYHUVDO7LPH 7HPSRUDOV


WVHDUFKH[WHQVLRQ&ODVVLFH[WHQVLRQV
&KDSWHU7KH%DVLFV
WVTXHULHV764XHULHV764XHULHV

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\SHV GDWD  VHHGDWDW\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/9 DND3/-DYD6FULSW 3/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/PRYHPHQWV WKRXJK
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

WH[WXDOV VHHFKDUDFWHUVDQGVWULQJV ,QWKHHQG\RXZLOOZRQGHUZK\\RXHYHUXVHGDQ\RWKHUGDWDEDVHEHFDXVH


3RVWJUH64/GRHVHYHU\WKLQJ\RXFRXOGKRSHIRUDQGGRHVLWIRUIUHH1RPRUH
WKLUGSDUW\UHSOLFDWLRQRSWLRQV7KLUG3DUW\5HSOLFDWLRQ2SWLRQV UHDGLQJWKHOLFHQVLQJFRVWILQHSULQWRIWKRVHRWKHUGDWDEDVHVWRILJXUHRXWKRZ
PDQ\GROODUV\RXQHHGWRVSHQGLI\RXKDYHHLJKWFRUHVRQ\RXUYLUWXDOL]HG
WLPHGDWDW\SH7HPSRUDOV
VHUYHUVZLWK;QXPEHURIFRQFXUUHQWFRQQHFWLRQV1RPRUHIUHWWLQJDERXWKRZ
WLPH]RQHV PXFKPRUHWKHQH[WXSJUDGHZLOOFRVW\RX

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[HFXWLRQV SVTO 7LPLQJ([HFXWLRQV PDQDJHPHQWFRXOGEHRYHUNLOO<RXPLJKWFRQVLGHUDVLQJOHXVHUGDWDEDVHVXFK
DV64/LWHRUDGDWDEDVHVXFKDV)LUHELUGWKDWFDQEHUXQHLWKHUDVDFOLHQWVHUYHU
72$67 7KH2YHUVL]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\RIFORXGFRPSXWLQJVXFKDV3ODWIRUPDVD6HUYLFH 3DD6 DQG
'DWDEDVHDVD6HUYLFH 'EDD6 0RVWRIWKHPDMRU3DD6DQG'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 &69RUWDE DQGDPLQLPDOLVWLFUHSRUWZULWHUWKDWFDQJHQHUDWH+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 /76 YHUVLRQVXSSRUWHGDQG 675,&7TXDOLILHU)XQFWLRQ%DVLFV
GLVWULEXWHGE\%LJ64/DQGVSHQGDOLWWOHWLPHWHVWGULYLQJSJ$GPLQEHIRUH\RX
VWULQJV VHHFKDUDFWHUVDQGVWULQJV
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

VLPLODUWRRSHUDWRU a 5HJXODU([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/ UHODWLRQDOGDWDEDVHSURGXFWV DQGWKDWߞ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\VFKHPDVZRXOGEHWKHLQGLYLGXDOVWDWHV RUSURYLQFHVSUHIHFWXUHVRU
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
URZV UHFRUGV
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& UDQGRPSDJHFRVW UDWLR5DQGRP3DJH&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
UHVWRUH VHHEDFNXSDQGUHVWRUH VFKHPDQDPH6RPHH[WHQVLRQVHVSHFLDOO\RQHVWKDWLQVWDOODQHZSURFHGXUDO
ODQJXDJH 3/ 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
ULJKWV VHHSULYLOHJHV )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 -DYD6FULSW DQG3/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 )':V IDFLOLWDWHWKHPDJLFKDQGVKDNHEHWZHHQ FDVFDGLQJ5HSOLFDWLRQ-DUJRQ
3RVWJUH64/DQGH[WHUQDOGDWDVRXUFHV)':LPSOHPHQWDWLRQVLQ3RVWJUH64/
IROORZWKH64/0DQDJHPHQWRI([WHUQDO'DWD 0(' 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
UDQGRPSDJHFRVW 53& 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\ZKLFKFROXPQ V WR
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/
UHFRUGV URZV 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
WDEOHVZKLFKOLVWDOOWDEOHV LQFOXGLQJYLHZV LQDGDWDEDVHDQGYLHZVZKLFK 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 )76 LVDQDWXUDOODQJXDJHߙ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]LSFRGHV ZKLFKDUHILYH
GLJLWVORQJLQWKH86 WRFKDUDFWHUIURPLQWHJHU<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<RXFDQQRZUHSOLFDWHMXVWDWDEOHRUDGDWDEDVH QR
DERXW3ULYLOHJHV QHHGIRUWKHZKROHFOXVWHU VLQFH\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$FFRXQW SRVWJUHV WDEOHVWUXFWXUH7KLVIHDWXUHKDVH[LVWHGIRUVRPHWLPHLQ2UDFOHDQG,%0
'%GDWDEDVHV5HIHUWR([DPSOH
VHWWLQJ&UHDWLQJ'DWDEDVH$VVHWVDQG6HWWLQJ3ULYLOHJHV3ULYLOHJH
PDQDJHPHQW )':SXVKGRZQDJJUHJDWHVWRUHPRWHVHUYHUV
W\SHVRI7\SHVRI3ULYLOHJHV 7KH)':$3,FDQQRZUXQDJJUHJDWLRQVVXFKDV&2817 RU680 RQ
UHPRWHTXHULHVSRVWJUHVBIGZWDNHVDGYDQWDJHRIWKLVQHZIHDWXUH3ULRUWR
SURFHGXUDOODQJXDJHV 3/V 3RVWJUH64/'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$FFRXQW SRVWJUHV
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/V SURFHGXUDOODQJXDJHV 3RVWJUH64/'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 SHUFHQWLOHBGLVF SHUFHQWLOHGLVFUHWH DQGSHUFHQWLOHBFRQW SHUFHQWLOH
GDWDEDVHUHVWRUHDQG'DWDEDVH5HVWRUHSJBUHVWRUH FRQWLQXRXV ZHUHDGGHG7KH\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

SJBVWDWBVWDWHPHQWVYLHZ*DWKHULQJ6WDWLVWLFVRQ6WDWHPHQWV WITH CHECK OPTIONFODXVHDGGHGWRWKHCREATE VIEWVWDWHPHQWZLOOEORFN


XSGDWHRULQVHUWRQWKHYLHZLIWKHUHVXOWLQJGDWDZRXOGQRORQJHUEHYLVLEOH
SJBVWDWBVWDWHPHQWVBUHVHWIXQFWLRQ*DWKHULQJ6WDWLVWLFVRQ6WDWHPHQWV LQWKHYLHZ:HGHPRQVWUDWHWKLVIHDWXUHLQ([DPSOH
SJBVWDWBXVHUBLQGH[HVYLHZ+RZ8VHIXO,V<RXU,QGH[" $QHZGDWDW\SHJSONB
SJBVWDWBXVHUBWDEOHVYLHZ+RZ8VHIXO,V<RXU,QGH[" 7KH-DYD6FULSWREMHFWQRWDWLRQELQDU\W\SHDOORZV\RXWRLQGH[DIXOO-621
GRFXPHQWDQGH[SHGLWHUHWULHYDORIVXEHOHPHQWV)RUGHWDLOVVHHߡ-621ߢDQG
SJBWHUPLQDWHBEDFNHQGIXQFWLRQ0DQDJLQJ&RQQHFWLRQV FKHFNRXWWKHVHEORJSRVWV,QWURGXFHMVRQE$6WUXFWXUHG)RUPDWIRU6WRULQJ
SJBWUJPH[WHQVLRQ3RSXODUH[WHQVLRQV3RVWJUH64/6WRFN,QGH[HV -621DQG-621%:LOGFDUG4XHU\
,PSURYHG*HQHUDOL]HG,QYHUWHG,QGH[ *,1
SJBWVBFRQILJIXQFWLRQ)76&RQILJXUDWLRQV
*,1ZDVGHVLJQHGZLWK)76WULJUDPVKVWRUHVDQG-621%LQPLQG8QGHU
PDQ\FLUFXPVWDQFHV\RXPD\FKRRVH*,1ZLWKLWVVPDOOHUIRRWSULQWRYHU% SJBGXPSWRRO
7UHHZLWKRXWORVVLQSHUIRUPDQFH9HUVLRQLPSURYHGLWVTXHU\VSHHG
&KHFNRXW*,1DVD6XEVWLWXWHIRU%LWPDS,QGH[HV DERXW%DFNXSDQG5HVWRUH6HOHFWLYH%DFNXS8VLQJSJBGXPS'DWDEDVH
%DFNXS8VLQJSJBGXPS
0RUH-621IXQFWLRQV
SJ$GPLQDQG6HOHFWLYHEDFNXSRIGDWDEDVHDVVHWV
7KHVHDUHMVRQBEXLOGBDUUD\MVRQBEXLOGBREMHFWMVRQBREMHFWMVRQBWRBUHFRUG
DQGMVRQBWRBUHFRUGVHW VHOHFWLYHEDFNXSDQG6HOHFWLYHEDFNXSRIGDWDEDVHDVVHWV
([SHGLWHGPRYHVEHWZHHQWDEOHVSDFHV XQORJJHGWDEOHVDQG8QORJJHG7DEOHV
<RXFDQQRZPRYHDOOGDWDEDVHREMHFWVIURPRQHWDEOHVSDFHWRDQRWKHUE\
YHUVLRQFRQVLGHUDWLRQV%DFNXSDQG5HVWRUH
XVLQJWKHV\QWD[ALTER TABLESPACE old_space MOVE ALL TO
new_space; SJBGXPSDOOWRRO
5RZQXPEHUVLQUHWXUQHGVHWV DERXW%DFNXSDQG5HVWRUH
<RXFDQDGGDURZQXPEHUIRUVHWUHWXUQLQJIXQFWLRQVZLWKWKHV\VWHP
VHOHFWLYHEDFNXSDQG%DFNLQJXSV\VWHPZLGHREMHFWV
FROXPQRUGLQDOLW\7KLVLVSDUWLFXODUO\KDQG\ZKHQFRQYHUWLQJGHQRUPDOL]HG
GDWDVWRUHGLQDUUD\VKVWRUHVDQGFRPSRVLWHW\SHVWRUHFRUGV+HUHLVDQ VHUYHUEDFNXSDQG6HUYHU%DFNXSSJBGXPSDOO
H[DPSOHXVLQJKVWRUH
V\VWHPZLGHEDFNXS6\VWHPZLGH%DFNXS8VLQJSJBGXPSDOO
SELECT ordinality, key, value
FROM EACH('breed=>pug,cuteness=>high'::hstore) WITH ordinality; SJBILOHBVHWWLQJVYLHZ&KHFNLQJSRVWJUHVTOFRQIVHWWLQJV

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

SJFFRPPDQGOLQHWRRO:LQGRZVDQG'HVNWRS/LQX[ ROWS FROM

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(7 ERWK0LFURVRIWRU0RQR \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-6 QRFRPSLODWLRQUHTXLUHG DQG1RGH'%,
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 VRXUFHOLFHQVLQJ DOWKRXJK*UHHQ3OXPZDVFORVHGVRXUFHIRUDSHULRG 7KHVH
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 %'5 IRUNGHYHORSHGE\QG4XDGUDQW3LHFHVRI%'5VXFKDVWKH
SHUIRUPDQFHWXQLQJ VHHTXHU\SHUIRUPDQFHWXQLQJ ORJLFDOUHSOLFDWLRQVXSSRUWDUHEHHILQJXSWKHEXLOWLQUHSOLFDWLRQIXQFWLRQDOLW\LQ
3RVWJUH64/SURSHU6RPHRIWKHSDUDOOHOL]DWLRQZRUNRI3RVWJUHV;/ZLOODOVR
3HUOODQJXDJH'DWDEDVH'ULYHUV OLNHO\PDNHLWLQWRIXWXUHYHUVLRQVRI3RVWJUH64/
SHUPLVVLRQV VHHSULYLOHJHV &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/$3 RQOLQHDQDO\WLFDOSURFHVVLQJ DSSOLFDWLRQV0DWHULDOL]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
PHGLDQ VWDWLVWLF 3HUFHQWLOHVDQG0RGH
<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\VWRSSLQJDQGUHVWDUWLQJWKHSRVWJUHVVHUYLFH GDHPRQ <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 3RVWPDVWHUVHWWLQJVDIIHFWWKHHQWLUHVHUYHU SRVWPDVWHUUHSUHVHQWVWKH
3DUDOOHOL]HG4XHULHV 3RVWJUH64/VHUYLFH DQGWDNHHIIHFWRQO\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

SHOW deadlock_timeout; FURQWDEFRPPDQG-RE6FKHGXOLQJZLWKSJ$JHQW

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
DSSOLHGVHWWRIDOVH I 7KHDSSOLHGLVVKRZQLQ([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
ORFDO PHDQLQJDVRFNHWRQWKHORFDOV\VWHP RUORFDOKRVWPHDQLQJWKH,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

SULYLOHJHVIURPJURXSUROHV&UHDWLQJ*URXS5ROHV ALTER SYSTEM SET work_mem = '500MB';

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& JUDQGXQLILHGFRQILJXUDWLRQ 3RVWJUH64/'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"

7KLVLVWKHOHDVWVHFXUHDXWKHQWLFDWLRQHVVHQWLDOO\QRSDVVZRUGLVQHHGHG$V *'$/ *HRVSDWLDO'DWD$EVWUDFWLRQ/LEUDU\ 4XHU\LQJ2WKHU7DEXODU)RUPDWV


ORQJDVWKHXVHUDQGGDWDEDVHH[LVWLQWKHV\VWHPDQGWKHUHTXHVWFRPHVIURP ZLWKRJUBIGZ
DQ,3ZLWKLQWKHDOORZHGUDQJHWKHXVHUFDQFRQQHFW<RXVKRXOGLPSOHPHQW
WUXVWRQO\IRUORFDOFRQQHFWLRQVRUSULYDWHQHWZRUNFRQQHFWLRQV(YHQWKHQ *HQHUDOL]HG,QYHUWHG,QGH[ *,1 )HDWXUHV,QWURGXFHGLQ3RVWJUH64/
LWߞVSRVVLEOHIRUVRPHRQHWRVSRRI,3DGGUHVVHVVRWKHPRUHVHFXULW\PLQGHG 3RVWJUH64/6WRFN,QGH[HV
DPRQJXVGLVFRXUDJHLWVXVHHQWLUHO\1HYHUWKHOHVVLWߞVWKHPRVWFRPPRQIRU
*HQHUDOL]HG6HDUFK7UHH *L67 LQGH[HV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
3RVWJUH64/LQVWDOOHGRQDGHVNWRSIRUVLQJOHXVHUORFDODFFHVVZKHUHVHFXULW\
8QORJJHG7DEOHV3RVWJUH64/6WRFN,QGH[HV
LVQRWDFRQFHUQ
PG JHQHUDWHBVHULHVIXQFWLRQ*HQHUDWH6HULHV)XQFWLRQ'DWHWLPH2SHUDWRUVDQG
)XQFWLRQV6HW5HWXUQLQJ)XQFWLRQVLQ6(/(&7:,7+25',1$/,7<
9HU\FRPPRQUHTXLUHVDQPGHQFU\SWHGSDVVZRUGWRFRQQHFW
JHRFRGLQJSJ6FULSWDQGSJ6FULSW
SDVVZRUG
8VHVFOHDUWH[WSDVVZRUGDXWKHQWLFDWLRQ JHRPHWULFPHDQ:ULWLQJ64/$JJUHJDWH)XQFWLRQV:ULWLQJ64/$JJUHJDWH
)XQFWLRQV:ULWLQJ$JJUHJDWH)XQFWLRQVZLWK3/9
LGHQW
*HRVSDWLDO'DWD$EVWUDFWLRQ/LEUDU\ *'$/ 4XHU\LQJ2WKHU7DEXODU)RUPDWV
8VHVSJBLGHQWFRQIWRFKHFNZKHWKHUWKH26DFFRXQWRIWKHXVHUWU\LQJWR
ZLWKRJUBIGZ
FRQQHFWKDVDPDSSLQJWRD3RVWJUH64/DFFRXQW7KHSDVVZRUGLVQRW
FKHFNHGLGHQWLVQRWDYDLODEOHRQ:LQGRZV ?JH[HFFRPPDQG'\QDPLF64/([HFXWLRQ
SHHU *,1 *HQHUDOL]HG,QYHUWHG,QGH[ )HDWXUHV,QWURGXFHGLQ3RVWJUH64/
8VHVWKH26QDPHRIWKHXVHUIURPWKHNHUQHO,WLVDYDLODEOHRQO\IRU/LQX[ 3RVWJUH64/6WRFN,QGH[HV
%6'PDF26DQG6RODULVDQGRQO\IRUORFDOFRQQHFWLRQVRQWKHVHV\VWHPV
*L67 *HQHUDOL]HG6HDUFK7UHH LQGH[HV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
FHUW 8QORJJHG7DEOHV3RVWJUH64/6WRFN,QGH[HV
6WLSXODWHVWKDWFRQQHFWLRQVXVH66/7KHFOLHQWPXVWKDYHDUHJLVWHUHG
JOREDOYDULDEOHV&UHDWLQJ*URXS5ROHV
FHUWLILFDWHFHUWXVHVDQLGHQWILOHVXFKDVSJBLGHQWWRPDSWKHFHUWLILFDWHWRD
3RVWJUH64/XVHUDQGLVDYDLODEOHRQDOOSODWIRUPVZKHUH66/FRQQHFWLRQLV *RRJOH&ORXG64/IRU3RVWJUH64/1RWDEOH3RVWJUH64/)RUNV
HQDEOHG
*RRJOH9HQJLQH:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW
0RUHHVRWHULFRSWLRQVDERXQGVXFKDVJVVUDGLXVOGDSDQGSDP6RPHPD\QRW
)XQFWLRQV
DOZD\VEHLQVWDOOHGE\GHIDXOW
<RXFDQHOHFWPRUHWKDQRQHDXWKHQWLFDWLRQPHWKRGHYHQIRUWKHVDPHGDWDEDVH JUDQGXQLILHGFRQILJXUDWLRQ *8& 3RVWJUH64/'DWDEDVH2EMHFWV
.HHSLQPLQGWKDWSJBKEDFRQILVSURFHVVHGIURPWRSWRERWWRP *5$17FRPPDQG&UHDWLQJ*URXS5ROHV*5$17'HIDXOW3ULYLOHJHV
3/&RIIHH6FULSW:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW 0DQDJLQJ&RQQHFWLRQV
)XQFWLRQV:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
0RUHRIWHQWKDQQRWVRPHRQHHOVH QHYHU\RXRIFRXUVH ZLOOH[HFXWHDQ
3//LYH6FULSW:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW LQHIILFLHQWTXHU\WKDWHQGVXSKRJJLQJUHVRXUFHV7KH\FRXOGDOVRUXQDTXHU\
)XQFWLRQV:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9 WKDWߞVWDNLQJPXFKORQJHUWKDQZKDWWKH\KDYHSDWLHQFHIRU&DQFHOOLQJWKHTXHU\
WHUPLQDWLQJWKHFRQQHFWLRQRUERWKZLOOSXWDQHQGWRWKHRIIHQGLQJTXHU\
3/SJ64/:ULWLQJ3/SJ64/)XQFWLRQV:ULWLQJ7ULJJHU)XQFWLRQVLQ
&DQFHOOLQJDQGWHUPLQDWLQJDUHIDUIURPJUDFHIXODQGVKRXOGEHXVHGVSDULQJO\
3/SJ64/
<RXUFOLHQWDSSOLFDWLRQVKRXOGSUHYHQWTXHULHVIURPJRLQJKD\ZLUHLQWKHILUVW
3/3\WKRQ:ULWLQJ3/3\WKRQ)XQFWLRQV%DVLF3\WKRQ)XQFWLRQ SODFH2XWRISROLWHQHVV\RXSUREDEO\VKRXOGDOHUWWKHFRQQHFWHGUROHWKDW\RXߞUH
DERXWWRWHUPLQDWHLWVFRQQHFWLRQRUZDLWXQWLODIWHUKRXUVWRGRWKHGLUW\GHHG
3/9:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW)XQFWLRQV
7KHUHDUHIHZVFHQDULRVZKHUH\RXVKRXOGFDQFHODOODFWLYHXSGDWHTXHULHV
:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9
EHIRUHEDFNLQJXSWKHGDWDEDVHDQGEHIRUHUHVWRULQJWKHGDWDEDVH
UDQNLQJVHDUFKUHVXOWV5DQNLQJ5HVXOWV 7RFDQFHOUXQQLQJTXHULHVDQGWHUPLQDWHFRQQHFWLRQVIROORZWKHVHVWHSV
VHWUHWXUQLQJ6HW5HWXUQLQJ)XQFWLRQVLQ6(/(&7:,7+25',1$/,7<  5HWULHYHDOLVWLQJRIUHFHQWFRQQHFWLRQVDQGSURFHVV,'V 3,'V 
%DVLF64/)XQFWLRQ
SELECT * FROM pg_stat_activity;
VWDWH$JJUHJDWHV

VWDWLVWLFDO3HUFHQWLOHVDQG0RGH3HUFHQWLOHVDQG0RGH SJBVWDWBDFWLYLW\LVDYLHZWKDWOLVWVWKHODVWTXHU\UXQQLQJRQHDFKFRQQHFWLRQ
WKHFRQQHFWHGXVHU XVHQDPH WKHGDWDEDVH GDWQDPH LQXVHDQGWKHVWDUW
VWULQJ6WULQJ)XQFWLRQV WLPHVRIWKHTXHULHV5HYLHZWKHOLVWWRLGHQWLI\WKH3,'VRIFRQQHFWLRQV\RX
ZLVKWRWHUPLQDWH
WULJJHU3RVWJUH64/'DWDEDVH2EMHFWV7ULJJHUVDQG7ULJJHU)XQFWLRQV
7ULJJHUVDQG7ULJJHU)XQFWLRQV:ULWLQJ7ULJJHU)XQFWLRQVLQ3/SJ64/  &DQFHODFWLYHTXHULHVRQDFRQQHFWLRQZLWK3,'1234

WUXVWHGDQGXQWUXVWHGODQJXDJHV7UXVWHGDQG8QWUXVWHG/DQJXDJHV%DVLF SELECT pg_cancel_backend(1234);


3\WKRQ)XQFWLRQ
7KLVGRHVQRWWHUPLQDWHWKHFRQQHFWLRQLWVHOIWKRXJK
ZLQGRZ:LQGRZ)XQFWLRQV25'(5%<:ULWLQJ:LQGRZ)XQFWLRQVLQ
3/9:ULWLQJ:LQGRZ)XQFWLRQVLQ3/9  7HUPLQDWHWKHFRQQHFWLRQ

ZULWLQJZLWK64/:ULWLQJ)XQFWLRQVZLWK64/:ULWLQJ64/$JJUHJDWH SELECT pg_terminate_backend(1234);


)XQFWLRQV
<RXPD\QHHGWRWDNHWKHDGGLWLRQDOVWHSRIWHUPLQDWLQJWKHFOLHQWFRQQHFWLRQ
IX]]\VWUPDWFKH[WHQVLRQ6WHS,QVWDOOLQJLQWRDGDWDEDVH3RSXODUH[WHQVLRQV
7KLVLVHVSHFLDOO\LPSRUWDQWSULRUWRDGDWDEDVHUHVWRUH,I\RXGRQߞWWHUPLQDWH
* WKHFRQQHFWLRQWKHFOLHQWPD\LPPHGLDWHO\UHFRQQHFWDIWHUUHVWRUHDQGUXQWKH
RIIHQGLQJTXHU\DQHZ,I\RXGLGQRWDOUHDG\FDQFHOWKHTXHULHVRQWKH MVRQGDWDW\SHVXSSRUW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/)XOO7H[W
FRQQHFWLRQWHUPLQDWLQJWKHFRQQHFWLRQZLOOFDQFHODOORILWVTXHULHV 6XSSRUWIRU-621DQG-621%
3RVWJUH64/OHWV\RXHPEHGIXQFWLRQVZLWKLQDUHJXODU6(/(&7VWDWHPHQW(YHQ MVRQEGDWDW\SHVXSSRUW)HDWXUHV,QWURGXFHGLQ3RVWJUH64/)XOO7H[W
WKRXJKSJBWHUPLQDWHBEDFNHQGDQGSJBFDQFHOBEDFNHQGDFWRQRQO\RQH 6XSSRUWIRU-621DQG-621%
FRQQHFWLRQDWDWLPH\RXFDQNLOOPXOWLSOHFRQQHFWLRQVE\ZUDSSLQJWKHPLQD
6(/(&7)RUH[DPSOHOHWߞVVXSSRVH\RXZDQWWRNLOODOOFRQQHFWLRQVEHORQJLQJ UDQNLQJUHVXOWV5DQNLQJ5HVXOWV
WRDUROHZLWKDVLQJOHEORZ5XQWKLV64/FRPPDQG
WVTXHULHV764XHULHV764XHULHV
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE usename = 'some_role';
WVYHFWRUGDWDW\SH769HFWRUV

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

)76 IXOOWH[WVHDUFK ,QDGGLWLRQWRWKHFKDQJHLQVWUXFWXUH3RVWJUH64/ZLOOQRZWUDFNDGGLWLRQDO


ZDLWORFNVWKDWGLGQRWJHWVHWWRwaiting=trueLQSULRUYHUVLRQV$VDUHVXOW
DERXW3RVWJUH64/'DWDEDVH2EMHFWV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ \RXPD\ILQGOLJKWHUORFNZDLWVEHLQJOLVWHGIRUTXHULHVWKDQ\RXVDZLQSULRU
)XOO7H[W6HDUFK YHUVLRQV)RUDOLVWRIGLIIHUHQWZDLWBHYHQWW\SHVUHIHUWR3RVWJUH64/0DQXDO
ZDLWBHYHQWQDPHVDQGW\SHV
)76FRQILJXUDWLRQV)76&RQILJXUDWLRQV)76&RQILJXUDWLRQV

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
ORJLQUROHZLWKWKHQDPHSRVWJUHV 3RVWJUH64/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

SRSXODU3RSXODUH[WHQVLRQV GRANT royalty TO leo;


GRANT royalty TO regina;
XSJUDGLQJWRQHZPRGHO8SJUDGLQJWRWKHQHZH[WHQVLRQPRGHO
6RPHSULYLOHJHVFDQߞWEHLQKHULWHG)RUH[DPSOHDOWKRXJK\RXFDQFUHDWHD
) JURXSUROHWKDW\RXPDUNDVVXSHUXVHUWKLVGRHVQߞWPDNHLWVPHPEHUUROHV
)':V IRUHLJQGDWDZUDSSHUV VXSHUXVHUV+RZHYHUWKRVHXVHUVFDQLPSHUVRQDWHWKHLUJURXSUROHE\XVLQJWKH
6(752/(FRPPDQGWKHUHE\JDLQLQJVXSHUXVHUSULYLOHJHVIRUWKHGXUDWLRQRI
DERXW3RVWJUH64/'DWDEDVH2EMHFWV5HSOLFDWLRQDQG([WHUQDO'DWD)RUHLJQ WKHVHVVLRQ)RUH[DPSOH
'DWD:UDSSHUV /HWߞVJLYHWKHUR\DOW\UROHVXSHUXVHUULJKWVZLWKWKHFRPPDQG
TXHU\LQJIODWILOHV4XHU\LQJ)ODW)LOHV4XHU\LQJ)ODW)LOHVDV-DJJHG$UUD\V
ALTER ROLE royalty SUPERUSER;
TXHU\LQJIRUHLJQVHUYHUV4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV4XHU\LQJ
$OWKRXJKleoLVDPHPEHURIWKHUR\DOW\JURXSDQGKHLQKHULWVPRVWULJKWVRI G\QDPLFBVKDUHGBPHPRU\BW\SHQHWZRUNVHWWLQJ3DUDOOHOL]HG4XHULHV
UR\DOW\ZKHQKHORJVLQKHVWLOOZLOOQRWKDYHVXSHUXVHUULJKWV+HFDQJDLQ
VXSHUXVHUULJKWVE\GRLQJ (

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/ HQGRIOLIH VXSSRUW: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

'RFXPHQW7\SH'HILQLWLRQ '7' ,QVHUWLQJ;0/'DWD :HߞOOGRDVHWRIH[HUFLVHVWKDWLOOXVWUDWHWKHGLIIHUHQFHVEHWZHHQSET ROLEDQG


SET SESSION AUTHORIZATIONE\ILUVWORJJLQJLQDVOHRDQGWKHQUXQQLQJWKH
GROODUTXRWLQJ  'ROODU4XRWLQJ'2 FRGHLQ([DPSOH
'523)25(,*17$%/(FRPPDQG4XHU\LQJ)ODW)LOHV ([DPSOH6(752/(DQG6(7$87+25,=$7,21
SELECT session_user, current_user;
'5230$7(5,$/,=('9,(:FRPPDQG0DWHULDOL]HG9LHZV session_user | current_user
--------------+--------------
'52338%/,&$7,21FRPPDQG5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHV leo | leo
(1 row)
ZLWK/RJLFDO5HSOLFDWLRQ SET SESSION AUTHORIZATION regina;
ERROR: permission denied to set session authorization
'52367$7,67,&6FRPPDQG7DEOH6WDWLVWLFV SET ROLE regina;
ERROR: permission denied to set role "regina"
'52368%6&5,37,21FRPPDQG5HSOLFDWLQJ2QO\6RPH7DEOHVRU'DWDEDVHV ALTER ROLE leo SUPERUSER;
ERROR: must be superuser to alter superusers
ZLWK/RJLFDO5HSOLFDWLRQ SET ROLE royalty;
SELECT session_user, current_user;
'5237$%/(FRPPDQG3DUWLWLRQHG7DEOHV session_user | current_user
--------------+--------------
leo | royalty
'67 GD\OLJKWVDYLQJWLPH 7HPSRUDOV (1 row)
SET ROLE regina;
'7' 'RFXPHQW7\SH'HILQLWLRQ ,QVHUWLQJ;0/'DWD ERROR: permission denied to set role "regina"
ALTER ROLE leo SUPERUSER;
'XQVWDQ$QGUHZ%DVLF)XQFWLRQV SET ROLE regina;
SELECT session_user, current_user;
G\QDPLFEDFNJURXQGZRUNHUV)HDWXUHV,QWURGXFHGLQ3RVWJUH64/ session_user | current_user
--------------+--------------
leo | regina
G\QDPLF64/H[HFXWLRQ'\QDPLF64/([HFXWLRQ'\QDPLF64/([HFXWLRQ (1 row)
SET SESSION AUTHORIZATION regina;
ERROR: permission denied to set session authorization VHUYLFHVDQG3RVWJUH64/'DWDEDVH2EMHFWV
-- After ending session and logging back in as leo
SELECT session_user, current_user;
SET SESSION AUTHORIZATION regina; GDWDEDVHGULYHUV'DWDEDVH'ULYHUV
SELECT session_user, current_user;
session_user | current_user GDWDEDVHREMHFWV
--------------+--------------
leo | leo UHWULHYLQJGHWDLOVRI5HWULHYLQJ'HWDLOVRI'DWDEDVH2EMHFWV
(1 row)
SET SESSION AUTHORIZATION
session_user | current_user
W\SHVVXSSRUWHG3RVWJUH64/'DWDEDVH2EMHFWV3RVWJUH64/'DWDEDVH2EMHFWV
--------------+--------------
regina | regina GDWHGDWDW\SH7HPSRUDOV
(1 row)
GDWHUDQJHGDWDW\SH7HPSRUDOV%XLOWLQ5DQJH7\SHV
,Q([DPSOHOHRZDVXQDEOHWRXVH6(76(66,21$87+25,=$7,21
EHFDXVHKHߞVQRWDVXSHUXVHU+HZDVDOVRXQDEOHWR6(752/(WRUHJLQD GDWHWLPHRSHUDWRUVDQGIXQFWLRQV'DWHWLPH2SHUDWRUVDQG)XQFWLRQV'DWHWLPH
EHFDXVHKHLVQRWLQWKHUHJLQDJURXS+RZHYHUKHZDVDEOHWRSET ROLE 2SHUDWRUVDQG)XQFWLRQV
royaltyVLQFHKHLVDPHPEHURIWKHUR\DOW\JURXS KHߞVDNLQJFRQVRUW (YHQ
WKRXJKUR\DOW\KDVVXSHUXVHUULJKWVKHVWLOOZDVQߞWDEOHWRLPSHUVRQDWHWKH GDWHBSDUWIXQFWLRQ'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
TXHHQUHJLQDEHFDXVHKLV6(752/(DELOLWLHVDUHVWLOOEDVHGRQEHLQJWKH GD\OLJKWVDYLQJWLPH '67 7HPSRUDOV
SRZHUOHVVOHR6LQFHUR\DOW\LVDJURXSWKDWKDVVXSHUXVHUULJKWVKHZDVDEOHWR
SURPRWHKLVRZQDFFRXQWOHRWREHDVXSHUXVHU2QFHOHRLVSURPRWHGWRSRZHU GEOLQNH[WHQVLRQ3RSXODUH[WHQVLRQV
KHFDQWKHQLPSHUVRQDWHUHJLQD+HLVQRZDEOHWRFRPSOHWHO\WDNHRYHUKHU
''/ GDWDGHILQLWLRQODQJXDJH 3RVWJUH64/'DWDEDVH2EMHFWV5HSOLFDWLRQ
VHVVLRQBXVHUDQGFXUUHQWBXVHUSHUVRQDZLWK6(76(66,21$87+25,=$7,21
-DUJRQ

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\PDQDJHPHQWEXVLQHVV GRJJLHVSD <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

&5($7(7$%/(FRPPDQG6HULDOV,QVHUWLQJ-621'DWD%LQDU\-621MVRQE search_path = "$user", public;


3DUWLWLRQHG7DEOHV
1RZLIUROHFXVWRPHUORJVLQDOOTXHULHVZLOOILUVWORRNLQWKHFXVWRPHU
&5($7(7$%/(63$&(FRPPDQG&UHDWLQJ7DEOHVSDFHV VFKHPDIRUWKHWDEOHVEHIRUHPRYLQJWRSXEOLF0RVWLPSRUWDQWO\WKH64/
&5($7(7<3(FRPPDQG7<3(2) UHPDLQVWKHVDPHIRUDOOFXVWRPHUV(YHQLIWKHEXVLQHVVJURZVWRKDYH
WKRXVDQGVRUKXQGUHGVRIWKRXVDQGVRIGRJRZQHUVQRQHRIWKH64/VFULSWVQHHG
&5($7(81,48(,1'(;FRPPDQG0DWHULDOL]HG9LHZV WRFKDQJH&RPPRQO\VKDUHGWDEOHVVXFKDVFRPPRQORRNXSWDEOHVFDQEHSXWLQ
WKHSXEOLFVFKHPD
&5($7(86(5FRPPDQG5ROHV4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
$QRWKHUSUDFWLFHWKDWZHVWURQJO\HQFRXUDJHLVWRFUHDWHVFKHPDVWRKRXVH
&5($7('%SULYLOHJH'DWDEDVH&UHDWLRQ H[WHQVLRQV ߡ6WHS,QVWDOOLQJLQWRDGDWDEDVHߢ :KHQ\RXLQVWDOODQH[WHQVLRQ
QHZWDEOHVIXQFWLRQVGDWDW\SHVDQGSOHQW\RIRWKHUUHOLFVMRLQ\RXUVHUYHU,I
FURQWDEFRPPDQG-RE6FKHGXOLQJZLWKSJ$JHQW
WKH\DOOVZDUPLQWRWKHSXEOLFVFKHPDLWJHWVFOXWWHUHG)RUH[DPSOHWKHHQWLUH
?FURVVWDEFRPPDQG&URVVWDEV 3RVW*,6VXLWHRIH[WHQVLRQVZLOOWRJHWKHUDGGWKRXVDQGVRIIXQFWLRQV,I\RXߞYH
DOUHDG\FUHDWHGDIHZWDEOHVDQGIXQFWLRQVRI\RXURZQLQWKHSXEOLFVFKHPD
?FURVVWDEYLHZFRPPDQG&URVVWDEV LPDJLQHKRZPDGGHQLQJLWZRXOGEHWRVFDQDOLVWRIWDEOHVDQGIXQFWLRQVWU\LQJ
WRILQG\RXURZQDPRQJWKHWKRXVDQGV
&69IRUPDW([SRUWLQJTXHULHVDVDVWUXFWXUHGILOHRUUHSRUWLQSJ$GPLQ
4XHU\LQJ)ODW)LOHV4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ %HIRUH\RXLQVWDOODQ\H[WHQVLRQVFUHDWHDQHZVFKHPD

&7(V FRPPRQWDEOHH[SUHVVLRQV CREATE SCHEMA my_extensions;

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
3ULYLOHJHV RIWHQFDOOHGSHUPLVVLRQV FDQEHWULFN\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/6 ILUVWDSSHDUHGLQ3RVWJUH64/$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
FRQWULEV VHHH[WHQVLRQV
ERWKQDPHGSRVWJUHV/RJLQWR\RXUVHUYHUDVSRVWJUHV
&RRUGLQDWHG8QLYHUVDO7LPH 87& 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

2EYLRXVO\\RXQHHGWRKDYHWKHSULYLOHJH\RXߞUHJUDQWLQJ$QG\RXPXVW FRPPRQWDEOHH[SUHVVLRQV &7(V


KDYHWKH*5$17SULYLOHJH\RXUVHOI<RXFDQߞWJLYHDZD\ZKDW\RXGRQߞW
KDYH DERXW&RPPRQ7DEOH([SUHVVLRQV

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;

&/867(5FRPPDQG0DWHULDOL]HG9LHZV ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema


GRANT SELECT, REFERENCES ON TABLES TO PUBLIC;
&RIIHH6FULSWODQJXDJH:ULWLQJ3/93/&RIIHH6FULSWDQG3//LYH6FULSW
ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema
)XQFWLRQV GRANT ALL ON TABLES TO mydb_admin WITH GRANT OPTION;

FRORQ  6KRUWFXWV ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema


GRANT SELECT, UPDATE ON SEQUENCES TO public;
&2/8016FODXVH4XHU\LQJ;0/'DWD
ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema
GRANT ALL ON FUNCTIONS TO mydb_admin WITH GRANT OPTION;
FROXPQVYLHZ3RVWJUH64/'DWDEDVH2EMHFWV
ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema
FRPPDQGOLQHWRROV GRANT USAGE ON TYPES 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
*UDQWUHDGDQGUHIHUHQFHULJKWV WKHDELOLW\WRFUHDWHIRUHLJQNH\FRQVWUDLQWV
DJDLQVWFROXPQVLQDWDEOH IRUDOOIXWXUHWDEOHVFUHDWHGLQDVFKHPDWRDOO %5,1 EORFNUDQJHLQGH[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
%'5 ELGLUHFWLRQDOUHSOLFDWLRQ 1RWDEOH3RVWJUH64/)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 %'5 1RWDEOH3RVWJUH64/)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

SELECT pg_describe_object([Link],[Link],0) AS description VSOLWWLQJVWULQJVLQWR6SOLWWLQJ6WULQJVLQWR$UUD\V7DEOHVRU6XEVWULQJV


FROM pg_catalog.pg_depend AS D INNER JOIN pg_catalog.pg_extension AS E
ON [Link] = [Link] XQQHVWIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
WHERE
[Link] = 'pg_catalog.pg_extension'::pg_catalog.regclass AND XQQHVWLQJWRURZV8QQHVWLQJ$UUD\VWR5RZV
deptype = 'e' AND
[Link] = 'fuzzystrmatch';
]HURLQGH[HGIRU-6214XHU\LQJ-621
7KLVVKRZVZKDWߞVSDFNDJHGLQWKHH[WHQVLRQ DUUD\BDJJIXQFWLRQ)HDWXUHV,QWURGXFHGLQ3RVWJUH64/$UUD\&RQVWUXFWRUV
2XWSXWWLQJ-621&RPSRVLWH7\SHVLQ4XHULHV
description
---------------------------------------------------------------------------
function dmetaphone_alt(text)
DUUD\BWRBMVRQIXQFWLRQ2XWSXWWLQJ-621&RPSRVLWH7\SHVLQ4XHULHV
function dmetaphone(text)
function difference(text,text) DUUD\BXSSHUIXQFWLRQ5HIHUHQFLQJ(OHPHQWVLQDQ$UUD\
function text_soundex(text)
function soundex(text) DV\QFKURQRXVUHSOLFDWLRQ5HSOLFDWLRQ-DUJRQ
function metaphone(text,integer)
function levenshtein_less_equal(text,text,integer,integer,integer,integer) DWVLJQVHOHFWLQJDWWULEXWHVRIHOHPHQWV4XHU\LQJ;0/'DWD
function levenshtein_less_equal(text,text,integer)
function levenshtein(text,text,integer,integer,integer)
function levenshtein(text,text) DXWKHQWLFDWLRQPHWKRGV7KHSJBKEDFRQI)LOH$XWKHQWLFDWLRQPHWKRGV

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[WHQVLRQ YHUVLRQVDQG
$/7(57$%/(63$&(FRPPDQG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
DERYH RUVKDUHFRQWULE SULRUWRYHUVLRQ 7KLVPDNHVWKHH[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

$1<RSHUDWRU$1<$UUD\6HDUFK SELECT * FROM pg_available_extensions;

DSWBSRVWJUHVTOUHSRVLWRU\'HELDQ8EXQWX 6WHS,QVWDOOLQJLQWRDGDWDEDVH

DUFKLYHBFRPPDQGFRQILJXUDWLRQGLUHFWLYH&RQILJXULQJWKH0DVWHU 7KHH[WHQVLRQVXSSRUWPDNHVLQVWDOODWLRQRIDGGHGIHDWXUHVVLPSOH8VHWKH
&5($7((;7(16,21FRPPDQGWRLQVWDOOH[WHQVLRQVLQWRHDFKGDWDEDVH7KH
DUJXPHQWVLQIXQFWLRQV)XQFWLRQ%DVLFV WKUHHELJEHQHILWVDUHWKDW\RXGRQߞWKDYHWRILJXUHRXWZKHUHWKHH[WHQVLRQILOHV
DUHNHSW VKDUHH[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

psql -p 5432 -d mydb -c "CREATE EXTENSION fuzzystrmatch;" ZULWLQJZLWK3/9:ULWLQJ$JJUHJDWH)XQFWLRQVZLWK3/9

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

,I\RXߞYHEHHQXVLQJDYHUVLRQRI3RVWJUH64/ROGHUWKDQDQGUHVWRUHG\RXU DOORIDUUD\RINH\VH[LVWVRSHUDWRU " %LQDU\-621MVRQE


ROGGDWDEDVHLQWRYHUVLRQRUODWHUGXULQJDYHUVLRQXSJUDGHDOOH[WHQVLRQV
VKRXOGFRQWLQXHWRIXQFWLRQZLWKRXWLQWHUYHQWLRQ)RUPDLQWDLQDELOLW\\RXVKRXOG $/7(5'$7$%$6(FRPPDQG8VLQJ6FKHPDV0RYLQJ2EMHFWV$PRQJ
XSJUDGH\RXUROGH[WHQVLRQVLQWKHFRQWULEIROGHUWRXVHWKHQHZDSSURDFKWR 7DEOHVSDFHV)76&RQILJXUDWLRQV
H[WHQVLRQV<RXFDQXSJUDGHH[WHQVLRQVHVSHFLDOO\WKHRQHVWKDWFRPHSDFNDJHG
$/7(5'()$8/735,9,/(*(6FRPPDQG'HIDXOW3ULYLOHJHV
ZLWK3RVWJUH64/IURPWKHROGFRQWULEPRGHOWRWKHQHZRQH5HPHPEHUWKDW
ZHߞUHUHIHUULQJRQO\WRWKHXSJUDGHLQWKHLQVWDOODWLRQPRGHOQRWWRWKHH[WHQVLRQ $/7(5)25(,*17$%/(FRPPDQG4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
LWVHOI
$/7(552/(FRPPDQG&UHDWLQJ*URXS5ROHV
)RUH[DPSOHVXSSRVH\RXKDGLQVWDOOHGWKHWDEOHIXQFH[WHQVLRQ IRUFURVVWDE
TXHULHV WR\RXU3RVWJUH64/LQDVFKHPDFDOOHGFRQWULEDQG\RXKDYHMXVW $/7(56(48(1&(FRPPDQG6HULDOV
UHVWRUHG\RXUGDWDEDVHWRDVHUYHU5XQWKHIROORZLQJFRPPDQGWRXSJUDGH
$/7(56(59(5FRPPDQG4XHU\LQJ2WKHU3RVWJUH64/6HUYHUV
CREATE EXTENSION tablefunc SCHEMA contrib FROM unpackaged;
$/7(56<67(0FRPPDQG&KDQJLQJWKHSRVWJUHVTOFRQIVHWWLQJV&RQILJXULQJ
7KLVFRPPDQGVHDUFKHVWKURXJKFRQWULEVFKHPD DVVXPLQJWKLVLVZKHUH\RX WKH0DVWHU
SODFHGDOOWKHH[WHQVLRQV UHWULHYHVDOOFRPSRQHQWVRIWKHH[WHQVLRQDQG $/7(56<67(06(7FRPPDQG)HDWXUHV,QWURGXFHGLQ3RVWJUH64/
UHSDFNDJHVWKHPLQWRDQHZH[WHQVLRQREMHFWVRLWDSSHDUVLQWKH
SJBDYDLODEOHBH[WHQVLRQVOLVWDVEHLQJLQVWDOOHG $/7(57$%/(FRPPDQG
"  DOORIDUUD\RINH\VH[LVWVRSHUDWRU %LQDU\-621MVRQE 7KLVFRPPDQGOHDYHVWKHROGIXQFWLRQVLQWKHFRQWULEVFKHPDLQWDFWEXWUHPRYHV
WKHPIURPEHLQJDSDUWRIDGDWDEDVHEDFNXS
"_ DQ\RIDUUD\RINH\VH[LVWVRSHUDWRU %LQDU\-621MVRQE

#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

? EDFNVODVK 5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ 3RSXODUH[WHQVLRQV


?FRPPDQG([HFXWLQJ6KHOO&RPPDQGV 6LQFHYHUVLRQ3RVWJUH64/SUHIHUVWKHH[WHQVLRQPRGHOWRGHOLYHUDOODGG
RQV7KHVHLQFOXGHEDVLFH[WHQVLRQVFRQVLVWLQJRQO\RIIXQFWLRQVDQGW\SHVDV
_ RURSHUDWRU 764XHULHV ZHOODV3/VLQGH[W\SHVDQG)':V,QWKLVVHFWLRQZHOLVWWKHPRVWSRSXODU
H[WHQVLRQV VRPHVD\ߡPXVWKDYHߢH[WHQVLRQV WKDW3RVWJUH64/GRHVQߞWLQVWDOO
__ FRQFDWHQDWLRQRSHUDWRU 6WULQJ)XQFWLRQV$UUD\6OLFLQJDQG6SOLFLQJ(GLWLQJ
LQWR\RXUGDWDEDVHE\GHIDXOW'HSHQGLQJRQ\RXU3RVWJUH64/GLVWULEXWLRQ
-621%GDWD769HFWRUV
\RXߞOOILQGPDQ\RIWKHVHDOUHDG\DYDLODEOHRQ\RXUVHUYHU
__ RURSHUDWRU 764XHULHV EWUHHBJLVW
a VLPLODUWRRSHUDWRU 5HJXODU([SUHVVLRQVDQG3DWWHUQ0DWFKLQJ 3URYLGHV*L67LQGH[RSHUDWRUFODVVHVWKDWLPSOHPHQW%7UHHHTXLYDOHQW
EHKDYLRUIRUFRPPRQ%7UHHVHUYLFHVGDWDW\SHV6HHߡ3RVWJUH64/6WRFN
aaRSHUDWRU2SHUDWRU&ODVVHV ,QGH[HVߢIRUPRUHGHWDLOV
$ EWUHHBJLQ
DGGLWLRQRSHUDWRU  'DWHWLPH2SHUDWRUVDQG)XQFWLRQV 3URYLGHV*,1LQGH[RSHUDWRUFODVVHVWKDWLPSOHPHQW%7UHHHTXLYDOHQW
EHKDYLRUIRUFRPPRQ%7UHHVHUYLFHGGDWDW\SHV6HHߡ3RVWJUH64/6WRFN
$GPLQHUWRRO$GPLQHU ,QGH[HVߢIRUPRUHGHWDLOV
DGPLQSDFNH[WHQVLRQ(GLWLQJSRVWJUHVTOFRQIDQGSJBKEDFRQIIURPSJ$GPLQ SRVWJLV
$)7(5WULJJHU7ULJJHUVDQG7ULJJHU)XQFWLRQV (OHYDWHV3RVWJUH64/WRDVWDWHRIWKHDUWVSDWLDOGDWDEDVHRXWULYDOLQJDOO
FRPPHUFLDORSWLRQV,I\RXGHDOZLWKVWDQGDUG2*&*,6GDWDGHPRJUDSKLF
DJJUHJDWHIXQFWLRQV VWDWLVWLFVGDWDRUJHRFRGLQJGGDWDRUHYHQUDVWHUGDWD\RXGRQߞWZDQWWR
DERXW$JJUHJDWHV$JJUHJDWHV EHZLWKRXWWKLVRQH<RXFDQOHDUQPRUHDERXW3RVW*,6LQRXUERRN3RVW*,6
LQ$FWLRQ3RVW*,6LVDZKRSSHURIDQH[WHQVLRQZHLJKLQJLQDWPRUHWKDQ
ZLQGRZIXQFWLRQVDQG$JJUHJDWHV IXQFWLRQVW\SHVDQGVSDWLDOLQGH[HV3RVW*,6LVVRELJLWKDVH[WHQVLRQV
WKDWH[WHQGLW7KHUHH[LVWH[WHQVLRQVRQWRSRI3RVW*,6VXFKDVWKRVH
LQFOXGHGZLWK3RVW*,6LWVHOI,QDGGLWLRQWKHUHLVSJSRLQWFORXGIRUPDQDJLQJ
SRLQWFORXGVDQGSJ5RXWLQJIRUQHWZRUNURXWLQJZKLFKDUHSDFNDJHG ,QGH[
VHSDUDWHO\
IX]]\VWUPDWFK
6\PEROV
$OLJKWZHLJKWH[WHQVLRQZLWKIXQFWLRQVVXFKDVVRXQGH[OHYHQVKWHLQDQG
PHWDSKRQHDOJRULWKPVIRUIX]]\VWULQJPDWFKLQJ:HGLVFXVVLWVXVHLQ:KHUH !SRLQWHUV\PERO4XHU\LQJ-621
LV6RXQGH[DQG2WKHU)X]]\7KLQJV
!!RSHUDWRU4XHU\LQJ-621
KVWRUH
 GROODUTXRWLQJ 'ROODU4XRWLQJ'2
$QH[WHQVLRQWKDWDGGVNH\YDOXHSDLUVWRUDJHDQGLQGH[VXSSRUWZHOOVXLWHG
IRUVWRULQJSVHXGRQRUPDOL]HGGDWD,I\RXDUHORRNLQJIRUDFRPIRUWDEOH  DQGRSHUDWRU 764XHULHV
PHGLXPEHWZHHQDUHODWLRQDOGDWDEDVHDQG1R64/FKHFNRXWKVWRUH8VDJH
 DQGRSHUDWRU 764XHULHV
RIKVWRUHLQPDQ\FDVHVKDVEHHQUHSODFHGZLWKWKHEXLOWLQMVRQEW\SH6R
WKLVH[WHQVLRQLVQߞWDVSRSXODUDVLWXVHGWREH  RYHUODSRSHUDWRU $UUD\&RQWDLQPHQW&KHFNV2YHUODSRSHUDWRU([FOXVLRQ
SJBWUJP WULJUDP &RQVWUDLQWV

$QRWKHUIX]]\VWULQJVHDUFKOLEUDU\XVHGLQFRQMXQFWLRQZLWKIX]]\VWUPDWFK  SDUHQWKHVHV %XLOGLQJ&XVWRP'DWD7\SHV


,WLQFOXGHVDQRSHUDWRUFODVVPDNLQJVHDUFKHVXVLQJWKHILIKERSHUDWRU
 DGGLWLRQRSHUDWRU 'DWHWLPH2SHUDWRUVDQG)XQFWLRQV
LQGH[DEOHWULJUDPFDQDOVRDOORZZLOGFDUGVHDUFKHVLQWKHIRUPRILIKE
%something%'RUUHJXODUH[SUHVVLRQVHDUFKHVVXFKDVsomefield ~  VXEWUDFWLRQRSHUDWRU 'DWHWLPH2SHUDWRUVDQG)XQFWLRQV(GLWLQJ-621%GDWD
'(foo|bar)'WRXWLOL]HDQLQGH[6HH7HDFKLQJ,/,.(DQG/,.(1HZ7ULFNV (GLWLQJ-621%GDWD
IRUIXUWKHUGLVFXVVLRQ
!RSHUDWRU4XHU\LQJ-621
GEOLQN
!!RSHUDWRU4XHU\LQJ-621
$OORZV\RXWRTXHU\D3RVWJUH64/GDWDEDVHRQDQRWKHUVHUYHU3ULRUWRWKH
LQWURGXFWLRQRI)':VLQYHUVLRQWKLVZDVWKHRQO\VXSSRUWHGPHFKDQLVP  FRORQ 6KRUWFXWV
IRUFURVVGDWDEDVHLQWHUDFWLRQV,WUHPDLQVXVHIXOIRURQHWLPHFRQQHFWLRQVRU
DGKRFTXHULHVHVSHFLDOO\ZKHUH\RXQHHGWRFDOOIXQFWLRQVRQWKHIRUHLJQ ! GLVWDQFHRSHUDWRU )HDWXUHV,QWURGXFHGLQ3RVWJUH64/
VHUYHU3ULRUWR3RVWJUH64/SRVWJUHVBIGZGRHVQߞWDOORZDVWDWHPHQWWR # FRQWDLQHGLQRSHUDWRU $UUD\&RQWDLQPHQW&KHFNV&RQWDLQVDQGFRQWDLQHG
FDOOIXQFWLRQVRQWKHIRUHLJQVHUYHURQO\ORFDORQHV,Q3RVWJUH64/\RX
LQRSHUDWRUV%LQDU\-621MVRQE
FDQFDOOIXQFWLRQVGHILQHGLQDQH[WHQVLRQLI\RXGHQRWHLQWKHIRUHLJQVHUYHU
WKDWWKHVHUYHUKDVWKDWH[WHQVLRQLQVWDOOHG  HTXDOLW\RSHUDWRU $UUD\&RQWDLQPHQW&KHFNV%LQDU\-621MVRQE
SJFU\SWR " NH\H[LVWVRSHUDWRU %LQDU\-621MVRQE
-?, --help[=options] show this help, then exit 3URYLGHVHQFU\SWLRQWRROVLQFOXGLQJWKHSRSXODU3*3,WߞVKDQG\IRU
--help=commands list backslash commands, then exit
--help=variables list special variables, then exit
HQFU\SWLQJWRSVHFUHWLQIRUPDWLRQVWRUHGLQWKHGDWDEDVH6HHRXUTXLFN
--version output version information, then exit SULPHURQLWDW(QFU\SWLQJ'DWDZLWKSJFU\SWR
Input and output options:
-a, --echo-all echo all input from script
&ODVVLFH[WHQVLRQV
-b, --echo-errors echo failed commands +HUHDUHDIHZYHQHUDEOHH[H[WHQVLRQVWKDWKDYHJDLQHGHQRXJKRIDIROORZLQJ
-e, --echo-queries echo commands sent to server
-E, --echo-hidden display queries that internal commands generate WRPDNHLWLQWRRIILFLDO3RVWJUH64/UHOHDVHV:HFDOOWKHPRXWKHUHEHFDXVH\RX
-L, --log-file=FILENAME send session log to file FRXOGVWLOOUXQLQWRWKHPDVVHSDUDWHH[WHQVLRQVRQROGHUVHUYHUV
-n, --no-readline disable enhanced command-line editing (readline)
-o, --output=FILENAME send query results to file (or |pipe) WVHDUFK
-q, --quiet run quietly (no messages, only query output)
-s, --single-step single-step mode (confirm each query) $VXLWHRILQGH[HVRSHUDWRUVFXVWRPGLFWLRQDULHVDQGIXQFWLRQVWKDWHQKDQFH
-S, --single-line single-line mode (end of line terminates SQL command) )76V,WLVQRZSDUWRI3RVWJUH64/SURSHU,I\RXߞUHVWLOOUHO\LQJRQEHKDYLRU
IURPWKHROGH[WHQVLRQ\RXFDQLQVWDOOWVHDUFK$EHWWHUWDFWLFZRXOGEHMXVW
Output format options: WRXSGDWHVHUYHUVZKHUH\RXߞUHXVLQJWKHROGIXQFWLRQVEHFDXVHFRPSDWLELOLW\
-A, --no-align unaligned table output mode
-F, --field-separator=STRING
FRXOGHQGDWDQ\WLPH
set field separator (default: "|")
-H, --html HTML table output mode [PO
-P, --pset=VAR[=ARG] set printing option VAR to ARG (see \pset command)
-R, --record-separator=STRING $QH[WHQVLRQWKDWDGGHGDQ;0/GDWDW\SHUHODWHGIXQFWLRQVDQGRSHUDWRUV
set record separator (default: newline) 7KH;0/GDWDW\SHLVQRZDQLQWHJUDOSDUWRI3RVWJUH64/LQSDUWWRPHHW
-t, --tuples-only print rows only WKH$16,64/;0/VWDQGDUG7KHROGH[WHQVLRQQRZGXEEHG[POFDQVWLOO
-T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)
-x, --expanded turn on expanded table output EHLQVWDOOHGDQGFRQWDLQVIXQFWLRQVWKDWGLGQߞWPDNHLWLQWRWKHFRUH,Q
-z, --field-separator-zero SDUWLFXODU\RXQHHGWKLVH[WHQVLRQLI\RXUHOLHGRQWKHxlst_process
set field separator to zero byte
-0, --record-separator-zero IXQFWLRQIRUSURFHVVLQJ;6/WHPSODWHV7KHUHDUHDOVRDFRXSOHRIROG;3DWK
set record separator to zero byte IXQFWLRQVRQO\IRXQGLQ[PO
Connection options:
-h, --host=HOSTNAME database server host or socket directory
-p, --port=PORT database server port (default: "5432") %DFNXSDQG5HVWRUH
-U, --username=USERNAME database user name
-w, --no-password never prompt for password 3RVWJUH64/VKLSVZLWKWKUHHXWLOLWLHVIRUEDFNXSSJBGXPSSJBGXPSDOODQG
-W, --password force password prompt (should happen automatically)
SJBEDVHEDFNXS<RXߞOOILQGDOORIWKHPLQWKH3RVWJUH64/ELQIROGHU
For more information, type "\?" (for internal commands) or "\help" (for SQL 8VHSJBGXPSWREDFNXSVSHFLILFGDWDEDVHV7REDFNXSDOOGDWDEDVHVLQSODLQ
commands) from within psql, or consult the psql section in the PostgreSQL
documentation. WH[WDORQJZLWKVHUYHUJOREDOVXVHSJBGXPSDOOZKLFKQHHGVWRUXQXQGHUD
VXSHUXVHUDFFRXQWVRWKDWLWEDFNXSDOOGDWDEDVHV8VHSJBEDVHEDFNXSWRGR
7KHVHLWHPVDUHQHZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/
V\VWHPOHYHOGLVNEDFNXSRIDOOGDWDEDVHV
)RUWKHUHVWRIWKLVVHFWLRQZHߞOOIRFXVRXUGLVFXVVLRQRQXVLQJSJBGXPSDQG
SJBGXPSDOOSJBEDVHEDFNXSLVWKHPRVWHIILFLHQWZD\RIGRLQJDIXOOSRVWJUHVTO |unicode_border_linestyle|unicode_column_linestyle
|unicode_header_linestyle
VHUYHUFOXVWHUEDFNXS,I\RXKDYHDUHDVRQDEO\VL]HGGDWDEDVHDVLQ*%RU })
PRUH\RXVKRXOGEHXVLQJSJBEDVHEDFNXSDVSDUWRI\RXUEDFNXSVWUDWHJ\ \t [on|off] show only rows (currently off)
SJBEDVHEDFNXSKRZHYHUUHTXLUHVHQDEOLQJRIIHDWXUHVWKDWDUHRIWHQWXUQHGRII \T [STRING] set HTML <table> tag attributes, or unset if none
\x [on|off] toggle expanded output (currently off)
EXWWKDWDUHDOVRQHHGHGIRUUHSOLFDWLRQVRZHߞOOVDYHGLVFXVVLRQRI Connection
SJBEDVHEDFNXSIRUߡ6HWWLQJ8S)XOO6HUYHU5HSOLFDWLRQߢ \c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}
connect to new database (currently "postgres")
0RVWRIWKHFRPPDQGOLQHRSWLRQVIRUWKHVHWRROVH[LVWERWKLQ*18VW\OH WZR \encoding [ENCODING] show or set client encoding
\password [USERNAME] securely change the password for a user
K\SKHQVSOXVDZRUG DQGWKHWUDGLWLRQDOVLQJOHOHWWHUVW\OH RQHK\SKHQSOXVDQ \conninfo display information about current connection
DOSKDEHWLFFKDUDFWHU <RXFDQXVHERWKVW\OHVLQWHUFKDQJHDEO\HYHQLQWKHVDPH Operating System
FRPPDQG:HߞOOEHFRYHULQJMXVWWKHEDVLFVKHUHIRUDPRUHLQGHSWKGLVFXVVLRQ \cd [DIR] change the current working directory
\setenv NAME [VALUE] set or unset environment variable
VHHWKH3RVWJUH64/GRFXPHQWDWLRQ%DFNXSDQG5HVWRUH \timing [on|off] toggle timing of commands (currently off)
\! [COMMAND] execute command in shell or start interactive shell
,QWKLVVHFWLRQZHZLOOQRWGLVFXVVWKLUGSDUW\WRROVWKDWDUHRIWHQXVHGIRU
3RVWJUH64/EDFNXSDQGUHVWRUH7ZRSRSXODURSHQVRXUFHRQHV\RXPLJKWZDQW 1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/$OOFRQGLWLRQDORSWLRQVDUH
WRFRQVLGHUDUHSJ%DFN5HVWDQG%DUPDQ7KHVHRIIHUDGGLWLRQDOIHDWXUHVOLNH QHZ
EDFNXSVFKHGXOLQJPXOWLVHUYHUVXSSRUWDQGUHVWRUHVKRUWFXWV 1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/
$V\RXZDGHWKURXJKWKLVVHFWLRQ\RXߞOOILQGWKDWZHRIWHQVSHFLI\WKHSRUWDQG 1HZIHDWXUHLQWURGXFHGLQ3RVWJUH64/
KRVWLQRXUH[DPSOHV7KLVLVEHFDXVHZHRIWHQUXQEDFNXSVIRUDGLIIHUHQWVHUYHU
DVVFKHGXOHGMREVXVLQJSJ$JHQWDVGLVFXVVHGLQߡ-RE6FKHGXOLQJZLWK
SJ$JHQWߢ:HRIWHQKDYHPXOWLSOHLQVWDQFHVRI3RVWJUH64/UXQQLQJRQWKHVDPH
SVTO1RQLQWHUDFWLYH&RPPDQGV
PDFKLQHRQGLIIHUHQWSRUWVDVZHOO6RPHWLPHVVSHFLI\LQJWKHKRVWFDQFDXVH ([DPSOH%VKRZVWKHQRQLQWHUDFWLYHFRPPDQGVKHOSVFUHHQ([DPSOHVRIWKHLU
SUREOHPVLI\RXUVHUYLFHLVVHWWROLVWHQRQO\RQORFDOKRVW<RXFDQVDIHO\OHDYH XVDJHDUHFRYHUHGLQߡ,QWHUDFWLYHYHUVXV1RQLQWHUDFWLYHSVTOߢ
RXWWKHKRVWLI\RXDUHUXQQLQJWKHH[DPSOHVGLUHFWO\RQWKHVHUYHU ([DPSOH%SVTOEDVLFKHOSVFUHHQ
<RXPD\DOVRZDQWWRFUHDWHDaSJSDVVILOHWRVWRUHDOOSDVVZRUGVSJBGXPSDQG psql --help
SJBGXPSDOOGRQߞWKDYHSDVVZRUGRSWLRQV$OWHUQDWLYHO\\RXFDQVHWDSDVVZRUG psql is the PostgreSQL interactive terminal.
Usage:
LQWKHPGPASSWORDHQYLURQPHQWYDULDEOH psql [OPTION]... [DBNAME [USERNAME]]

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/GDWDEDVHV SODLQ
\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 3 UXQV \? 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-j HTXLYDOHQWWR--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]

,IWKHQDPHRIWKHGDWDEDVHLVWKHVDPHDVWKHRQH\RXEDFNHGXS\RXFDQFUHDWH General options:


DQGUHVWRUHWKHGDWDEDVHLQRQHVWHS -d, --dbname=NAME connect to database name
-f, --file=FILENAME output file name
-F, --format=c|d|t backup file format (should be automatic)
pg_restore --dbname=postgres --create --jobs=4 --verbose [Link] -l, --list print summarized TOC of the archive
-v, --verbose verbose mode
-V, --version output version information, then exit
:KHQ\RXXVHWKH--createRSWLRQWKHGDWDEDVHQDPHLVDOZD\VWKHQDPHRIWKH -?, --help show this help, then exit
RQH\RXEDFNHGXS<RXFDQߞWUHQDPHLW,I\RXߞUHDOVRXVLQJWKH--dbname
RSWLRQWKDWGDWDEDVHQDPHPXVWEHGLIIHUHQWIURPWKHQDPHRIWKHGDWDEDVH Options controlling the restore:
1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/ EHLQJUHVWRUHG:HXVXDOO\MXVWVSHFLI\WKHSRVWJUHVGDWDEDVH
1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/ 1RUPDOO\DUHVWRUHZLOOQRWUHFUHDWHREMHFWVDOUHDG\SUHVHQWLQDGDWDEDVH,I\RX
1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/ KDYHGDWDLQWKHGDWDEDVHDQG\RXZDQWWRUHSODFHLWZLWKZKDWߞVLQWKHEDFNXS
\RXQHHGWRDGGWKH--cleanVZLWFKWRWKHpg_restoreFRPPDQG7KLVZLOO
FDXVHREMHFWVWREHGURSSHGIURPWKHFXUUHQWGDWDEDVHVRWKDWUHVWRUHFDQUH
6HUYHU%DFNXSSJBGXPSDOO FUHDWHWKHP
8VHpg_dump_allWREDFNXSDOOGDWDEDVHVRQ\RXUVHUYHURQWRDVLQJOHSODLQ
WH[WRUSODLQWH[W64/ILOH7KHEDFNXSURXWLQHZLOODXWRPDWLFDOO\LQFOXGHVHUYHU
OHYHOREMHFWVVXFKDVUROHVDQGWDEOHVSDFHV([DPSOH%VKRZVWKHpg_dumpall :$51,1*
KHOSRXWSXW6HHߡ6\VWHPZLGH%DFNXS8VLQJSJBGXPSDOOߢIRUWKHIXOO ,I\RXUHVWRUHRYHUDQH[LVWLQJGDWDEDVHWKHFRQWHQWRIWKHEDFNXSPD\UHSODFHWKLQJVLQ\RXU
FXUUHQWGDWDEDVH%HFDUHIXOGXULQJDUHVWRUHGRQߞWDFFLGHQWDOO\SLFNWKHZURQJEDFNXSILOHRU
GLVFXVVLRQ WKHZURQJGDWDEDVHWRUHVWRUHWR
([DPSOH%SJBGXPSDOOKHOS
pg_dumpall --help
pg_dumpall extracts a PostgreSQL database cluster into an SQL script file. :LWK3RVWJUH64/RUODWHU\RXFDQWDNHDGYDQWDJHRIWKH--sectionRSWLRQ
Usage:
pg_dumpall [OPTION]...
WRUHVWRUHMXVWWKHVWUXFWXUHZLWKRXWWKHGDWD7KLVLVXVHIXOLI\RXZDQWWRXVHDQ
H[LVWLQJGDWDEDVHDVDWHPSODWHIRUDQHZRQH7RGRVRILUVWFUHDWHWKHWDUJHW
General options: GDWDEDVH
-f, --file=FILENAME output file name
-v, --verbose verbose mode
-V, --version output version information, then exit CREATE DATABASE mydb2;
--lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock
-?, --help show this help, then exit
7KHQXVHSJBUHVWRUH
Options controlling the output content:
-a, --data-only dump only the data, not the schema pg_restore --dbname=mydb2 --section=pre-data --jobs=4 [Link]
-c, --clean clean (drop) databases before recreating
-g, --globals-only dump only global objects, no databases
-o, --oids include OIDs in dump
-O, --no-owner skip restoration of object ownership 0DQDJLQJ'LVN6WRUDJHZLWK7DEOHVSDFHV
-r, --roles-only dump only roles, no databases or tablespaces
-s, --schema-only dump only the schema, no data 3RVWJUH64/XVHVWDEOHVSDFHVWRDVFULEHORJLFDOQDPHVWRSK\VLFDOORFDWLRQVRQ
-S, --superuser=NAME superuser user name to use in the dump GLVN,QLWLDOL]LQJD3RVWJUH64/FOXVWHUDXWRPDWLFDOO\EHJHWVWZRWDEOHVSDFHV
-t, --tablespaces-only dump only tablespaces, no databases or roles
-x, --no-privileges do not dump privileges (grant/revoke) SJBGHIDXOWZKLFKVWRUHVDOOXVHUGDWDDQGSJBJOREDOZKLFKVWRUHVDOOV\VWHP
--binary-upgrade for use by upgrade utilities only GDWD7KHVHDUHORFDWHGLQWKHVDPHIROGHUDV\RXUGHIDXOWGDWDFOXVWHU<RXߞUH
--column-inserts dump data as INSERT commands with column names
--disable-dollar-quoting disable dollar quoting, use SQL standard quoting
IUHHWRFUHDWHWDEOHVSDFHVDWZLOODQGKRXVHWKHPRQDQ\VHUYHUGLVNV<RXFDQ
--disable-triggers disable triggers during data-only restore H[SOLFLWO\DVVLJQGHIDXOWWDEOHVSDFHVIRUQHZREMHFWVE\GDWDEDVH<RXFDQDOVR
--inserts dump data as INSERT commands, rather than COPY PRYHH[LVWLQJGDWDEDVHREMHFWVWRQHZRQHV
--no-publications do not dump publications
--no-security-labels do not dump security label assignments
--no-subscriptions do not dump subscriptions &UHDWLQJ7DEOHVSDFHV
7RFUHDWHDQHZWDEOHVSDFHVSHFLI\DORJLFDOQDPHDQGDSK\VLFDOIROGHUDQG -b, --blobs include large objects in dump
-B, --no-blobs exclude large objects in dump
PDNHVXUHWKDWWKHSRVWJUHVVHUYLFHDFFRXQWKDVIXOODFFHVVWRWKHSK\VLFDOIROGHU -c, --clean clean (drop) database objects before recreating
,I\RXDUHRQD:LQGRZVVHUYHUXVHWKHIROORZLQJFRPPDQG QRWHWKHXVHRI -C, --create include commands to create database in dump
8QL[VW\OHIRUZDUGVODVKHV  -E, --encoding=ENCODING dump the data in encoding ENCODING
-n, --schema=SCHEMA dump the named schema(s) only
-N, --exclude-schema=SCHEMA do NOT dump the named schema(s)
CREATE TABLESPACE secondary LOCATION 'C:/pgdata94_secondary'; -o, --oids include OIDs in dump
-O, --no-owner skip restoration of object ownership in
plain-text format
)RU8QL[EDVHGV\VWHPV\RXILUVWPXVWFUHDWHWKHIROGHURUGHILQHDQIVWDE -s, --schema-only dump only the schema, no data
ORFDWLRQWKHQXVHWKLVFRPPDQG -S, --superuser=NAME superuser user name to use in plain-text format
-t, --table=TABLE dump the named table(s) only
-T, --exclude-table=TABLE do NOT dump the named table(s)
CREATE TABLESPACE secondary LOCATION '/usr/data/pgdata94_secondary';
-x, --no-privileges do not dump privileges (grant/revoke)
--binary-upgrade for use by upgrade utilities only
--column-inserts dump data as INSERT commands with column names
0RYLQJ2EMHFWV$PRQJ7DEOHVSDFHV --disable-dollar-quoting disable dollar quoting, use SQL standard quoting
<RXFDQVKXIIOHGDWDEDVHREMHFWVDPRQJGLIIHUHQWWDEOHVSDFHV7RPRYHDOO --disable-triggers disable triggers during data-only restore
--enable-row-security enable row security (dump only content user has
REMHFWVLQWKHGDWDEDVHWR\RXUVHFRQGDU\WDEOHVSDFHLVVXHWKHIROORZLQJ64/ access to)
FRPPDQG --exclude-table-data=TABLE do NOT dump data for the named table(s)
--if-exists use IF EXISTS when dropping objects
--inserts dump data as INSERT commands, rather than COPY
ALTER DATABASE mydb SET TABLESPACE secondary; --no-publications do not dump publications
--no-security-labels do not dump security label assignments
7RPRYHMXVWRQHWDEOH --no-subscriptions do not dump subscriptions
--no-synchronized-snapshots do not use synchronized snapshots in parallel jobs
--no-tablespaces do not dump tablespace assignments
ALTER TABLE mytable SET TABLESPACE secondary; --no-unlogged-table-data do not dump unlogged table data
--quote-all-identifiers quote all identifiers, even if not key words
--section=SECTION dump named section (pre-data, data, or post-data)
1HZLQ3RVWJUH64/LVWKHDELOLW\PRYHDJURXSRIREMHFWVIURPRQH --serializable-deferrable wait until the dump can run without anomalies
WDEOHVSDFHWRDQRWKHU,IWKHUROHUXQQLQJWKHFRPPDQGLVDVXSHUXVHUDOOREMHFWV --snapshot=SNAPSHOT use given snapshot for the dump
ZLOOEHPRYHG,IQRWRQO\WKHRZQHGREMHFWVZLOOEHPRYHG --strict-names require table and/or schema include patterns to
match at least one entity each
7RPRYHDOOREMHFWVIURPGHIDXOWWDEOHVSDFHWRVHFRQGDU\XVH --use-set-session-authorization
use SET SESSION AUTHORIZATION commands instead of
ALTER OWNER commands to set ownership
ALTER TABLESPACE pg_default MOVE ALL TO secondary; Connection options:
-d, --dbname=DBNAME database to dump
'XULQJWKHPRYH\RXUGDWDEDVHRUWDEOHZLOOEHORFNHG -h, --host=HOSTNAME database server host or socket directory
-p, --port=PORT database server port number
-U, --username=NAME connect as specified database user
-w, --no-password never prompt for password
9HUERWHQ3UDFWLFHV -W, --password force password prompt (should happen automatically)
--role=ROLENAME do SET ROLE before dump
:HKDYHDFWHGDVILUVWUHVSRQGHUVWRPDQ\3RVWJUH64/DFFLGHQWVVRZHWKRXJKW 1HZIHDWXUHVLQWURGXFHGLQ3RVWJUH64/
LWEHVWWRHQGWKLVFKDSWHUE\LWHPL]LQJWKHPRVWFRPPRQPLVWDNHV
$SSHQGL[%3RVWJUH64/ )RUVWDUWHUVLI\RXGRQߞWNQRZZKDW\RXGLGZURQJWKHORJILOHFRXOGSURYLGH
FOXHV/RRNIRUWKHSJBORJIROGHULQ\RXU3RVWJUH64/GDWDIROGHURUWKHURRWRI
3DFNDJHG&RPPDQG/LQH7RROV WKH3RVWJUH64/GDWDIROGHU,WߞVDOVRSRVVLEOHWKDW\RXUVHUYHUVKXWGRZQEHIRUHD
ORJHQWU\FRXOGEHZULWWHQLQZKLFKFDVHWKHORJZRQߞWKHOS\RX,I\RXUVHUYHU
IDLOVWRUHVWDUWWU\WKHIROORZLQJIURPWKH26FRPPDQGOLQH

7KLVDSSHQGL[VXPPDUL]HVLQGLVSHQVDEOHFRPPDQGOLQHWRROVSDFNDJHGZLWK path/to/your/bin/pg_ctl -D your_postgresql_data_folder


3RVWJUH64/VHUYHU:HGLVFXVVHGWKHPDWOHQJWKLQWKHERRN+HUHZHOLVWWKHLU
KHOSPHVVDJHV:HKRSHWRVDYH\RXDELWRIWLPHZLWKWKHLULQFOXVLRQDQG 'RQߞW'HOHWH3RVWJUH64/&RUH6\VWHP)LOHVDQG%LQDULHV
SHUKDSVPDNHWKLVERRNDQRWVRVWUDQJHEHGIHOORZ
3HUKDSVWKLVLVVWDWLQJWKHREYLRXVEXWZKHQSHRSOHUXQRXWRIGLVNVSDFHWKH
ILUVWWKLQJWKH\GRLVVWDUWGHOHWLQJILOHVIURPWKH3RVWJUH64/GDWDFOXVWHUIROGHU
'DWDEDVH%DFNXS8VLQJSJBGXPS EHFDXVHLWߞVVRGDUQELJ3DUWRIWKHUHDVRQWKLVPLVWDNHKDSSHQVVRIUHTXHQWO\LV
WKDWVRPHIROGHUVVSRUWLQQRFXRXVQDPHVVXFKDVSJBORJSJB[ORJDQGSJBFORJ
8VHpg_dumpWREDFNXSDOORUSDUWRIDGDWDEDVH%DFNXSILOHIRUPDWVDYDLODEOH <HVWKHUHDUHVRPHILOHV\RXFDQVDIHO\GHOHWHEXWXQOHVV\RXNQRZSUHFLVHO\
DUH7$5FRPSUHVVHG 3RVWJUH64/FXVWRPIRUPDW SODLQWH[WDQGSODLQWH[W ZKLFKRQHV\RXFRXOGHQGXSGHVWUR\LQJ\RXUGDWD
64/3ODLQWH[WEDFNXSFDQFRS\SVTOVSHFLILFFRPPDQGVWKHUHIRUHUHVWRUHE\
7KHSJBORJIROGHURIWHQIRXQGLQ\RXUGDWDIROGHULVDIROGHUWKDWEXLOGVXS
UXQQLQJWKHILOHZLWKLQSVTO$SODLQWH[W64/EDFNXSLVPHUHO\DILOHZLWK
TXLFNO\HVSHFLDOO\LI\RXKDYHORJJLQJHQDEOHG<RXFDQDOZD\VSXUJHILOHVIURP
VWDQGDUG64/CREATEDQGINSERTFRPPDQGV7RUHVWRUH\RXFDQUXQWKHILOH
WKLVIROGHUZLWKRXWKDUP,QIDFWPDQ\SHRSOHVFKHGXOHMREVWRUHPRYHORJILOHV
XVLQJSVTORUSJ$GPLQ([DPSOH%VKRZVWKHpg_dumpKHOSRXWSXW)RUIXOO RQDUHJXODUEDVLV
FRYHUDJHRIpg_dumpXVDJHVHHߡ6HOHFWLYH%DFNXS8VLQJSJBGXPSߢ
)LOHVLQWKHRWKHUIROGHUVH[FHSWIRUSJB[ORJVKRXOGQHYHUEHGHOHWHGHYHQLI
([DPSOH%SJBGXPSKHOS
WKH\KDYHORJVRXQGLQJQDPHV'RQߞWHYHQWKLQNRIWRXFKLQJpg_clogWKHDFWLYH
pg_dump --help
pg_dump dumps a database as a text file or to other formats.
FRPPLWORJXQOHVV\RXZDQWWRLQYLWHGLVDVWHU
Usage: SJB[ORJVWRUHVWUDQVDFWLRQORJV6RPHV\VWHPVZHߞYHVHHQDUHFRQILJXUHGWR
pg_dump [OPTION]... [DBNAME]
PRYHSURFHVVHGWUDQVDFWLRQORJVLQWRDVXEIROGHUFDOOHGDUFKLYH<RXߞOORIWHQ
General options: KDYHDQDUFKLYHIROGHUVRPHZKHUH QRWQHFHVVDULO\DVDVXEIROGHURISJB[ORJ LI
-f, --file=FILENAME output file or directory name
-F, --format=c|d|t|p output file format (custom, directory, tar, plain
\RXDUHUXQQLQJV\QFKURQRXVUHSOLFDWLRQGRLQJFRQWLQXRXVDUFKLYLQJRUMXVW
text) NHHSLQJORJVDURXQGLQFDVH\RXQHHGWRUHYHUWWRDGLIIHUHQWSRLQWLQWLPH
-j, --jobs=NUM use this many parallel jobs to dump 'HOHWLQJILOHVLQWKHURRWRISJB[ORJZLOOPHVVXSWKHSURFHVV'HOHWLQJILOHVLQ
-v, --verbose verbose mode
-Z, --compress=0-9 compression level for compressed formats WKHDUFKLYHGIROGHUZLOOMXVWSUHYHQW\RXIURPSHUIRUPLQJSRLQWLQWLPHUHFRYHU\
--lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock RULIDVODYHVHUYHUKDVQߞWSOD\HGEDFNWKHORJVZLOOSUHYHQWWKHVODYHIURP
--no-sync do not wait for changes to be written safely to disk
--help show this help, then exit
IHWFKLQJWKHP,IWKHVHVFHQDULRVGRQߞWDSSO\WR\RXLWߞVVDIHWRUHPRYHILOHVLQ
--version output version information, then exit WKHDUFKLYHIROGHU
Options controlling the output content:
-a, --data-only dump only the data, not the schema %HOHHU\RIRYHU]HDORXVDQWLYLUXVSURJUDPVHVSHFLDOO\RQ:LQGRZV:HߞYHVHHQ
FDVHVLQZKLFKDQWLYLUXVVRIWZDUHUHPRYHGLPSRUWDQWELQDULHVLQWKH3RVWJUH64/ (QWHUSULVH'%PDLQWDLQVDQHDV\WRXVHRQHVWHSLQVWDOOHUIRUPDF26
ELQIROGHU,I3RVWJUH64/IDLOVWRVWDUWRQD:LQGRZVV\VWHPWKHHYHQWYLHZHULV 3J$GPLQFRPHVDVSDUWRIWKHLQVWDOOHU)RUDGGRQV(QWHUSULVH'%RIIHUVD
WKHILUVWSODFHWRORRNIRUFOXHVDVWRZK\ VWDFNEXLOGHUSURJUDPIURPZKLFK\RXFDQLQVWDOOSRSXODUH[WHQVLRQV
GULYHUVODQJXDJHVDQGDGPLQLVWUDWLRQWRROV

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$FFRXQW SRVWJUHV
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

pgc init pgdevops


pgc start pgdevops
SVTOLVWKHGHULJXHXUFRPPDQGOLQHXWLOLW\SDFNDJHGZLWK3RVWJUH64/$VLGH
IURPLWVFRPPRQXVHRIUXQQLQJTXHULHV\RXFDQXVHSVTOWRH[HFXWHVFULSWV
7KHGHIDXOWSRUWLWLQVWDOOVRQLVKWWSORFDOKRVW
LPSRUWDQGH[SRUWGDWDUHVWRUHWDEOHVGRRWKHUGDWDEDVHDGPLQLVWUDWLRQDQGHYHQ
JHQHUDWHUHSRUWV,I\RXKDYHDFFHVVRQO\WRDVHUYHUߞVFRPPDQGOLQHZLWKQR 7RXSJUDGHDQH[LVWLQJSDFNDJHXVHpgc upgradeLQVWHDGRIpgc install
*8,SVTOLV\RXURQO\FKRLFHWRLQWHUDFWZLWK3RVWJUH64/,I\RXIDOOLQWRWKLV
JURXS\RXKDYHWREHLQWLPDWHZLWKP\ULDGFRPPDQGVDQGRSWLRQV:HVXJJHVW
WKDW\RXSULQWRXWWKHGXPSRISVTOKHOSDVGLVFXVVHGLQߡSVTO,QWHUDFWLYH 7,3
&RPPDQGVߢDQGHQVKULQHLWDERYH\RXUZRUNVWDWLRQ 7RKHOS\RXWU\RXWGLIIHUHQWYHUVLRQVRI3RVWJUH64/RQWKHVDPHPDFKLQHRUUXQLWIURPD
86%GHYLFHERWK(QWHUSULVH'%DQG%LJ64/RIIHUVWDQGDORQHVHWXSV5HDG6WDUWLQJ
3RVWJUH64/LQ:LQGRZVZLWKRXW,QVWDOOIRUJXLGDQFHRQ(QWHUSULVH'%)RU%LJ64/UHDG
,QVWDOOLQJSJ'HY2SV
(QYLURQPHQW9DULDEOHV
$VZLWKRWKHUFRPPDQGOLQHWRROVSDFNDJHGZLWK3RVWJUH64/\RXFDQIRUJR
VSHFLI\LQJ\RXUFRQQHFWLRQVHWWLQJVߚKRVWSRUWXVHUߚE\LQLWLDOL]LQJWKH &HQW26)HGRUD5HG+DW6FLHQWLILF/LQX[
PGHOSTPGPORTDQGPGUSERHQYLURQPHQWYDULDEOHV7RDYRLGKDYLQJWRUHW\SH
WKHSDVVZRUG\RXFDQLQLWLDOL]HWKHYDULDEOHPGPASSWORD)RUPRUHVHFXUH 0RVW/LQX[8QL[GLVWULEXWLRQVRIIHU3RVWJUH64/LQWKHLUPDLQUHSRVLWRULHV
DFFHVVFUHDWHDSDVVZRUGILOHDVGHVFULEHGLQ3RVWJUH64/3DVVZRUG)LOH6LQFH DOWKRXJKWKHYHUVLRQPLJKWEHRXWGDWHG7RFRPSHQVDWHPDQ\SHRSOHXVH
YHUVLRQSVTODFFHSWVWZRQHZHQYLURQPHQWYDULDEOHV EDFNSRUWVZKLFKDUHDOWHUQDWLYHSDFNDJHUHSRVLWRULHVRIIHULQJQHZHUYHUVLRQV

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

pgc update ,QWHUDFWLYHYHUVXV1RQLQWHUDFWLYHSVTO


pgc list
5XQSVTOLQWHUDFWLYHO\E\W\SLQJpsqlIURP\RXU26FRPPDQGOLQH<RXUSURPSW
7KHRXWSXWZLOOVKRZVRPHWKLQJOLNH ZLOOWUDQVILJXUHWRWKHSVTOSURPSWVLJQDOLQJWKDW\RXDUHQRZLQWKHLQWHUDFWLYH
SVTOFRQVROH%HJLQW\SLQJLQFRPPDQGV)RU64/VWDWHPHQWVWHUPLQDWHZLWKD
Category | Component | Version | ReleaseDt | Status | Cur? VHPLFRORQ,I\RXSUHVV(QWHUZLWKRXWDVHPLFRORQSVTOZLOODVVXPHWKDW\RXU
PostgreSQL pg92 9.2.21-1 2017-05-11 1 VWDWHPHQWFRQWLQXHVWRWKHQH[WOLQH
PostgreSQL pg93 9.3.17-1 2017-05-11 1
PostgreSQL pg94 9.4.12-1 2017-05-11 1 7\SLQJ\?ZKLOHLQWKHSVTOFRQVROHEULQJVXSDOLVWRIDYDLODEOHFRPPDQGV)RU
PostgreSQL pg95 9.5.7-1 2017-05-11 1
PostgreSQL pg96 9.6.3-1 2017-05-11 Installed 1 FRQYHQLHQFHZHߞYHUHSULQWHGWKLVOLVWLQ$SSHQGL[%KLJKOLJKWLQJQHZDGGLWLRQV
Extensions cassandra_fdw3-pg96 3.0.1-1 2016-11-08 1 LQWKHODWHVWYHUVLRQVVHHߡSVTO,QWHUDFWLYH&RPPDQGVߢ7\SLQJ\hIROORZHGE\
Extensions hadoop_fdw2-pg96 2.5.0-1 2016-09-01 1
Extensions oracle_fdw1-pg96 1.5.0-1 2016-09-01 1 WKHFRPPDQGZLOOEULQJXSWKHUHOHYDQWVHFWLRQVRIWKH3RVWJUH64/
Extensions orafce3-pg96 3.3.1-1 2016-09-23 1 GRFXPHQWDWLRQSHUWDLQLQJWRWKHFRPPDQG
Extensions pgaudit11-pg96 1.1.0-2 2017-05-18 1
Extensions pgpartman2-pg96 2.6.4-1 2017-04-15 1 7RUXQFRPPDQGVUHSHDWHGO\RULQDVHTXHQFH\RXߞUHEHWWHURIIFUHDWLQJDVFULSW
Extensions pldebugger96-pg96 9.6.0-1 2016-12-28 1 ILUVWDQGWKHQUXQQLQJLWXVLQJSVTOQRQLQWHUDFWLYHO\$W\RXU26SURPSWW\SH
Extensions plprofiler3-pg96 3.2-1 2017-04-15 1
Extensions postgis23-pg96 2.3.2-3 2017-05-18 Installed 1 psqlIROORZHGE\WKHQDPHRIWKHVFULSWILOH:LWKLQWKLVVFULSW\RXFDQPL[DQ
Extensions setuser1-pg96 1.2.0-1 2017-02-23 1 XQOLPLWHGQXPEHURI64/DQGSVTOFRPPDQGV$OWHUQDWLYHO\\RXFDQSDVVLQ
Extensions tds_fdw1-pg96 1.0.8-1 2016-11-23 1
Servers pgdevops 1.4-1 2017-05-18 Installed 1 RQHRUPRUH64/VWDWHPHQWVVXUURXQGHGE\GRXEOHTXRWHV1RQLQWHUDFWLYHSVTO
Applications backrest 1.18 2017-05-18 1 LVZHOOVXLWHGIRUDXWRPDWHGWDVNV%DWFK\RXUFRPPDQGVLQWRDILOHWKHQ
Applications ora2pg 18.1 2017-03-23 1
Applications pgadmin3 1.23.0a 2016-10-20 Installed 1
VFKHGXOHLWWRUXQDWUHJXODULQWHUYDOVXVLQJDVFKHGXOLQJGDHPRQOLNHSJ$JHQW
Applications pgagent 3.4.1-1 2017-02-23 1 FURQWDELQ/LQX[8QL[RU:LQGRZV6FKHGXOHU
Applications pgbadger 9.1 2017-02-09 1
Frameworks java8 8u121 2017-02-09 1 1RQLQWHUDFWLYHSVTORIIHUVIHZFRPPDQGOLQHRSWLRQVEHFDXVHWKHVFULSWILOHGRHV
Frameworks perl5 [Link] 2016-03-14 1 PRVWRIWKHZRUN)RUDOLVWLQJRIDOORSWLRQVVHHߡSVTO1RQLQWHUDFWLYH
Frameworks python2 2.7.12-1 2016-10-20 Installed 0
Frameworks tcl86 8.6.4-1 2016-03-11 1 &RPPDQGVߢ7RH[HFXWHDILOHXVHWKH-fRSWLRQDVLQWKHIROORZLQJ

7RLQVWDOOWKHELQDULHVIRUDSDFNDJH psql -f some_script_file

pgc install pgdevops 7RH[HFXWH64/RQWKHIO\XVHWKH-cRSWLRQ6HSDUDWHPXOWLSOHVWDWHPHQWVZLWK


DVHPLFRORQDVLQWKHIROORZLQJ
7KHSJGHYRSVSDFNDJHLVDZHEEDVHGDGPLQLVWUDWLRQWRROWKDWLQFOXGHV
psql -d postgresql_book -c "DROP TABLE IF EXISTS dross; CREATE SCHEMA staging;"
$SSHQGL[$,QVWDOOLQJ
<RXFDQHPEHGLQWHUDFWLYHFRPPDQGVLQVLGHVFULSWILOHV([DPSOHLVWKH
FRQWHQWVRIDVFULSWQDPHGEXLOGBVWDJHSVTOZKLFKZHZLOOXVHWRFUHDWHD 3RVWJUH64/
VWDJLQJWDEOHFDOOHGVWDJLQJIDFWILQGHUBLPSRUWWKDWLVORDGHGLQ([DPSOH
7KHVFULSWILUVWJHQHUDWHVDCREATE TABLEVWDWHPHQWZKLFKLWZULWHVWRDQHZ
ILOHFDOOHGFUHDWHBVFULSWVTO,WWKHQH[HFXWHVWKHJHQHUDWHGFUHDWHBVFULSWVTO
:LQGRZVDQG'HVNWRS/LQX[
([DPSOH6FULSWWKDWLQFOXGHVSVTOLQWHUDFWLYHFRPPDQGV
\a (QWHUSULVH'%EXLOGVLQVWDOOHUVIRU:LQGRZVDQGGHVNWRSYHUVLRQVRI/LQX[7KH\
\t RIIHUERWKELWDQGELWYHUVLRQVIRUHDFK26
\g create_script.sql
SELECT 7KHLQVWDOOHUVDUHHDV\WRXVH7KH\FRPHSDFNDJHGZLWK3J$GPLQ 3RVWJUH64/
'CREATE TABLE staging.factfinder_import ( FRPHZLWKSJ$GPLQZKLOHROGHUYHUVLRQVFRPHZLWKSJ$GPLQ DQGD
geo_id varchar(255), geo_id2 varchar(255), geo_display varchar(255),' ||
array_to_string(array_agg('s' || VWDFNEXLOGHUIURPZKLFK\RXFDQLQVWDOODGGRQVOLNH-'%&1(7GULYHUV
lpad(i::text,2,'0') || ' varchar(255),s' || 5XE\3RVW*,6SKS3J$GPLQDQGSJ$JHQW
lpad(i::text,2,'0') || '_perc varchar(255)'),',') ||
');' (QWHUSULVH'%KDVWZR3RVWJUH64/RIIHULQJVWKHRIILFLDORSHQVRXUFHHGLWLRQRI
FROM generate_series(1,51) As i;
\o
3RVWJUH64/GXEEHGWKH&RPPXQLW\(GLWLRQDQGLWVSURSULHWDU\HGLWLRQFDOOHG
\i create_script.sql $GYDQFHG3OXV7KHSURSULHWDU\IRUNRIIHUV2UDFOHFRPSDWLELOLW\DQGHQKDQFHG
PDQDJHPHQWIHDWXUHV'RQߞWJHWFRQIXVHGEHWZHHQWKHWZRZKHQ\RXGRZQORDG
6LQFHZHZDQWWKHRXWSXWRIRXUTXHU\WREHVDYHGDVDQH[HFXWDEOH
LQVWDOOHUV,QWKLVERRNZHIRFXVHGRQWKHRIILFLDO3RVWJUH64/QRW3RVWJUHV3OXV
VWDWHPHQWZHQHHGWRUHPRYHWKHKHDGHUVE\XVLQJWKH\tRSWLRQ VKRUWKDQG
$GYDQFHG6HUYHUKRZHYHUPXFKRIWKHPDWHULDODSSOLHVWR3RVWJUHV3OXV
IRUWXSOHVRQO\ DQGXVHWKH\aRSWLRQWRJHWULGRIWKHH[WUDEUHDNLQJ $GYDQFHG6HUYHU
HOHPHQWVWKDWSVTOQRUPDOO\SXWVLQ:HWKHQXVHWKH\gRSWLRQWRIRUFHRXU
TXHU\RXWSXWWREHUHGLUHFWHGWRDILOH %LJ64/LVDQRSHQVRXUFH3RVWJUH64/GLVWULEXWLRQODUJHO\IXQGHGE\WKH
FRPSDQ\2SHQ6&*7KH%LJ64/GLVWULEXWLRQLVVLPLODUWR(QWHUSULVH'%DQGKDV
:HFDOOWKH\oZLWKRXWILOHDUJXPHQWVWRVWRSUHGLUHFWLRQRITXHU\UHVXOWVWR
LQVWDOOHUVIRUELWYHUVLRQVRI:LQGRZV0DFDQG/LQX[
ILOH
7RH[HFXWHRXUJHQHUDWHGVFULSWZHXVHWKH\iIROORZHGE\WKHJHQHUDWHG ,WLVQHZHUWKDQWKH(QWHUSULVH'%GLVWULEXWLRQDQGWDUJHWVLQWHURSHUDELOLW\
VFULSWQDPHFUHDWHBVFULSWVTO7KH\iLVWKHLQWHUDFWLYHYHUVLRQRIWKH 'HY2SVDQG%LJ'DWD$VVXFKLWLQFOXGHVH[WHQVLRQV\RXZRXOGQߞWFRPPRQO\
QRQLQWHUDFWLYH-fRSWLRQ ILQGLQRWKHUGLVWULEXWLRQV,WLVSDFNDJHGZLWKSJ764/DSURFHGXUDOODQJXDJH
WKDWHPXODWHV0LFURVRIW64/6HUYHUߞV7UDQVDFW64/VWRUHGSURFHGXUHODQJXDJH
7RUXQ([DPSOHZHHQWHUWKHIROORZLQJDWDQ26SURPSW DQGORWVRIJRRGLHVIRUEHQFKPDUNLQJDQGPRQLWRULQJOLNHSJ%DGJHU

psql -f build_stage.psql -d postgresql_book <RXߞOODOVRILQGRWKHUHQKDQFHPHQWVOLNH3RVW*,6 LQFOXGLQJRJUBIGZ PDQ\


RWKHU)':VVXFKDVKDGRRSBIGZFDVVDQGUDBIGZRUDFOHBIGZDQGYDULRXV3/V
([DPSOHLVDQDGDSWDWLRQRIDQDSSURDFKZHGHVFULEHLQ+RZWR&UHDWHDQ1 /LNH(QWHUSULVH'%%LJ64/KDVLWVRZQLQVWDOOHUV\VWHP7KHLQVWDOOHUFDQEH
FROXPQ7DEOH$VQRWHGLQWKHDUWLFOH\RXFDQSHUIRUPWKLVZLWKRXWDQ WULJJHUHGYLDDZHELQWHUIDFHRUYLDWKHVKHOOFRPPDQGOLQHWRROWKH\FDOOpgc
(DFK)':LVGLIIHUHQWDQGFRPHVZLWKLWVRZQ$3,VHWWLQJV LQWHUPHGLDU\ILOHE\XVLQJWKHDOFRPPDQGLQWURGXFHGLQ3RVWJUH64/
1H[WHVWDEOLVKDWOHDVWRQHXVHUIRU\RXU)':$OOXVHUVWKDWFRQQHFWWR\RXU
VHUYHUVKRXOGEHDEOHWRDFFHVVWKH*RRJOHVHDUFKVHUYHUVRKHUHZHFUHDWHRQH
IRUWKHHQWLUHpublicJURXS
SVTO&XVWRPL]DWLRQV
,I\RXVSHQGPRVWRI\RXUGD\LQSVTOFRQVLGHUWDLORULQJWKHSVTOHQYLURQPHQWWR
CREATE USER MAPPING FOR public SERVER www_fdw_server_google_search; PDNH\RXPRUHSURGXFWLYHSVTOUHDGVVHWWLQJVIURPDFRQILJXUDWLRQILOHFDOOHG
SVTOUFLISUHVHQW:KHQSVTOODXQFKHVLWVHDUFKHVIRUWKLVILOHDQGUXQVDOO
1RZFUHDWH\RXUIRUHLJQWDEOHDVVKRZQLQ([DPSOH(DFKILHOGLQWKHWDEOH FRPPDQGVWKHUHLQ
FRUUHVSRQGVWRD*(7SDUDPHWHULQWKH85/WKDW*RRJOHFUHDWHVIRUDVHDUFK
2Q/LQX[8QL[WKHILOHLVFXVWRPDULO\QDPHGSVTOUFDQGVKRXOGEHSODFHGLQ
([DPSOH0DNHDIRUHLJQWDEOHIURP*RRJOH \RXUKRPHGLUHFWRU\2Q:LQGRZVWKHILOHLVFDOOHGSVTOUFFRQIDQGVKRXOGEH
CREATE FOREIGN TABLE www_fdw_google_search ( SODFHGLQWKH$33'$7$?SRVWJUHVTOIROGHUZKLFKXVXDOO\UHVROYHVWR
q text,
GsearchResultClass text, &?8VHUV?username?$SS'DWD?5RDPLQJ?SRVWJUHVTO'RQߞWZRUU\LI\RXFDQߞWILQG
unescapedUrl text, WKHILOHULJKWDIWHULQVWDOODWLRQ\RXXVXDOO\QHHGWRFUHDWHLW$Q\VHWWLQJVLQWKH
url text,
visibleUrl text,
ILOHZLOORYHUULGHSVTOGHIDXOWV
cacheUrl text,
title text,
([DPSOHLVDJOLPSVHLQWRWKHFRQWHQWVRIDSVTOUFILOH<RXFDQLQFOXGHDQ\
content text SVTOFRPPDQG
) SERVER www_fdw_server_google_search;
([DPSOH([DPSOHSVTOUFILOH
7KHXVHUPDSSLQJGRHVQߞWDVVLJQDQ\ULJKWV<RXVWLOOQHHGWRJUDQWULJKWVEHIRUH \pset null 'NULL'
EHLQJDEOHWRTXHU\WKHIRUHLJQWDEOH \encoding latin1
\set PROMPT1 '%n@%M:%>%x %/# '
\pset pager always
GRANT SELECT ON TABLE www_fdw_google_search TO public; \timing on
\set qstats92 '
SELECT usename, datname, left(query,100) || ''...'' As query
1RZFRPHVWKHIXQSDUW:HVHDUFKZLWKWKHWHUPNew in PostgreSQL 9.4DQG FROM pg_stat_activity WHERE state != ''idle'' ;
PL[LQDELWRIUHJXODUH[SUHVVLRQJRRGQHVVWRVWULSRII+70/WDJV '

SELECT regexp_replace(title,E'(?x)(< [^>]*? >)','','g') As title


FROM www_fdw_google_search :$51,1*
WHERE q = 'New in PostgreSQL 10'
LIMIT 2; (DFKFRPPDQGPXVWEHRQDVLQJOHOLQHZLWKRXWEUHDNV2XUH[DPSOHVPD\DGGOLQHEUHDNVWR
DFFRPPRGDWHSULQWLQJ

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\OHVODVK IRUZDUG
VODVK IRUSDWK,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;

\set PROMPT1 '%n@%M:%>%x %/# '


7KHQFUHDWH\RXU*RRJOHIRUHLJQGDWDVHUYHU
7KLVLQFOXGHVZKRPZHDUHORJJHGLQDV %n WKHKRVWVHUYHU %M WKHSRUW %> 
CREATE SERVER www_fdw_server_google_search
WKHWUDQVDFWLRQVWDWXV %x DQGWKHGDWDEDVH %/ 7KLVLVSUREDEO\RYHUNLOOVR FOREIGN DATA WRAPPER www_fdw
HFRQRPL]HDV\RXVHHILW7KHFRPSOHWHOLVWLQJRISURPSWV\PEROVLVGRFXPHQWHG OPTIONS (uri '[Link]
LQWKHSVTO5HIHUHQFH*XLGH
7KHGHIDXOWIRUPDWVXSSRUWHGE\www_fdwLV-621VRZHGLGQߞWQHHGWRLQFOXGH
:KHQZHFRQQHFWZLWKSVTOWRRXUGDWDEDVHRXUHQKDQFHGSURPSWORRNVOLNH
LWLQWKHOPTIONSPRGLILHU7KHRWKHUVXSSRUWHGIRUPDWLV;0/)RUGHWDLOVRQ
postgres@localhost:5442 postgresql_book# DGGLWLRQDOSDUDPHWHUVWKDW\RXFDQVHWUHIHUWRWKHwww_fdw GRFXPHQWDWLRQ
6KRXOGZHVZLWFKWRDQRWKHUGDWDEDVHXVLQJ\connect postgis_bookRXU
CREATE SCHEMA wb_data;
IMPORT FOREIGN SCHEMA ogr_all SURPSWFKDQJHVWR
FROM SERVER ogr_fdw_wb INTO wb_data;
postgres@localhost:5442 postgis_book#
7KHogr_allVFKHPDLVDFDWFKDOOWKDWLPSRUWVDOOWDEOHVLQWKHIRUHLJQVHUYHU
UHJDUGOHVVRIVFKHPD6RPHGDWDVRXUFHVVFKHPDVDQGVRPHGRQߞW7R 7LPLQJ([HFXWLRQV
DFFRPPRGDWHDOOLQSXWVRJUBIGZ LQSODFHRIRJUBDOO DFFHSWVWKHLQLWLDO
<RXPD\ILQGLWLQVWUXFWLYHWRKDYHSVTORXWSXWWKHWLPHLWWRRNIRUHDFKTXHU\WR
FKDUDFWHUVRIDWDEOHQDPHDVWKHVFKHPD6RIRUH[DPSOHLI\RXZDQWHGWR
H[HFXWH8VHWKH\timingFRPPDQGWRWRJJOHLWRQDQGRII
LPSRUWMXVWDVXEVHWRIZRUNVKHHWVZKHUHWKHZRUNVKHHWQDPHEHJLQVZLWK
ߡ)LQDQFHߢ\RXZRXOGUHSODFHRJUBDOOZLWKߡ)LQDQFHߢ :KHQHQDEOHGHDFKTXHU\\RXUXQZLOOUHSRUWWKHGXUDWLRQDWWKHHQG)RU
H[DPSOHZLWK\timing onH[HFXWLQJSELECT COUNT(*) FROM pg_tables;
CREATE SCHEMA wb_data; RXWSXWV
IMPORT FOREIGN SCHEMA "Finance"
FROM SERVER ogr_fdw_wb INTO wb_data;
count
--------
7KHVFKHPDLVFDVHVHQVLWLYHVRLIWKHQDPHRIDZRUNVKHHWFRQWDLQVXSSHUFDVH 73
FKDUDFWHUVRUQRQVWDQGDUGFKDUDFWHUVLWQHHGVWREHTXRWHG (1 row)
Time: 18.650 ms
7KLVQH[WH[DPSOHZLOOFUHDWHDVHUYHUSRLQWLQJWRDIROGHURI&69ILOHV&UHDWHD
VFKHPDIIWRKRXVHIRUHLJQWDEOHVIRUWKH&69VHUYHU7KH)':ZLOOWKHQFUHDWH $XWRFRPPLW&RPPDQGV
IRUHLJQWDEOHVOLQNHGWR&69ILOHVZKHUHWKH&69ILOHQDPHEHJLQVZLWK+RXVLQJ
LQVFKHPDII %\GHIDXOWDXWRFRPPLWLVRQPHDQLQJDQ\64/FRPPDQG\RXLVVXHWKDW
FKDQJHVGDWDZLOOLPPHGLDWHO\FRPPLW(DFKFRPPDQGLVLWVRZQWUDQVDFWLRQ
CREATE SERVER ogr_fdw_ff DQGLVLUUHYHUVLEOH,I\RXDUHUXQQLQJDODUJHEDWFKRISUHFDULRXVXSGDWHV\RX
FOREIGN DATA WRAPPER ogr_fdw PD\ZDQWDVDIHW\QHW6WDUWE\WXUQLQJRIIDXWRFRPPLW\set AUTOCOMMIT off
OPTIONS (datasource '/fdw_data/factfinder', format 'CSV');
CREATE SCHEMA ff; 1RZ\RXKDYHWKHRSWLRQWRUROOEDFN\RXUVWDWHPHQWV
IMPORT FOREIGN SCHEMA "Housing"
FROM SERVER ogr_fdw_ff INTO ff; UPDATE [Link] SET short_name = 'This is a mistake.';

,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:eav WKHFRORQUHVROYHVWKHYDULDEOH 
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

CREATE SERVER ogr_fdw_wb


FOREIGN DATA WRAPPER ogr_fdw
:$51,1* OPTIONS (
:LQGRZVGRHVQRWVWRUHWKHFRPPDQGKLVWRU\XQOHVV\RXߞUHUXQQLQJD/LQX[8QL[YLUWXDO datasource '/fdw_data/[Link]',
HQYLURQPHQWVXFKDV&\JZ\Q0LQJ:RU06<6 format 'ODS'
);
IRUHLJQWDEOHV\RXH[SHFWHG
$FRPSDQLRQFODXVHWRLIMIT TOLVWKHEXCEPTFODXVH,QVWHDGRIEULQJLQJLQ
SVTO*HPV
WDEOHVOLVWHGLWEULQJVLQWDEOHVQRWOLVWHG
,QWKLVVHFWLRQZHFRYHUKHOSIXOIHDWXUHWWHVEXULHGLQVLGHWKHSVTO
,I\RXWDNHDGYDQWDJHRI3RVWJUH64/H[WHQVLRQV\RXߞOOZDQWWRXVHWKH
GRFXPHQWDWLRQ
SHUIRUPDQFHHQKDQFHPHQWIRUHLJQVHUYHURSWLRQLQWURGXFHGLQYHUVLRQFDOOHG
H[WHQVLRQV7RXWLOL]HLWDGGWKHRSWLRQWRDQH[LVWLQJSRVWJUHVBIGZVHUYHUDVZH
GRLQWKHIROORZLQJH[DPSOH ([HFXWLQJ6KHOO&RPPDQGV
,QSVTO\RXFDQFDOORXWWRWKH26VKHOOZLWKWKH\!FRPPDQG/HWߞVVD\\RXߞUH
ALTER SERVER census(OPTION ADD extensions 'btree_gist, pg_trgm');
RQ:LQGRZVDQGQHHGDGLUHFWRU\OLVWLQJ,QVWHDGRIH[LWLQJSVTORURSHQLQJ
DQRWKHUZLQGRZ\RXFDQMXVWW\SH\! dirDWWKHSVTOSURPSW
7KHH[WHQVLRQVRSWLRQLVDFRPPDVHSDUDWHGOLVWRIH[WHQVLRQVLQVWDOOHGRQWKH
IRUHLJQVHUYHU:KHQ3RVWJUH64/UXQVDTXHU\LQYROYLQJDQ\RIWKHW\SHVRU
IXQFWLRQVGHILQHGLQWKHH[WHQVLRQLQD:+(5(FODXVHLWZLOOWU\WRSXVKWKH :DWFKLQJ6WDWHPHQWV
IXQFWLRQFDOOVWRWKHUHPRWHVHUYHUIRULPSURYHGSHUIRUPDQFH,IWKHH[WHQVLRQV 7KH\watchFRPPDQGKDVEHHQLQSVTOVLQFH3RVWJUH64/8VHLWWR
RSWLRQLVQRWVSHFLILHGDOOH[WHQVLRQIXQFWLRQVZLOOEHUXQORFDOO\ZKLFKPD\ UHSHDWHGO\UXQDQ64/VWDWHPHQWDWIL[HGLQWHUYDOVVR\RXFDQPRQLWRUWKH
UHTXLUHWUDQVIHUULQJPRUHGDWD RXWSXW)RUH[DPSOHVXSSRVH\RXZDQWWRNHHSWDEVRQTXHULHVWKDWKDYH\HWWR
FRPSOHWH7DJWKHZDWFKFRPPDQGWRWKHHQGRIWKHTXHU\DVVKRZQLQ
4XHU\LQJ2WKHU7DEXODU)RUPDWVZLWKRJUBIGZ ([DPSOH
7KHUHDUHPDQ\)':VIRUTXHU\LQJRWKHUUHODWLRQDOGDWDEDVHVRUIODWILOH ([DPSOH:DWFKLQJFRQQHFWLRQWUDIILFHYHU\VHFRQGV
IRUPDWV0RVW)':VWDUJHWDVSHFLILFNLQGRIGDWDVRXUFH)RUH[DPSOH\RXFDQ SELECT datname, query
ILQGWKH0RQJR'%)':IRUTXHU\LQJ0RQJR'EGDWD+DGRRS)':IRU FROM pg_stat_activity
WHERE state = 'active' AND pid != pg_backend_pid();
TXHU\LQJ+DGRRSGDWDVRXUFHVDQG0\64/)':IRUTXHU\LQJ0\64/GDWD \watch 10
VRXUFHV
$OWKRXJK\watchLVSULPDULO\IRUPRQLWRULQJTXHU\RXWSXW\RXFDQXVHLWWR
7KHUHDUHWZR)':VZHDUHDZDUHRIWKDWEXQGOHPDQ\IRUPDWV0XOWLFRUQ)': H[HFXWHVWDWHPHQWVDWIL[HGLQWHUYDOV,Q([DPSOHZHILUVWFUHDWHDWDEOH
LVUHDOO\DQ)':$3,WKDWDOORZV\RXWRZULWH\RXURZQ)':LQ3\WKRQ7KHUH XVLQJEXONLQVHUWV\QWD[ DQGWKHQORJDFWLYLW\HYHU\ILYHVHFRQGVDIWHU2QO\WKH
DUHVRPHUHDG\PDGHGULYHUVDYDLODEOHEXWWKH0XOWLFRUQ)':FXUUHQWO\KDVQR ODVWVWDWHPHQWWKDWGRHVWKHLQVHUWLVUHSHDWHGHYHU\ILYHVHFRQGV
RIIHULQJRQ:LQGRZVDQGLVRIWHQWULFN\WRJHWZRUNLQJRQ/LQX[
([DPSOH/RJWUDIILFHYHU\ILYHVHFRQGV
ogr_fdwLVDQRWKHU)':WKDWVXSSRUWVPDQ\IRUPDWVDQGWKHRQHZHߞOO SELECT * INTO log_activity
GHPRQVWUDWHLQWKLVVHFWLRQRJUBIGZVXSSRUWVPDQ\WDEXODUIRUPDWVVXFKDV FROM pg_stat_activity;
VSUHDGVKHHWV'EDVHILOHVDQG&69VDVZHOODVRWKHUUHODWLRQDOGDWDEDVHV,WLV INSERT INTO log_activity
SELECT * FROM pg_stat_activity; \watch 5
DOVRDVSDWLDOGDWDEDVHGULYHUWKDWWUDQVIRUPVVSDWLDOFROXPQVIURPRWKHU
GDWDEDVHVOLNH64/6HUYHURU2UDFOHLQWRWKH3RVW*,63RVWJUH64/VSDWLDO &UHDWHWDEOHDQGGRILUVWLQVHUW
JHRPHWU\W\SH ,QVHUWHYHU\ILYHVHFRQGV
7RNLOODZDWFKXVHCTRL-X CTRL-C 7KLVFRSLHVWKHFROODWLRQVHWWLQJVIURPWKHIRUHLJQVHUYHUIRUWKHIRUHLJQ
WDEOHV7KHGHIDXOWIRUWKLVVHWWLQJLVtrue
5HWULHYLQJ'HWDLOVRI'DWDEDVH2EMHFWV import_default
9DULRXVSVTOGHVFULEHFRPPDQGVOLVWGDWDEDVHREMHFWVDORQJZLWKGHWDLOV 7KLVFRQWUROVZKHWKHUGHIDXOWYDOXHVIRUFROXPQVVKRXOGEHLQFOXGHG7KH
([DPSOHGHPRQVWUDWHVKRZWROLVWDOOWDEOHVDQGWKHLUVL]HVRQGLVNLQWKH GHIDXOWIRUWKHRSWLRQLVfalseVRFROXPQVRQWKHORFDOVHUYHUKDYHQR
SJBFDWDORJVFKHPDWKDWEHJLQVZLWKWKHOHWWHUVpg_t GHIDXOWV%XWGHIDXOWYDOXHVDUHXVHIXOGXULQJLQVHUWVLI\RXQHJOHFWWR
([DPSOH/LVWWDEOHVZLWK?GW VSHFLI\WKHYDOXHRIDFROXPQ3RVWJUH64/DXWRPDWLFDOO\LQVHUWVWKHGHIDXOW
\dt+ pg_catalog.pg_t* %HFDUHIXOWKRXJKߚWKHEHKDYLRURIGHIDXOWFRXOGEHXQH[SHFWHGLI\RXߞUH
Schema | Name | Type | Owner | Size | Description UHO\LQJRQDVHTXHQFHIRUDXWRQXPEHULQJ7KHQH[WDVVLJQHGYDOXHIURPWKH
-----------+------------------+-------+----------+--------+------------
pg_catalog | pg_tablespace | table | postgres | 40 kB |
VHTXHQFHFRXOGEHGLIIHUHQWEHWZHHQWKHIRUHLJQVHUYHUDQGWKHORFDOVHUYHU
pg_catalog | pg_trigger | table | postgres | 16 kB |
pg_catalog | pg_ts_config | table | postgres | 40 kB | import_not_null
pg_catalog | pg_ts_config_map | table | postgres | 48 kB |
pg_catalog | pg_ts_dict | table | postgres | 40 kB | 7KLVFRQWUROVZKHWKHU12718//FRQVWUDLQWVDUHLPSRUWHG7KHGHIDXOWLV
pg_catalog | pg_ts_parser | table | postgres | 40 kB | true
pg_catalog | pg_ts_template | table | postgres | 40 kB |
pg_catalog | pg_type | table | postgres | 112 kB | ,Q([DPSOHZHLPSRUWDOOWDEOHVLQRXUERRNVSXEOLFVFKHPD
,I\RXQHHGIXUWKHUGHWDLORQDSDUWLFXODUREMHFWXVHWKH\d+FRPPDQGDVVKRZQ ([DPSOH8VH,03257)25(,*16&+(0$WROLQNDOOWDEOHVLQDVFKHPD
LQ([DPSOH CREATE SCHEMA remote_census;
IMPORT FOREIGN SCHEMA public
([DPSOH'HVFULEHREMHFWZLWK?G FROM SERVER book_server
INTO remote_census
\d+ pg_ts_dict
OPTIONS (import_default 'true');
Table "pg_catalog.pg_ts_dict"
Column | Type | Modifiers | Storage | Stats target | Description
---------------+------+-----------+----------+--------------+------------ 7KHIMPORT FOREIGN SCHEMADVVKRZQLQ([DPSOHZLOOFUHDWHIRUHLJQ
dictname | name | not null | plain | | WDEOHVZLWKWKHVDPHQDPHVDVWKRVHLQWKHIRUHLJQVFKHPDDQGFUHDWHWKHPLQWKH
dictnamespace | oid | not null | plain | |
dictowner | oid | not null | plain | | GHVLJQDWHGVFKHPDremote_census
dicttemplate | oid | not null | plain | |
dictinitoption | text | | extended | | 7REULQJLQRQO\DVXEVHWRIWDEOHVXVHLIMIT TORUEXCEPTPRGLILHUV)RU
Indexes: H[DPSOHWREULQJLQMXVWWKHfactsDQGlu_fact_typesWDEOHVZHFRXOGKDYH
"pg_ts_dict_dictname_index" UNIQUE, btree (dictname, dictnamespace)
"pg_ts_dict_oid_index" UNIQUE, btree (oid)
ZULWWHQ
Has OIDs: yes
IMPORT FOREIGN SCHEMA census
LIMIT TO (facts, lu_fact_types)
&URVVWDEV FROM SERVER book_server INTO remote_census;

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

CREATE FOREIGN TABLE staging.factfinder_array (x text[]) ,Q([DPSOHZHODXQFKLQWHUDFWLYHSVTOFRQQHFWWRRXUGDWDEDVHXVH\cdWR


SERVER file_taserver
OPTIONS ( FKDQJHWKHFXUUHQWGLUHFWRU\WRWKHIROGHUFRQWDLQLQJRXUILOHDQGLPSRUWRXUGDWD
format 'csv', XVLQJWKH\copyFRPPDQG%HFDXVHWKHGHIDXOWGHOLPLWHULVDWDEZHDXJPHQW
filename '/postgresql_book/ch10/DEC_10_SF1_QTH1_with_ann.csv',
header 'false', RXUVWDWHPHQWZLWKCSVWRWHOOSVTOWKDWRXUGDWDLVFRPPDVHSDUDWHGLQVWHDG
delimiter ',',
quote '"', ,I\RXUILOHKDVQRQVWDQGDUGGHOLPLWHUVVXFKDVSLSHVLQGLFDWHWKHGHOLPLWHUDV
encoding 'latin1', IROORZV
null ''
);
\copy sometable FROM [Link] DELIMITER '|';
2XUH[DPSOH&69EHJLQVZLWKHLJKWKHDGHUURZVDQGKDVPRUHFROXPQVWKDQZH
FDUHWRFRXQW:KHQWKHVHWXSLVILQLVKHG\RXFDQILQDOO\TXHU\RXUGHOLPLWHGILOH 'XULQJLPSRUW\RXFDQUHSODFHQXOOYDOXHVZLWKVRPHWKLQJRI\RXURZQ
GLUHFWO\7KHIROORZLQJTXHU\ZLOOJLYHXVWKHQDPHVRIWKHKHDGHUURZVZKHUH FKRRVLQJE\DGGLQJDNULL ASDVLQWKHIROORZLQJ
WKHILUVWFROXPQRIWKHKHDGHULV[Link]
\copy sometable FROM [Link] NULL As ''; \RXZDQW:HXVXDOO\FUHDWHDVHSDUDWHVFKHPDWRKRXVHIRUHLJQGDWD)RUWKLV
H[DPSOHZHߞOOXVHRXUVWDJLQJVFKHPDDVVKRZQLQ([DPSOH
:$51,1* +HUHDUHDIHZLQLWLDOOLQHVRIWKHSLSHGHOLPLWHGILOHZHDUHOLQNLQJWRWRVKRZ
'RQߞWFRQIXVHWKH\copyFRPPDQGLQSVTOZLWKWKHCOPYVWDWHPHQWSURYLGHGE\WKH64/
WKHIRUPDWRIWKHGDWDZHDUHWDNLQJLQ
ODQJXDJH%HFDXVHSVTOLVDFOLHQWXWLOLW\DOOSDWKVDUHLQWHUSUHWHGUHODWLYHWRWKHFRQQHFWHG
FOLHQW7KH64/FRS\LVVHUYHUEDVHGDQGUXQVXQGHUWKHFRQWH[WRIWKHSRVWJUHVVHUYLFH26 Dev|Company
DFFRXQW7KHLQSXWILOHIRUDQ64/FRS\PXVWUHVLGHLQDSDWKDFFHVVLEOHE\WKHSRVWJUHV Tom Lane|Crunchy Data
VHUYLFHDFFRXQW Bruce Momjian|EnterpriseDB

([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/

CREATE EXTENSION file_fdw; )LJXUH0LQLPDOLVW+70/UHSRUW

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

ALTER SYSTEM SET wal_level = logical; )LJXUH$GYDQFHG+70/UHSRUW

$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

pg_dump -U postgres -p5447 -Fp --section pre-data --section post-data \


-f pub_struct.sql postgresql_book

$QGWKHQXVHSVTORQWKHVXEVFULEHUVHUYHUWRFUHDWHRXUVXEVFULSWLRQGDWDEDVH
ZLWKVWUXFWXUHVDVIROORZV

CREATE DATABASE book_sub;


&KDSWHU8VLQJSJ$GPLQ 2Q:LQGRZV

restore_command = 'copy %p ..\\archive\\%f'

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

standby_mode = 'on' *UDSKLFDOH[SODLQIRU\RXUTXHULHV


primary_conninfo = 'host=[Link] port=5432 user=pgrepuser password=woohoo 7KLVDZHVRPHIHDWXUHRIIHUVSLFWRULDOLQVLJKWLQWRZKDWWKHTXHU\SODQQHULV
application_name=replica1' WKLQNLQJ:KLOHYHUERVHWH[WEDVHGSODQQHURXWSXWVWLOOKDVLWVSODFHD
trigger_file = '[Link]' JUDSKLFDOH[SODLQSURYLGHVDPRUHGLJHVWLEOHELUGߞVH\HYLHZ

 ,I\RXILQGWKDWWKHVODYHFDQߞWSOD\EDFN:$/VIDVWHQRXJK\RXFDQVSHFLI\ 64/SDQH


DORFDWLRQIRUFDFKLQJ,QWKDWFDVHDGGWRWKHUHFRYHU\FRQIILOHDOLQHVXFKDV SJ$GPLQXOWLPDWHO\LQWHUDFWVZLWK3RVWJUH64/YLD64/DQGLWߞVQRWVK\
WKHIROORZLQJZKLFKYDULHVGHSHQGLQJRQWKH26 DERXWOHWWLQJ\RXVHHWKHJHQHUDWHG64/:KHQ\RXXVHWKHJUDSKLFDO
2Q/LQX[8QL[ LQWHUIDFHWRPDNHFKDQJHVWR\RXUGDWDEDVHSJ$GPLQDXWRPDWLFDOO\GLVSOD\V
LQDQ64/SDQHWKHXQGHUO\LQJ64/WKDWZLOOSHUIRUPWKHWDVNV)RUQRYLFHV
restore_command = 'cp %p ../archive/%f' VWXG\LQJWKHJHQHUDWHG64/LVDVXSHUEOHDUQLQJRSSRUWXQLW\)RUSURVWDNLQJ
DGYDQWDJHRIWKHJHQHUDWHG64/LVDJUHDWWLPHVDYHU
*8,HGLWRUIRUFRQILJXUDWLRQILOHVVXFKDVSRVWJUHVTOFRQIDQGSJBKEDFRQI 127(
<RXQRORQJHUQHHGWRGLJDURXQGIRUWKHILOHVDQGXVHDQRWKHUHGLWRU7KLVLV ,QYHUVLRQDQGDERYHWKHSJB[ORJGLUHFWRU\LVSJBZDO
FXUUHQWO\RQO\SUHVHQWLQSJ$GPLQDQGWRXVHLW\RXDOVRQHHGWRLQVWDOOWKH
pgadminH[WHQVLRQLQWKHGDWDEDVHFDOOHGpostgres
,QWKHIROORZLQJH[DPSOHZHDUHRQWKHVODYHVHUYHUDQGSHUIRUPLQJD
'DWDH[SRUWDQGLPSRUW VWUHDPLQJEDVHEDFNXSIURPRXUPDVWHUVHUYHU  
SJ$GPLQFDQHDVLO\H[SRUWTXHU\UHVXOWVDVD&69ILOHRURWKHUGHOLPLWHG
IRUPDWDQGLPSRUWVXFKILOHVDVZHOOSJ$GPLQFDQHYHQH[SRUWUHVXOWVDV pg_basebackup -D /target_dir -h [Link] \
+70/SURYLGLQJ\RXZLWKDWXUQNH\UHSRUWLQJHQJLQHDOEHLWDELWFUXGH --port=5432 --checkpoint=fast
--xlog-method=stream -R
%DFNXSDQGUHVWRUHZL]DUG
&DQߞWUHPHPEHUWKHP\ULDGFRPPDQGVDQGVZLWFKHVWRSHUIRUPDEDFNXSRU ,I\RXDUHXVLQJSJBEDVHEDFNXSSULPDULO\IRUEDFNXSSXUSRVHV\RXFDQXVHWKH
UHVWRUHXVLQJSJBUHVWRUHDQGSJBGXPS"SJ$GPLQKDVDQLFHLQWHUIDFHWKDW WDUUHGFRPSUHVVHGIRUPZKLFKZLOOFUHDWHDWDUJ]ILOHLQWKHWDUJHWBGLUIROGHUIRU
OHWV\RXVHOHFWLYHO\EDFNXSDQGUHVWRUHGDWDEDVHVVFKHPDVVLQJOHWDEOHV HDFKWDEOHVSDFH-XLVVKRUWKDQGIRU--xlog-method7KHWDUUHGFRPSUHVVLRQ
DQGJOREDOV<RXFDQYLHZDQGFRS\WKHXQGHUO\LQJSJBGXPSRUSJBUHVWRUH IRUPDWGRHVQRWVXSSRUWVWUHDPLQJORJVVR\RXKDYHWRUHVRUWWRIHWFKLQJWKHORJV
FRPPDQGWKDWSJ$GPLQXVHGLQWKH0HVVDJHWDE ZLWKWKDWIRUPDW
*UDQWZL]DUG pg_basebackup -Z9 -D /target_dir/ -h [Link] -Ft -Xfetch
7KLVWLPHVDYHUDOORZV\RXWRFKDQJHSULYLOHJHVRQPDQ\GDWDEDVHREMHFWVLQ
RQHIHOOVZRRS )RUEDFNXS\RXZLOOZDQWWRDXJPHQW\RXUEDFNXSWRLQFOXGHWUDQVDFWLRQORJ
VKLSSLQJEDFNXSXVLQJSJBUHFHLYH[ORJIRUYHUVLRQVSULRUWR)RUYHUVLRQV
SJ6FULSWHQJLQH DQGDERYHSJBUHFHLYH[ORJZDVUHQDPHGWRSJBUHFHLYHZDO7KLV\RXߞOOZDQWWR
7KLVLVDTXLFNDQGGLUW\ZD\WRUXQVFULSWVWKDWGRQߞWKDYHWRFRPSOHWHDV NHHSUXQQLQJDVDFURQMRERUVHUYLFHWRFRQWLQXDOO\PDNHORJEDFNXSV
WUDQVDFWLRQV:LWKWKLV\RXFDQH[HFXWHORRSVWKDWFRPPLWRQHDFKLWHUDWLRQ
XQOLNHIXQFWLRQVWKDWUHTXLUHDOOVWHSVWREHFRPSOHWHGEHIRUHWKHZRUNLV &RQILJXULQJWKH6ODYHVIRU)XOO6HUYHU&OXVWHU5HSOLFDWLRQ
FRPPLWWHG8QIRUWXQDWHO\\RXFDQQRWXVHWKLVHQJLQHRXWVLGHRISJ$GPLQ
7KLVSDUWLVQRWQHHGHGIRUORJLFDOUHSOLFDWLRQ7RPLQLPL]HKHDGDFKHVVODYHV
DQGLWLVFXUUHQWO\RQO\DYDLODEOHLQSJ$GPLQ QRW 
VKRXOGKDYHWKHVDPHFRQILJXUDWLRQDVWKHPDVWHUHVSHFLDOO\LI\RXߞOOEHXVLQJ
64/(GLWRU$XWRFRPSOHWHIHDWXUH WKHPIRUIDLORYHU7KH\PXVWDOVRKDYHWKHVDPHVHWRI3RVWJUH64/H[WHQVLRQV
LQVWDOOHGLQELQDU\RWKHUZLVHZKHQ&5($7((;7(16,21LVSOD\HGEDFNLW
7RWULJJHUWKHDXWRFRPSOHWHSRSXSXVH&75/6SDFH7KHDXWRFRPSOHWH
ZLOOIDLODQGVWRSUHVWRUH,QRUGHUIRUWKHVHUYHUWREHDVODYHLWPXVWEHDEOHWR
IHDWXUHLVLPSURYHGLQSJ$GPLQ
SOD\EDFNWKH:$/WUDQVDFWLRQVRIWKHPDVWHU7KHVWHSVIRUFUHDWLQJDVODYHDUH
SJ$JHQW DVIROORZV
:HߞOOGHYRWHDQHQWLUHVHFWLRQWRWKLVFURVVSODWIRUPMREVFKHGXOLQJDJHQW  &UHDWHDQHZLQVWDQFHRI3RVWJUH64/ZLWKWKHVDPHYHUVLRQ SUHIHUDEO\HYHQ
SJ$GPLQSURYLGHVDFRROLQWHUIDFHWRLW PLFURYHUVLRQV DV\RXUPDVWHUVHUYHU)RU3RVWJUH64/NHHSLQJVHUYHUV
 $GGWKHarchive_commandFRQILJXUDWLRQGLUHFWLYHWRSRVWJUHVTODXWRFRQIRU &RQQHFWLQJWRD3RVWJUH64/6HUYHU
XVHALTER SYSTEMWRLQGLFDWHZKHUHWKH:$/VZLOOEHVDYHG:LWK &RQQHFWLQJWRD3RVWJUH64/VHUYHUZLWKSJ$GPLQLVVWUDLJKWIRUZDUG7KH
VWUHDPLQJ\RXߞUHIUHHWRFKRRVHDQ\GLUHFWRU\0RUHGHWDLOVRQWKLVVHWWLQJ *HQHUDODQG&RQQHFWLRQWDEVDUHVKRZQLQ)LJXUH
FDQEHIRXQGLQWKH3RVWJUH64/3*6WDQGE\GRFXPHQWDWLRQ
2Q/LQX[8QL[\RXUarchive_commandOLQHVKRXOGORRNVRPHWKLQJOLNH

archive_command = 'cp %p ../archive/%f'

<RXFDQDOVRXVHrsyncLQVWHDGRIcpLI\RXZDQWWRVWRUHWKH:$/VRQD
GLIIHUHQWVHUYHU

archive_command = 'rsync -av %p postgres@[Link]:archive/%f'

2Q:LQGRZV

archive_command = 'copy %p ..\\archive\\%f'

 $GGDUXOHWRSJBKEDFRQIDOORZLQJWKHVODYHVWRUHSOLFDWH$VDQH[DPSOH )LJXUHSJ$GPLQUHJLVWHUVHUYHUFRQQHFWLRQGLDORJ


WKHIROORZLQJUXOHZLOODOORZD3RVWJUH64/DFFRXQWQDPHGpgrepuserRQD
VHUYHURQ\RXUSULYDWHQHWZRUNZLWKDQ,3DGGUHVVLQWKHUDQJHWR 1DYLJDWLQJSJ$GPLQ
WRUHSOLFDWHXVLQJDQPGSDVVZRUG
7KHWUHHOD\RXWRISJ$GPLQLVLQWXLWLYHWRIROORZEXWGRHVHQJHQGHUVRPH
SRVVLEOHDQ[LHW\EHFDXVHLWVWDUWVRIIE\VKRZLQJ\RXHYHU\HVRWHULFREMHFWIRXQG
host replication pgrepuser [Link]/24 md5
LQWKHGDWDEDVH<RXFDQSDUHGRZQWKHWUHHGLVSOD\E\JRLQJLQWRWKH%URZVHU
VHFWLRQRI3UHIHUHQFHVDQGGHVHOHFWLQJREMHFWVWKDW\RXZRXOGUDWKHUQRWKDYHWR
 5HVWDUWWKH3RVWJUH64/VHUYLFHIRUWKHVHWWLQJVWRWDNHHIIHFW
VWDUHDWHYHU\WLPH\RXXVHSJ$GPLQ7RGHFOXWWHUWKHEURZVHWUHHVHFWLRQVJRWR
8VHWKHpg_basebackupXWLOLW\IRXQGLQWKHELQIROGHURI\RXU3RVWJUH64/ )LOHV࠱3UHIHUHQFHV࠱%URZVHU࠱1RGHV<RXZLOOVHHWKHVFUHHQVKRZQLQ
LQVWDOODWLRQWRFUHDWHDFOXVWHUEDFNXS7KLVZLOOFUHDWHDFRS\RIWKHGDWD )LJXUH
FOXVWHUILOHVLQWKHVSHFLILHGGLUHFWRU\
:KHQXVLQJSJBEDVHEDFNXSXVHWKH--xlog-method-streamVZLWFKWRDOVR
FRS\RYHUWKH:$/ORJVDQGWKH-RVZLWFKWRDXWRPDWLFDOO\FUHDWHDFRQILJ
ILOH7KHFRPPDQG--xlog-method-streamZLOOVSDZQDQRWKHUGDWDEDVH
FRQQHFWLRQIRUFRS\LQJWKH:$/V
EHIRUHGHFLGLQJZKDWWRXVH

6HWWLQJ8S)XOO6HUYHU5HSOLFDWLRQ
/HWߞVJRRYHUWKHVWHSVWRUHSOLFDWHWKHZKROHVHUYHUFOXVWHU:HߞOOWDNHDGYDQWDJH
RIVWUHDPLQJUHSOLFDWLRQ5HFDOOWKDWVWUHDPLQJUHSOLFDWLRQRQO\UHTXLUHV
FRQQHFWLRQVDWWKH3RVWJUH64/GDWDEDVHOHYHOEHWZHHQWKHPDVWHUDQGVODYHV

&RQILJXULQJWKH0DVWHU
7KHVWHSVIRUVHWWLQJXSWKHPDVWHUDUH

 &UHDWHDUHSOLFDWLRQDFFRXQW

CREATE ROLE pgrepuser REPLICATION LOGIN PASSWORD 'woohoo';

 $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
VODYHVVKRXOGEHUXQQLQJWKHVDPH26DQGELWQHVV ELWELW DVWKHPDVWHU,W
)LJXUH'LVFRQQHFWIURPWKHVHUYHUDQGUHFRQQHFW\RXVKRXOGVHHWKHPHQX
LVDOVRUHFRPPHQGHGWKDWDOOVHUYHUVEHUXQQLQJWKHVDPHPLQRUYHUVLRQDVWKH
HQDEOHG
PDVWHUWKRXJKUXQQLQJWKHVDPHSDWFKOHYHO PLFURYHUVLRQ LVQRWUHTXLUHG
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_fdw VHHߡ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%XWIRUODUJHGDWDEDVHV LQWKH
WHUDE\WHV WKHUHVWRUHLWVHOIFRXOGWDNHKRXUVLIQRWGD\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

CREATE EXTENSION pg_buffercache;

<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 

([DPSOHUHWXUQVWKHQXPEHURIEXIIHUHGSDJHVRIWKHfactsDQG  :ULWHWKHTXHU\


lu_fact_typesWDEOHV2IFRXUVHWRDFWXDOO\VHHEXIIHUHGURZV\RXQHHGWRUXQ  5XQWKHTXHU\
DTXHU\7U\WKLVRQH
 ,QSJ$GPLQ\RXߞGFKRRVH)LOH࠱([SRUW,QSJ$GPLQ\RXFOLFNWKH
SELECT T.fact_subcats[2], COUNT(*) As num_fact
FROM GRZQORDGLFRQ DQGEURZVHWRZKHUH\RXZDQWWRVDYH
[Link] As F
INNER JOIN  )RUSJ$GPLQ\RXJHWDGGLWLRQDOSURPSWVEHIRUHEHLQJJLYHQDVDYHRSWLRQ
census.lu_fact_types AS T ON F.fact_type_id = T.fact_type_id
GROUP BY T.fact_subcats[2];
)LOORXWWKHVHWWLQJVDVVKRZQLQ)LJXUH

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_cost 53&
UDWLRZKLFKLVWKHUHODWLYHFRVWRIGLVNDFFHVVZKHQUHWULHYLQJDUHFRUGXVLQJD
([SRUWLQJDV+70/RU;0/LVPXFKWKHVDPHH[FHSW\RXXVHWKH)LOH࠱4XLFN
VHTXHQWLDOUHDGYHUVXVUDQGRPDFFHVV*HQHUDOO\WKHIDVWHU DQGPRUHH[SHQVLYH
5HSRUWRSWLRQ VHH)LJXUH 
WKHSK\VLFDOGLVNWKHORZHUWKHUDWLR7KHGHIDXOWYDOXHIRU53&LVZKLFK
ZRUNVZHOOIRUPRVWPHFKDQLFDOKDUGGULYHVRQWKHPDUNHWWRGD\7KHXVHRI
VROLGVWDWHGULYHV 66'V KLJKHQGVWRUDJHDUHDQHWZRUNV 6$1V RUFORXG
VWRUDJHPDNHVLWZRUWKWZHDNLQJWKLVYDOXH
<RXFDQVHWWKH53&UDWLRSHUGDWDEDVHSHUVHUYHURUSHUWDEOHVSDFH$WWKH
VHUYHUOHYHOLWPDNHVPRVWVHQVHWRVHWWKHUDWLRLQWKHSRVWJUHVTOFRQIILOH,I\RX
KDYHGLIIHUHQWNLQGVRIGLVNV\RXFDQVHWWKHYDOXHVDWWKHtablespaceOHYHO
XVLQJWKHALTER TABLESPACEFRPPDQG

ALTER TABLESPACE pg_default SET (random_page_cost=2);

'HWDLOVDERXWWKLVVHWWLQJFDQEHIRXQGDW5DQGRP3DJH&RVW5HYLVLWHG7KH
DUWLFOHVXJJHVWVWKHIROORZLQJVHWWLQJV
+LJKHQG1$66$1RU
$PD]RQ(%6DQG+HURNX
L6&6,DQGRWKHUPHGLRFUH6$1VEXWYDULHVZLGHO\
66'VWR
1Y5$0 RU1$1' 
pg_statsJLYHVWKHSODQQHUDVHQVHRIKRZDFWXDOYDOXHVDUHGLVSHUVHGZLWKLQD
JLYHQFROXPQDQGOHWVLWSODQDFFRUGLQJO\7KHpg_statsWDEOHLVFRQVWDQWO\
XSGDWHGDVDEDFNJURXQGSURFHVV$IWHUDODUJHGDWDORDGRUDPDMRUGHOHWLRQ\RX
VKRXOGPDQXDOO\XSGDWHWKHVWDWVE\H[HFXWLQJVACUUM ANALYZEVACUUM
SHUPDQHQWO\UHPRYHVGHOHWHGURZVIURPWDEOHVANALYZEXSGDWHVWKHVWDWV
)RUFROXPQVWKDWSDUWLFLSDWHRIWHQLQMRLQVDQGDUHXVHGKHDYLO\LQWHEREFODXVHV
FRQVLGHULQFUHDVLQJWKHQXPEHURIVDPSOHGURZV

ALTER TABLE [Link] ALTER COLUMN fact_type_id SET STATISTICS 1000;

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%DFNXS VHH)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\RXFDQIRUJRWKHRWKHUWDEV VHH)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;

Labels will hold records.


,QWKHSDUDOOHOSODQIRXUZRUNHUVHDFKWDNHDERXWPVWRDFFRPSOLVKWKHLU
SET @labels = SRUWLRQRIWKHWDVN
SELECT
quote_ident(
replace( 3DUDOOHO6FDQV
replace(lower(COALESCE(fact_subcats[4], fact_subcats[3])), ' ', '_')
,':','' $SDUDOOHOTXHU\KDVDSDUWLFXODUVFDQVWUDWHJ\IRUSDUWLWLRQLQJWKHVHWRIGDWD
) DPRQJZRUNHUV,Q3RVWJUH64/RQO\DVHTXHQWLDOVFDQLVSDUDOOHOL]DEOH
) As col_name,
fact_type_id 3RVWJUH64/LVDOVRDEOHWRSDUDOOHOL]HELWPDSKHDSVFDQVLQGH[VFDQVDQG
FROM census.lu_fact_types LQGH[RQO\VFDQV+RZHYHUIRULQGH[DQGLQGH[RQO\VFDQVRQO\%7UHHLQGH[HV
WHERE category = 'Population' AND fact_subcats[3] ILIKE 'Hispanic or Latino%'
ORDER BY short_name;
ZLOOSDUDOOHOL]H1RVXFKOLPLWDWLRQH[LVWVIRUELWPDSKHDSVFDQVIRUWKHPDQ\
LQGH[W\SHZLOOTXDOLI\%XWLQWKHELWPDSKHDSVFDQWKHEXLOGLQJRIWKHELWPDS
SET @tdef = 'census.hisp_pop(tract_id varchar(11) PRIMARY KEY '; LQGH[LVQRWSDUDOOHOL]DEOHVRZRUNHUVPXVWZDLWIRUWKHELWPDSLQGH[WREHIXOO\
Loop through records using LINES function. EXLOW
WHILE @I < LINES(@labels)
BEGIN
SET @tdef = @tdef + ', ' + @labels[@I][0] + ' numeric(12,3) '; 3DUDOOHO-RLQV
ORDER BY area_type_code; SET @I = @I + 1;
Finalize GroupAggregate END
(cost=104596.49..104596.61 rows=3 width=10)
(actual time=500.440..500.444 rows=3 loops=1) SET @tdef = @tdef + ')';
Output: COUNT(*), area_type_code
Group Key: labor.area_type_code Print out table def.
-> Sort PRINT @tdef;
(cost=104596.49..104596.52 rows=12 width=10)
(actual time=500.433..500.435 rows=15 loops=1) create the table.
Output: area_type_code, (PARTIAL COUNT(*)) CREATE TABLE @tdef;
Sort Key: labor.area_type_code
Sort Method: quicksort Memory: 25kB $OWKRXJKSJ6FULSWGRHVQRWKDYHDQH[HFXWHFRPPDQGWKDWDOORZV\RXWRUXQ
-> Gather
(cost=104595.05..104596.28 rows=12 width=10)
G\QDPLFDOO\JHQHUDWHG64/ZHDFFRPSOLVKHGWKHVDPHWKLQJLQ([DPSOHE\
(actual time=500.159..500.382 rows=15 loops=1) DVVLJQLQJDQ64/VWULQJWRDYDULDEOH([DPSOHSXVKHVWKHHQYHORSHDELW
Output: area_type_code, (PARTIAL COUNT(*)) IXUWKHUE\SRSXODWLQJWKHcensus.hisp_popWDEOHZHMXVWFUHDWHG
Workers Planned: 4
Workers Launched: 4 ([DPSOH3RSXODWLQJWDEOHVZLWKSJ6FULSWORRS
-> Partial HashAggregate
(cost=103595.05..103595.08 rows=3 width=10) DECLARE @I, @labels, @tload, @tcols, @fact_types;
(actual time=483.081..483.082 rows=3 loops=5) SET @I = 0;
Output: area_type_code, PARTIAL count(*) SET @labels =
Group Key: labor.area_type_code SELECT
Worker 0: actual time=476.705..476.706 rows=3 loops=1 quote_ident(
Worker 1: actual time=480.704..480.705 rows=3 loops=1 replace(
Worker 2: actual time=480.598..480.599 rows=3 loops=1 replace(
Worker 3: actual time=478.000..478.000 rows=3 loops=1 lower(COALESCE(fact_subcats[4], fact_subcats[3])), ' ', '_'),':'
-> Parallel Seq Scan on [Link] ,''
(cost=0.00..95516.70 rows=1615670 width=2) )
(actual time=1.550..282.833 rows=1292543 loops=5) ) As col_name,
Output: area_type_code fact_type_id
Worker 0: actual time=0.078..282.698 rows=1278313 loops=1 FROM census.lu_fact_types
Worker 1: actual time=3.497..282.068 rows=1338095 loops=1 WHERE category = 'Population' AND fact_subcats[3] ILIKE 'Hispanic or Latino%'
Worker 2: actual time=3.378..281.273 rows=1232359 loops=1 ORDER BY short_name;
Worker 3: actual time=0.761..278.013 rows=1318569 loops=1
Planning time: 0.060 ms SET @tload = 'tract_id';
Execution time: 512.667 ms SET @tcols = 'tract_id';
SET @fact_types = '-1';
7RVHHWKHFRVWDQGWLPLQJZLWKRXWSDUDOOHOL]DWLRQVHW
WHILE @I < LINES(@labels)
max_parallel_workers_per_gather=0DQGFRPSDUHWKHSODQDVVKRZQLQ BEGIN
([DPSOH SET @tcols = @tcols + ', ' + @labels[@I][0] ;
SET @tload = @tload +
([DPSOH*URXSE\ZLWKRXWSDUDOOHOL]DWLRQ ', MAX(CASE WHEN fact_type_id = ' +
CAST(@labels[@I][1] AS STRING) +
set max_parallel_workers_per_gather=0; ' THEN val ELSE NULL END)';
EXPLAIN ANALYZE VERBOSE SET @fact_types = @fact_types + ', ' + CAST(@labels[@I][1] As STRING);
SELECT COUNT(*), area_type_code SET @I = @I + 1;
FROM labor END
GROUP BY area_type_code
INSERT INTO census.hisp_pop(@tcols) $QGWKHQUXQ([DPSOHDJDLQ7KHRXWSXWRIWKHQHZSODQLVVKRZQLQ
SELECT @tload FROM [Link]
WHERE fact_type_id IN(@fact_types) AND yr=2010
([DPSOH
GROUP BY tract_id;
([DPSOH(;3/$,1 $1$/<=( RXWSXWRI3DUDOOHOSODQ
7KHOHVVRQWRWDNHDZD\IURP([DPSOHLVWKDW\RXFDQG\QDPLFDOO\DSSHQG Gather
(cost=1029.57..1051.65 rows=192 width=64)
64/IUDJPHQWVLQWRDYDULDEOH (actual time=12.881..13.947 rows=1 loops=1)
Workers Planned: 1
Workers Launched: 1
Single Copy: true
*UDSKLFDO([SODLQ -> HashAggregate
(cost=29.57..32.45 rows=192 width=64)
2QHRIWKHJUHDWJHPVLQSJ$GPLQLVLWVDWDJODQFHJUDSKLFDOH[SODLQRIWKH (actual time=0.230..0.231 rows=1 loops=1)
TXHU\SODQ<RXFDQDFFHVVWKHJUDSKLFDOH[SODLQSODQE\RSHQLQJXSDQ64/ Group Key: "left"((tract_id)::text, 5)
-> Bitmap Heap Scan on hisp_pop
TXHU\ZLQGRZZULWLQJDTXHU\DQGFOLFNLQJWKHH[SODLQLFRQ  (cost=10.25..28.61 rows=192 width=36)
(actual time=0.127..0.184 rows=204 loops=1)
6XSSRVHZHUXQWKHTXHU\
Recheck Cond:
(((tract_id)::text >= '25025000000'::text) AND
SELECT left(tract_id, 5) As county_code, SUM(hispanic_or_latino) As tot, ((tract_id)::text <= '25025999999'::text))
SUM(white_alone) As tot_white, -> Bitmap Index Scan on hisp_pop_pkey
SUM(COALESCE(hispanic_or_latino,0) - COALESCE(white_alone,0)) AS non_white (cost=0.00..10.20 rows=192 width=0)
FROM census.hisp_pop (actual time=0.106..0.106 rows=204 loops=1)
GROUP BY county_code Index Cond:
ORDER BY county_code; (((tract_id)::text >= '25025000000'::text) AND
((tract_id)::text <= '25025999999'::text))
Planning time: 0.416 ms
:HZLOOJHWWKHJUDSKLFDOH[SODLQVKRZQLQ)LJXUH+HUHߞVDTXLFNWLSIRU Execution time: 16.160 ms
LQWHUSUHWLQJWKHJUDSKLFDOH[SODLQWULPWKHIDW7KHIDWWHUWKHDUURZWKHORQJHUD
VWHSWDNHVWRFRPSOHWH 7KHFRVWRIRUJDQL]LQJDGGLWLRQDOZRUNHUV HYHQRQH VLJQLILFDQWO\LQFUHDVHVWKH
WRWDOWLPHRIWKHTXHU\
*HQHUDOO\SDUDOOHOL]DWLRQLVUDUHO\ZRUWKZKLOHIRUTXHULHVWKDWILQLVKLQDIHZ
PLOOLVHFRQGV%XWIRUTXHULHVRYHUDJLQRUPRXVGDWDVHWWKDWQRUPDOO\WDNH
VHFRQGVRUPLQXWHVWRFRPSOHWHSDUDOOHOL]DWLRQLVZRUWKWKHLQLWLDOVHWXSFRVW
7RLOOXVWUDWHWKHEHQHILWRISDUDOOHOL]DWLRQZHGRZQORDGHGDWDEOHIURPWKH86
%XUHDXRI/DERU6WDWLVWLFVZLWKPLOOLRQURZVRIGDWDDQGUDQWKHTXHU\LQ
([DPSOH
([DPSOH*URXSE\ZLWKSDUDOOHOL]DWLRQ
set max_parallel_workers_per_gather=4;
EXPLAIN ANALYZE VERBOSE
SELECT COUNT(*), area_type_code
FROM labor
GROUP BY area_type_code
dynamic_shared_memory_typeFDQQRWEHVHWWRnone

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)

set force_parallel_mode = true;


-RE6FKHGXOLQJZLWKSJ$JHQW ([DPSOH8VLQJ),/7(5LQVWHDGRIVXETXHULHV
SELECT T.tract_id, COUNT(*) As tot,
SJ$JHQWLVDKDQG\XWLOLW\IRUVFKHGXOLQJ3RVWJUH64/MREV%XWLWFDQDOVR COUNT(*) FILTER (WHERE F.fact_type_id = 131) AS type_1
FROM census.lu_tracts AS T LEFT JOIN [Link] AS F
H[HFXWHEDWFKVFULSWVRQWKH26UHSODFLQJcrontabRQ/LQX[8QL[DQGWKH7DVN
ON T.tract_id = F.tract_id
6FKHGXOHURQ:LQGRZVSJ$JHQWJRHVHYHQIXUWKHU\RXFDQVFKHGXOHMREVWRUXQ GROUP BY T.tract_id;
RQDQ\RWKHUKRVWUHJDUGOHVVRI26$OO\RXKDYHWRGRLVLQVWDOOWKHSJ$JHQW
VHUYLFHRQWKHKRVWDQGSRLQWLWWRXVHDVSHFLILF3RVWJUH64/GDWDEDVHZLWK )RUWKLVSDUWLFXODUH[DPSOHWKHFILTERSHUIRUPDQFHLVRQO\DERXWDPLOOLVHFRQG
SJ$JHQWWDEOHVDQGIXQFWLRQVLQVWDOOHG7KH3RVWJUH64/VHUYHULWVHOILVQRW IDVWHUWKDQRXUCASEYHUVLRQDQGWKHSODQVDUHPRUHRUOHVVWKHVDPH
UHTXLUHGEXWWKHFOLHQWFRQQHFWLRQOLEUDULHVDUH%HFDXVHSJ$JHQWLVEXLOWDWRS
3RVWJUH64/\RXDUHEOHVVHGZLWKWKHDGGHGDGYDQWDJHRIKDYLQJDFFHVVWRDOO
WKHWDEOHVFRQWUROOLQJWKHDJHQW,I\RXHYHUQHHGWRUHSOLFDWHDFRPSOLFDWHGMRE 3DUDOOHOL]HG4XHULHV
PXOWLSOHWLPHV\RXFDQJRVWUDLJKWLQWRWKHGDWDEDVHWDEOHVGLUHFWO\DQGLQVHUWWKH $SDUDOOHOL]HGTXHU\LVRQHZKRVHH[HFXWLRQLVGLVWULEXWHGE\WKHSODQQHUDPRQJ
UHFRUGVIRUQHZMREVVNLSSLQJWKHSJ$GPLQLQWHUIDFH PXOWLSOHEDFNHQGSURFHVVHV%\VRGRLQJ3RVWJUH64/LVDEOHWRXWLOL]HPXOWLSOH
:HߞOOJHW\RXVWDUWHGZLWKSJ$JHQWLQWKLVVHFWLRQ9LVLW6HWWLQJ8SSJ$JHQWDQG SURFHVVRUFRUHVVRWKDWZRUNFRPSOHWHVLQOHVVWLPH'HSHQGLQJRQWKHQXPEHURI
'RLQJ6FKHGXOHG%DFNXSVWRVHHPRUHZRUNLQJH[DPSOHVDQGGHWDLOVRQKRZWR SURFHVVRUFRUHVLQ\RXUKDUGZDUHWKHWLPHVDYLQJVFRXOGEHVLJQLILFDQW+DYLQJ
VHWLWXS WZRFRUHVFRXOGKDOYH\RXUWLPHIRXUFRXOGTXDUWHU\RXUWLPHHWF
3DUDOOHOL]DWLRQZDVLQWURGXFHGLQYHUVLRQ7KHNLQGVRITXHULHVDYDLODEOHIRU
,QVWDOOLQJSJ$JHQW SDUDOOHOL]DWLRQDUHOLPLWHGXVXDOO\FRQVLVWLQJRQO\RIWKHPRVWVWUDLJKWIRUZDUG
VHOHFWVWDWHPHQWV%XWZLWKHDFKQHZUHOHDVHZHH[SHFWWKHUDQJHRI
<RXFDQGRZQORDGSJ$JHQWIURPSJ$JHQW'RZQORDG,WLVDOVRDYDLODEOHYLDWKH
SDUDOOHOL]DEOHTXHULHVWRH[SDQG
('%$SSOLFDWLRQ6WDFNEXLOGHUDQG%LJ64/SDFNDJH7KHSDFNDJHGH[WHQVLRQ
VFULSWFUHDWHVDQHZVFKHPDQDPHGSJ$JHQWLQWKHpostgresGDWDEDVH:KHQ 7KHNLQGVRITXHULHVWKDWFDQQRWEHSDUDOOHOL]HGDVRIYHUVLRQDUH
\RXFRQQHFWWR\RXUVHUYHUYLDSJ$GPLQ\RXZLOOVHHDQHZVHFWLRQFDOOHG-REV $Q\GDWDPRGLI\LQJTXHULHVVXFKDVXSGDWHVLQVHUWVDQGGHOHWHV
DVVKRZQLQ)LJXUH
$Q\GDWDGHILQLWLRQTXHULHVVXFKDVWKHFUHDWLRQRIQHZWDEOHVFROXPQVDQG
LQGH[HV
4XHULHVFDOOHGE\FXUVRUVRUforORRSV
6RPHDJJUHJDWHV&RPPRQRQHVOLNH&2817DQG680DUHSDUDOOHOL]DEOH
EXWDJJUHJDWHVWKDWLQFOXGH',67,1&7RU25'(5%<DUHQRW
)XQFWLRQVRI\RXURZQFUHDWLRQ%\GHIDXOWWKH\DUH3$5$//(/816$)(
)LJXUHSJ$GPLQZLWKSJ$JHQWLQVWDOOHG EXW\RXFDQHQDEOHSDUDOOHOL]DWLRQWKURXJKWKH3$5$//(/VHWWLQJRIWKH
IXQFWLRQDVGHVFULEHGLQߡ$QDWRP\RI3RVWJUH64/)XQFWLRQVߢ
127( 7KHIROORZLQJVHWWLQJUHTXLUHPHQWVDUHQHHGHGWRHQDEOHWKHXVHRISDUDOOHOLVP
$OWKRXJKSJ$JHQWLVLQVWDOOHGE\GHIDXOWLQSRVWJUHVGE\RXFDQLQVWDOOLQDGLIIHUHQWGDWDEDVH
XVLQJCREATE EXTENSION pgagent;,I\RXGHFLGHWRLQVWDOOLQDGLIIHUHQWGDWDEDVHPDNHVXUH
WRVHW\RXUSJDJHQWVHUYLFHWRXVHWKDWGDWDEDVHDQGLQSJ$GPLQVHWWKHPDLQWHQDQFHGELQWKH
VHUYHUFRQQHFWLRQWDEWREHWKLVGDWDEDVH

,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\

SELECT tract_id FROM vw_stats;

([HFXWLRQWLPHLVDERXWPVRQRXUVHUYHUEHFDXVHLWGRHVQߞWUXQDQ\
FRPSXWDWLRQIRUFHUWDLQILHOGVVXFKDVnum_factsDQGnum_fact_typesILHOGV
ZHGLGQRWDVNIRU,I\RXORRNHGDWWKHSODQ\RXPD\EHVWDUWOHGWRILQGWKDWLW
QHYHUHYHQWRXFKHVWKHIDFWVWDEOHEHFDXVHLWߞVVPDUWHQRXJKWRNQRZLWGRHVQߞW
QHHGWR%XWVXSSRVHZHHQWHU

SELECT * FROM vw_stats;

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$67 7KH VDPHSJ$JHQWGDWDEDVHDOOWKHVHDJHQWVE\GHIDXOWZLOOH[HFXWHDOOMREV
2YHUVL]HG$WWULEXWH6WRUDJH7HFKQLTXH 72$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

CREATE OR REPLACE VIEW vw_stats AS


SELECT tract_id,
(SELECT COUNT(*)
FROM [Link] As F
WHERE F.tract_id = T.tract_id) As num_facts,
(SELECT COUNT(*)
FROM census.lu_fact_types As Y
WHERE Y.fact_type_id IN (
SELECT fact_type_id
FROM [Link] F
WHERE F.tract_id = T.tract_id
)
) As num_fact_types
FROM census.lu_tracts As T;
)LJXUHSJ$JHQWMREVLQSJ$GPLQ

+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([DPSOH ZHߞOOVDYH\RXWKHH\HVRUH
RIVHHLQJWKHJQDUOHGRXWSXWRIWKHWH[WEXPLAIN ZKLOH)LJXUHVKRZVWKH
WDEXODURXWSXWIURPKWWSH[SODLQGHSHV]FRPUHYHDOLQJDJUHDWGHDORI
LQHIILFLHQF\

)LJXUH*UDSKLFDOSODQZKHQRYHUXVLQJVXETXHULHV
LQFRUSRUDWLQJPRUHWDEOHVLQVWHDGRIFRQVLGHULQJWKHVRPHWLPHVPRUHDSSURSULDWH
&KDSWHU'DWD7\SHV LQQHUMRLQ8QOLNHRWKHUSURJUDPPLQJODQJXDJHVWKH64/ODQJXDJHGRHVQRW
OHQGLWVHOIZHOOWREOLQGUHXVH
6HFRQGSHRSOHGRQߞWWHQGWRNHHSXSZLWKWKHODWHVWGHYHORSPHQWVLQWKHLU
3RVWJUH64/VXSSRUWVWKHZRUNKRUVHGDWDW\SHVRIDQ\GDWDEDVHQXPHULFV GLDOHFWRI64/'RQߞWEHREOLYLRXVWRDOOWKHV\QWD[VDYLQJ DQGVDQLW\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
KDYLQJRQHDUJXPHQW RUELQDU\ KDYLQJWZRDUJXPHQWV VXFKDV+-*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\YDOXHV ERWKWKH
pg_stat_statements; XSSHUDQGORZHUERXQGV DQGHYHQKRZPDQ\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
([DPSOHJHQHUDWHBVHULHV ZLWKVWHSSLQJRI
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/FKDUDFWHU DEEUHYLDEOHDV KDELWWRDQDO\]HWDEOHVIUHTXHQWO\WRXSGDWHWKHVWDWLVWLFVHVSHFLDOO\ULJKWDIWHUDQ
FKDU character varying DEEUHYLDEOHDVYDUFKDU DQGWH[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 &RPPRQVWULQJPDQLSXODWLRQVDUHSDGGLQJ lpadrpad WULPPLQJZKLWHVSDFH
WDEOHDVVKRZQLQ)LJXUH rtrimltrimtrimbtrim H[WUDFWLQJVXEVWULQJV substring DQG
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[FOXVLYHWLPH WLPHFRQVXPHGE\WKHSDUHQWVWHS DQGLQFOXVLYH FROM (
WLPH WKHWLPHRIWKHSDUHQWVWHSSOXVLWVFKLOGVWHSV  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\
SXOOVWKHPDWFKLQJUHFRUGVIURPGDWDSDJHV RUIURPPHPRU\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 '67 FRQYHUVLRQVE\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 time DNDtime without time zone
WDEOHZHFUHDWHGLQ([DPSOHVDQG
6WRUHVKRXUVPLQXWHVDQGVHFRQGVZLWKQRDZDUHQHVVRIWLPH]RQHRU
,QRUGHUWRHQVXUHWKDWWKHSODQQHUGRHVQߞWXVHDQLQGH[ZHILUVWGURSWKHSULPDU\ FDOHQGDUGDWHV
NH\IURPRXUWDEOH
timestamp DNDtimestamp without time zone
ALTER TABLE census.hisp_pop DROP CONSTRAINT IF EXISTS hisp_pop_pkey;
6WRUHVERWKFDOHQGDUGDWHVDQGWLPH KRXUVPLQXWHVVHFRQGV EXWGRHVQRW
'URSSLQJDOOLQGH[HVOHWVXVVHHWKHPRVWEDVLFRISODQVLQDFWLRQWKHVHTXHQWLDO FDUHDERXWWKHWLPH]RQH
VFDQVWUDWHJ\6HH([DPSOH timestamptz DNDtimestamp with time zone
$WLPH]RQH࠺DZDUHGDWHDQGWLPHGDWDW\SH,QWHUQDOO\timestamptzLV
VWRUHGLQ&RRUGLQDWHG8QLYHUVDO7LPH 87& 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
timetz DNDtime 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[DFWPRPHQW DQGSODQDFFRUGLQJO\ 
$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]-8 EHLQJWKH3DFLILFRIIVHWIURP
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/ZLQGRZIXQFWLRQV OHDGODJURZBQXPEHUFXPHBGLVWDQG LVUHTXHVWHG
ILUVWBYDOXHODVWBYDOXH LQ3/9
 &RPSXWHWKHRIIVHWIRUWLPH]RQHIRUWKLV87&WLPH IRU
America/New_York 
 'HWHUPLQHWKHGDWHWLPHZLWKWKHRIIVHW ZLWKDRIIVHW
EHFRPHV 

 'LVSOD\WKHUHVXOW 2012-02-15 [Link]-5 

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\HIILFLHQW LQPDQ\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;

2012-02-10 [Link]-05 &RIIHH6FULSWGRHVQߞWORRNDOOWKDWGLIIHUHQWIURP-DYD6FULSWH[FHSWIRUWKHODFN


RISDUHQWKHVHVFXUO\EUDFHVDQGVHPLFRORQV7KH/LYH6FULSWYHUVLRQORRNV
OVERLAPSGHPRQVWUDWHGLQ([DPSOHUHWXUQVtrueLIWZRWHPSRUDOUDQJHV H[DFWO\OLNHWKH&RIIHH6FULSWH[FHSWZLWKDLANGUAGE pllsVSHFLILHU
RYHUODS7KLVLVDQ$16,64/SUHGLFDWHHTXLYDOHQWWRWKHoverlapsIXQFWLRQ
OVERLAPSWDNHVIRXUSDUDPHWHUVWKHILUVWSDLUFRQVWLWXWLQJRQHUDQJHDQGWKHODVW :ULWLQJ$JJUHJDWH)XQFWLRQVZLWK3/9
SDLUFRQVWLWXWLQJWKHRWKHUUDQJH$QRYHUODSFRQVLGHUVWKHWLPHSHULRGVWREHKDOI ,Q([DPSOHVDQGZHUHIRUPXODWHWKHVWDWHWUDQVLWLRQDQGILQDOIXQFWLRQ
RSHQPHDQLQJWKDWWKHVWDUWWLPHLVLQFOXGHGEXWWKHHQGWLPHLVRXWVLGHWKH RIWKHJHRPHWULFPHDQDJJUHJDWHIXQFWLRQ VHHߡ:ULWLQJ64/$JJUHJDWH
UDQJH7KLVLVVOLJKWO\GLIIHUHQWEHKDYLRUIURPWKHFRPPRQBETWEENSUHGLFDWH )XQFWLRQVߢ XVLQJ3/9
ZKLFKFRQVLGHUVERWKVWDUWDQGHQGWREHLQFOXGHG7KLVTXLUNZRQߞWPDNHD
GLIIHUHQFHXQOHVVRQHRI\RXUUDQJHVLVDIL[HGSRLQWLQWLPH DSHULRGIRUZKLFK ([DPSOH3/9JHRPHWULFPHDQDJJUHJDWHVWDWHWUDQVLWLRQIXQFWLRQ
VWDUWDQGHQGDUHLGHQWLFDO :DWFKRXWIRUWKLVLI\RXߞUHDQDYLGXVHURIWKH CREATE OR REPLACE FUNCTION geom_mean_state(prev numeric[2], next numeric)
RETURNS numeric[2] AS
OVERLAPSIXQFWLRQ $$
return (next == null || next == 0) ? prev :
([DPSOH29(5/$36IRUWLPHVWDPSDQGGDWH [(prev[0] == null)? 0: prev[0] + [Link](next), prev[1] + 1];
SELECT $$
('2012-10-25 10:00 AM'::timestamp, '2012-10-25 2:00 PM'::timestamp) LANGUAGE plv8 IMMUTABLE PARALLEL SAFE;
OVERLAPS
('2012-10-25 11:00 AM'::timestamp,'2012-10-26 2:00 PM'::timestamp) AS x, ([DPSOH3/9JHRPHWULFPHDQDJJUHJDWHILQDOIXQFWLRQ
('2012-10-25'::date,'2012-10-26'::date) CREATE OR REPLACE FUNCTION geom_mean_final(in_num numeric[2])
OVERLAPS RETURNS numeric AS
('2012-10-26'::date,'2012-10-27'::date) As y; $$
x |y return in_num[1] > 0 ? [Link](in_num[0]/in_num[1]) : 0;
---+--- $$
t |f LANGUAGE plv8 IMMUTABLE PARALLEL SAFE;

,QDGGLWLRQWRRSHUDWRUVDQGSUHGLFDWHV3RVWJUH64/FRPHVZLWKIXQFWLRQV 7KHILQDOCREATE AGGREGATESXWVDOOWKHSLHFHVWRJHWKHUDQGORRNVPRUHRUOHVV


VXSSRUWLQJWHPSRUDOW\SHV$IXOOOLVWLQJFDQEHIRXQGDW'DWHWLPH)XQFWLRQVDQG WKHVDPHLQDOOODQJXDJHV2XU3/9YDULDQWLVVKRZQLQ([DPSOH
2SHUDWRUV:HߞOOGHPRQVWUDWHDVDPSOLQJKHUH
([DPSOH3/9JHRPHWULFPHDQDJJUHJDWHSXWWLQJDOOWKHSLHFHVWRJHWKHU
2QFHDJDLQZHVWDUWZLWKWKHYHUVDWLOHgenerate_seriesIXQFWLRQ<RXFDQXVH CREATE AGGREGATE geom_mean(numeric) (
WKLVIXQFWLRQZLWKWHPSRUDOW\SHVDQGLQWHUYDOVWHSV SFUNC=geom_mean_state,
STYPE=numeric[],
$V\RXFDQVHHLQ([DPSOHZHFDQH[SUHVVGDWHVLQRXUORFDOGDWHWLPH FINALFUNC=geom_mean_final,
-DYD6FULSWH[DPSOHVRQWKHZHEWRYDOLGDWHHPDLODGGUHVVHV:HDUELWUDULO\ IRUPDWRUWKHPRUHJOREDO,62\\\\PPGGIRUPDW3RVWJUH64/DXWRPDWLFDOO\
SLFNHGRQHDQGPDGHD3/9RXWRILWLQ([DPSOH LQWHUSUHWVGLIIHULQJLQSXWIRUPDWV7REHVDIHZHWHQGWRVWLFNZLWKHQWHULQJGDWHV
([DPSOH8VLQJ3/9WRYDOLGDWHDQHPDLODGGUHVV LQ,62EHFDXVHGDWHIRUPDWVYDU\IURPFXOWXUHWRFXOWXUHVHUYHUWRVHUYHURU
HYHQGDWDEDVHWRGDWDEDVH
CREATE OR REPLACE FUNCTION
validate_email(email text) returns boolean as ([DPSOH*HQHUDWHWLPHVHULHVXVLQJJHQHUDWHBVHULHV
$$
var re = /\S+@\S+\.\S+/; SELECT (dt - interval '1 day')::date As eom
return [Link](email); FROM generate_series('2/1/2012', '6/30/2012', interval '1 month') As dt;
$$ LANGUAGE plv8 IMMUTABLE STRICT PARALLEL SAFE; eom
------------
2XUFRGHXVHVD-DYD6FULSWUHJH[REMHFWWRFKHFNWKHHPDLODGGUHVV7RXVHWKH 2012-01-31
2012-02-29
IXQFWLRQVHH([DPSOH 2012-03-31
2012-04-30
([DPSOH&DOOLQJWKH3/9HPDLOYDOLGDWRU 2012-05-31
SELECT email, validate_email(email) AS is_valid
FROM (VALUES ('alexgomezq@[Link]') $QRWKHUSRSXODUDFWLYLW\LVWRH[WUDFWRUIRUPDWSDUWVRIDGDWHWLPHYDOXH+HUH
,('[Link]'),('alexgomezq@gmailcom')) AS x (email);
WKHIXQFWLRQVdate_partDQGto_charILWWKHELOO([DPSOHDOVRGULYHV
ZKLFKRXWSXWV KRPHWKHEHKDYLRURI'67IRUDWLPH]RQH࠺DZDUHGDWDW\SH:HLQWHQWLRQDOO\
email | is_valid
FKRVHDSHULRGWKDWFURVVHVDGD\OLJKWVDYLQJVZLWFKRYHULQUS/East%HFDXVHWKH
----------------------+----------
alexgomezq@[Link] | t FORFNVSULQJVIRUZDUGDWDPWKHILQDOURZRIWKHWDEOHUHIOHFWVWKHQHZWLPH
[Link] | f
alexgomezq@gmailcom | f ([DPSOH([WUDFWLQJHOHPHQWVRIDGDWHWLPHYDOXH
SELECT dt, date_part('hour',dt) As hr, to_char(dt,'HH12:MI AM') As mn
$OWKRXJK\RXFDQFRGHWKHVDPHIXQFWLRQXVLQJ3/SJ64/DQG3RVWJUH64/ߞV FROM
RZQUHJXODUH[SUHVVLRQVXSSRUWZHJXLOWOHVVO\SRDFKHGVRPHRQHHOVHߞVWLPH generate_series(
'2012-03-11 12:30 AM',
WHVWHGFRGHDQGZDVWHGQRWLPHRIRXURZQ,I\RXߞUHDZHEGHYHORSHUDQGILQG '2012-03-11 3:00 AM',
\RXUVHOIKDYLQJWRYDOLGDWHGDWDRQERWKWKHFOLHQWVLGHDQGWKHGDWDEDVHVLGH interval '15 minutes'
XVLQJ3/9FRXOGKDOYH\RXUGHYHORSPHQWHIIRUWVSUHWW\PXFKE\FXWWLQJDQG ) As dt;
dt | hr | mn
SDVWLQJ -----------------------+----+----------
2012-03-11 [Link]-05 | 0 | 12:30 AM
<RXFDQVWRUHDZKROHVHWRIWKHVHYDOLGDWLRQIXQFWLRQVLQDPRGXOHVWDEOH<RX 2012-03-11 [Link]-05 | 0 | 12:45 AM
FDQWKHQLQMHFWUHVXOWVRQWRWKHSDJHEXWDOVRXVHWKHYDOLGDWLRQIXQFWLRQVGLUHFWO\ 2012-03-11 [Link]-05 | 1 | 01:00 AM
2012-03-11 [Link]-05 | 1 | 01:15 AM
LQWKHGDWDEDVHDVGHVFULEHGLQ$QGUHZ'XQVWDQߞVߡ/RDGLQJ8VHIXO0RGXOHVLQ 2012-03-11 [Link]-05 | 1 | 01:30 AM
3/9ߢ7KLVLVSRVVLEOHEHFDXVHWKHevalIXQFWLRQLVSDUWRIWKH3/9 2012-03-11 [Link]-05 | 1 | 01:45 AM
-DYD6FULSWODQJXDJH7KHEXLOWLQIXQFWLRQDOORZV\RXWRFRPSLOHIXQFWLRQVDW 2012-03-11 [Link]-04 | 3 | 03:00 AM

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/9 SOY
([DPSOH&RQYHUWLQJDGHOLPLWHGVWULQJWRDQDUUD\
7KLVLVWKHEDVLFODQJXDJHWKDWVHUYHVDVWKHEDVLVIRUWKHRWKHUWZR-DYD6FULSW
SELECT string_to_array('[Link]', '.') As estados;
ODQJXDJHV estados
----------
3/&RIIHH6FULSW SOFRIIHH {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//LYH6FULSW SOOV 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\

,I\RXUHPRYHDQHOHPHQWRIRQHDUUD\VRWKDW\RXGRQߞWKDYHDQHTXDOQXPEHURI SELECT filename


HOHPHQWVLQERWK\RXJHWWKHUHVXOWVKRZQLQ([DPSOH FROM list_incoming_files() As filename
WHERE filename ILIKE '%.csv'
([DPSOH8QQHVWLQJXQEDODQFHGDUUD\V
SELECT
unnest( '{blind,mouse}'::varchar[]) AS v, :ULWLQJ3/93/&RIIHH6FULSWDQG
unnest('{1,2,3}'::smallint[]) AS i;
v |i 3//LYH6FULSW)XQFWLRQV
------+-
blind |1 3/9 DND3/-DYD6FULSW LVDWUXVWHGODQJXDJHEXLOWDWRSWKH*RRJOH9
mouse |2 HQJLQH,WDOORZV\RXWRZULWHIXQFWLRQVLQ-DYD6FULSWDQGLQWHUIDFHZLWKWKH
blind |3
mouse |1 -621GDWDW\SH,WLVQRWSDUWRIWKHFRUH3RVWJUH64/RIIHULQJVR\RXZRQߞWILQG
blind |2 LWLQDOOSRSXODU3RVWJUH64/GLVWULEXWLRQV<RXFDQDOZD\VFRPSLOHLWIURP
mouse |3
VRXUFH)RU:LQGRZVZHߞYHEXLOW3/9H[WHQVLRQZLQGRZVELQDULHV<RXFDQ
H[WHQVLRQVZHUHFRPSLOHGDJDLQVW)RUH[DPSOHLI\RXUplpython2uZDV 9HUVLRQLQWURGXFHGDPXOWLDUJXPHQWunnestIXQFWLRQWKDWSXWVLQQXOO
FRPSLOHGDJDLQVW3\WKRQ\RXVKRXOGLQVWDOO3\WKRQ SODFHKROGHUVZKHUHWKHDUUD\VDUHQRWEDODQFHG7KHPDLQGUDZEDFNZLWKWKH
QHZunnestLVWKDWLWFDQDSSHDURQO\LQWKHFROMFODXVH([DPSOHUHYLVLWV
%DVLF3\WKRQ)XQFWLRQ RXUXQEDODQFHGDUUD\VXVLQJWKHYHUVLRQFRQVWUXFW

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_columnWRGHWHUPLQHZKDWFKDQJHG 7KLVIHDWXUHLVQRWVXSSRUWHG
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;

7KHHTXDOLW\RSHUDWRU = UHWXUQVtrueRQO\LIHOHPHQWVLQDOOWKHDUUD\VDUHHTXDO 0DNHDEVROXWHO\VXUHWKDW\RXKDYH3\WKRQSURSHUO\UXQQLQJRQ\RXUVHUYHU


DQGLQWKHVDPHRUGHU,I\RXGRQߞWFDUHDERXWRUGHURIHOHPHQWVDQGMXVWQHHGWR EHIRUHDWWHPSWLQJWRLQVWDOOWKHH[WHQVLRQRUHOVH\RXZLOOUXQLQWRHUURUVWKDW
NQRZZKHWKHUDOOWKHHOHPHQWVLQRQHDUUD\DSSHDUDVDVXEVHWRIWKHRWKHUDUUD\ FRXOGEHGLIILFXOWWRWURXEOHVKRRW
XVHWKHFRQWDLQPHQWRSHUDWRUV @><@ ([DPSOHGHPRQVWUDWHVWKH
7KHH[WHQVLRQVDUHFRPSLOHGDJDLQVWDVSHFLILFPLQRUYHUVLRQRI3\WKRQ<RX
GLIIHUHQFHEHWZHHQWKHFRQWDLQV @> DQGFRQWDLQHGE\ @< RSHUDWRUV
VKRXOGLQVWDOOWKHPLQRUYHUVLRQRI3\WKRQWKDWPDWFKHVZKDW\RXUplpythonu
BEGIN ([DPSOH$UUD\FRQWDLQPHQWRSHUDWRUV
RETURN QUERY
SELECT log_id, user_name, description, log_ts FROM logs SELECT '{1,2,3}'::int[] @> '{3,2}'::int[] AS contains;
WHERE user_name = param_user_name; contains
END; --------
$$ t
LANGUAGE 'plpgsql' STABLE; (1 row)
SELECT '{1,2,3}'::int[] <@ '{3,2}'::int[] AS contained_by;
contained_by
:ULWLQJ7ULJJHU)XQFWLRQVLQ3/SJ64/ ------------
f
%HFDXVH\RXFDQߞWZULWHWULJJHUIXQFWLRQVLQ64/3/SJ64/LV\RXUQH[WEHVW (1 row)

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
$FRQWLQXRXVGDWHDQGWLPH WLPHVWDPS UDQJHDOORZLQJIRUIUDFWLRQDO
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([DPSOH 1RWHWKDWRXUDJJUHJDWHKDVDQLQLWLDOFRQGLWLRQWKDWLVWKHVDPH [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>IRUWKHIRUPHUDQG IRUWKH
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 DQDGGLWLYHRQH EXP(SUM(LN(x))/n) :HߞOOEHXVLQJWKLVPHWKRGLQRXU
H[DPSOH
7ZRUDQJHRSHUDWRUVWHQGWREHXVHGPRVWRIWHQRYHUODS && DQGFRQWDLQV @> 
7KRVHDUHWKHRQHVZHߞOOFRYHU7RVHHWKHIXOOFDWDORJRIUDQJHRSHUDWRUVJRWR 7REXLOGRXUJHRPHWULFPHDQDJJUHJDWHZHQHHGWZRVXEIXQFWLRQVDVWDWH
5DQJH2SHUDWRUV WUDQVLWLRQIXQFWLRQWRVXPWKHORJV VHH([DPSOH DQGDILQDOIXQFWLRQWR
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 -DYD6FULSW2EMHFW1RWDWLRQ DQGPDQ\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 ODQJXDJHVWKDWDUHXQWUXVWHGHQGLQWKHOHWWHU8 3/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\RXUDJJUHJDWH DQH[DPSOHLVDEXLOWLQFRYDULDQFHIXQFWLRQ VHH
+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-621SULPLWLYHV QXPEHUV
VWULQJVERROHDQV 7RUHWXUQWKHWH[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[WUDFWBSDWKLVDYDULDGLFIXQFWLRQ IXQFWLRQVZLWKDQXQOLPLWHGQXPEHURIDUJXPHQWV  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-621REMHFWV UHTXLUHVYHUVLRQ 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[PHWKRG FRYHUHG
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
IXQFWLRQ VHHߡ: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
LVGHILQHGWRWDNHWKUHHLQSXWDUJXPHQWV WZREHLQJRSWLRQDO  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\QDPH ear_sizeskin_colorHWF LQVLGHWKH
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/6HUYHU VXSSRUW;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

INSERT INTO families (profile) VALUES ('<family name="HsuObe"></family>');


$QDWRP\RI3RVWJUH64/)XQFWLRQV
ZHZLOOJHWWKLVHUURUERROR: new row for relation "families" violates 3RVWJUH64/IXQFWLRQVIDOOLQWRWKHFDWHJRULHVRIEDVLFIXQFWLRQDJJUHJDWH
check constraint "chk_has_relation" IXQFWLRQZLQGRZIXQFWLRQDQGWULJJHUIXQFWLRQ:HߞOOVWDUWE\GHWDLOLQJWKH
)RUPRUHLQYROYHGFKHFNVWKDWUHTXLUHFKHFNLQJDJDLQVW'7'RU;6'\RXߞOO EDVLFDQDWRP\RIDIXQFWLRQDQGWKHQJRLQWRGHWDLODERXWKRZWKHYDULRXVNLQGV
QHHGWRUHVRUWWRZULWLQJIXQFWLRQVDQGXVLQJWKRVHLQWKHFKHFNFRQVWUDLQW RIVSHFLDOL]HGIXQFWLRQW\SHVH[WHQGVIURPWKLV
EHFDXVH3RVWJUH64/GRHVQߞWKDYHEXLOWLQIXQFWLRQVWRKDQGOHWKRVHNLQGVRI
FKHFNV )XQFWLRQ%DVLFV
5HJDUGOHVVRIZKLFKODQJXDJHV\RXFKRRVHIRUZULWLQJIXQFWLRQVDOOIXQFWLRQV
4XHU\LQJ;0/'DWD VKDUHDVLPLODUVWUXFWXUHDVVKRZQLQ([DPSOH
7RTXHU\;0/WKHxpathIXQFWLRQLVUHDOO\XVHIXO7KHILUVWDUJXPHQWLVDQ ([DPSOH%DVLFIXQFWLRQVWUXFWXUH
;3DWKTXHU\DQGWKHVHFRQGLVDQxmlREMHFW7KHRXWSXWLVDQDUUD\RI;0/ CREATE OR REPLACE FUNCTION func_name(arg1 arg1_datatype DEFAULT arg1_default)
leo | physics | 72.00 HOHPHQWVWKDWVDWLVILHVWKH;3DWKTXHU\([DPSOHFRPELQHVxpathZLWK
regina | algebra | 72.50
regina | calculus | 64.50 unnestWRUHWXUQDOOWKHIDPLO\PHPEHUVunnestXQUDYHOVWKHDUUD\LQWRDURZ
regina | chemistry | 73.50 VHW:HWKHQFDVWWKH;0/IUDJPHQWWRWH[W
regina | economics | 90.00
regina | physics | 84.00 ([DPSOH4XHU\;0/ILHOG
NULL | algebra | 77.25
SELECT ordinality AS id, family,
NULL | calculus | 65.00
(xpath('/member/relation/text()', f))[1]::text As relation,
NULL | chemistry | 74.50
(xpath('/member/name/text()', f))[1]::text As mem_name
NULL | economics | 90.00
FROM (
NULL | physics | 78.00
SELECT
NULL | NULL | 74.65
(xpath('/family/@name', profile))[1]::text As family,
(15 rows)
[Link], f.f
FROM families, unnest(xpath('/family/member', profile)) WITH ORDINALITY AS f
,IZHDOVRZDQWHGWRLQFOXGHVXEWRWDOVIRUMXVWWKHVXEMHFWDQGMXVWWKHVWXGHQW ) x;
ZHߞGXVHGROUPING SETS ( (student), (student, subject), (subject), id | family | relation | mem_name
----+--------+----------+----------
() )RUWKHVKRUWKDQGCUBE (student, subject)LQ([DPSOH 1 | Gomez | padre | Alex
([DPSOH$YJVFRUHIRUHDFKVWXGHQWVWXGHQWLQVXEMHFWVXEMHFWDQG 2 | Gomez | madre | Sonia
3 | Gomez | hijo | Brandon
RYHUDOO 4 | Gomez | hija | Azaleah
SELECT student, subject, AVG(score)::numeric(10,2) (4 rows)
FROM test_scores
WHERE student IN ('leo','regina') *HWWKHWH[WHOHPHQWLQWKHrelationDQGnameWDJVRIHDFKmemberHOHPHQW
GROUP BY CUBE (student, subject) :HQHHGWRXVHDUUD\VXEVFULSWLQJEHFDXVHxpathDOZD\VUHWXUQVDQDUUD\
ORDER BY student NULLS LAST, subject NULLS LAST;
student | subject | avg HYHQLIRQO\RQHHOHPHQWLVUHWXUQHG
---------+-----------+------- *HWWKHQDPHDWWULEXWHIURPfamilyURRW)RUWKLVZHXVH@attribute_name
leo | algebra | 82.00
leo | calculus | 65.50 %UHDNWKHUHVXOWRIWKH6(/(&7LQWRWKHVXEHOHPHQWV<member>
leo | chemistry | 75.50 <relation></relation><name></name>DQG</member>WDJV7KH
leo | physics | 72.00
leo | NULL | 73.75 VODVKLVDZD\RIJHWWLQJDWVXEWDJHOHPHQWV)RUH[DPSOH
regina | algebra | 72.50 xpath('/family/member', 'profile')ZLOOUHWXUQDQDUUD\RIDOO
regina | calculus | 64.50
regina | chemistry | 73.50 PHPEHUVLQHDFKIDPLO\WKDWLVGHILQHGLQDSURILOH7KH#VLJQLVXVHGWR
regina | economics | 90.00 VHOHFWDWWULEXWHVRIDQHOHPHQW6RIRUH[DPSOHfamily/@nameUHWXUQVWKH
regina | physics | 84.00
regina | NULL | 75.44 QDPHDWWULEXWHRIDfamily%\GHIDXOWxpathDOZD\VUHWXUQVDQHOHPHQW
NULL | algebra | 77.25 LQFOXGLQJWKHWDJSDUW7KHtext()IRUFHVDUHWXUQRIMXVWWKHWH[WERG\RIDQ
NULL | calculus | 65.00
NULL | chemistry | 74.50
HOHPHQW
NULL | economics | 90.00
NULL | physics | 78.00
1HZLQYHUVLRQLVWKH$16,64/VWDQGDUG;0/7$%/(FRQVWUXFW
NULL | NULL | 74.65 ;0/7$%/(FRQYHUWVWH[WRI;0/LQWRLQGLYLGXDOURZVDQGFROXPQVEDVHGRQ
(17 rows) VRPHGHILQHGWUDQVIRUPDWLRQ:HߞOOUHSHDW([DPSOHXVLQJ;0/7$%/(
([DPSOH4XHU\;0/XVLQJ;0/7$%/(
SELECT xt.* NULL | economics | 90.00
FROM families, NULL | physics | 78.00
XMLTABLE ('/family/member' PASSING profile (16 rows)
COLUMNS
id FOR ORDINALITY , :KDWLIZHZDQWHGWRKDYHWRWDOEUHDNGRZQVIRUVWXGHQWVWXGHQWSOXVVXEMHFW
family text PATH '../@name' ,
relation text NOT NULL ,
DQGRYHUDOODYHUDJH":HFRXOGUHYLVHRXUTXHU\WRDGGDXQLYHUVDOJURXSLQJVHW
member_name text PATH 'name' NOT NULL GROUPING SETS ((student),(student, subject),())7KLVLVHTXLYDOHQWWR
) AS xt;
WKHVKRUWKDQGROLLUP (student, subject)6HH([DPSOH
id | family | relation | mem_name
----+--------+----------+---------- ([DPSOH$YJVFRUHIRUHDFKVWXGHQWLQVXEMHFWVWXGHQWDQGRYHUDOO
1 | Gomez | padre | Alex
2 | Gomez | madre | Sonia SELECT student, subject, AVG(score)::numeric(10,2)
3 | Gomez | hijo | Brandon FROM test_scores
4 | Gomez | hija | Azaleah WHERE student IN ('leo','regina')
(4 rows) GROUP BY ROLLUP (student,subject)
7KHILUVWSDUWLVDQ;0/SDWKHOHPHQWWKDWGHILQHVWKHURZ7KHZRUG ORDER BY student NULLS LAST, subject NULLS LAST;
student | subject | avg
3$66,1*LVIROORZHGE\WKHWDEOHFROXPQWRSDUVHRXWURZV7KLVFROXPQ ---------+-----------+-------
KDVWREHRIW\SHxml:HXVHWKH[Link]FROXPQRIRXUIDPLOLHV leo | algebra | 82.00
leo | calculus | 65.50
WDEOH leo | chemistry | 75.50
7KH&2/8016FRPSRQHQWVKRXOGGHILQHWKHOLVWRIFROXPQVWREHSDUVHG leo | physics | 72.00
RXWRIWKH[PO leo | NULL | 73.75
regina | algebra | 72.50
6LPLODUWR:,7+25',1$/,7<LQFRQMXQFWLRQZLWKVHWUHWXUQLQJIXQFWLRQV regina | calculus | 64.50
\RXFDQXVH)2525',1$/,7<WRDVVLJQQXPHULFRUGHUWRHDFKUHFRUG regina | chemistry | 73.50
regina | economics | 90.00
<RXFDQXVHWRPRYHXSDOHYHODERYHWKHEDVHRIWKHURZ,QWKLVFDVHZH regina | physics | 84.00
XVH#QDPHWRJHWWKHIDPLO\QDPHZKLFKLVRQHOHYHODERYH regina | NULL | 75.44
NULL | NULL | 74.65
IDPLO\PHPEHU7KH#LVXVHGWRGHQRWHWKLVLVDQDWWULEXWH VRPHWKLQJRI (12 rows)
IRUPname='a value' DQGQRWDQHOHPHQW
,IDSDWKHOHPHQWPDWFKHVWKHQDPHRI\RXUGHILQHGFROXPQ\RXGRQߞWQHHG ,IZHUHYHUVHWKHRUGHURIFROXPQVLQ52//83ZHJHWWKHVFRUHIRUHDFK
WRVSHFLI\WKH3$7+,QWKLVFDVHEHFDXVHIDPLO\PHPEHUUHODWLRQPDWFKHV VWXGHQWVXEMHFWSDLUDYHUDJHIRUHDFKVXEMHFWDQGRYHUDOODYHUDJHDVVKRZQLQ
([DPSOH
RXUFROXPQQDPHrelationZHFDQVNLSWKH3$7+FODXVH
([DPSOH$YJVFRUHIRUHDFKVWXGHQWLQVXEMHFWVXEMHFWDQGRYHUDOO
SELECT student, subject, AVG(score)::numeric(10,2)
)XOO7H[W6HDUFK FROM test_scores
WHERE student IN ('leo','regina')
,ߞPVXUH\RXߞYHVHHQZHEVLWHVZKHUH\RXFDQVHDUFKE\W\SLQJLQNH\ZRUGV$Q GROUP BY ROLLUP (subject,student)
ORDER BY student NULLS LAST, subject NULLS LAST;
HFRPPHUFHVLWHZLOOEULQJXSDOLVWRIPDWFKLQJSURGXFWVDILOPVLWHZLOOEULQJ student | subject | avg
XSDOLVWRIPDWFKLQJPRYLHVDNQRZOHGJHEDVHVLWHZLOOEULQJXSPDWFKLQJ ---------+-----------+-------
TXHVWLRQVDQGDQVZHUVHWF leo | algebra | 82.00
leo | calculus | 65.50
leo | chemistry | 75.50
7RVHDUFKWH[WXDOGDWDE\NH\ZRUGV\RXKDYHDW\RXUGLVSRVDOWKHlikeRUilike
SELECT student, subject, AVG(score)::numeric(10,2) FDVHLQVHQVLWLYH FRPPDQGV<RXFDQDOVRDYDLO\RXUVHOIRISRZHUIXOUHJXODU
FROM test_scores
WHERE student IN ('leo','regina')
H[SUHVVLRQDQG6RXQGH[VHDUFKHV%XWERWKRIWKHVHPHWKRGVVWRSVKRUWRI
GROUP BY GROUPING SETS ((student),(student,subject)) RIIHULQJQDWXUDOODQJXDJH࠺EDVHGPDWFKFRQGLWLRQV)RUH[DPSOHLI\RXߞUH
ORDER BY student, subject NULLS LAST; ORRNLQJIRU/*%7PRYLHVDQGW\SHWKDWDEEUHYLDWLRQLQWR\RXUVHDUFK\RXߞUH
student | subject | avg
---------+-----------+------- JRLQJWRPLVVPRYLHVGHVFULEHGDVOHVELDQJD\ELVH[XDORUWUDQVJHQGHUHG,I
leo | algebra | 82.00 \RXW\SHLQWKHVHDUFKWHUPORWVRIVWHDP\VH[VFHQHV\RXPD\HQGXSZLWK
leo | calculus | 65.50
leo | chemistry | 75.50
QRWKLQJXQOHVVWKHGHVFULSWLRQYHU\FORVHO\PDWFKHVZKDW\RXW\SHGLQ
leo | physics | 72.00
leo | NULL | 73.75
)76LVDVXLWHRIWRROVWKDWDGGVDPRGLFXPRIߡLQWHOOLJHQFHߢWR\RXUVHDUFKHV
regina | algebra | 72.50 7KRXJKLWߞVIDUIURPEHLQJDEOHWRUHDG\RXUPLQGLWFDQILQGZRUGVWKDWDUH
regina | calculus | 64.50 FORVHLQPHDQLQJUDWKHUWKDQVSHOOLQJ)76LVSDFNDJHGLQWR3RVWJUH64/ZLWK
regina | chemistry | 73.50
regina | economics | 90.00 QRDGGLWLRQDOLQVWDOODWLRQQHFHVVDU\
regina | physics | 84.00
regina | NULL | 75.44
$WWKHFRUHRI)76LVDQ)76FRQILJXUDWLRQ7KHFRQILJXUDWLRQFRGLILHVWKHUXOHV
(11 rows) XQGHUZKLFKPDWFKZLOORFFXUE\UHIHUULQJWRRQHRUPRUHGLFWLRQDULHV)RU
LQVWDQFHLI\RXUGLFWLRQDU\FRQWDLQVHQWULHVWKDWHTXDWHWKHZRUGVORYHURPDQFH
,QDVLQJOHTXHU\([DPSOHJLYHVXVERWKWKHDYHUDJHRIHDFKVWXGHQWDFURVV
LQIDWXDWLRQOXVWWKHQDQ\VHDUFKE\RQHRIWKHZRUGVZLOOILQGPDWFKHVZLWKDQ\
DOOVXEMHFWVDQGKLVRUKHUDYHUDJHLQHDFKVXEMHFW
RIWKHZRUGV'LFWLRQDULHVPD\DOVRHTXDWHZRUGVZLWKWKHVDPHVWHP)RU
:HFDQHYHQLQFOXGHDWRWDOIRUHDFKVXEMHFWDFURVVDOOVWXGHQWVE\KDYLQJ H[DPSOHORYHORYLQJDQGORYHGVKDUHDFRPPRQVWHP$GLFWLRQDU\FRXOG
PXOWLSOHJURXSLQJVHWVDVVKRZQLQ([DPSOH HTXDWHDOOSULQFLSOHSDUWVRIDYHUEIRUH[DPSOHHDWHDWVDWHDQGHDWHQFRXOG
([DPSOH$YJVFRUHIRUHDFKVWXGHQWVWXGHQWLQVXEMHFWDQGVXEMHFW EHFRQVLGHUHGWKHVDPH
SELECT student, subject, AVG(score)::numeric(10,2) $GLFWLRQDU\FDQDOVROLVWVWRSZRUGV7KHVHDUHXVXDOO\SDUWVRIVSHHFKWKDWDGG
FROM test_scores
WHERE student IN ('leo','regina')
OLWWOHWRWKHPHDQLQJ$UWLFOHVFRQMXQFWLRQVSUHSRVLWLRQVDQGSURQRXQVVXFKDV
GROUP BY GROUPING SETS ((student,subject),(student),(subject)) DWKHRQDQGWKDWRIWHQPDNHXSWKHOLVWRIVWRSZRUGV
ORDER BY student NULLS LAST, subject NULLS LAST;
student | subject | avg %H\RQGPDWFKLQJV\QRQ\PVDQGSUXQLQJVWRSZRUGV)76FDQEHXVHGWRUDQN
---------+-----------+------- VHDUFKHV)76FDQXWLOL]HWKHSUR[LPLW\RIZRUGVWRHDFKRWKHUDQGWKHIUHTXHQF\
leo | algebra | 82.00
leo | calculus | 65.50
RIWHUPVLQWH[WWRUDQNVHDUFKUHVXOWV)RUH[DPSOHLI\RXߞUHLQWHUHVWHGLQ
leo | chemistry | 75.50 YLHZLQJPRYLHVZKHUHVH[LVGHSLFWHGZLWKVPRNLQJ\RXFRXOGVHDUFKIRUWKH
leo | physics | 72.00 WZRZRUGVVH[DQGVPRNLQJEXWDOVRVSHFLI\WKDWWKHWZRZRUGVPXVWEHWZR
leo | NULL | 73.75
regina | algebra | 72.50 ZRUGVDSDUWDQGUDQNKLJKHULIWKH\DSSHDULQWKHWLWOH$QGVRWKH\VPRNHGDIWHU
regina | calculus | 64.50 VH[ZRXOGKLWZKHUHDVVH[WRRNSODFHLQDKRWHOZKLFKKDVDIR\HUIRUVPRNLQJ
regina | chemistry | 73.50
regina | economics | 90.00
JXHVWVZRXOGPLVV)76FDQDSSO\XQHTXDOZHLJKWVWRWKHSODFHVZKHUHWKH
regina | physics | 84.00 VRXJKWDIWHUZRUGVDSSHDULQWKHWH[W)RULQVWDQFHLI\RXKDYHDPRYLHZKHUH
regina | NULL | 75.44 WKHZRUGVH[DSSHDUVLQHLWKHUWKHWLWOHRUWKHE\OLQH\RXFRXOGPDNHWKLVPRYLH
NULL | algebra | 77.25
NULL | calculus | 65.00 UDQNKLJKHUWKDQPRYLHVZKHUHVH[LVRQO\LQWKHGHVFULSWLRQ
NULL | chemistry | 74.50
)76&RQILJXUDWLRQV ([DPSOHZHUHSHDWWKHLATERALLQ([DPSOHEXWDGGRQDVHTXHQWLDO
0RVW3RVWJUH64/GLVWULEXWLRQVFRPHSDFNDJHGZLWKRYHU)76FRQILJXUDWLRQV QXPEHUWRHDFKVHW
$OOWKHVHDUHLQVWDOOHGLQWKHSJBFDWDORJVFKHPD ([DPSOH8VLQJ:,7+25',1$/,7<ZLWK/$7(5$/
SELECT [Link], i_type, [Link]
7RVHHWKHOLVWLQJRILQVWDOOHG)76FRQILJXUDWLRQVUXQWKHTXHU\SELECT FROM
cfgname FROM pg_ts_config;2UXVHWKH\dFFRPPDQGLQSVTO$W\SLFDOOLVW interval_periods CROSS JOIN LATERAL
generate_series('2012-01-01'::date, '2012-12-31'::date, i_type)
IROORZV WITH ORDINALITY AS d(dt,ord)
WHERE NOT (dt = '2012-01-01' AND i_type = '132 days'::interval);
cfgname ord | i_type | dt
---------- ----+------------+-----------------------
simple 1 | 5 mons | 2012-01-01 [Link]-05
danish 2 | 5 mons | 2012-06-01 [Link]-04
dutch 3 | 5 mons | 2012-11-01 [Link]-04
english 2 | 132 days | 2012-05-12 [Link]-04
finnish 3 | 132 days | 2012-09-21 [Link]-04
french 1 | [Link] | 2012-01-01 [Link]-05
german 2 | [Link] | 2012-07-21 [Link]-04
hungarian (7 rows)
italian
norwegian ,Q([DPSOHWITH ORDINALITYJHWVDSSOLHGWRWKHUHVXOWRIWKHVHW
portuguese
romanian UHWXUQLQJIXQFWLRQ,WDOZD\VJHWVDSSOLHGEHIRUHWKHWHEREFRQGLWLRQ$VD
russian UHVXOWWKHUHLVDJDSLQQXPEHULQJLQWKHILQDOUHVXOW WKHQXPEHULVODFNLQJIRU
spanish
swedish
WKHGD\LQWHUYDO EHFDXVHWKHQXPEHUZDVILOWHUHGRXWE\RXUWHERE
turkish FRQGLWLRQ
(16 rows)
,IZHGLGQߞWKDYHWKHWHEREFRQGLWLRQH[FOXGLQJWKHGD\UHFRUG
,I\RXQHHGWRFUHDWH\RXURZQFRQILJXUDWLRQVRUGLFWLRQDULHVUHIHUWR ZHZRXOGKDYHURZVZLWKWKHWKURZEHLQJ1 | 132 days | 2012-01-01
3RVWJUH64/0DQXDO)XOO7H[W6HDUFK&RQILJXUDWLRQDQG3RVWJUH64/0DQXDO [Link]-04
)XOO7H[W6HDUFK'LFWLRQDULHV
<RXߞUHQRWOLPLWHGWREXLOWLQ)76FRQILJXUDWLRQV<RXFDQFUHDWH\RXURZQ%XW *5283,1*6(76&8%(52//83
EHIRUH\RXGR\RXPD\ZLVKWRVHHZKDWRWKHUXVHUVKDYHDOUHDG\FUHDWHGWKDW
PD\VXLW\RXUQHHGV,I\RXUWH[WLVPHGLFDOUHODWHG\RXPD\EHDEOHWRILQGD ,I\RXߞYHHYHUWULHGWRFUHDWHDVXPPDU\UHSRUWWKDWLQFOXGHVERWKWRWDOVDQG
FRQILJXUDWLRQZLWKGLFWLRQDULHVFKRFNIXOORIVSHFLDOL]HGDQDWRP\WHUPV,I\RXU VXEWRWDOV\RXߞOODSSUHFLDWHWKHFDSDELOLW\WRSDUWLWLRQ\RXUGDWDRQWKHIO\
WH[WLVLQ6SDQLVKILQGDFRQILJXUDWLRQWKDWWDLORUVWR\RXUSDUWLFXODUGLDOHFWRI *URXSLQJVHWVOHW\RXGRH[DFWO\WKDW
6SDQLVK )RURXUWDEOHRIWHVWVFRUHVLIZHQHHGWRILQGERWKWKHRYHUDOODYHUDJHSHU
2QFH\RXORFDWHDFRQILJXUDWLRQWKDW\RXߞGOLNHDGGHGWR\RXUDUVHQDO VWXGHQWDQGWKHDYHUDJHSHUVWXGHQWE\VXEMHFWZHFRXOGZULWHDTXHU\DVVKRZQ
LQVWDOODWLRQLVTXLWHVLPSOHDQGXVXDOO\GRHVQߞWUHTXLUHDGGLWLRQDOFRPSLODWLRQ LQ([DPSOHWDNLQJDGYDQWDJHRIJURXSLQJVHWV
:HGHPRQVWUDWHE\LQVWDOOLQJWKHSRSXODUKXQVSHOOFRQILJXUDWLRQ ([DPSOH$YJVFRUHIRUHDFKVWXGHQWDQGVWXGHQWLQVXEMHFW
,QWURGXFHGLQYHUVLRQWKHWITH ORDINALITYFODXVHLVDQ64/$16, 6WDUWE\GRZQORDGLQJKXQVSHOOFRQILJXUDWLRQVIURPKXQVSHOOBGLFWV<RXߞOOEH
VWDQGDUGFRQVWUXFWWITH ORDINALITYDGGVDVHTXHQWLDOQXPEHUFROXPQWRDVHW JUHHWHGE\KXQVSHOOIRUPDQ\GLIIHUHQWODQJXDJHV:HߞOOJRZLWKKXQVSHOOBHQBXV
UHWXUQLQJIXQFWLRQUHVXOW
 'RZQORDGHYHU\WKLQJLQWKHIROGHU
 &RS\HQBXVDIIL[DQGHQBXVGLFWWR\RXU3RVWJUH64/LQVWDOODWLRQGLUHFWRU\
127( VKDUHWVHDUFKBGDWD
$OWKRXJK\RXFDQߞWXVHWITH ORDINALITYZLWKWDEOHVDQGVXETXHULHV\RXFDQDFKLHYHWKH
VDPHUHVXOWIRUWKRVHE\XVLQJWKHZLQGRZIXQFWLRQ52:B180%(5  &RS\WKHKXQVSHOOBHQBXV VTODQGKXQVSHOOBHQBXVFRQWUROILOHVWR\RXU
3RVWJUH64/LQVWDOODWLRQGLUHFWRU\VKDUHH[WHQVLRQIROGHU

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

ALTER DATABASE postgresql_book


SET default_text_search_config = 'pg_catalog.english';
:,7+25',1$/,7<
INNER JOIN 7KLVUHSODFHPHQWWDNHVSODFHDWWKHGDWDEDVHOHYHOEXWDVZLWKPRVW3RVWJUH64/
(
SELECT *
FRQILJXUDWLRQVHWWLQJV\RXFDQPDNHWKHFKDQJHDWWKHVHUYHUXVHURUVHVVLRQ
FROM census.lu_fact_types OHYHOV
WHERE category = CASE WHEN [Link] = 2011
THEN 'Housing' ELSE category END
) R 769HFWRUV
ON L.fact_type_id = R.fact_type_id;
$WH[WFROXPQPXVWEHYHFWRUL]HGEHIRUH)76FDQVHDUFKDJDLQVWLW7KHUHVXOWDQW
1RZDGGWKHLATERALNH\ZRUGDQGWKHHUURULVJRQH YHFWRUFROXPQLVDWVYHFWRUGDWDW\SH7RFUHDWHDWVYHFWRUIURPWH[W\RXPXVW
VSHFLI\WKH)76FRQILJXUDWLRQWRXVH7KHYHFWRUL]DWLRQUHGXFHVWKHRULJLQDOWH[W
SELECT * WRDVHWRIZRUGVNHOHWRQVUHIHUUHGWRDVOH[HPHVE\UHPRYLQJVWRSZRUGV)RU
FROM HDFKOH[HPHWKH769HFWRUUHFRUGVZKHUHLQWKHRULJLQDOWH[WLWDSSHDUV7KH
[Link] L INNER JOIN LATERAL
( PRUHIUHTXHQWO\DOH[HPHDSSHDUVWKHKLJKHUWKHZHLJKW(DFKOH[HPHWKHUHIRUH
SELECT * LVLPEXHGZLWKDWOHDVWRQHSRVLWLRQPXFKOLNHDYHFWRULQWKHSK\VLFDOVHQVH
FROM census.lu_fact_types
WHERE category = CASE WHEN [Link] = 2011 8VHWKHWRBWVYHFWRUIXQFWLRQWRYHFWRUL]HDEORERIWH[W7KLVIXQFWLRQZLOOUHVRUW
THEN 'Housing' ELSE category END
) R
WRWKHGHIDXOW)76FRQILJXUDWLRQXQOHVV\RXVSHFLI\DQRWKHU
ON L.fact_type_id = R.fact_type_id; ([DPSOHVKRZVKRZ769HFWRUVGLIIHUGHSHQGLQJRQZKLFK)76
FRQILJXUDWLRQZDVXVHGLQWKHLUFRQVWUXFWLRQ
LATERALOHWV\RXVKDUHGDWDLQFROXPQVDFURVVWZRWDEOHVLQDFROMFODXVH
+RZHYHULWZRUNVRQO\LQRQHGLUHFWLRQWKHULJKWKDQGVLGHFDQGUDZIURPWKH ([DPSOH769HFWRUGHULYHGIURPGLIIHUHQW)76FRQILJXUDWLRQV
OHIWKDQGVLGHEXWQRWYLFHYHUVD SELECT
[Link],
7KHUHDUHVLWXDWLRQVZKHQ\RXVKRXOGDYDLO\RXUVHOIRILATERALWRDYRLG CASE
WHEN [Link] ='default' THEN to_tsvector(f.t)
H[WUHPHO\FRQYROXWHGV\QWD[,Q([DPSOHDFROXPQRQWKHOHIWVHUYHVDVD ELSE to_tsvector([Link]::regconfig,f.t)
SDUDPHWHULQWKHgenerate_seriesIXQFWLRQRQWKHULJKW END As vect
FROM (
SELECT 'Just dancing in the rain. I like to dance.'::text) As f(t), (
CREATE TABLE interval_periods(i_type interval); VALUES ('default'),('english'),('english_hunspell'),('simple')
INSERT INTO interval_periods (i_type) ) As c(name);
VALUES ('5 months'), ('132 days'), ('4862 hours'); name | vect
-----------------+--------------------------------------------------------------------
([DPSOH8VLQJ/$7(5$/ZLWKJHQHUDWHBVHULHV ---------
default | 'danc':2,9 'like':7 'rain':5
SELECT i_type, dt english | 'danc':2,9 'like':7 'rain':5
FROM english_hunspell | 'dance':2,9 'dancing':2 'like':7 'rain':5
interval_periods CROSS JOIN LATERAL simple | 'dance':9 'dancing':2 'i':6 'in':3 'just':1 'like':7
generate_series('2012-01-01'::date, '2012-12-31'::date, i_type) AS dt 'rain':5 'the':4 'to':8
WHERE NOT (dt = '2012-01-01' AND i_type = '132 days'::interval); (4 rows)
i_type | dt
------------+----------------------- ([DPSOHGHPRQVWUDWHVKRZIRXUGLIIHUHQW)76FRQILJXUDWLRQVUHVXOWLQ
5 mons | 2012-01-01 [Link]-05
5 mons | 2012-06-01 [Link]-04
GLIIHUHQWYHFWRUV1RWHKRZWKH(QJOLVKDQG+XQVSHOOFRQILJXUDWLRQVUHPRYHDOO
VWRSZRUGVVXFKDVMXVWDQGWR(QJOLVKDQG+XQVSHOODOVRFRQYHUWZRUGVWRWKHLU pg_namespace n ON [Link] = [Link] LEFT JOIN
pg_tablespace t ON [Link] = [Link] LEFT JOIN
QRUPDOL]HGIRUPDVGLFWDWHGE\WKHLUGLFWLRQDULHVVRGDQFLQJEHFRPHVGDQFDQG pg_inherits As th ON [Link] = [Link]
GDQFHUHVSHFWLYHO\7KHVLPSOHFRQILJXUDWLRQKDVQRFRQFHSWRIVWHPPLQJDQG WHERE
VWRSZRUGV [Link] IS NULL AND
[Link] = 'r'::"char" AND [Link]
7KHWRBWVYHFWRUIXQFWLRQUHWXUQVZKHUHHDFKOH[HPHDSSHDUVLQWKHWH[W6RIRU UNION ALL
SELECT
H[DPSOH'danc':2,9PHDQVWKDWGDQFLQJDQGGDQFHDSSHDUDVWKHVHFRQGDQG [Link] As tableoid,
WKHQLQWKZRUGV [Link] AS schemaname,
[Link] || '->' || [Link] AS tablename
7RLQFRUSRUDWH)76LQWR\RXUGDWDEDVHDGGDWVYHFWRUFROXPQWR\RXUWDEOH<RX FROM
tbls INNER JOIN
WKHQHLWKHUVFKHGXOHWKHWVYHFWRUFROXPQWREHXSGDWHGUHJXODUO\RUDGGDWULJJHU pg_inherits As th ON [Link] = [Link] INNER JOIN
WRWKHWDEOHVRWKDWZKHQHYHUUHOHYDQWILHOGVXSGDWHWKHWVYHFWRUILHOG pg_class c ON [Link] = [Link] LEFT JOIN
UHFRPSXWHV pg_namespace n ON [Link] = [Link] LEFT JOIN
pg_tablespace t ON [Link] = [Link]
)RURXUH[DPSOHVZHJDWKHUHGILFWLWLRXVPRYLHGDWD/RDGWKHWDEOHVIURPSVTO )
SELECT * FROM tbls ORDER BY tablename;
XVLQJWKHILOHVTOVFULSWDVIROORZV tableoid | schemaname | tablename
---------+------------+---------------------------------------
\encoding utf8; 3152249 | public | logs
\i [Link] 3152260 | public | logs->logs_2011
3152272 | public | logs->logs_2011->logs_2011_01_02

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

WRBWVTXHU\DQGSODLQWRBWVTXHU\ORRNRQO\DWZRUGVQRWWKHLUVHTXHQFH6R CREATE TABLE logs_2011_01_02 (


EXVLQHVVDQDO\WLFVDQGDQDO\WLFVEXVLQHVVSURGXFHWKHVDPHWVTXHU\7KLVLVD PRIMARY KEY (log_id),
CONSTRAINT chk
VKRUWFRPLQJEHFDXVH\RXߞUHOLPLWHGWRVHDUFKLQJE\VLQJOHZRUGVRQO\9HUVLRQ CHECK (log_ts >= '2011-01-01' AND log_ts < '2011-03-01')
DGGUHVVHGWKLVZLWKWKHIXQFWLRQSKUDVHWRBWVTXHU\,Q([DPSOHWKH )
INHERITS (logs_2011);
SKUDVHWRBWVTXHU\YHFWRUL]HVWKHZRUGVLQVHUWLQJWKHGLVWDQFHRSHUDWRUEHWZHHQ
IXQFWLRQ2WKHUGDWDEDVHVWHQGWROLPLWZLQGRZIXQFWLRQVWRXVLQJEXLOWLQ WKHZRUGV7KLVPHDQVWKDWWKHVHDUFKHGWH[WPXVWFRQWDLQWKHZRUGVEXVLQHVV
DJJUHJDWHVVXFKDVAVGSUMMINDQGMAX DQGDQDO\WLFVLQWKDWRUGHUXSJUDGLQJDZRUGVHDUFKWRDSKUDVHVHDUFK
([DPSOH764XHU\FRQVWUXFWLRQVSKUDVHWRBTXHU\
SELECT phraseto_tsquery('business analytics');
&RPPRQ7DEOH([SUHVVLRQV phraseto_tsquery
-------------------
(VVHQWLDOO\FRPPRQWDEOHH[SUHVVLRQV &7(V DOORZ\RXWRGHILQHDTXHU\WKDW 'busi' <-> 'analyt'
FDQEHUHXVHGLQDODUJHUTXHU\&7(VDFWDVWHPSRUDU\WDEOHVGHILQHGZLWKLQWKH SELECT phraseto_tsquery('english_hunspell','business analytics');
phraseto_tsquery
VFRSHRIWKHVWDWHPHQWWKH\ߞUHJRQHRQFHWKHHQFORVLQJVWDWHPHQWKDVILQLVKHG ---------------------------------------------
H[HFXWLQJ 'business' <-> 'analyt' | 'busy' <-> 'analyt'

7KHUHDUHWKUHHZD\VWRXVH&7(V <RXFDQDOVRFDVWWH[WWRWVTXHU\ZLWKRXWXVLQJDQ\IXQFWLRQVDVLQ'business &


%DVLF&7( analytics'::tsquery+RZHYHUZLWKFDVWVZRUGVDUHQRWUHSODFHGZLWK
OH[HPHVDQGDUHWDNHQOLWHUDOO\
7KLVLV\RXUSODLQYDQLOOD&7(XVHGWRPDNH\RXU64/PRUHUHDGDEOHRUWR
HQFRXUDJHWKHSODQQHUWRPDWHULDOL]HDFRVWO\LQWHUPHGLDWHUHVXOWIRUEHWWHU 764XHULHVFDQEHFRPELQHGXVLQJWKHRURSHUDWRU || RUWKHDQGRSHUDWRU && 
SHUIRUPDQFH 7KHH[SUHVVLRQtsquery1 || tsquery2PHDQVPDWFKLQJWH[WPXVWVDWLVI\HLWKHU
:ULWDEOH&7( WVTXHU\RUWVTXHU\7KHH[SUHVVLRQtsquery1 && tsquery2PHDQVPDWFKLQJ
WH[WPXVWVDWLVI\ERWKWVTXHU\DQGWVTXHU\
7KLVLVDQH[WHQVLRQRIWKHEDVLF&7(ZLWKUPDATEINSERTDQGDELETE
([DPSOHVRIHDFKDUHVKRZQLQ([DPSOH
FRPPDQGV$FRPPRQILQDOVWHSLQWKH&7(LVWRUHWXUQFKDQJHGURZV
([DPSOH&RPELQLQJWVTXHULHV
5HFXUVLYH&7(
SELECT plainto_tsquery('business analyst') || phraseto_tsquery('data scientist');
7KLVSXWVDQHQWLUHO\QHZZKLUORQVWDQGDUG&7(7KHURZVUHWXUQHGE\D tsquery
-------------------------------------------
UHFXUVLYH&7(YDU\GXULQJWKHH[HFXWLRQRIWKHTXHU\ 'busi' & 'analyst' | 'data' <-> 'scientist'
SELECT plainto_tsquery('business analyst') && phraseto_tsquery('data scientist');
3RVWJUH64/DOORZV\RXWRKDYHD&7(WKDWLVERWKZULWDEOHDQGUHFXUVLYH tsquery
--------------------------------------------
'busi' & 'analyst' & ('data' <-> 'scientist')
%DVLF&7(V
WVTXHULHVDQGWVYHFWRUVKDYHDGGLWLRQDORSHUDWRUVIRUGRLQJWKLQJVOLNH
7KHEDVLF&7(ORRNVOLNH([DPSOH7KHWITHNH\ZRUGLQWURGXFHVWKH&7(
GHWHUPLQLQJLIRQHLVDVXEVHWRIDQRWKHUDQGVHYHUDORWKHUIXQFWLRQV$OOWKLVLV
([DPSOH%DVLF&7( GHWDLOHGLQ3RVWJUH64/0DQXDO7H[W6HDUFK)XQFWLRQVDQG2SHUDWRUV
WITH cte AS (
SELECT
tract_id, substring(tract_id,1, 5) As county_code, 8VLQJ)XOO7H[W6HDUFK
COUNT(*) OVER(PARTITION BY substring(tract_id,1, 5)) As cnt_tracts
FROM census.lu_tracts :HKDYHFUHDWHGDWVYHFWRUIURPRXUWH[WZHKDYHFUHDWHGDWVTXHU\IURPRXU
) VHDUFKWHUPV1RZZHFDQSHUIRUPDQ)76:HGRVRE\XVLQJWKH@@RSHUDWRU
SELECT MAX(tract_id) As last_tract, county_code, cnt_tracts
([DPSOHGHPRQVWUDWHVLW
([DPSOH)76LQDFWLRQ LQVWDQFHLI\RXUURZLVLQWKHILIWKURZLQWKHWKLUGSDUWLWLRQWKHVXPZLOOFRYHU
SELECT left(title,50) As title, left(description,50) as description RQO\WKHILUVWILYHURZVLQWKHWKLUGSDUWLWLRQ:HSXWDQORDER BY
FROM film
WHERE fts @@ to_tsquery('hunter & (scientist | chef)') AND title > '';
left(tract_id,5), valDWWKHHQGRIWKHTXHU\VR\RXFDQHDVLO\VHHWKH
title | description SDWWHUQEXWNHHSLQPLQGWKDWWKHORDER BYRIWKHTXHU\LVLQGHSHQGHQWRIWKH
-----------------------+---------------------------------------------------
ALASKA PHANTOM | A Fanciful Saga of a Hunter And a Pastry Chef who
ORDER BYLQHDFKOVERFODXVH
CAUSE DATE | A Taut Tale of a Explorer And a Pastry Chef who mu
CINCINATTI WHISPERER | A Brilliant Saga of a Pastry Chef And a Hunter who <RXFDQH[SOLFLWO\FRQWUROWKHURZVXQGHUFRQVLGHUDWLRQE\DGGLQJDRANGERU
COMMANDMENTS EXPRESS | A Fanciful Saga of a Student And a Mad Scientist w ROWSFODXVHROWS BETWEEN CURRENT ROW AND 5 FOLLOWING
DAUGHTER MADIGAN | A Beautiful Tale of a Hunter And a Mad Scientist w
GOLDFINGER SENSIBILITY | A Insightful Drama of a Mad Scientist And a Hunter 3RVWJUH64/DOVRVXSSRUWVZLQGRZQDPLQJZKLFKLVXVHIXOLI\RXKDYHWKHVDPH
HATE HANDICAP | A Intrepid Reflection of a Mad Scientist And a Pio
ZLQGRZIRUHDFKRI\RXUZLQGRZFROXPQV([DPSOHGHPRQVWUDWHVKRZWR
INSIDER ARIZONA | A Astounding Saga of a Mad Scientist And a Hunter
WORDS HUNTER | A Action-Packed Reflection of a Composer And a Mad QDPHZLQGRZVDVZHOODVKRZWRXVHWKHLEADDQGLAGZLQGRZIXQFWLRQVWR
(9 rows) VKRZDUHFRUGYDOXHEHIRUHDQGDIWHUIRUDJLYHQSDUWLWLRQ
([DPSOHILQGVDOOILOPVZLWKDWLWOHRUGHVFULSWLRQFRQWDLQLQJWKHZRUG ([DPSOH1DPLQJZLQGRZVGHPRQVWUDWLQJ/($'DQG/$*
KXQWHUDQGHLWKHUWKHZRUGVFLHQWLVWRUWKHZRUGFKHIRUERWK SELECT * FROM (
SELECT
,I\RXDUHUXQQLQJ3RVWJUH64/\RXFDQVSHFLI\WKHSUR[LPLW\DQGRUGHURI ROW_NUMBER() OVER( wt ) As rnum,
ZRUGV6HH([DPSOH substring(tract_id,1, 5) As county_code,
tract_id,
([DPSOH)76ZLWKRUGHUDQGSUR[LPLW\ LAG(tract_id,2) OVER wt As tract_2_before,
LEAD(tract_id) OVER wt As tract_after
SELECT left(title,50) As title, left(description,50) as description
FROM census.lu_tracts
FROM film
WINDOW wt AS (PARTITION BY substring(tract_id,1, 5) ORDER BY tract_id)
WHERE fts @@ to_tsquery('hunter <4> (scientist | chef)') AND title > '';
) As x
title | description
WHERE rnum BETWEEN 2 and 3 AND county_code IN ('25007','25025')
-----------------+---------------------------------------------------
ORDER BY county_code, rnum;
ALASKA PHANTOM | A Fanciful Saga of a Hunter And a Pastry Chef who
rnum | county_code | tract_id | tract_2_before | tract_after
DAUGHTER MADIGAN | A Beautiful Tale of a Hunter And a Mad Scientist w
-----+-------------+-------------+----------------+------------
(2 rows)
2 | 25007 | 25007200200 | | 25007200300
3 | 25007 | 25007200300 | 25007200100 | 25007200400
([DPSOHUHTXLUHVWKDWWKHZRUGKXQWHUSUHFHGHVFLHQWLVWRUFKHIE\H[DFWO\ 2 | 25025 | 25025000201 | | 25025000202
IRXUZRUGV 3 | 25025 | 25025000202 | 25025000100 | 25025000301

1DPLQJRXUZLQGRZwtZLQGRZ
5DQNLQJ5HVXOWV 8VLQJRXUZLQGRZQDPHLQVWHDGRIUHW\SLQJ
)76LQFOXGHVIXQFWLRQVIRUUDQNLQJUHVXOWV7KHVHIXQFWLRQVDUHWVBUDQNDQG %RWKLEADDQGLAGWDNHDQRSWLRQDOVWHSDUJXPHQWWKDWGHILQHVKRZPDQ\URZV
WVBUDQNBFGWVBUDQNFRQVLGHUVRQO\WKHIUHTXHQF\RIWHUPVDQGZHLJKWVZKLOH
WRVNLSIRUZDUGRUEDFNZDUGWKHVWHSFDQEHSRVLWLYHRUQHJDWLYHLEADDQGLAG
WVBUDQNBFG FGVWDQGVIRUFRYHUDJHGHQVLW\ 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]DWLRQDGGVPDUNHUV ORFDWLRQRIWKHOH[HPHVZLWKLQWKH WKDWZLWKZLQGRZIXQFWLRQVZHZHUHDEOHWRSHUIRUPDQDJJUHJDWLRQZLWKRXW
YHFWRU DQGRSWLRQDOO\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 DNDrecordrow REMHFWW\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
PHGLDQ DNDSHUFHQWLOH DQGPRGH7KHVHIXQFWLRQVDUHSHUFHQWLOHBGLVF $OWKRXJK\RXFDQHDVLO\FUHDWHFRPSRVLWHW\SHVMXVWE\FUHDWLQJDWDEOHDWVRPH
SHUFHQWLOHGLVFUHWH SHUFHQWLOHBFRQW SHUFHQWLOHFRQWLQXRXV DQGPRGH 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//RU127 somevalue,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
WKHPZLWKWZRVHTXHQWLDOGROODUVLJQV  KHQFHWKHQDPHGROODUTXRWLQJ timestamp with time zone VKRUWKDQGtimestamptz LVDGDWHDQGWLPH
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

:LWKGROODUTXRWLQJ DROP SEQUENCE logs_log_id_seq CASCADE;


ALTER TABLE logs
ALTER COLUMN log_id ADD GENERATED BY DEFAULT AS IDENTITY;
SELECT $$It's O'Neil's play. $$ || $$It'll start at two o'clock.$$

,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_aggDQGhstore DIXQFWLRQ
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\WKDWDWDEOH WKHFKLOGWDEOH LQKHULWVIURPDQRWKHUWDEOH WKH WKHVXETXHU\
SDUHQWWDEOH 3RVWJUH64/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( IURPWKHLUSDUHQWV VHH([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[HV VHHߡ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

SELECT tract_name 7<3(2)


FROM census.lu_tracts
WHERE tract_name ILIKE ANY(ARRAY['%99%duke%','%06%Barnstable%']::text[]); 3RVWJUH64/DXWRPDWLFDOO\FUHDWHVDFRUUHVSRQGLQJFRPSRVLWHGDWDW\SHLQWKH
EDFNJURXQGZKHQHYHU\RXFUHDWHDQHZWDEOH7KHUHYHUVHLVQRWWUXH%XW\RX
tract_name FDQXVHDFRPSRVLWHGDWDW\SHDVDWHPSODWHIRUFUHDWLQJWDEOHV:HߞOO
-----------------------------------------------------
Census Tract 102.06, Barnstable County, Massachusetts GHPRQVWUDWHWKLVE\ILUVWFUHDWLQJDW\SHZLWKWKHGHILQLWLRQ
Census Tract 103.06, Barnstable County, Massachusetts
Census Tract 106, Barnstable County, Massachusetts CREATE TYPE basic_user AS (user_name varchar(50), pwd varchar(10));
Census Tract 9900, Dukes County, Massachusetts
(4 rows)
:HFDQWKHQFUHDWHDWDEOHZLWKURZVWKDWDUHLQVWDQFHVRIWKLVW\SHDVVKRZQLQ
([DPSOH
7KHH[DPSOHMXVWVKRZQLVDVKRUWKDQGZD\RIXVLQJPXOWLSOHILIKEORFODXVHV
<RXFDQXVHANYZLWKRWKHUFRPSDUDWRUVVXFKDVLIKE=DQG~ WKHUHJH[OLNH ([DPSOH8VLQJ7<3(WRGHILQHDQHZWDEOHVWUXFWXUH
RSHUDWRU  CREATE TABLE super_users OF basic_user (CONSTRAINT pk_su PRIMARY KEY (user_name));

ANYFDQEHXVHGZLWKDQ\GDWDW\SHVDQGFRPSDULVRQRSHUDWRUV RSHUDWRUVWKDW $IWHUFUHDWLQJWDEOHVIURPGDWDW\SHV\RXFDQߞWDOWHUWKHFROXPQVRIWKHWDEOH


UHWXUQD%RROHDQ LQFOXGLQJRQHV\RXEXLOW\RXUVHOIRULQVWDOOHGYLDH[WHQVLRQV ,QVWHDGDGGRUUHPRYHFROXPQVWRWKHFRPSRVLWHGDWDW\SHDQG3RVWJUH64/ZLOO
DXWRPDWLFDOO\SURSDJDWHWKHFKDQJHVWRWKHWDEOHVWUXFWXUH0XFKOLNH
6HW5HWXUQLQJ)XQFWLRQVLQ6(/(&7 LQKHULWDQFHWKHDGYDQWDJHRIWKLVDSSURDFKLVWKDWLI\RXKDYHPDQ\WDEOHV
VKDULQJWKHVDPHXQGHUO\LQJVWUXFWXUHDQG\RXQHHGWRPDNHDXQLYHUVDO
$VHWUHWXUQLQJIXQFWLRQLVDIXQFWLRQWKDWFRXOGUHWXUQPRUHWKDQRQHURZ DOWHUDWLRQ\RXFDQGRVRE\VLPSO\FKDQJLQJWKHXQGHUO\LQJFRPSRVLWHW\SH
3RVWJUH64/DOORZVVHWUHWXUQLQJIXQFWLRQVWRDSSHDULQWKHSELECTFODXVHRIDQ /HWߞVVD\ZHQRZQHHGWRDGGDSKRQHQXPEHUWRRXUsuper_usersWDEOHIURP
64/VWDWHPHQW7KLVLVQRWWUXHRIPRVWRWKHUGDWDEDVHVLQZKLFKRQO\VFDODU
([DPSOH$OOZHKDYHWRGRLVH[HFXWHWKHIROORZLQJFRPPDQG FRORQVDVLQ'2011-1-1'::date7KLVV\QWD[LVVKRUWHUDQGHDVLHUWRDSSO\IRU
FDVHVLQZKLFK\RXFDQߞWGLUHFWO\FDVWIURPRQHW\SHWRDQRWKHUDQGKDYHWR
ALTER TYPE basic_user ADD ATTRIBUTE phone varchar(10) CASCADE; LQWHUFHGHZLWKRQHRUPRUHLQWHUPHGLDU\W\SHVVXFKDV
someXML::text::integer
1RUPDOO\\RXFDQߞWFKDQJHWKHGHILQLWLRQRIDW\SHLIWDEOHVGHSHQGRQWKDWW\SH
7KHCASCADEPRGLILHURYHUULGHVWKLVUHVWULFWLRQDSSO\LQJWKHVDPHFKDQJHWRDOO
GHSHQGHQWWDEOHV 0XOWLURZ,QVHUW
3RVWJUH64/VXSSRUWVWKHPXOWLURZFRQVWUXFWRUWRLQVHUWPRUHWKDQRQHUHFRUGDW
DWLPH([DPSOHGHPRQVWUDWHVKRZWRXVHDPXOWLURZFRQVWUXFWLRQWRLQVHUW
&RQVWUDLQWV GDWDLQWRWKHWDEOHZHFUHDWHGLQ([DPSOH
3RVWJUH64/FRQVWUDLQWVDUHWKHPRVWDGYDQFHG DQGPRVWFRPSOH[ RIDQ\ ([DPSOH8VLQJDPXOWLURZFRQVWUXFWRUWRLQVHUWGDWD
GDWDEDVHZHߞYHZRUNHGZLWK<RXFDQFRQWURODOOIDFHWVRIKRZDFRQVWUDLQW INSERT INTO logs_2011 (user_name, description, log_ts)
KDQGOHVH[LVWLQJGDWDDOOFDVFDGHRSWLRQVKRZWRSHUIRUPWKHPDWFKLQJZKLFK VALUES
('robe', 'logged in', '2011-01-10 10:15 AM EST'),
LQGH[HVWRLQFRUSRUDWHFRQGLWLRQVXQGHUZKLFKWKHFRQVWUDLQWFDQEHYLRODWHG ('lhsu', 'logged out', '2011-01-11 10:20 AM EST');
DQGPRUH2QWRSRILWDOO\RXFDQSLFN\RXURZQQDPHIRUHDFKFRQVWUDLQW)RU
WKHIXOOWUHDWPHQWZHVXJJHVW\RXUHYLHZWKHRIILFLDOGRFXPHQWDWLRQ<RXߞOOILQG 7KHODWWHUSRUWLRQRIWKHPXOWLURZFRQVWUXFWRUVWDUWLQJZLWKWKHVALUESNH\ZRUG
FRPIRUWLQNQRZLQJWKDWXVLQJWKHGHIDXOWVHWWLQJVXVXDOO\ZRUNVRXWILQH:HߞOO LVRIWHQUHIHUUHGWRDVDYDOXHVOLVW$YDOXHVOLVWFDQVWDQGDORQHDQGHIIHFWLYHO\
VWDUWRIIZLWKVRPHWKLQJIDPLOLDUWRPRVWUHODWLRQDOIRONVIRUHLJQNH\XQLTXH FUHDWHVDWDEOHRQWKHIO\DVLQ([DPSOH
DQGFKHFNFRQVWUDLQWV7KHQZHߞOOPRYHRQWRH[FOXVLRQFRQVWUDLQWV ([DPSOH8VLQJDPXOWLURZFRQVWUXFWRUDVDYLUWXDOWDEOH
SELECT *
FROM (
:$51,1* VALUES
('robe', 'logged in', '2011-01-10 10:15 AM EST'::timestamptz),
1DPHVRISULPDU\NH\DQGXQLTXHNH\FRQVWUDLQWVPXVWEHXQLTXHZLWKLQDJLYHQVFKHPD$ ('lhsu', 'logged out', '2011-01-11 10:20 AM EST'::timestamptz)
JRRGSUDFWLFHLVWRLQFOXGHWKHQDPHRIWKHWDEOHDQGFROXPQDVSDUWRIWKHQDPHRIWKHNH\)RU ) AS l (user_name, description, log_ts);
WKHVDNHRIEUHYLW\RXUH[DPSOHVPLJKWQRWDELGHE\WKLVSUDFWLFH
:KHQ\RXXVHVALUESDVDVWDQGLQIRUDYLUWXDOWDEOH\RXQHHGWRVSHFLI\WKH
QDPHVIRUWKHFROXPQV<RXDOVRQHHGWRH[SOLFLWO\FDVWWKHYDOXHVWRWKHGDWD
)RUHLJQ.H\&RQVWUDLQWV W\SHVLQWKHWDEOHLIWKHSDUVHUFDQߞWLQIHUWKHGDWDW\SHIURPWKHGDWD7KH
3RVWJUH64/IROORZVWKHVDPHFRQYHQWLRQDVPRVWGDWDEDVHVWKDWVXSSRUW PXOWLURZ9$/8(6FRQVWUXFWDOVRH[LVWVLQ0\64/DQG64/6HUYHU
UHIHUHQWLDOLQWHJULW\<RXFDQVSHFLI\FDVFDGHXSGDWHDQGGHOHWHUXOHVWRDYRLG
SHVN\RUSKDQHGUHFRUGV:HVKRZ\RXKRZWRDGGIRUHLJQNH\FRQVWUDLQWVLQ ,/,.(IRU&DVH,QVHQVLWLYH6HDUFK
([DPSOH 3RVWJUH64/LVFDVHVHQVLWLYH+RZHYHULWGRHVKDYHPHFKDQLVPVLQSODFHWR
([DPSOH%XLOGLQJIRUHLJQNH\FRQVWUDLQWVDQGFRYHULQJLQGH[HV LJQRUHFDVLQJ<RXFDQDSSO\WKHupperIXQFWLRQWRERWKVLGHVRIWKH$16,LIKE
SET search_path=census, public; RSHUDWRURU\RXFDQVLPSO\XVHWKHILIKE aa RSHUDWRU
ALTER TABLE facts ADD CONSTRAINT fk_facts_1 FOREIGN KEY (fact_type_id)
REFERENCES lu_fact_types (fact_type_id) ON UPDATE CASCADE ON DELETE RESTRICT;
county | tract_id | tract_name
-------+-------------+--------------------------------------------------- CREATE INDEX fki_facts_1 ON facts (fact_type_id);
25001 | 25001010100 | Census Tract 101, Barnstable County, Massachusetts
25003 | 25003900100 | Census Tract 9001, Berkshire County, Massachusetts :HGHILQHDIRUHLJQNH\UHODWLRQVKLSEHWZHHQRXUIDFWVDQGIDFWBW\SHVWDEOHV
25005 | 25005600100 | Census Tract 6001, Bristol County, Massachusetts 7KLVSUHYHQWVXVIURPLQWURGXFLQJIDFWW\SHVLQWRIDFWVWDEOHVXQOHVVWKH\DUH
25007 | 25007200100 | Census Tract 2001, Dukes County, Massachusetts
25009 | 25009201100 | Census Tract 2011, Essex County, Massachusetts DOUHDG\SUHVHQWLQWKHIDFWBW\SHVORRNXSWDEOH
: :HDGGDFDVFDGHUXOHWKDWDXWRPDWLFDOO\XSGDWHVWKHIDFWBW\SHBLGLQRXU
(14 rows)
IDFWVWDEOHVKRXOGZHUHQXPEHURXUIDFWW\SHV:HUHVWULFWGHOHWHVIURPRXU
7KHONPRGLILHUDFFHSWVPXOWLSOHFROXPQVFRQVLGHULQJDOORIWKHPWRGHWHUPLQH ORRNXSWDEOHVRIDFWW\SHVLQXVHFDQQRWEHUHPRYHGRESTRICTLVWKHGHIDXOW
GLVWLQFWQHVV7KHORDER BYFODXVHKDVWRVWDUWZLWKWKHVHWRIFROXPQVLQWKH EHKDYLRUEXWZHVXJJHVWVWDWLQJLWIRUFODULW\
DISTINCT ONWKHQ\RXFDQIROORZZLWK\RXUSUHIHUUHGRUGHULQJ 8QOLNHIRUSULPDU\NH\DQGXQLTXHFRQVWUDLQWV3RVWJUH64/GRHVQߞW
DXWRPDWLFDOO\FUHDWHDQLQGH[IRUIRUHLJQNH\FRQVWUDLQWV\RXVKRXOGDGGWKLV
\RXUVHOIWRVSHHGXSTXHULHV
/,0,7DQG2))6(7
)RUHLJQNH\FRQVWUDLQWVDUHLPSRUWDQWIRUGDWDLQWHJULW\1HZHUYHUVLRQVRI
LIMITUHWXUQVRQO\WKHQXPEHURIURZVLQGLFDWHGOFFSETLQGLFDWHVWKHQXPEHU
3RVWJUH64/FDQDOVRXVHWKHPWRLPSURYHWKHSODQQHUߞVWKLQNLQJ,QYHUVLRQ
RIURZVWRVNLS<RXFDQXVHWKHPLQWDQGHPRUVHSDUDWHO\<RXDOPRVWDOZD\V
WKHSODQQHUZDVUHYLVHGWRXVHIRUHLJQNH\UHODWLRQVKLSVWRLQIHUVHOHFWLYLW\IRU
XVHWKHPLQFRQMXQFWLRQZLWKDQORDER BY,Q([DPSOHZHGHPRQVWUDWH
MRLQSUHGLFDWHVWKXVLPSURYLQJPDQ\W\SHVRITXHULHV
XVHRIDSRVLWLYHRIIVHW/HDYLQJRXWWKHRIIVHW\LHOGVWKHVDPHUHVXOWDVVHWWLQJ
WKHRIIVHWWR]HUR
8QLTXH&RQVWUDLQWV
/LPLWVDQGRIIVHWVDUHQRWXQLTXHWR3RVWJUH64/DQGDUHLQIDFWFRSLHGIURP
0\64/DOWKRXJKLPSOHPHQWDWLRQGLIIHUVZLGHO\DPRQJGDWDEDVHSURGXFWV (DFKWDEOHFDQKDYHQRPRUHWKDQDVLQJOHSULPDU\NH\,I\RXQHHGWRHQIRUFH
XQLTXHQHVVRQRWKHUFROXPQV\RXPXVWUHVRUWWRXQLTXHFRQVWUDLQWVRUXQLTXH
([DPSOH)LUVWWUDFWIRUFRXQWLHVWKURXJK LQGH[HV$GGLQJDXQLTXHFRQVWUDLQWDXWRPDWLFDOO\FUHDWHVDQDVVRFLDWHGXQLTXH
SELECT DISTINCT ON (left(tract_id, 5)) LQGH[6LPLODUWRSULPDU\NH\VXQLTXHNH\FRQVWUDLQWVFDQSDUWLFLSDWHDVWKH
left(tract_id, 5) As county, tract_id, tract_name
FROM census.lu_tracts IRUHLJQNH\LQIRUHLJQNH\FRQVWUDLQWVEXWFDQKDYHQXOOYDOXHV$XQLTXHLQGH[
ORDER BY county, tract_id LIMIT 3 OFFSET 2; ZLWKRXWDXQLTXHNH\FRQVWUDLQWFDQDOVRKDYHQXOOYDOXHVDQGLQDGGLWLRQFDQXVH
county | tract_id | tract_name
-------+-------------+-------------------------------------------------
IXQFWLRQVLQLWVGHILQLWLRQ7KHIROORZLQJH[DPSOHVKRZVKRZWRDGGDXQLTXH
25005 | 25005600100 | Census Tract 6001, Bristol County, Massachusetts NH\
25007 | 25007200100 | Census Tract 2001, Dukes County, Massachusetts
25009 | 25009201100 | Census Tract 2011, Essex County, Massachusetts
ALTER TABLE logs_2011 ADD CONSTRAINT uq UNIQUE (user_name,log_ts);
(3 rows)

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[FOXVLRQFRQVWUDLQWSUHYHQWLQJEORFNVIURPRYHUODSSLQJ WZREORFNVKDYLQJWKH
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\V LQW
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/VWLOOXVHVUXOHVWRGHILQHWKHYLHZ DYLHZ
<RXFDQFUHDWHLQGH[HVRQWDEOHV ZLWKWKHH[FHSWLRQRIIRUHLJQWDEOHV DVZHOODV LVQRWKLQJEXWDQINSTEAD OF SELECTUXOHRQDYLUWXDOWDEOH DQGWRLPSOHPHQW
PDWHULDOL]HGYLHZV VLQJOHWDEOHXSGDWDEOHYLHZV7KHGLIIHUHQFHEHWZHHQXVLQJDWULJJHUDQGDUXOHLV
WKDWDUXOHUHZULWHVWKHXQGHUO\LQJTXHU\DQGDWULJJHUJHWVFDOOHGIRUHDFKYLUWXDO
URZ$VVXFKUXOHVEHFRPHRYHUZKHOPLQJO\GLIILFXOWWRZULWH DQGXQGHUVWDQG
:$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\WLFDOSURFHVVLQJ 2/$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,1 LVDQLQGH[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 *L67 LVDQLQGH[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[ *,1 LVJHDUHGWRZDUGWKHEXLOWLQIXOOWH[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]HG6HDUFK7UHH 63*L67 FDQEHXVHGLQWKH
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'.$DQG580 D UPDATE [Link] AS f
SET
YDULDQWEDVHGRQ*,1 LQGH[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 NQRZZKDWRSHUDWRUFODVVHV RSFODVVHVIRUVKRUW DUHDQGZK\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\SHRIint4 FRPPRQO\NQRZQDVDQLQWHJHU 7KHSJBRSFODVVV\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_ops DNDvarchar_ops GRHVQߞWLQFOXGHWKH
~~RSHUDWRU WKHLIKERSHUDWRU VRQRQHRI\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[HVDJDLQVWWKHVDPHFROXPQ 7KHUHߞVQROLPLWWRWKH UPDATE census.vw_facts_2011 SET yr = 2012 WHERE yr = 2011;
QXPEHURILQGH[HV\RXFDQEXLOGDJDLQVWDVLQJOHFROXPQ 7KHSODQQHUZLOO
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[

3RVWJUH64/VXUSDVVHVRWKHUGDWDEDVHSURGXFWVLQ$16,64/FRPSOLDQFH,W CREATE INDEX idx ON featnames_short


FHPHQWVLWVOHDGE\DGGLQJFRQVWUXFWVWKDWUDQJHIURPFRQYHQLHQWV\QWD[ USING btree (upper(fullname) varchar_pattern_ops);

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[HV VRPHWLPHVFDOOHGILOWHUHGLQGH[HV DUHLQGH[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[DPSOHVRIPXOWLFROXPQ DNDFRPSRXQG LQGH[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_DATERUGDWDIURPRWKHUWDEOHV RURWKHUURZVRIWKHLQGH[HG
WDEOH WRGHWHUPLQHZKHWKHUDUHFRUGVKRXOGEHLQGH[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\WKHYLHZLQVWHDGRIWKHWDEOH PDQ\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
7KHYLHZUHSODFHVWKHQDPHFROXPQZLWKORZHU QDPH VRWKDWZKHQZHGRD \RXULQGH[DQGWKHOHVVRILWWKDWFDQHDVLO\ILWLQ5$0'RQߞWJRRYHUERDUGZLWK
TXHU\DJDLQVWQDPHZLWKWKHYLHZLWߞVVKRUWKDQGIRUORZHU QDPH DJDLQVWWKH FRPSRXQGLQGH[HV
XQGHUO\LQJWDEOH7KHYLHZDOVRHQDEOHVis_active = trueZKLFKPHDQVDQ\
TXHU\DJDLQVWWKHYLHZZLOODXWRPDWLFDOO\KDYHWKDWFRQGLWLRQLQLWDQGEHDEOHWR
XVHWKH3$57,$/LQGH[

SELECT * FROM vw_subscribers_current WHERE name = 'sandy';

You might also like