PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╕рд╛рдореАрд▓ рд╣реЛрдгреЗ рдЖрдгрд┐ ORs

рдмрдлрд░ рдЖрдгрдгрд╛рд▒реНрдпрд╛ рдСрдкрд░реЗрд╢рдиреНрд╕рдкрд╛рд╕реВрди рд╕рд╛рд╡рдз рд░рд╣рд╛...
рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди рдПрдХ рдЫреЛрдЯреА рдХреНрд╡реЗрд░реА рд╡рд╛рдкрд░реВрди, PostgreSQL рдордзреАрд▓ рдХреНрд╡реЗрд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реА рд╕рд╛рд░реНрд╡рддреНрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрди рдкрд╛рд╣реВ. рддреБрдореНрд╣реА рддреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рд╛рд▓ рдХреА рдирд╛рд╣реА рд╣реЗ рддреБрдордЪреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдмрджреНрджрд▓ рдЬрд╛рдгреВрди рдШреЗрдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ.

PG рдЪреНрдпрд╛ рдХрд╛рд╣реА рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреНрдпреЗ рд╢реЗрдбреНрдпреБрд▓рд░ рдЕрдзрд┐рдХ рд╣реБрд╢рд╛рд░ рд╣реЛрддрд╛рдирд╛ рдкрд░рд┐рд╕реНрдерд┐рддреА рдмрджрд▓реВ рд╢рдХрддреЗ, рдкрд░рдВрддреБ 9.4/9.6 рд╕рд╛рдареА рддреЗ рдЕрдВрджрд╛рдЬреЗ рд╕рдорд╛рди рджрд┐рд╕рддреЗ, рдЬрд╕реЗ рдХреА рдпреЗрдереЗ рдЙрджрд╛рд╣рд░рдгреЗ рдЖрд╣реЗрдд.

рдЪрд▓рд╛ рдПрдХ рдЦрд░реА рд╡рд┐рдирдВрддреА рдХрд░реВрдпрд╛:

SELECT
  TRUE
FROM
  "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В" d
INNER JOIN
  "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨а╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╨╡" doc_ex
    USING("@╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В")
INNER JOIN
  "╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" t_doc ON
    t_doc."@╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" = d."╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░"
WHERE
  (d."╨Ы╨╕╤Ж╨╛3" = 19091 or d."╨б╨╛╤В╤А╤Г╨┤╨╜╨╕╨║" = 19091) AND
  d."$╨з╨╡╤А╨╜╨╛╨▓╨╕╨║" IS NULL AND
  d."╨г╨┤╨░╨╗╨╡╨╜" IS NOT TRUE AND
  doc_ex."╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡"[1] IS TRUE AND
  t_doc."╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" = '╨Я╨╗╨░╨╜╨а╨░╨▒╨╛╤В'
LIMIT 1;

рдЯреЗрдмрд▓ рдЖрдгрд┐ рдлреАрд▓реНрдб рдирд╛рд╡рд╛рдВрдмрджреНрджрд▓рдлреАрд▓реНрдб рдЖрдгрд┐ рдЯреЗрдмрд▓реНрд╕рдЪреА "рд░рд╢рд┐рдпрди" рдирд╛рд╡реЗ рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рд╣рд╛рддрд╛рд│рд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдкрд░рдВрддреБ рд╣реА рдЪрд╡рдЪреА рдмрд╛рдм рдЖрд╣реЗ. рдХрд╛рд░рдг рдж рдЯреЗрдиреНрд╕рд░ рдпреЗрдереЗ рддреЗрдереЗ рдХреЛрдгрддреЗрд╣реА рдкрд░рджреЗрд╢реА рд╡рд┐рдХрд╕рдХ рдирд╛рд╣реАрдд рдЖрдгрд┐ PostgreSQL рдЖрдореНрд╣рд╛рд▓рд╛ рдЪрд┐рддреНрд░рд▓рд┐рдкреАрдордзреНрдпреЗ рджреЗрдЦреАрд▓ рдирд╛рд╡реЗ рджреЗрдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ, рдЬрд░ рддреЗ рдХреЛрдЯ рдордзреНрдпреЗ рдмрдВрдж, рдордЧ рдЖрдореНрд╣реА рд╡рд╕реНрддреВрдВрдирд╛ рдЕрд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдЖрдгрд┐ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдирд╛рд╡ рджреЗрдгреНрдпрд╛рд╕ рдкреНрд░рд╛рдзрд╛рдиреНрдп рджреЗрддреЛ рдЬреЗрдгреЗрдХрд░реВрди рдХреЛрдгрддреАрд╣реА рд╡рд┐рд╕рдВрдЧрддреА рдирд╛рд╣реА.
рдЪрд▓рд╛ рдкрд░рд┐рдгрд╛рдореА рдпреЛрдЬрдирд╛ рдкрд╛рд╣реВ:
PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╕рд╛рдореАрд▓ рд╣реЛрдгреЗ рдЖрдгрд┐ ORs
[explain.tensor.ru рдкрд╣рд╛]

144ms рдЖрдгрд┐ рдЬрд╡рд│рдЬрд╡рд│ 53K рдмрдлрд░ - рдореНрд╣рдгрдЬреЗ 400MB рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдбреЗрдЯрд╛! рдЖрдгрд┐ рдЬрд░ рддреЗ рд╕рд░реНрд╡ рдЖрдордЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдиреБрд╕рд╛рд░ рдХреЕрд╢реЗрдордзреНрдпреЗ рдЕрд╕рддреАрд▓ рддрд░ рдЖрдореНрд╣реА рднрд╛рдЧреНрдпрд╡рд╛рди рдЕрд╕реВ, рдЕрдиреНрдпрдерд╛ рдбрд┐рд╕реНрдХрд╡рд░реВрди рд╡рд╛рдЪрддрд╛рдирд╛ рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рдЬрд╛рд╕реНрдд рд╡реЗрд│ рд▓рд╛рдЧреЗрд▓.

рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ!

рдХреЛрдгрддреАрд╣реА рд╡рд┐рдирдВрддреА рдХрд╢реАрддрд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрдг рдкреНрд░рдердо рддреЗ рдХрд╛рдп рдХрд░рд╛рд╡реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдЖрддрд╛ рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╡реНрдпрд╛рдкреНрддреАрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдиреЗрдЪрд╛ рд╡рд┐рдХрд╛рд╕ рд╕реЛрдбреВрдпрд╛ рдЖрдгрд┐ рд╕рд╣рдордд рд╣реЛрдКрдпрд╛ рдХреА рдЖрдкрдг рддреБрд▓рдиреЗрдиреЗ тАЬрд╕реНрд╡рд╕реНрддтАЭ рдХрд░реВ рд╢рдХрддреЛ. рд╡рд┐рдирдВрддреА рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд╛ рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрд╛рд╣реА рдЧреЛрд╖реНрдЯреА рдмреЗрд╕рд╡рд░ рд░реЛрд▓ рдХрд░рд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ.

рдореНрд╣рдгреВрди рд╡рд┐рдирдВрддреА:
- рдХрд┐рдорд╛рди рдХрд╛рд╣реА рджрд╕реНрддрдРрд╡рдЬрд╛рдЪреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рддрдкрд╛рд╕рддреЗ
- рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕реНрдерд┐рддреАрдд рдЖрдгрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛
- рдЬрд┐рдереЗ рд▓реЗрдЦрдХ рдХрд┐рдВрд╡рд╛ рдХрд▓рд╛рдХрд╛рд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реЗ рдХрд░реНрдордЪрд╛рд░реА рдЖрд╣реЗрдд

рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛ + рдорд░реНрдпрд╛рджрд╛ 1

рдмрд░реНрдпрд╛рдЪ рд╡реЗрд│рд╛ рдбреЗрд╡реНрд╣рд▓рдкрд░рд╕рд╛рдареА рдХреНрд╡реЗрд░реА рд▓рд┐рд╣рд┐рдгреЗ рд╕реЛрдкреЗ рдЕрд╕рддреЗ рдЬреЗрдереЗ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рдЯреЗрдмрд▓ рдкреНрд░рдердо рдЬреЛрдбрд▓реЗ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдирдВрддрд░ рдпрд╛ рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯрдордзреВрди рдлрдХреНрдд рдПрдХ рд░реЗрдХреЙрд░реНрдб рд╢рд┐рд▓реНрд▓рдХ рд░рд╛рд╣рддреЛ. рдкрд░рдВрддреБ рд╡рд┐рдХрд╕рдХрд╛рд╕рд╛рдареА рд╕реЛрдкреЗ рдореНрд╣рдгрдЬреЗ рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╛рдареА рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдЕрд╕рд╛ рдирд╛рд╣реА.
рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдлрдХреНрдд 3 рдЯреЗрдмрд▓реНрд╕ рд╣реЛрддреНрдпрд╛ - рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдХрд╛рдп рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЛ...

рдЪрд▓рд╛ рдкреНрд░рдердо "рджрд╕реНрддрдРрд╡рдЬ рдкреНрд░рдХрд╛рд░" рд╕рд╛рд░рдгреАрд╕рд╣ рдХрдиреЗрдХреНрд╢рдирдкрд╛рд╕реВрди рдореБрдХреНрдд рд╣реЛрдК рдЖрдгрд┐ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рдбреЗрдЯрд╛рдмреЗрд╕рд▓рд╛ рд╕рд╛рдВрдЧрд╛ рдХреА рдЖрдордЪрд╛ рдкреНрд░рдХрд╛рд░ рд░реЗрдХреЙрд░реНрдб рдЕрджреНрд╡рд┐рддреАрдп рдЖрд╣реЗ (рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╢реЗрдбреНрдпреБрд▓рд░рд▓рд╛ рдЕрджреНрдпрд╛рдк рдХрд▓реНрдкрдирд╛ рдирд╛рд╣реА):

WITH T AS (
  SELECT
    "@╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░"
  FROM
    "╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░"
  WHERE
    "╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" = '╨Я╨╗╨░╨╜╨а╨░╨▒╨╛╤В'
  LIMIT 1
)
...
WHERE
  d."╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" = (TABLE T)
...

рд╣реЛрдп, рдЬрд░ рдЯреЗрдмрд▓/CTE рдордзреНрдпреЗ рдПрдХрд╛рдЪ рд░реЗрдХреЙрд░реНрдбрдЪреЗ рдПрдХрдЪ рдлреАрд▓реНрдб рдЕрд╕реЗрд▓, рддрд░ PG рдордзреНрдпреЗ рддреБрдореНрд╣реА рдЕрд╕реЗ рд▓рд┐рд╣реВ рд╢рдХрддрд╛, рддреНрдпрд╛рдРрд╡рдЬреА

d."╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" = (SELECT "@╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" FROM T LIMIT 1)

PostgreSQL рдХреНрд╡реЗрд░реАрдВрдордзреНрдпреЗ рдЖрд│рд╢реА рдореВрд▓реНрдпрдорд╛рдкрди

BitmapOr vs UNION

рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рдмрд┐рдЯрдореЕрдк рд╣реАрдк рд╕реНрдХреЕрдирд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдЦреВрдк рдЦрд░реНрдЪ рдпреЗрдИрд▓ - рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдордЪреНрдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдд, рдЬреЗрд╡реНрд╣рд╛ рдмрд░реЗрдЪ рд░реЗрдХреЙрд░реНрдб рдЖрд╡рд╢реНрдпрдХ рдЕрдЯреА рдкреВрд░реНрдг рдХрд░рддрд╛рдд. рдЖрдореНрд╣рд╛рд▓рд╛ рддреЗ рдорд┐рд│рд╛рд▓реЗ рдХрд╛рд░рдг OR рд╕реНрдерд┐рддреА BitmapOr рдордзреНрдпреЗ рдмрджрд▓рд▓реА- рдпреЛрдЬрдирд╛ рдордзреНрдпреЗ рдСрдкрд░реЗрд╢рди.
рдЪрд▓рд╛ рдореВрд│ рд╕рдорд╕реНрдпреЗрдХрдбреЗ рдкрд░рдд рдЬрд╛рдКрдпрд╛ - рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рдВрдмрдВрдзрд┐рдд рд░реЗрдХреЙрд░реНрдб рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдХреЛрдгреАрд╣реА рдЕрдЯреАрдВрдордзреВрди - рдореНрд╣рдгрдЬреЗ, рджреЛрдиреНрд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рд╕рд░реНрд╡ 59K рд░реЗрдХреЙрд░реНрдб рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рдПрдХ рдЕрдЯ рдмрд╛рд╣реЗрд░ рдХрд╛рдо рдПрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗ, рдЖрдгрд┐ рдкрд╣рд┐рд▓реНрдпрд╛рдордзреНрдпреЗ рдХрд╛рд╣реАрд╣реА рд╕рд╛рдкрдбрд▓реЗ рдирд╛рд╣реА рддреЗрд╡реНрд╣рд╛рдЪ рджреБрд╕рд▒реНрдпрд╛рдХрдбреЗ рдЬрд╛. рдЦрд╛рд▓реАрд▓ рдбрд┐рдЭрд╛рдЗрди рдЖрдореНрд╣рд╛рд▓рд╛ рдорджрдд рдХрд░реЗрд▓:

(
  SELECT
    ...
  LIMIT 1
)
UNION ALL
(
  SELECT
    ...
  LIMIT 1
)
LIMIT 1

"рдмрд╛рд╣реНрдп" рдорд░реНрдпрд╛рджрд╛ 1 рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рдХреА рдкреНрд░рдердо рд░реЗрдХреЙрд░реНрдб рд╕рд╛рдкрдбрд▓реНрдпрд╛рд╡рд░ рд╢реЛрдз рд╕рдорд╛рдкреНрдд рд╣реЛрдИрд▓. рдЖрдгрд┐ рдЬрд░ рддреЗ рдкрд╣рд┐рд▓реНрдпрд╛ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рдЖрдзреАрдЪ рд╕рд╛рдкрдбрд▓реЗ рдЕрд╕реЗрд▓ рддрд░, рджреБрд╕рд░рд╛ рдмреНрд▓реЙрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА (рдХрдзреАрд╣реА рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗ рдирд╛рд╣реА рдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд).

"рдХреЗрд╕ рдЕрдВрддрд░реНрдЧрдд рдХрдареАрдг рдкрд░рд┐рд╕реНрдерд┐рддреА рд▓рдкрд╡рдд рдЖрд╣реЗ"

рдореВрд│ рдХреНрд╡реЗрд░реАрдордзреНрдпреЗ рдПрдХ рдЕрддреНрдпрдВрдд рдЧреИрд░рд╕реЛрдпреАрдЪрд╛ рдХреНрд╖рдг рдЖрд╣реЗ - рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рд░рдгреА "DocumentExtension" рд╡рд┐рд░реБрджреНрдз рд╕реНрдерд┐рддреА рддрдкрд╛рд╕рдгреЗ. рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдордзреАрд▓ рдЗрддрд░ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдЪреНрдпрд╛ рд╕рддреНрдпрд╛рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВрди (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, d. "рд╣рдЯрд╡рд▓реЗрд▓реЗ" рдЦрд░реЗ рдирд╛рд╣реА), рд╣реЗ рдХрдиреЗрдХреНрд╢рди рдиреЗрд╣рдореА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ "рдХрд┐рдВрдордд рд╕рдВрд╕рд╛рдзрдиреЗ" рдЕрд╕рддреЗ. рддреНрдпрд╛рдкреИрдХреА рдЕрдзрд┐рдХ рдХрд┐рдВрд╡рд╛ рдХрдореА рдЦрд░реНрдЪ рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓ - рдпрд╛ рдЯреЗрдмрд▓рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ.
рдкрд░рдВрддреБ рддреБрдореНрд╣реА рдХреНрд╡реЗрд░реА рд╕реБрдзрд╛рд░реВ рд╢рдХрддрд╛ рдЬреЗрдгреЗрдХрд░реВрди рд╕рдВрдмрдВрдзрд┐рдд рд░реЗрдХреЙрд░реНрдбрдЪрд╛ рд╢реЛрдз рдЦрд░реЛрдЦрд░ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛рдЪ рд╣реЛрдИрд▓:

SELECT
  ...
FROM
  "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В" d
WHERE
  ... /*index cond*/ AND
  CASE
    WHEN "$╨з╨╡╤А╨╜╨╛╨▓╨╕╨║" IS NULL AND "╨г╨┤╨░╨╗╨╡╨╜" IS NOT TRUE THEN (
      SELECT
        "╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡"[1] IS TRUE
      FROM
        "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨а╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╨╡"
      WHERE
        "@╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В" = d."@╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В"
    )
  END

рдПрдХрджрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд▓рд┐рдВрдХ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЯреЗрдмрд▓рд╡рд░реВрди рдирд┐рдХрд╛рд▓рд╛рд╕рд╛рдареА рдХреЛрдгрддреНрдпрд╛рд╣реА рдлреАрд▓реНрдбрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА, рдирдВрддрд░ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕рдмрдХреНрд╡реЗрд░реАрд╡рд░ JOIN рд▓рд╛ рд╕реНрдерд┐рддреАрдд рдмрджрд▓рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдЖрд╣реЗ.
рдЪрд▓рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдлреАрд▓реНрдб "рдХреЗрд╕ рдмреНрд░реЕрдХреЗрдЯрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░" рд╕реЛрдбреВ, рд░реЗрдХреЙрд░реНрдбрдордзреВрди WHEN рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╕реЛрдкреНрдпрд╛ рдЕрдЯреА рдЬреЛрдбрд╛ - рдЖрдгрд┐ рдЖрддрд╛ "рднрд╛рд░реА" рдХреНрд╡реЗрд░реА рдлрдХреНрдд THEN рдХрдбреЗ рдЬрд╛рдд рдЕрд╕рддрд╛рдирд╛рдЪ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реА рдЬрд╛рддреЗ.

рдорд╛рдЭреЗ рдЖрдбрдирд╛рд╡ "рдПрдХреВрдг" рдЖрд╣реЗ

рдЖрдореНрд╣реА рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдореЗрдХреЕрдирд┐рдХреНрд╕рд╕рд╣ рдкрд░рд┐рдгрд╛рдореА рдХреНрд╡реЗрд░реА рдЧреЛрд│рд╛ рдХрд░рддреЛ:

WITH T AS (
  SELECT
    "@╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░"
  FROM
    "╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░"
  WHERE
    "╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░" = '╨Я╨╗╨░╨╜╨а╨░╨▒╨╛╤В'
)
  (
    SELECT
      TRUE
    FROM
      "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В" d
    WHERE
      ("╨Ы╨╕╤Ж╨╛3", "╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░") = (19091, (TABLE T)) AND
      CASE
        WHEN "$╨з╨╡╤А╨╜╨╛╨▓╨╕╨║" IS NULL AND "╨г╨┤╨░╨╗╨╡╨╜" IS NOT TRUE THEN (
          SELECT
            "╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡"[1] IS TRUE
          FROM
            "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨а╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╨╡"
          WHERE
            "@╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В" = d."@╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В"
        )
      END
    LIMIT 1
  )
UNION ALL
  (
    SELECT
      TRUE
    FROM
      "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В" d
    WHERE
      ("╨в╨╕╨┐╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨░", "╨б╨╛╤В╤А╤Г╨┤╨╜╨╕╨║") = ((TABLE T), 19091) AND
      CASE
        WHEN "$╨з╨╡╤А╨╜╨╛╨▓╨╕╨║" IS NULL AND "╨г╨┤╨░╨╗╨╡╨╜" IS NOT TRUE THEN (
          SELECT
            "╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡"[1] IS TRUE
          FROM
            "╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В╨а╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╨╡"
          WHERE
            "@╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В" = d."@╨Ф╨╛╨║╤Г╨╝╨╡╨╜╤В"
        )
      END
    LIMIT 1
  )
LIMIT 1;

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдгреЗ

рдПрдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдбреЛрд│реНрдпрд╛рдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ рдХреА UNION рд╕рдмрдмреНрд▓реЙрдХрдордзреАрд▓ рдЕрдиреБрдХреНрд░рдорд┐рдд рдкрд░рд┐рд╕реНрдерд┐рддреА рдереЛрдбреНрдпрд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдЖрд╣реЗрдд - рдпрд╛рдЪреЗ рдХрд╛рд░рдг рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЯреЗрдмрд▓рд╡рд░ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЖрд╣реЗрдд. рдЖрдгрд┐ рдЬрд░ рддреЗ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕рддреАрд▓ рддрд░ рддреЗ рддрдпрд╛рд░ рдХрд░рдгреЗ рдлрд╛рдпрджреЗрд╢реАрд░ рдард░реЗрд▓: рджрд╕реНрддрдРрд╡рдЬ(рд╡реНрдпрдХреНрддреА3, рджрд╕реНрддрдРрд╡рдЬ рдкреНрд░рдХрд╛рд░) ╨╕ рджрд╕реНрддрдРрд╡рдЬ (рджрд╕реНрддрдРрд╡рдЬ рдкреНрд░рдХрд╛рд░, рдХрд░реНрдордЪрд╛рд░реА).
ROW рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рдлреАрд▓реНрдбрдЪреНрдпрд╛ рдХреНрд░рдорд╛рдмрджреНрджрд▓рдирд┐рдпреЛрдЬрдХрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдЕрд░реНрдерд╛рддрдЪ, рдЖрдкрдг рд▓рд┐рд╣реВ рд╢рдХрддрд╛ (A, B) = (constA, constB)рдЖрдгрд┐ (B, A) = (constB, constA). рдкрдг рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рддрд╛рдирд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рддреАрд▓ рдлреАрд▓реНрдбрдЪреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ, рдЕрд╢реА рд╡рд┐рдирдВрддреА рдирдВрддрд░ рдбреАрдмрдЧ рдХрд░рдгреЗ рдЕрдзрд┐рдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗ.
рдХрд╛рдп рдЖрд╣реЗ рдпреЛрдЬрдиреЗрдд?
PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╕рд╛рдореАрд▓ рд╣реЛрдгреЗ рдЖрдгрд┐ ORs
[explain.tensor.ru рдкрд╣рд╛]

рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдЖрдореНрд╣реА рджреБрд░реНрджреИрд╡реА рд╣реЛрддреЛ рдЖрдгрд┐ рдкрд╣рд┐рд▓реНрдпрд╛ UNION рдмреНрд▓реЙрдХрдордзреНрдпреЗ рдХрд╛рд╣реАрд╣реА рд╕рд╛рдкрдбрд▓реЗ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рджреБрд╕рд░рд╛ рдЕрджреНрдпрд╛рдк рдЕрдВрдорд▓рд╛рдд рдЖрд▓рд╛. рдкрдг рддрд░реАрд╣реА - рдлрдХреНрдд 0.037ms рдЖрдгрд┐ 11 рдмрдлрд░!
рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреАрдЪрд╛ рд╡реЗрдЧ рд╡рд╛рдврд╡рд▓рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдореЗрдорд░реАрдордзреНрдпреЗ рдбреЗрдЯрд╛ рдкрдВрдкрд┐рдВрдЧ рдХрдореА рдХреЗрд▓реЗ рдЖрд╣реЗ рдЕрдиреЗрдХ рд╣рдЬрд╛рд░ рд╡реЗрд│рд╛, рдЕрдЧрджреА рд╕реЛрдкреНрдпрд╛ рддрдВрддреНрд░рд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди - рдереЛрдбреНрдпрд╛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯрд╕рд╣ рдЪрд╛рдВрдЧрд▓рд╛ рдкрд░рд┐рдгрд╛рдо. ЁЯЩВ

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛