рдзреЗрд░реИ рдЬрд╕реЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ
... рд╕рдВрдЧрдд рдпреЛрдЬрдирд╛ рдиреЛрдбреНрд╕ рдХреЛ рд▓рд╛рдЧреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрдХреЗрдд рд╕рдВрдЧ рдПрдХ рд╕реБрдиреНрджрд░ рдбрд┐рдЬрд╛рдЗрди рдХреНрд╡реЗрд░реА рдорд╛:
рдЙрдирдХреЛ рджреЛрд╕реНрд░реЛ рднрд╛рдЧрдХреЛ рдпреЛ рдЯреНрд░рд╛рдиреНрд╕рдХреНрд░рд┐рдкреНрдЯрдорд╛
рдкрд╣рд┐рд▓реЛ рднрд╛рдЧрдХреЛ рдЯреНрд░рд╛рдиреНрд╕рдХреНрд░рд┐рдкреНрдЯ, рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд░ рддрд┐рдиреАрд╣рд░реВрдХрд╛ рд╕рдорд╛рдзрд╛рдирд╣рд░реВрдорд╛ рд╕рдорд░реНрдкрд┐рдд, рд▓реЗрдЦрдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫред
"рдмрд┐рд░рд╛рдореА SQL рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡реНрдпрдЮреНрдЬрдирд╣рд░реВ" .
рдкрд╣рд┐рд▓реЗ, рд░рдЩ рд╕реБрд░реБ рдЧрд░реМрдВ - рд░ рд╣рд╛рдореА рдЕрдм рдпреЛрдЬрдирд╛рд▓рд╛рдИ рд░рдВрдЧ рджрд┐рдиреЗрдЫреИрдиреМрдВ, рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рд░рдВрдЧреАрди рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВ, рд╣рд╛рдореАрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдпреЛ рд╕реБрдиреНрджрд░ рд░ рдмреБрдЭреНрди рдпреЛрдЧреНрдп рдЫ, рддрд░ рдЕрдиреБрд░реЛрдзред
рдпреЛ рд╣рд╛рдореАрд▓рд╛рдИ рд▓рд╛рдЧреНрдереНрдпреЛ рдХрд┐ рдпрд╕реНрддреЛ рдЕрдирдлрд░реНрдореНрдпрд╛рдЯ "рдкрд╛рдирд╛" рд╕рдВрдЧ рд▓рдЧ рдмрд╛рдЯ рддрд╛рдирд┐рдПрдХреЛ рдЕрдиреБрд░реЛрдз рдзреЗрд░реИ рдХреБрд░реВрдк рд░ рддреНрдпрд╕реИрд▓реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреЗрдЦрд┐рдиреНрдЫред
рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдХреЛрдбрдорд╛ рдЕрдиреБрд░реЛрдзрдХреЛ рдореБрдЦреНрдп рднрд╛рдЧрд▓рд╛рдИ "рдЧреЛрдВрдж" рд▓рдЧрд╛рдЙрдБрдЫрдиреН (рдпреЛ, рдЕрд╡рд╢реНрдп рдкрдирд┐, рдПрдиреНрдЯрд┐рдкреНрдпрд╛рдЯрд░реНрди рд╣реЛ, рддрд░ рдпреЛ рд╣реБрдиреНрдЫ) рдПрдХ рд▓рд╛рдЗрдирдорд╛ред рднрдпрд╛рдирдХ!
рдпрд╕рд▓рд╛рдИ рдЕрдЭ рд╕реБрдиреНрджрд░ рдврдВрдЧрд▓реЗ рдЪрд┐рддреНрд░рдг рдЧрд░реМрдВред
рд░ рдпрджрд┐ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рд╕реБрдиреНрджрд░ рдврдВрдЧрд▓реЗ рдХреЛрд░реНрди рд╕рдХреНрдЫреМрдВ, рддреНрдпреЛ рд╣реЛ, рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓ рд░ рдЕрдиреБрд░реЛрдзрдХреЛ рдореБрдЦреНрдп рднрд╛рдЧрд▓рд╛рдИ рд╕рдБрдЧреИ рд░рд╛рдЦреНрди, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдпрд╕ рдЕрдиреБрд░реЛрдзрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБрдорд╛ рд╕рдВрдХреЗрдд "рд╕рдВрд▓рдЧреНрди" рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ - рдпреЛрдЬрдирд╛рдХреЛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдмрд┐рдиреНрджреБрдорд╛ рдХреЗ рднрдпреЛред
рдХреНрд╡реЗрд░реА рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд░реВрдЦ
рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдЕрдиреБрд░реЛрдз рдкрд╣рд┐рд▓реЗ рдкрд╛рд░реНрд╕ рдЧрд░реНрдиреБрдкрд░реНрдЫред
рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд╕рдБрдЧ рдЫ
рд╣рд╛рдореАрд▓реЗ рдЕрдиреБрд░реЛрдзрдХреЛ рдореБрдЦреНрдп рднрд╛рдЧрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдЗрдирдкреБрдЯрдХреЛ рд░реВрдкрдорд╛ рдлрд┐рдб рдЧрд░реНрдЫреМрдВ - рдЖрдЙрдЯрдкреБрдЯрдорд╛ рд╣рд╛рдореАрд▓реЗ JSON рд╡рд╕реНрддреБрдХреЛ рд░реВрдкрдорд╛ рдкрд╛рд░реНрд╕ рдЧрд░рд┐рдПрдХреЛ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд░реВрдЦ рдкрд╛рдЙрдБрдЫреМрдВред
рдЕрдм рд╣рд╛рдореА рдпрд╕ рд░реВрдЦрдХреЛ рдорд╛рдзреНрдпрдордмрд╛рдЯ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдорд╛ рджреМрдбрди рд╕рдХреНрдЫреМрдВ рд░ рд╣рд╛рдореАрд▓реЗ рдЪрд╛рд╣реЗрдХреЛ рдЗрдиреНрдбреЗрдиреНрдЯ, рд░рдЩ рд░ рдврд╛рдБрдЪрд╛рдХреЛ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рднреЗрд▓рд╛ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рд╣реЛрдЗрди, рдпреЛ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдЫреИрди, рддрд░ рдпреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реБрдиреЗрдЫ рдХрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рд▓рд╛рдЧреНрдереНрдпреЛред
рдореНрдпрд╛рдкрд┐рдЩ рдХреНрд╡реЗрд░реА рд░ рдпреЛрдЬрдирд╛ рдиреЛрдбрд╣рд░реВ
рдЕрдм рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЛ рдЪрд░рдгрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реЗрдХреЛ рдпреЛрдЬрдирд╛ рд░ рджреЛрд╕реНрд░реЛ рдЪрд░рдгрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реЗрдХреЛ рдкреНрд░рд╢реНрдирд▓рд╛рдИ рдХрд╕рд░реА рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд╣реЗрд░реМрдВред
рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдФрдВ - рд╣рд╛рдореАрд╕рдБрдЧ рдПрдЙрдЯрд╛ рдкреНрд░рд╢реНрди рдЫ рдЬрд╕рд▓реЗ CTE рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫ рд░ рддреНрдпрд╕рдмрд╛рдЯ рджреБрдИ рдкрдЯрдХ рдкрдвреНрдЫред рдЙрд╕рд▓реЗ рдпрд╕реНрддреЛ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдБрдЫред
CTE
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдзреНрдпрд╛рдирдкреВрд░реНрд╡рдХ рд╣реЗрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рд╕рдВрд╕реНрдХрд░рдг 12 рд╕рдореНрдо (рд╡рд╛ рдХреБрдЮреНрдЬреА рд╢рдмреНрджрдХреЛ рд╕рд╛рде рд╕реБрд░реВ рдЧрд░реНрджреИ MATERIALIZED
) рдЧрдарди
рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд┐ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдЕрдиреБрд░реЛрдзрдорд╛ рдХрддреИ CTE рдкреБрд╕реНрддрд╛ рд░ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдХрддреИ рдиреЛрдб рджреЗрдЦреНрдпреМрдВ CTE
, рддреНрдпрд╕рдкрдЫрд┐ рдпреА рдиреЛрдбрд╣рд░реВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ "рд▓рдбрд╛рдЗрдБ" рд╣реБрдиреНрдЫрдиреН, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рддреБрд░реБрдиреНрддреИ рдЬреЛрдбреНрди рд╕рдХреНрдЫреМрдВред
рддрд╛рд░рд╛ рдЪрд┐рдиреНрд╣рдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛: CTEs рдиреЗрд╕реНрдЯ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдХрдордЬреЛрд░ рдиреЗрд╕реНрдЯреЗрдбрд╣рд░реВ рдЫрдиреН, рд░ рдПрдЙрдЯреИ рдирд╛рдордХрд╛ рдкрдирд┐ред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВ рднрд┐рддреНрд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ CTE A
рдмрдирд╛рдЙрди CTE X
, рд░ рднрд┐рддреНрд░ рд╕рдорд╛рди рд╕реНрддрд░ рдорд╛ CTE B
рдлреЗрд░рд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН CTE X
:
WITH A AS (
WITH X AS (...)
SELECT ...
)
, B AS (
WITH X AS (...)
SELECT ...
)
...
рддреБрд▓рдирд╛ рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдмреБрдЭреНрдиреБрдкрд░реНрдЫред рдпреЛ "рдЖрдБрдЦрд╛рд▓реЗ" рдмреБрдЭреНрди - рдпреЛрдЬрдирд╛ рд╣реЗрд░реЗрд░, рдЕрдиреБрд░реЛрдзрдХреЛ рд╢рд░реАрд░ рдкрдирд┐ рд╣реЗрд░реНрди - рдзреЗрд░реИ рдЧрд╛рд╣реНрд░реЛ рдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрдХреЛ CTE рдкреБрд╕реНрддрд╛ рдЬрдЯрд┐рд▓ рдЫ, рдиреЗрд╕реНрдЯреЗрдб рдЫ, рд░ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдареВрд▓реЛ рдЫрдиреН, рддрдм рдпреЛ рдкреВрд░реНрдгрддрдпрд╛ рдмреЗрд╣реЛрд╢ рдЫред
рдпреВрдирд┐рдпрди
рдпрджрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдкреНрд░рд╢реНрдирдорд╛ рдХреБрдЮреНрдЬреА рд╢рдмреНрдж рдЫ рднрдиреЗ UNION [ALL]
(рджреБрдИ рдирдореВрдирд╛рд╣рд░реВ рдЬреЛрдбреНрдиреЗ рдЕрдкрд░реЗрдЯрд░), рддреНрдпрд╕рдкрдЫрд┐ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдпреЛ рдиреЛрдбрд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫ Append
, рд╡рд╛ рдХреЗрд╣рд┐ Recursive Union
.
рдЬреБрди рдорд╛рдерд┐ "рдорд╛рдерд┐" рдЫ UNION
- рдпреЛ рд╣рд╛рдореНрд░реЛ рдиреЛрдбрдХреЛ рдкрд╣рд┐рд▓реЛ рд╡рдВрд╢рдЬ рд╣реЛ, рдЬреБрди "рддрд▓" - рджреЛрд╕реНрд░реЛ рд╣реЛред рдпрджрд┐ рдорд╛рд░реНрдлрдд UNION
рд╣рд╛рдореАрд╕рдБрдЧ рдПрдХреИрдЪреЛрдЯрд┐ рдзреЗрд░реИ рдмреНрд▓рдХрд╣рд░реВ "рдЧреНрд▓реБрдб" рдЫрдиреН, рддреНрдпрд╕рдкрдЫрд┐ Append
-рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдиреЛрдб рд╣реБрдиреЗрдЫ, рддрд░ рдпрд╕рдорд╛ рджреБрдИ рд╣реЛрдЗрди, рддрд░ рдзреЗрд░реИ рдмрдЪреНрдЪрд╛рд╣рд░реВ рд╣реБрдиреЗрдЫрдиреН - рдХреНрд░рдорд╢рдГ рддрд┐рдиреАрд╣рд░реВ рдЬрд╛рдиреЗ рдХреНрд░рдордорд╛:
(...) -- #1
UNION ALL
(...) -- #2
UNION ALL
(...) -- #3
Append
-> ... #1
-> ... #2
-> ... #3
рддрд╛рд░рд╛ рдЪрд┐рдиреНрд╣рдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛: рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирдореВрдирд╛ рдЙрддреНрдкрд╛рджрди рднрд┐рддреНрд░ (WITH RECURSIVE
) рдкрдирд┐ рдПрдХ рднрдиреНрджрд╛ рдмрдвреА рд╣реБрди рд╕рдХреНрдЫ UNION
ред рддрд░ рдЕрдиреНрддрд┐рдо рдПрдХ рдкрдЫрд┐рдХреЛ рдЕрдиреНрддрд┐рдо рдмреНрд▓рдХ рд╕рдзреИрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реБрдиреНрдЫ UNION
ред рдорд╛рдерд┐рдХрд╛ рд╕рдмреИ рдХреБрд░рд╛ рдПрдЙрдЯреИ рдЫрдиреН, рддрд░ рдлрд░рдХ рдЫрдиреН UNION
:
WITH RECURSIVE T AS(
(...) -- #1
UNION ALL
(...) -- #2, ╤В╤Г╤В ╨║╨╛╨╜╤З╨░╨╡╤В╤Б╤П ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╤П ╤Б╤В╨░╤А╤В╨╛╨▓╨╛╨│╨╛ ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╤П ╤А╨╡╨║╤Г╤А╤Б╨╕╨╕
UNION ALL
(...) -- #3, ╤В╨╛╨╗╤М╨║╨╛ ╤Н╤В╨╛╤В ╨▒╨╗╨╛╨║ ╤А╨╡╨║╤Г╤А╤Б╨╕╨▓╨╜╤Л╨╣ ╨╕ ╨╝╨╛╨╢╨╡╤В ╤Б╨╛╨┤╨╡╤А╨╢╨░╤В╤М ╨╛╨▒╤А╨░╤Й╨╡╨╜╨╕╨╡ ╨║ T
)
...
рддрдкрд╛рдИрдВ рдкрдирд┐ рддреНрдпрд╕реНрддрд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ "рд╕реНрдЯрд┐рдХ рдЖрдЙрдЯ" рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рд╣рд╛рдореА рджреЗрдЦреНрдЫреМрдВ UNION
-рд╣рд╛рдореНрд░реЛ рдЕрдиреБрд░реЛрдзрдорд╛ 3 рдЦрдгреНрдбрд╣рд░реВ рдерд┐рдПред рддрджрдиреБрд╕рд╛рд░, рдПрдХ UNION
рдпрд╕рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫ Append
-рдиреЛрдб, рд░ рдЕрд░реНрдХреЛрдорд╛ - Recursive Union
.
рдкрдвреНрдиреЗ-рд▓реЗрдЦреНрдиреЗ рдбрд╛рдЯрд╛
рд╕рдмреИ рдХреБрд░рд╛ рд░рд╛рдЦрд┐рдПрдХреЛ рдЫ, рдЕрдм рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдЕрдиреБрд░реЛрдзрдХреЛ рдХреБрди рдЯреБрдХреНрд░рд╛ рдпреЛрдЬрдирд╛рдХреЛ рдХреБрди рдЯреБрдХреНрд░рд╛рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫред рд░ рдпреА рдЯреБрдХреНрд░рд╛рд╣рд░реВрдорд╛ рд╣рд╛рдореА рд╕рдЬрд┐рд▓реИ рд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдкрдорд╛ рддреА рд╡рд╕реНрддреБрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдЫреМрдВ рдЬреБрди "рдкрдвреНрди рдпреЛрдЧреНрдп" рдЫрдиреНред
рдХреНрд╡реЗрд░реАрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫреИрди рдХрд┐ рдпреЛ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛ рд╡рд╛ CTE, рддрд░ рддрд┐рдиреАрд╣рд░реВ рдПрдЙрдЯреИ рдиреЛрдбрджреНрд╡рд╛рд░рд╛ рддреЛрдХрд┐рдПрдХрд╛ рдЫрдиреНред RangeVar
ред рд░ "рдкрдардиреАрдпрддрд╛" рдХреЛ рд╕рд░реНрддрдорд╛, рдпреЛ рдиреЛрдбрд╣рд░реВрдХреЛ рдПрдХрджрдо рд╕реАрдорд┐рдд рд╕реЗрдЯ рдкрдирд┐ рд╣реЛ:
Seq Scan on [tbl]
Bitmap Heap Scan on [tbl]
Index [Only] Scan [Backward] using [idx] on [tbl]
CTE Scan on [cte]
Insert/Update/Delete on [tbl]
рд╣рд╛рдореАрд▓рд╛рдИ рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реАрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдерд╛рд╣рд╛ рдЫ, рд╣рд╛рдореАрд▓рд╛рдИ рдмреНрд▓рдХрд╣рд░реВрдХреЛ рдкрддреНрд░рд╛рдЪрд╛рд░ рдерд╛рд╣рд╛ рдЫ, рд╣рд╛рдореАрд▓рд╛рдИ рд╡рд╕реНрддреБрд╣рд░реВрдХреЛ рдирд╛рдо рдерд╛рд╣рд╛ рдЫ - рд╣рд╛рдореА рдПрдХ-рджреЗрдЦрд┐-рдПрдХ рддреБрд▓рдирд╛ рдЧрд░реНрдЫреМрдВред
рдлреЗрд░рд┐ рдХрд╛рд░реНрдп "рдПрд╕реНрдЯреЗрд░рд┐рд╕реНрдХ рд╕рдВрдЧ"ред рд╣рд╛рдореА рдЕрдиреБрд░реЛрдз рд▓рд┐рдиреНрдЫреМрдВ, рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдЫреМрдВ, рд╣рд╛рдореАрд╕рдБрдЧ рдХреБрдиреИ рдЙрдкрдирд╛рдо рдЫреИрди - рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдПрдЙрдЯреИ CTE рдмрд╛рдЯ рджреБрдИ рдкрдЯрдХ рдкрдвреНрдЫреМрдВред
рд╣рд╛рдореА рдпреЛрдЬрдирд╛ рд╣реЗрд░реНрдЫреМрдВ - рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЫ? рд╣рд╛рдореАрд╕рдБрдЧ рдЙрдкрдирд╛рдо рдХрд┐рди рдерд┐рдпреЛ? рд╣рд╛рдореАрд▓реЗ рдЕрд░реНрдбрд░ рдЧрд░реЗрдХрд╛ рдЫреИрдиреМрдВред рдЙрд╕рд▓реЗ рдпрд╕реНрддреЛ "рдирдореНрдмрд░ рдирдореНрдмрд░" рдХрд╣рд╛рдБ рдкрд╛рдЙрдБрдЫ?
PostgreSQL рд▓реЗ рдпрд╕рд▓рд╛рдИ рдЖрдлреИрдВ рдердкреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рддреНрд░ рдпреЛ рдмреБрдЭреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХреЗрд╡рд▓ рдпрд╕реНрддреЛ рдЙрдкрдирд╛рдо рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐, рдпреЛрдЬрдирд╛рд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдиреЗ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╕рд▓реЗ рдХреБрдиреИ рдЕрд░реНрде рд░рд╛рдЦреНрджреИрди, рдпреЛ рдпрд╣рд╛рдБ рдердкрд┐рдПрдХреЛ рдЫред рдЙрд╣рд╛рдБрд▓рд╛рдИ рдзреНрдпрд╛рди рдирджрд┐рдФрдВред
рджреЛрд╕реНрд░реЛ рдХрд╛рд░реНрдп "рдПрд╕реНрдЯреЗрд░рд┐рд╕реНрдХ рд╕рдВрдЧ": рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛рдмрд╛рдЯ рдкрдврд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рдиреЛрдб рдкрд╛рдЙрдиреЗрдЫреМрдВ Append
рд╡рд╛ Merge Append
, рдЬрд╕рдорд╛ "рдмрдЪреНрдЪрд╛рд╣рд░реВ" рдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреЗрдЫ, рд░ рдЬрд╕рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рд╣реБрдиреЗрдЫ Scan
рддрд╛рд▓рд┐рдХрд╛-рдЦрдгреНрдбрдмрд╛рдЯ рдУрдо: Seq Scan
, Bitmap Heap Scan
рд╡рд╛ Index Scan
ред рддрд░, рдХреБрдиреИ рдкрдирд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдпреА "рдмрдЪреНрдЪрд╛рд╣рд░реВ" рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдирд╣рд░реВ рд╣реБрдиреЗрдЫреИрдирдиреН - рдпрд╕рд░реА рдпреА рдиреЛрдбрд╣рд░реВрдмрд╛рдЯ рдЫреБрдЯреНрдпрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред Append
рдорд╛ UNION
.
рд╣рд╛рдореА рддреНрдпрд╕реНрддрд╛ рдЧрд╛рдБрдард╣рд░реВ рдкрдирд┐ рдмреБрдЭреНрдЫреМрдВ, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ "рдПрдЙрдЯреИ рдереБрдкреНрд░реЛрдорд╛" рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдЫреМрдВ рд░ рднрдиреНрдЫреМрдВ: "рддрдкрд╛рдИрдВрд▓реЗ megatable рдмрд╛рдЯ рдкрдвреНрдиреБрднрдПрдХреЛ рд╕рдмреИ рдХреБрд░рд╛ рдпрд╣рд╛рдБ рд░ рд░реВрдЦрдХреЛ рддрд▓ рдЫ".
"рд╕рд░рд▓" рдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдиреЛрдбрд╣рд░реВ
Values Scan
рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдореЗрд▓ рдЦрд╛рдиреНрдЫ VALUES
рдЕрдиреБрд░реЛрдз рдорд╛ред
Result
рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдз рдЫ FROM
рдХреНрд░рдордмрджреНрдз рдЧрд░реНрдиреБрд╣реЛрд╕реН SELECT 1
ред рд╡рд╛ рдЬрдм рддрдкрд╛рдИрдВрд╕рдБрдЧ рдЬрд╛рдирд╛рдЬрд╛рдиреА рдЧрд▓рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЫ WHERE
-block (рддреНрдпрд╕рдкрдЫрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЗрдЦрд┐рдиреНрдЫ One-Time Filter
):
EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- ╨╕╨╗╨╕ 0 = 1
Result (cost=0.00..0.00 rows=0 width=230) (actual time=0.000..0.000 rows=0 loops=1)
One-Time Filter: false
Function Scan
рдЙрд╣реА рдирд╛рдордХреЛ SRF рд▓рд╛рдИ "рдирдХреНрд╕рд╛"ред
рддрд░ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рд╕рд╛рде рд╕рдмреИ рдХреБрд░рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЫ - рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рддрд┐рдиреАрд╣рд░реВ рд╕рдзреИрдВ рдорд╛ рдмрджрд▓реНрджреИрдирдиреН InitPlan
/SubPlan
ред рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рддрд┐рдиреАрд╣рд░реВрдорд╛ рдкрд░рд┐рдгрдд рд╣реБрдиреНрдЫрдиреН ... Join
рд╡рд╛ ... Anti Join
, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм рддрдкрд╛рдЗрдБ рдХреЗрд╣рд┐ рд▓реЗрдЦреНрдиреБрд╣реБрдиреНрдЫ WHERE NOT EXISTS ...
ред рд░ рдпрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рд╕рдзреИрдВ рд╕рдореНрднрд╡ рдЫреИрди - рдпреЛрдЬрдирд╛рдХреЛ рдкрд╛рдардорд╛ рдпреЛрдЬрдирд╛рдХреЛ рдиреЛрдбрд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХреБрдиреИ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рдЫреИрдирдиреНред
рдлреЗрд░рд┐ рдХрд╛рд░реНрдп "рдПрд╕реНрдЯреЗрд░рд┐рд╕реНрдХ рд╕рдВрдЧ": рдХреЗрд╣реА VALUES
рдЕрдиреБрд░реЛрдз рдорд╛ред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд░ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрддрдкрд╛рдИрд▓реЗ рдзреЗрд░реИ рдиреЛрдбрд╣рд░реВ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ Values Scan
.
"рдЧрдиреНрддреА" рдкреНрд░рддреНрдпрдпрд╣рд░реВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдПрдХрдЕрд░реНрдХрд╛рдмрд╛рдЯ рдЫреБрдЯреНрдпрд╛рдЙрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫ - рддрд┐рдиреАрд╣рд░реВ рдареНрдпрд╛рдХреНрдХреИ рдХреНрд░рдордмрджреНрдз рд░реВрдкрдорд╛ рдердкрд┐рдПрдХрд╛ рдЫрдиреН рдЬрд╕рдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рддрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд░реНрдЫрдиреНред VALUES
- рдорд╛рдерд┐ рджреЗрдЦрд┐ рддрд▓ рд╕рдореНрдо рдЕрдиреБрд░реЛрдз рд╕рдВрдЧ рдмреНрд▓рдХред
рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрд░реЛрдзрдорд╛ рд╕рдмреИ рдХреБрд░рд╛ рдорд┐рд▓рд╛рдЗрдПрдХреЛ рдЫ - рд╕рдмреИ рдмрд╛рдБрдХреА рдЫ Limit
.
рддрд░ рдпрд╣рд╛рдБ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд░рд▓ рдЫ - рдЬрд╕реНрддреИ рдиреЛрдбрд╣рд░реВ Limit
, Sort
, Aggregate
, WindowAgg
, Unique
"рдирдХреНрд╕рд╛" рдЕрдиреБрд░реЛрдзрдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрд▓рд╛рдИ рдПрдХ-рджреЗрдЦрд┐-рдПрдХ, рдпрджрд┐ рддрд┐рдиреАрд╣рд░реВ рддреНрдпрд╣рд╛рдБ рдЫрдиреНред рдпрд╣рд╛рдБ рдХреБрдиреИ "рддрд╛рд░рд╛рд╣рд░реВ" рд╡рд╛ рдХрдард┐рдирд╛рдЗрд╣рд░реВ рдЫреИрдирдиреНред
рд╢рд╛рдорд┐рд▓
рдЬрдм рд╣рд╛рдореА рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рдХрдард┐рдирд╛рдЗрд╣рд░реВ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН JOIN
рдЖрдкрд╕рдорд╛ред рдпреЛ рд╕рдзреИрдВ рд╕рдореНрднрд╡ рдЫреИрди, рддрд░ рдпреЛ рд╕рдореНрднрд╡ рдЫред
рдХреНрд╡реЗрд░реА рдкрд╛рд░реНрд╕рд░рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рд╣рд╛рдореАрд╕рдБрдЧ рдиреЛрдб рдЫ JoinExpr
, рдЬрд╕рдХреЛ рдареАрдХ рджреБрдИ рдмрдЪреНрдЪрд╛рд╣рд░реВ рдЫрдиреН - рдмрд╛рдпрд╛рдБ рд░ рджрд╛рдпрд╛рдБред рдпреЛ, рддрджрдиреБрд╕рд╛рд░, рддрдкрд╛рдИрдХреЛ JOIN рдХреЛ "рдорд╛рдерд┐" рдХреЗ рдЫ рд░ рдЕрдиреБрд░реЛрдзрдорд╛ "рддрд▓" рд▓реЗрдЦрд┐рдПрдХреЛ рдЫред
рд░ рдпреЛрдЬрдирд╛ рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрд┐, рдпреА рдХреЗрд╣рд┐ рдХреЛ рджреБрдИ рд╕рдиреНрддрд╛рди рд╣реЛ * Loop
/* Join
-рдиреЛрдбред Nested Loop
, Hash Anti Join
,... - рддреНрдпрд╕реНрддреИ рдХреЗрд╣реА рдХреБрд░рд╛ред
рд╕рд░рд▓ рддрд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ: рдпрджрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдПрдХ рдЕрд░реНрдХрд╛рдорд╛ "рд╕рд╛рдореЗрд▓" рд╣реБрдиреЗ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ A рд░ B рдЫрдиреН рднрдиреЗ, рдЕрдиреБрд░реЛрдзрдорд╛ рддрд┐рдиреАрд╣рд░реВ рдпрд╛ рдд рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрди рд╕рдХреНрдЫрдиреНред A-JOIN-B
, рд╡рд╛ B-JOIN-A
ред рдпрд╕рд░реА рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ, рдЕрд░реНрдХреЛ рддрд░рд┐рдХрд╛рд▓реЗ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ, рд░ рддреНрдпрд╕реНрддрд╛ рдЬреЛрдбреАрд╣рд░реВ рдирд╣рдЯреЗрд╕рдореНрдоред
рд╣рд╛рдореНрд░реЛ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд░реВрдЦ рд▓рд┐рдиреБрд╣реЛрд╕реН, рд╣рд╛рдореНрд░реЛ рдпреЛрдЬрдирд╛ рд▓рд┐рдиреБрд╣реЛрд╕реН, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН ... рд╕рдорд╛рди рдЫреИрди!
рдпрд╕рд▓рд╛рдИ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рдкреБрди: рдХреЛрд░реМрдВ - рдУрд╣, рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдХреЗрд╣рд┐ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ!
рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдиреЛрдбрд╣рд░реВ рдЫрдиреН рдЬреБрди рдПрдХреИ рд╕рд╛рде рдмрдЪреНрдЪрд╛рд╣рд░реВ B рд░ C рдЫрдиреН - рд╣рд╛рдореА рдХреБрди рдХреНрд░рдордорд╛ рд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрджреИрдиреМрдВред рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдВрдпреЛрдЬрди рдЧрд░реМрдВ рд░ рдиреЛрдбрдХреЛ рдЪрд┐рддреНрд░рд▓рд╛рдИ рдШреБрдорд╛рдЙрдиреБрд╣реЛрд╕реНред
рдлреЗрд░рд┐ рд╣реЗрд░реМрдВред рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рдмрдЪреНрдЪрд╛рд╣рд░реВ A рд░ рдЬреЛрдбреАрд╣рд░реВ (B + C) рд╕рдБрдЧ рдиреЛрдбрд╣рд░реВ рдЫрдиреН - рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рдкрдирд┐ рдЙрдкрдпреБрдХреНрддред
рдорд╣рд╛рди! рд╣рд╛рдореА рдпреА рджреБрдИ рд╣реМрдВ рднрдиреНрдиреЗ рдерд╛рд╣рд╛ рднрдпреЛ JOIN
рдЕрдиреБрд░реЛрдзрдмрд╛рдЯ рдпреЛрдЬрдирд╛ рдиреЛрдбрд╣рд░реВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬреЛрдбрд┐рдПрдХрд╛ рдерд┐рдПред
рдЕрдлрд╕реЛрд╕, рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдзреИрдВ рд╕рдорд╛рдзрд╛рди рд╣реБрдБрджреИрдиред
рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдорд╛ A JOIN B JOIN C
, рд░ рдпреЛрдЬрдирд╛рдорд╛, рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, "рдмрд╛рд╣реНрдп" рдиреЛрдбрд╣рд░реВ A рд░ C рдЬреЛрдбрд┐рдПрдХрд╛ рдерд┐рдПред рддрд░ рдЕрдиреБрд░реЛрдзрдорд╛ рддреНрдпрд╕реНрддреЛ рдХреБрдиреИ рдЕрдкрд░реЗрдЯрд░ рдЫреИрди, рд╣рд╛рдореАрд╕рдБрдЧ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреЗрд╣рд┐ рдЫреИрди, рд╕рдВрдХреЗрдд рд╕рдВрд▓рдЧреНрди рдЧрд░реНрди рдХреЗрд╣рд┐ рдЫреИрдиред рддрдкрд╛рдИрд▓реЗ рд▓реЗрдЦреНрджрд╛ "рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо" рдХреЛ рд╕рд╛рде рд╕рдорд╛рди рдЫ A, B
.
рддрд░, рдзреЗрд░реИ рдЬрд╕реЛ рдХреЗрд╕рд╣рд░реВрдорд╛, рд▓рдЧрднрдЧ рд╕рдмреИ рдиреЛрдбрд╣рд░реВ "рдЕрдирдЯрд╛рдЗрдб" рд╣реБрди рд╕рдХреНрдЫрдиреН рд░ рддрдкрд╛рдИрд▓реЗ рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдЩ рд╕рдордпрдореИ рдмрд╛рдБрдпрд╛рдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ - рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдкрдорд╛, рдЧреБрдЧрд▓ рдХреНрд░реЛрдордорд╛ рдЬрдм рддрдкрд╛рдЗрдБ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрди рд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдердирд▓рд╛рдИ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдЧрд░реНрди рдХрддрд┐ рд▓рд╛рдореЛ рд╕рдордп рд▓рд╛рдЧреЗрдХреЛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рд░ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдпреЛ рд╕рдмреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдпреЛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдЙрди рдХреЛ рд▓рд╛рдЧреА, рд╣рд╛рдореАрд▓реЗ рднрдгреНрдбрд╛рд░рдг рдмрдирд╛рдПрдХрд╛ рдЫреМрдВ
рдпрджрд┐ рддрдкрд╛рдЗрдБ рднрд░реНрдЦрд░реИ рдкрдвреНрди рдирд╕рдХрд┐рдиреЗ рдкреНрд░рд╢реНрдирд▓рд╛рдИ рдкрд░реНрдпрд╛рдкреНрдд рдлрд╛рд░рдордорд╛ рд▓реНрдпрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН
рд╕реНрд░реЛрдд: www.habr.com