{"id":313347,"date":"2020-11-18T09:00:51","date_gmt":"2020-11-18T09:00:51","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=313347"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=313347","title":{"rendered":"PostgreSQL Antipatterns: DBA-\u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432, \u0438\u043b\u0438 \u0422\u0440\u0438 \u0434\u0435\u043b\u0430 \u043e \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043c\u044b \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043c \u0432 \u0440\u043e\u043b\u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432\u0430, \u043f\u043e \u043a\u0440\u0443\u043f\u0438\u0446\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u043b\u0430, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/sbis.ru\/all_services\">\u0421\u0411\u0418\u0421<\/a>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438 \u043d\u0430\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 SQL \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u043b\u044f <b>PostgreSQL<\/b>-\u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mm\/c_\/dw\/mmc_dwzvdok5abldpwjvawjrbxo.png\"><\/div>\n<p>  \u0414\u0435\u0434\u0443\u043a\u0446\u0438\u044f \u0438 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c, \u0447\u0442\u043e \u0436\u0435 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442 \u0421\u0423\u0411\u0414 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e. \u0418\u0442\u0430\u043a, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u0441 \u0436\u0434\u0443\u0442:<\/p>\n<ul>\n<li><b>\u0414\u0435\u043b\u043e \u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u0432\u0432\u0435\u0440\u0445<\/b><br \/>  \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432 <a href=\"https:\/\/youtu.be\/wscdeLbglqA\">live-\u0432\u0438\u0434\u0435\u043e<\/a> \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/li>\n<li><b>\u0414\u0435\u043b\u043e \u043e \u0445\u0443\u0434\u0435\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435<\/b><br \/>  \u0423\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438.<\/li>\n<li><b>\u0414\u0435\u043b\u043e \u043e \u0440\u0430\u0437\u0432\u0435\u0441\u0438\u0441\u0442\u043e\u0439 \u043a\u043b\u044e\u043a\u0432\u0435<\/b><br \/>  \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0411\u0414 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 11 <code>JOIN<\/code> \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0439 \u0442\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2>#1: \u0414\u0435\u043b\u043e \u043e <s>\u043d\u0435<\/s>\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u0432\u0432\u0435\u0440\u0445<\/h2>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bq\/cw\/wz\/bqcwwzvbo2en7m_m1m5gy17seme.png\"><\/div>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <b>\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/b> \u0438\u0437 \u043d\u0435\u0434\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 <a href=\"https:\/\/sbis.ru\/inventory\">\u0441\u043a\u043b\u0430\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u0447\u0435\u0442\u0430<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0438 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<div class=\"oembed\"><iframe id=\"5fb4b37bfd7c16e10ee4a7de\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fb4b37bfd7c16e10ee4a7de\"><\/iframe><\/div>\n<pre><code class=\"sql\">WITH RECURSIVE h AS (   SELECT     n.&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; id   , ARRAY[       coalesce(         (           SELECT             ne.&quot;Info&quot;           FROM             &quot;NomenclatureExt&quot; ne           WHERE             ne.&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = n.&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;           LIMIT 1         )       , '{}'       )     ] res   , n.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; -- \u043f\u0440\u0435\u0434\u043e\u043a \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438   FROM     &quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; n   WHERE     n.&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = ANY($1::integer[]) UNION -- \u0443\u043d\u0438\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f   SELECT     h.id   , array_append(       h.res     , coalesce(         (           SELECT             ne.&quot;Info&quot;           FROM             &quot;NomenclatureExt&quot; ne           WHERE             ne.&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = n.&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;           LIMIT 1         )       , '{}'       )     ) -- \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430   , n.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;   FROM     &quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; n   , h   WHERE     n.&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = h.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; -- \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u0440\u0435\u0434\u043a\u043e\u0432 ) SELECT   h.id , h.res FROM   h WHERE   h.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; IS NULL;<\/code><\/pre>\n<p>  \u041c\u044b \u043f\u043e\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u043d\u0438 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0431\u0430\u0437\u044b, \u043d\u0438 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432\u0441\u0435 \u044d\u0442\u043e, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A3%D1%82%D0%B8%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D1%81%D1%82\">\u0443\u0442\u0438\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c<\/a>:  <\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0447\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0443\u0442\u043a\u0430, \u043f\u043b\u0430\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0443\u0442\u043a\u0430 \u0438 \u043a\u0440\u044f\u043a\u0430\u0435\u0442 \u043a\u0430\u043a \u0443\u0442\u043a\u0430, \u0442\u043e \u044d\u0442\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0438 \u0435\u0441\u0442\u044c \u0443\u0442\u043a\u0430.<\/p><\/blockquote>\n<p>  <\/p>\n<h4>\u0427\u0442\u043e\/\u0437\u0430\u0447\u0435\u043c \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441?<\/h4>\n<p>  \u041b\u044e\u0431\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441 \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0436\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u043d\u0443\u0436\u0435\u043d.<\/p>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c, \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u043e \u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0435, \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c.<\/p>\n<p>  <b><code>WITH RECURSIVE \/ Path<\/code><\/b><br \/>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0436\u0435 \u0448\u0430\u0433\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0433\u043e ID \u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0435\u0435 \u043f\u0440\u0435\u0434\u043a\u0430 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432-\u043f\u0443\u0442\u044c.<\/p>\n<p>  <b><code>Subquery<\/code><\/b><br \/>  \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u044b \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u043f\u043e\u0438\u0441\u043a \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>NomenclatureExt<\/code>. \u042f\u0432\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f 1-\u0432-1.<\/p>\n<p>  <b><code>UNION<\/code><\/b><br \/>  \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0443\u0436\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a-\u043f\u0440\u0435\u0434\u043a\u043e\u0432 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438. \u0410 \u0440\u0430\u0437 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>UNION<\/code>, \u0430 \u043d\u0435 <code>UNION ALL<\/code>, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  <b><code>Path Filter<\/code><\/b><br \/>  \u041d\u0443, \u0438 \u0432 \u0444\u0438\u043d\u0430\u043b\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432 \u00ab\u0446\u0435\u043f\u043e\u0447\u043a\u0435\u00bb \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0443\u0442\u044c \u00ab\u0432\u0432\u0435\u0440\u0445\u00bb <b>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e<\/b> \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430.<\/p>\n<h4>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435<\/h4>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u043c \u0433\u0440\u043e\u0437\u044f\u0442?<\/p>\n<ol>\n<li><b>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0432\u044b\u0447\u0438\u0442\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u00ab\u043f\u0440\u0435\u0434\u043a\u0430\u00bb<\/b><br \/>  \u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0441 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u043b\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445, \u043d\u043e \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0443 \u043d\u0430\u0441 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0432\u0432\u0435\u0440\u0445, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0440\u0430\u0437 \u0437\u0430 \u0440\u0430\u0437\u043e\u043c.\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 60 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043d\u0430\u0448\u043b\u0438 \u044d\u0442\u0438 60 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u043a\u0430 \u0442\u0435 \u0436\u0435 60 \u0440\u0430\u0437.<\/li>\n<li><b>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0432\u044b\u0447\u0438\u0442\u043a\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438<\/b><br \/>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043d\u0438 \u043e\u0442 \u0447\u0435\u0433\u043e, \u0442\u043e \u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0438\u0441\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0440\u043e\u0432\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0440\u0430\u0437, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e.<\/li>\n<li><b>\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0434 \u0443\u043d\u0438\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/b><br \/>  \u041e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u00ab\u0441\u0445\u043b\u0430\u043f\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00bb \u0434\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430.\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 59 \u0438\u0437 60 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0437\u0440\u044f.  <\/li>\n<\/ol>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043b\u0430\u043d\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<ul>\n<li>107 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u043e <code>Bitmap Scan<\/code> \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438 \u043f\u043b\u044e\u0441\u043e\u043c \u043a \u043d\u0438\u043c \u2014 107 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 PostgreSQL \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043c\u044b \u043d\u0430\u0439\u0434\u0435\u043c \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438, \u043e\u043d \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 18K \u0438\u0437 \u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Seq Scan<\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0438\u0437 22\u043c\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 12\u043c\u0441 \u043c\u044b \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0435\u0449\u0435 5\u043c\u0441 \u2014 \u043d\u0430 \u0435\u0435 \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438\u0442\u043e\u0433\u043e \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 77%.<\/li>\n<li>\u0418\u0437 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 18K \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u0430\u043c \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 <code>Hash Join<\/code> \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 475 \u0448\u0442\u0443\u043a \u2014 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043d\u0438\u043c \u0435\u0449\u0435 475 <code>Index Scan<\/code> \u043f\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c.<\/li>\n<li>\u0418\u0442\u043e\u0433\u043e: 22\u043c\u0441 \u0438 2843 buffers \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e.<\/li>\n<\/ul>\n<p>  <\/p>\n<h4>\u0427\u0442\u043e\/\u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c?<\/h4>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u0442\u043e\u0438\u0442 <b>\u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0434\u0443\u0431\u043b\u044c-\u0447\u0442\u0435\u043d\u0438\u0439<\/b> \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438.<\/p>\n<ol>\n<li>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0441\u0440\u0430\u0437\u0443 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438, \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0435\u0435 \u043f\u0440\u0435\u0434\u043a\u0430, \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0440\u0430\u0437\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043a\u0430\u043a <b><code>(tableAlias)<\/code><\/b>.<\/li>\n<li>\u0412\u044b\u0447\u0438\u0442\u043a\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <b><code>= ANY(ARRAY(...))<\/code><\/b>, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u0445 <code>JOIN<\/code>.<\/li>\n<li>\u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u0441\u0442\u0443\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 <b><code>(row)::text<\/code><\/b>.<\/li>\n<li>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u044b\u043c \u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u00ab\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u00bb \u0435\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 CTE.<\/li>\n<li>\u0422\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0438\u0437 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043c\u043e\u0436\u043d\u043e \u00ab\u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b><code>ARRAY(TABLE X)<\/code><\/b> \u0434\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f-\u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u0439 \u0438 \u0442\u0430\u043a \u043e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u0440\u0430\u0441\u043a\u0430\u0441\u0442\u043e\u0432\u043a\u043e\u0439 <b><code>(TABLE X)::integer[]<\/code><\/b>.<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"sql\">-- \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u044a\u0435\u043c \u0432\u0432\u0435\u0440\u0445 \u0434\u043e \u043a\u043e\u0440\u043d\u044f \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 , it AS (   SELECT     it::text -- \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 UNION   FROM     &quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; it   WHERE     &quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = ANY((TABLE src)::integer[]) UNION   (     WITH X AS (       SELECT DISTINCT         (it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;       FROM         it       WHERE         (it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; IS NOT NULL     )     SELECT       it2::text     FROM       &quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; it2     WHERE       &quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = ANY(ARRAY(TABLE X))   ) )<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0431\u043e\u0440 \u0441\u0430\u043c\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u00ab\u0446\u0435\u043f\u043e\u0447\u043a\u0438\u00bb \u043f\u043e\u0442\u043e\u043c\u043e\u043a-\u043f\u0440\u0435\u0434\u043e\u043a \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c \u0441\u043f\u0443\u0441\u043a\u043e\u043c \u0441\u0432\u0435\u0440\u0445\u0443-\u0432\u043d\u0438\u0437:<\/p>\n<pre><code class=\"sql\">-- \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u0443\u0441\u043a \u0432\u043d\u0438\u0437 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &quot;\u043f\u0443\u0442\u0438&quot; \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 , itr AS (   SELECT     ARRAY[(it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;] path   , it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; -- \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b   FROM     it   WHERE     (it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; IS NULL -- \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u043e\u0442 &quot;\u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445&quot; \u0437\u0430\u043f\u0438\u0441\u0435\u0439 UNION ALL   SELECT     ARRAY[((_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;] || itr.path -- \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u0435\u043c &quot;\u043f\u0443\u0442\u044c&quot; \u0441\u043f\u0435\u0440\u0435\u0434\u0438   , (_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;   FROM     itr   JOIN     it _it       ON ((_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b@&quot; IS NOT FALSE AND       ((_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = (itr.it).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; )<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u00ab\u043f\u0443\u0442\u0435\u0439-\u0438\u0437-ID\u00bb \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f <code>Info<\/code> \u0438\u0437 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041d\u043e \u0431\u0435\u0433\u0430\u0442\u044c \u0442\u0430\u043a \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 ID \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443:<\/p>\n<ul>\n<li>\u0421\u043e\u0431\u0435\u0440\u0435\u043c \u0432\u0435\u0441\u044c \u043d\u0430\u0431\u043e\u0440 ID, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u00ab\u043f\u0443\u0442\u044f\u0445\u00bb. \u041d\u043e \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043d\u0430\u0431\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u044e\u0442 ID \u0441\u0430\u043c\u0438\u0445 \u043d\u0430\u0448\u0438\u0445 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439.<\/li>\n<li>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u043e\u043f\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 <b><code>= ANY(ARRAY(...))<\/code><\/b>.<\/li>\n<li>\u0421\u043b\u043e\u0436\u0438\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432 <b><code>hstore<\/code>-\u00ab\u0441\u043b\u043e\u0432\u0430\u0440\u0438\u043a\u00bb<\/b>.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"sql\">-- \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c info \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u044f\u043c CTE , hs AS (   SELECT     hstore(       array_agg(&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;::text)     , array_agg(coalesce(&quot;Info&quot;, '{}'))     )   FROM     &quot;NomenclatureExt&quot;   WHERE     &quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = ANY(ARRAY(       SELECT         (it).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;       FROM         itr     )) )<\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 ID \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 <code>Info<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b><code>ARRAY(SELECT ... unnest(...))<\/code><\/b>:<\/p>\n<pre><code class=\"sql\">, ARRAY(     SELECT       (TABLE hs) -&gt; id::text -- \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 &quot;\u0441\u043b\u043e\u0432\u0430\u0440\u044f&quot;     FROM       unnest(path) id   ) res <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"sql\">-- \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 ID WITH RECURSIVE src AS (   SELECT $1::integer[] -- \u043d\u0430\u0431\u043e\u0440 ID \u0432 \u0432\u0438\u0434\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ) -- \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u044a\u0435\u043c \u0432\u0432\u0435\u0440\u0445 \u0434\u043e \u043a\u043e\u0440\u043d\u044f \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 , it AS (   SELECT     it::text -- \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 UNION   FROM     &quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; it   WHERE     &quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = ANY((TABLE src)::integer[]) UNION   (     WITH X AS (       SELECT DISTINCT         (it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;       FROM         it       WHERE         (it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; IS NOT NULL     )     SELECT       it2::text     FROM       &quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; it2     WHERE       &quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = ANY(ARRAY(TABLE X))   ) ) -- \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u0443\u0441\u043a \u0432\u043d\u0438\u0437 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &quot;\u043f\u0443\u0442\u0438&quot; \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 , itr AS (   SELECT     ARRAY[(it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;] path   , it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;   FROM     it   WHERE   WHERE     (it::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; IS NULL -- \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u043e\u0442 &quot;\u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445&quot; \u0437\u0430\u043f\u0438\u0441\u0435\u0439 UNION ALL   SELECT     ARRAY[((_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;] || itr.path -- \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u0435\u043c &quot;\u043f\u0443\u0442\u044c&quot; \u0441\u043f\u0435\u0440\u0435\u0434\u0438   , (_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;   FROM     itr   JOIN     it _it       ON ((_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b@&quot; IS NOT FALSE AND       ((_it.it)::&quot;\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = (itr.it).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; ) -- \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c info \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u044f\u043c CTE , hs AS (   SELECT     hstore(       array_agg(&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;::text)     , array_agg(coalesce(&quot;Info&quot;, '{}'))     )   FROM     &quot;NomenclatureExt&quot;   WHERE     &quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot; = ANY(ARRAY(       SELECT         (it).&quot;@\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430&quot;       FROM         itr     )) ) -- \u0441\u0442\u0440\u043e\u0438\u043c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 info \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e id \u0438\u0437 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 SELECT   path[1] id , ARRAY(     SELECT       (TABLE hs) -&gt; id::text -- \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 &quot;\u0441\u043b\u043e\u0432\u0430\u0440\u044f&quot;     FROM       unnest(path) id   ) res FROM   itr WHERE   path[1] = ANY((TABLE src)::integer[]); -- \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c <\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 (\u0430 \u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 4, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u0430) \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c, \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c, \u0432\u0441\u0435\u0433\u043e \u043f\u043e 12 \u0437\u0430\u043f\u0438\u0441\u0435\u0439.<\/li>\n<li>\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0435\u0439 \u00ab\u0432\u043d\u0438\u0437\u00bb \u0437\u0430\u043d\u044f\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 10\u043c\u0441. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u043e \u044d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/li>\n<li>\u0418\u0442\u043e\u0433\u043e, \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f 15\u043c\u0441 \u0432\u043c\u0435\u0441\u0442\u043e 22\u043c\u0441 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c 860 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043c\u0435\u0441\u0442\u043e 2843, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 <b>\u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u044d\u0448\u0435<\/b>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2>#2: \u0414\u0435\u043b\u043e \u043e \u0445\u0443\u0434\u0435\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435<\/h2>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wd\/gb\/bo\/wdgbbosj7-zyryg9hfnmk1r7ry8.png\"><\/div>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u00ab\u043a\u0443\u0447\u0435\u0440\u044f\u0432\u0435\u0435\u00bb, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <b>\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e<\/b> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0445 \u043a\u0430\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0448\u0435\u0439 <a href=\"https:\/\/sbis.ru\/business_network\">\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438<\/a>, \u0442\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c\u0438 \u0435\u0435.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u0439, \u044f \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0440\u043e\u044e \u0435\u0433\u043e \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d \u0445\u0443\u0434\u0435\u043b \u0432\u0441\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0438 \u0441\u0438\u043b\u044c\u043d\u0435\u0435. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435.<\/p>\n<blockquote><p>\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0442\u0438\u043f\u0430 &quot;<i>\u0412\u043e\u0442 \u0442\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 <b>\u0432 10 \u0440\u0430\u0437, \u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043d\u0430 10\u043c\u0441<\/b> \u2014 \u043e\u043d\u043e \u0436\u0435 \u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442! \u041c\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u0440\u0435\u043f\u043b\u0438\u043a! \u0412\u043c\u0435\u0441\u0442\u043e 100MB \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c 1MB? \u0414\u0430 \u043d\u0430\u043c \u043f\u0440\u043e\u0449\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c!<\/i>&quot;<\/p>\n<p>  \u0422\u0443\u0442 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u0435\u043c\u043e\u0432, \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0440\u0430\u0442\u0438\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f (= \u0434\u0435\u043d\u044c\u0433\u0438), \u0430 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 <b>\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0411\u0414 \u0440\u0430\u0441\u0442\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a N(logN)<\/b>, \u0430 \u0434\u0430\u0436\u0435 \u043d\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u043e. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u00ab\u0435\u0441\u0442\u00bb CPU \u0431\u0430\u0437\u044b \u043d\u0430 50%, \u0433\u043e\u0442\u043e\u0432\u044c\u0442\u0435\u0441\u044c \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 (= \u0434\u0435\u043d\u044c\u0433\u0438), \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0435 \u0438 \u0435\u0449\u0435\u2026<\/p>\n<p>  \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0435 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0438\u0445 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u0435. \u0414\u043e\u0431\u0438\u0432\u0448\u0438\u0441\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 50% \u0432\u0441\u0435\u0433\u043e 10%, \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u00ab\u0436\u0435\u043b\u0435\u0437\u043e\u00bb \u0435\u0449\u0435 \u0433\u043e\u0434\u0430 2-3, \u0430 \u00ab\u0432\u043b\u043e\u0436\u0438\u0442\u044c\u00bb \u0442\u0435 \u0436\u0435 \u0434\u0435\u043d\u044c\u0433\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0448\u0442\u0430\u0442\u0430 \u0438\u043b\u0438 \u0447\u044c\u0435\u0439-\u0442\u043e \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u044b.<\/p><\/blockquote>\n<p>  <\/p>\n<h4>00: \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">00: \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, 7.2\u043c\u0441<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">WITH personIds(&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;) AS (   SELECT     $1::uuid[] ) , persons AS (   SELECT     P.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , coalesce(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;, '') &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , coalesce(P.&quot;\u0418\u043c\u044f&quot;, '') &quot;\u0418\u043c\u044f&quot;   , coalesce(P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;, '') &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;       END     , ''     ) &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u0418\u043c\u044f&quot;       END     , ''     ) &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;       END     , ''     ) &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , P.&quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , P.&quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , P.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;   , P.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;   , P.&quot;\u041f\u043e\u043b&quot;   , P.&quot;\u041b\u043e\u0433\u0438\u043d&quot;   , P.&quot;\u0413\u043e\u0440\u043e\u0434&quot;   , P.&quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , P.&quot;$\u0421\u043e\u0437\u0434\u0430\u043d\u043e&quot;::date &quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   , coalesce(P.&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(P.&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;   FROM     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; P   WHERE     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = ANY((TABLE personids)::uuid[]) ) , counts AS (   SELECT     NULL c ) , users AS (   SELECT     hstore(       array_agg(&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)     , array_agg(udata::text)     )   FROM     (       SELECT         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text       , array_agg(u::text) udata       FROM         &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; u       WHERE         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; IN (           SELECT             &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;           FROM             persons         ) AND         (           &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot; OR           (             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )         )       GROUP BY 1     ) u2 ) , T1 AS (   SELECT     persons.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , persons.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , persons.&quot;\u0418\u043c\u044f&quot;   , persons.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , persons.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , persons.&quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , persons.&quot;\u0413\u043e\u0440\u043e\u0434&quot;   , coalesce(persons.&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(persons.&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;   , counts.c &quot;\u0412\u0441\u0435\u0433\u043e&quot;   , persons.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;   , (       SELECT         ARRAY(           SELECT             row_to_json(t2)           FROM             (               SELECT                 &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 as &quot;Account&quot;               , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint &quot;Face&quot;               , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE) &quot;HasUser&quot;               , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE) AND coalesce(&quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot;, TRUE) &quot;HasLoggedIn&quot;               , coalesce(&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;, persons.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;) &quot;Fired&quot;               FROM                 (                   SELECT                     *                   FROM                     (                       SELECT                         (udata::&quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;).*                       FROM                         unnest(((TABLE users) -&gt; &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)::text[]) udata                     ) udata15                   WHERE                     &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND                     &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE                 ) udata2             ) t2         )     )::text[] &quot;Users&quot;   , coalesce(       (         SELECT           row_to_json(t3)         FROM           (             SELECT               &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 as &quot;Account&quot;             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint &quot;Face&quot;             FROM               (                 SELECT                   (udata::&quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;).*                 FROM                   unnest(((TABLE users) -&gt; &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)::text[]) udata               ) udata2             WHERE               &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND               &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND               &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 = 5313189::int             ORDER BY               &quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; DESC, &quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot; DESC             LIMIT 1           ) t3       )     , (         SELECT           row_to_json(t4)         FROM           (             SELECT               &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 as &quot;Account&quot;             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint &quot;Face&quot;             FROM               (                 SELECT                   (udata::&quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;).*                 FROM                   unnest(((TABLE users) -&gt; &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)::text[]) udata               ) udata2             WHERE               &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND               &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND               &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;             ORDER BY               &quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; DESC, &quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot; DESC             LIMIT 1           ) t4       )     , (         SELECT           row_to_json(t5)         FROM           (             SELECT               &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 as &quot;Account&quot;             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint &quot;Face&quot;             FROM               (                 SELECT                   (udata::&quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;).*                 FROM                   unnest(((TABLE users) -&gt; &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)::text[]) udata               ) udata2             WHERE               &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND               &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE             LIMIT 1           ) t5       )     ) &quot;PrimaryFaceAccount&quot;   , (       SELECT         &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32       FROM         (           SELECT             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;           FROM             (               SELECT                 (udata::&quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;).*               FROM                 unnest(((TABLE users) -&gt; &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)::text[]) udata             ) udata2           WHERE             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;         ) t3       LIMIT 1     ) &quot;MainAccount&quot;   , ARRAY(       SELECT         &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot;::int       FROM         &quot;\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0435\u0414\u0430\u043d\u043d\u044b\u0435&quot;       WHERE         persons.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot; AND         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = persons.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; AND         &quot;\u0422\u0438\u043f&quot; = 'account'     ) &quot;\u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b\u0413\u0440\u0443\u043f\u043f\u044b&quot;   , persons.&quot;\u041f\u043e\u043b&quot;   , persons.&quot;\u041b\u043e\u0433\u0438\u043d&quot;   , persons.&quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , persons.&quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   FROM     persons   , counts ) SELECT   CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   END &quot;LastName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u0418\u043c\u044f&quot;   END &quot;FirstName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   END &quot;PatronymicName&quot; , * FROM   T1;<\/code><\/pre>\n<\/div><\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/e5\/xg\/_2\/e5xg_2xsqpgxzsmbndfqeovexpu.png\"><\/p>\n<p>  \u0414\u0430\u0436\u0435 \u0431\u0435\u0433\u043b\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043d\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0432 \u043f\u043b\u0430\u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 (<code>SubPlan 8, SubPlan 10, SubPlan 12, SubPlan 14, SubPlan 16<\/code>), \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0440\u0435\u043c\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 <code>unnest<\/code> \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 CTE.<\/p>\n<p>  \u042d\u0442\u0438 \u0441\u0443\u0431\u043f\u043b\u0430\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043f\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 <code>hstore<\/code> \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u044b:<\/p>\n<pre><code class=\"sql\">  , coalesce(       (         SELECT           row_to_json(T)         FROM           (             SELECT               ...             FROM               (                 SELECT                   (udata::&quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;).*                 FROM                   unnest(((TABLE users) -&gt; &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)::text[]) udata               ) udata2             WHERE               ...             ORDER BY               ...             LIMIT 1           ) T       ) <\/code><\/pre>\n<p>  \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 <b>\u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445<\/b>, \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u0431\u0435\u0440\u0435\u0442 \u0438\u0437 \u043d\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e, \u0430 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443; \u043a\u0442\u043e-\u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442, \u0430 \u043a\u0442\u043e-\u0442\u043e \u2014 \u043d\u0435\u0442; \u043a\u0442\u043e-\u0442\u043e \u0431\u0435\u0440\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438\u0437 \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0430 \u043a\u0442\u043e-\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0443 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439\u2026<\/p>\n<ol>\n<li>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434? \u041a\u043e\u043d\u0435\u0447\u043d\u043e! \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 <a href=\"https:\/\/www.depesz.com\/2013\/07\/23\/waiting-for-9-4-implement-the-filter-clause-for-aggregate-function-calls\/\"><code>FILTER<\/code><\/a> (9.4+) \u0438 <a href=\"https:\/\/www.depesz.com\/2012\/08\/19\/waiting-for-9-3-implement-sql-standard-lateral-subqueries\/\"><code>LATERAL<\/code><\/a> (9.3+).<\/li>\n<li>\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f JSON \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0432 5 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 (\u043f\u043e \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u044f\u043c, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c). \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u044d\u0442\u0438 <b>JSON \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438<\/b> \u2014 \u0432 \u00ab\u043f\u043e\u043b\u043d\u043e\u043c\u00bb (5 \u043a\u043b\u044e\u0447\u0435\u0439) \u0438 \u00ab\u043a\u043e\u0440\u043e\u0442\u043a\u043e\u043c\u00bb (2 \u043a\u043b\u044e\u0447\u0430) \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445.<\/li>\n<li><b>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430<\/b> \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0413\u0434\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0435\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0435\u0435 <b>\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e<\/b>.<\/li>\n<li><b><code>LIMIT 1<\/code><\/b> \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 <b>\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430: <code>arr[1]<\/code><\/b>. \u0422\u0430\u043a \u0447\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u044b.<\/li>\n<li>\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 <b><code>ARRAY[aggx::text, aggy::text]<\/code><\/b>.<\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">01. FILTER + LATERAL + single JSON (4\u043c\u0441, -45%)<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">WITH personIds(&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;) AS (   SELECT     $1::uuid[] ) , persons AS (   SELECT     P.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , coalesce(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;, '') &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , coalesce(P.&quot;\u0418\u043c\u044f&quot;, '') &quot;\u0418\u043c\u044f&quot;   , coalesce(P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;, '') &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;       END     , ''     ) &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u0418\u043c\u044f&quot;       END     , ''     ) &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;       END     , ''     ) &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , P.&quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , P.&quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , P.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;   , P.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;   , P.&quot;\u041f\u043e\u043b&quot;   , P.&quot;\u041b\u043e\u0433\u0438\u043d&quot;   , P.&quot;\u0413\u043e\u0440\u043e\u0434&quot;   , P.&quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , P.&quot;$\u0421\u043e\u0437\u0434\u0430\u043d\u043e&quot;::date &quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   , coalesce(P.&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(P.&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;   FROM     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; P   WHERE     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = ANY((TABLE personids)::uuid[]) ) , counts AS (   SELECT     NULL c ) , users AS (   SELECT     hstore(       array_agg(&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)     , array_agg(udata::text)     )   FROM     (       SELECT         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text       , array_agg(u::text) udata       FROM         &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; u       WHERE         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; IN (           SELECT             &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;           FROM             persons         ) AND         (           &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot; OR           (             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )         )       GROUP BY 1     ) u2 ) , T1 AS (   SELECT     persons.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , persons.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , persons.&quot;\u0418\u043c\u044f&quot;   , persons.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , persons.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , persons.&quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , persons.&quot;\u0413\u043e\u0440\u043e\u0434&quot;   , coalesce(persons.&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(persons.&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;   , counts.c &quot;\u0412\u0441\u0435\u0433\u043e&quot;   , persons.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot; -- 8&lt; --   , coalesce(usjs[1]::text[], '{}') &quot;Users&quot;   , coalesce(       (usjs[2]::json[])[1]     , (usjs[3]::json[])[1]     , (usjs[4]::json[])[1]     ) &quot;PrimaryFaceAccount&quot;   , ((usjs[5]::json[])[1] -&gt;&gt; 'Account')::bigint &quot;MainAccount&quot; -- 8&lt; --   , ARRAY(       SELECT         &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot;::int       FROM         &quot;\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0435\u0414\u0430\u043d\u043d\u044b\u0435&quot;       WHERE         persons.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot; AND         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = persons.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; AND         &quot;\u0422\u0438\u043f&quot; = 'account'     ) &quot;\u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b\u0413\u0440\u0443\u043f\u043f\u044b&quot;   , persons.&quot;\u041f\u043e\u043b&quot;   , persons.&quot;\u041b\u043e\u0433\u0438\u043d&quot;   , persons.&quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , persons.&quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   FROM     persons   , counts -- 8&lt; --   , LATERAL (       SELECT         ARRAY[ -- \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 json[]           array_agg(json_f) FILTER (WHERE -- \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 = 5313189::int           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         ] usjs       FROM         (           SELECT -- \u0433\u043e\u0442\u043e\u0432\u0438\u043c JSON \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0440\u0430\u0437\u0443, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439             json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             , 'HasUser'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE)             , 'HasLoggedIn'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE) AND coalesce(&quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot;, TRUE)             , 'Fired'             , coalesce(&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;, persons.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;)             ) json_f           , json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             ) json_s           , *           FROM             (               SELECT                 (unnest).*               FROM                 unnest(((TABLE users) -&gt; &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;::text)::&quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;[])             ) T           ORDER BY -- \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445             &quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; DESC, &quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot; DESC         ) T     ) usjs -- 8&lt; -- ) SELECT   CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   END &quot;LastName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u0418\u043c\u044f&quot;   END &quot;FirstName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   END &quot;PatronymicName&quot; , * FROM   T1;<\/code><\/pre>\n<\/div><\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/8t\/xp\/bs\/8txpbsjkfc39ledebkgjpoczr4g.png\"><\/p>\n<p>  \u041f\u043b\u0430\u043d \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435 \u0438 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043e\u0447\u0435. \u041a\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u0430\u0431\u043e\u0435 \u0437\u0432\u0435\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c? <code>unnest<\/code>!<\/p>\n<p>  \u0422\u0430\u043a, \u0441\u0442\u043e\u043f\u2026 \u041c\u044b \u0432 <code>unnest<\/code> \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u0435 \u00ab\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u00bb \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0441\u0443\u043d\u0443\u043b\u0438 \u0432 <code>hstore<\/code> \u0441 \u043a\u043b\u044e\u0447\u043e\u043c \u044d\u0442\u043e\u0439 \u0436\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u044b? \u0410 \u00ab\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438-\u0442\u043e\u00bb \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e <b>\u043e\u0442\u0431\u0438\u0440\u0430\u0435\u043c \u0432 <code>hstore<\/code> \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e<\/b> \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u0435.<\/p>\n<p>  \u042f \u044d\u0442\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0448\u043b\u0438, \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438, \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u043b\u0438, \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438, \u00ab\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438\u00bb\u2026 \u0427\u0442\u043e \u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043d\u0435 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c-\u0442\u043e?..<\/p>\n<ol>\n<li>\u0412 \u043e\u0431\u0449\u0435\u043c, <b>\u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON \u0432 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441<\/b> \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043f\u0435\u0440\u0441\u043e\u043d. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0443 \u043d\u0430\u0441 <b>\u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 CTE users \u0438 hstore<\/b>.<\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">02. \u041f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441 (4\u043c\u0441, -45%)<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">WITH personIds(&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;) AS (   SELECT     $1::uuid[] ) , persons AS (   SELECT     P.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , coalesce(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;, '') &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , coalesce(P.&quot;\u0418\u043c\u044f&quot;, '') &quot;\u0418\u043c\u044f&quot;   , coalesce(P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;, '') &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;       END     , ''     ) &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u0418\u043c\u044f&quot;       END     , ''     ) &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(P.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;         ELSE           P.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;       END     , ''     ) &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , P.&quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , P.&quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , P.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;   , P.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;   , P.&quot;\u041f\u043e\u043b&quot;   , P.&quot;\u041b\u043e\u0433\u0438\u043d&quot;   , P.&quot;\u0413\u043e\u0440\u043e\u0434&quot;   , P.&quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , P.&quot;$\u0421\u043e\u0437\u0434\u0430\u043d\u043e&quot;::date &quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   , coalesce(P.&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(P.&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; -- 8&lt; --   , (       SELECT         ARRAY[ -- \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 json[]           array_agg(json_f) FILTER (WHERE -- \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 = 5313189::int           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         ] usjs       FROM         (           SELECT -- \u0433\u043e\u0442\u043e\u0432\u0438\u043c JSON \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0440\u0430\u0437\u0443, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439             json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             , 'HasUser'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE)             , 'HasLoggedIn'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE) AND coalesce(&quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot;, TRUE)             , 'Fired'             , coalesce(&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;, P.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;)             ) json_f           , json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             ) json_s           , *           FROM             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;           WHERE             &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = P.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; AND             (               &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot; OR               (                 &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND                 &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE               )             )           ORDER BY -- \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445             &quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; DESC, &quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot; DESC         ) T     ) usjs -- 8&lt; --   FROM     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; P   WHERE     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = ANY((TABLE personids)::uuid[]) ) , counts AS (   SELECT     NULL c ) , T1 AS (   SELECT     persons.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , persons.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , persons.&quot;\u0418\u043c\u044f&quot;   , persons.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , persons.&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , persons.&quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , persons.&quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , persons.&quot;\u0413\u043e\u0440\u043e\u0434&quot;   , coalesce(persons.&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(persons.&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;   , counts.c &quot;\u0412\u0441\u0435\u0433\u043e&quot;   , persons.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;   , coalesce(usjs[1]::text[], '{}') &quot;Users&quot;   , coalesce(       (usjs[2]::json[])[1]     , (usjs[3]::json[])[1]     , (usjs[4]::json[])[1]     ) &quot;PrimaryFaceAccount&quot;   , ((usjs[5]::json[])[1] -&gt;&gt; 'Account')::bigint &quot;MainAccount&quot;   , ARRAY(       SELECT         &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot;::int       FROM         &quot;\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0435\u0414\u0430\u043d\u043d\u044b\u0435&quot;       WHERE         persons.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot; AND         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = persons.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; AND         &quot;\u0422\u0438\u043f&quot; = 'account'     ) &quot;\u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b\u0413\u0440\u0443\u043f\u043f\u044b&quot;   , persons.&quot;\u041f\u043e\u043b&quot;   , persons.&quot;\u041b\u043e\u0433\u0438\u043d&quot;   , persons.&quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , persons.&quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   FROM     persons   , counts ) SELECT   CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   ELSE     &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   END &quot;LastName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u0418\u043c\u044f&quot;   END &quot;FirstName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   END &quot;PatronymicName&quot; , * FROM   T1;<\/code><\/pre>\n<\/div><\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/p2\/mb\/k3\/p2mbk3bv_igvb_lu2owmtlsisyu.png\"><\/p>\n<p>  \u041a\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043b\u0438\u0448\u043d\u0438\u043c?<\/p>\n<ol>\n<li>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, <code>CTE personids<\/code> (<b>\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 inline-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441 \u0440\u0430\u0441\u043a\u0430\u0441\u0442\u043e\u0432\u043a\u043e\u0439<\/b>) \u0438 <code>CTE counts<\/code> (\u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u0430\u0442\u0430\u0432\u0438\u0437\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0434\u0438\u043d NULL).<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0441\u0442\u0430\u043b\u0438 \u0438\u0437 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <b>\u043b\u0443\u0447\u0448\u0435 \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u0430\u043b\u0438\u0430\u0441\u044b<\/b>.<\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">03. Inline-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (3.9\u043c\u0441, -46%)<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">WITH persons AS (   SELECT     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , coalesce(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;, '') &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , coalesce(&quot;\u0418\u043c\u044f&quot;, '') &quot;\u0418\u043c\u044f&quot;   , coalesce(&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;, '') &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , coalesce(       CASE         WHEN nullif(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;       END     , ''     ) &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;         ELSE           &quot;\u0418\u043c\u044f&quot;       END     , ''     ) &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , coalesce(       CASE         WHEN nullif(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN           &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;         ELSE           &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;       END     , ''     ) &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , &quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , &quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;   , &quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;   , &quot;\u041f\u043e\u043b&quot;   , &quot;\u041b\u043e\u0433\u0438\u043d&quot;   , &quot;\u0413\u043e\u0440\u043e\u0434&quot;   , &quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , &quot;$\u0421\u043e\u0437\u0434\u0430\u043d\u043e&quot;::date &quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   , coalesce(&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;   , (       SELECT         ARRAY[ -- \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 json[]           array_agg(json_f) FILTER (WHERE -- \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 = 5313189::int           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         ] usjs       FROM         (           SELECT -- \u0433\u043e\u0442\u043e\u0432\u0438\u043c JSON \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0440\u0430\u0437\u0443, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439             json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             , 'HasUser'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE)             , 'HasLoggedIn'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE) AND coalesce(&quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot;, TRUE)             , 'Fired'             , coalesce(&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;, p.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;)             ) json_f           , json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             ) json_s           , *           FROM             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;           WHERE             &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = p.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; AND             (               &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot; OR               (                 &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND                 &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE               )             )           ORDER BY -- \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445             &quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; DESC, &quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot; DESC         ) T     ) usjs   FROM     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; p   WHERE -- 8&lt; --     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = ANY($1::uuid[]) -- 8&lt; -- ) , T1 AS (   SELECT     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;   , &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   , &quot;\u0418\u043c\u044f&quot;   , &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   , &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   , &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;   , &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;   , &quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;   , &quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;   , &quot;\u0413\u043e\u0440\u043e\u0434&quot;   , coalesce(&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;   , coalesce(&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;   , NULL::bigint &quot;\u0412\u0441\u0435\u0433\u043e&quot;   , &quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;   , coalesce(usjs[1]::text[], '{}') &quot;Users&quot;   , coalesce(       (usjs[2]::json[])[1]     , (usjs[3]::json[])[1]     , (usjs[4]::json[])[1]     ) &quot;PrimaryFaceAccount&quot;   , ((usjs[5]::json[])[1] -&gt;&gt; 'Account')::bigint &quot;MainAccount&quot;   , ARRAY(       SELECT         &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot;::int       FROM         &quot;\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0435\u0414\u0430\u043d\u043d\u044b\u0435&quot;       WHERE         persons.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot; AND         &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = persons.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; AND         &quot;\u0422\u0438\u043f&quot; = 'account'     ) &quot;\u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b\u0413\u0440\u0443\u043f\u043f\u044b&quot;   , &quot;\u041f\u043e\u043b&quot;   , &quot;\u041b\u043e\u0433\u0438\u043d&quot;   , &quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;   , &quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;   FROM     persons ) SELECT   CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   ELSE     &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   END &quot;LastName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u0418\u043c\u044f&quot;   END &quot;FirstName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   END &quot;PatronymicName&quot; , * FROM   T1;<\/code><\/pre>\n<\/div><\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ve\/je\/oo\/vejeoo-ysctlgijeadqhzgwzn0s.png\"><br \/>  \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0447\u0435\u043d\u044c-\u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e, \u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c\u0441\u044f:<\/p>\n<ol>\n<li>\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c <b>\u043b\u0438\u0448\u043d\u044f\u044f CTE<\/b> T1 (\u0432\u0435\u0434\u044c <code>CTE Scan<\/code> \u0441\u0442\u043e\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432)?<\/li>\n<li>\u0417\u0430\u0447\u0435\u043c \u043c\u044b \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 <b>\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0432\u0430\u0436\u0434\u044b<\/b>?<\/li>\n<li>\u0417\u0430\u0447\u0435\u043c <b>\u0434\u0432\u0430\u0436\u0434\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f <code>coalesce<\/code><\/b> \u043d\u0430 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043f\u043e\u043b\u044f?<\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">04. \u0423\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u043b\u0438\u0448\u043d\u0435\u0435 (3.2\u043c\u0441, -56%)<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">WITH p AS (   SELECT     * -- 8&lt; --   , CASE       WHEN nullif(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '') IS NOT NULL THEN         ARRAY[           coalesce(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;, '')         , coalesce(&quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;, '')         , coalesce(&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;, '')         ]       ELSE         ARRAY[           coalesce(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;, '')         , coalesce(&quot;\u0418\u043c\u044f&quot;, '')         , coalesce(&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;, '')         ]     END fio -- 8&lt; --   , (       SELECT         ARRAY[ -- \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 json[]           array_agg(json_f) FILTER (WHERE -- \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32 = 5313189::int           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND             &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE           )::text         , array_agg(json_s) FILTER (WHERE             &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot;           )::text         ] usjs       FROM         (           SELECT -- \u0433\u043e\u0442\u043e\u0432\u0438\u043c JSON \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0440\u0430\u0437\u0443, \u043f\u043e\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439             json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             , 'HasUser'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE)             , 'HasLoggedIn'             , coalesce(&quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;, TRUE) AND coalesce(&quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot;, TRUE)             , 'Fired'             , coalesce(&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;, p.&quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot;)             ) json_f           , json_build_object(               'Account'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &gt;&gt; 32             , 'Face'             , &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; &amp; x'FFFFFFFF'::bigint             ) json_s           , *           FROM             &quot;\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot;           WHERE             &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = p.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; AND             (               &quot;\u0413\u043b\u0430\u0432\u043d\u044b\u0439&quot; OR               (                 &quot;\u0423\u0432\u043e\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE AND                 &quot;\u0423\u0434\u0430\u043b\u0435\u043d&quot; IS DISTINCT FROM TRUE               )             )           ORDER BY -- \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445             &quot;\u0415\u0441\u0442\u044c\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&quot; DESC, &quot;\u0412\u0445\u043e\u0434\u0438\u043b&quot; DESC         ) T     ) usjs   FROM     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; p   WHERE     &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot; = ANY($1::uuid[]) ) -- 8&lt; -- SELECT   CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;   ELSE     &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;   END &quot;LastName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u0418\u043c\u044f&quot;   END &quot;FirstName&quot; , CASE     WHEN &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot; OR &quot;MainAccount&quot; IS NOT NULL THEN       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot;     ELSE       &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;   END &quot;PatronymicName&quot; , * FROM   (     SELECT       &quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;     , coalesce(&quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;, '') &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f&quot;     , coalesce(&quot;\u0418\u043c\u044f&quot;, '') &quot;\u0418\u043c\u044f&quot;     , coalesce(&quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot;, '') &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e&quot; -- 8&lt; --     , fio[1] &quot;\u0424\u0430\u043c\u0438\u043b\u0438\u044f\u041b\u0438\u0446\u0430&quot;     , fio[2] &quot;\u0418\u043c\u044f\u041b\u0438\u0446\u0430&quot;     , fio[3] &quot;\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e\u041b\u0438\u0446\u0430&quot; -- 8&lt; --     , &quot;\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435&quot;     , &quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e&quot;     , &quot;\u0413\u043e\u0440\u043e\u0434&quot;     , coalesce(&quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;, FALSE) &quot;\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439\u041f\u0440\u043e\u0444\u0438\u043b\u044c&quot;     , coalesce(&quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;, FALSE) &quot;\u0415\u0441\u0442\u044c\u041a\u043e\u0440\u043f\u0410\u043a\u043a\u0430\u0443\u043d\u0442&quot;     , NULL::bigint &quot;\u0412\u0441\u0435\u0433\u043e&quot;     , &quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot;     , coalesce(usjs[1]::text[], '{}') &quot;Users&quot;     , coalesce(         (usjs[2]::json[])[1]       , (usjs[3]::json[])[1]       , (usjs[4]::json[])[1]       ) &quot;PrimaryFaceAccount&quot;     , ((usjs[5]::json[])[1] -&gt;&gt; 'Account')::bigint &quot;MainAccount&quot;     , ARRAY(         SELECT           &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot;::int         FROM           &quot;\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0435\u0414\u0430\u043d\u043d\u044b\u0435&quot;         WHERE           p.&quot;\u0413\u0440\u0443\u043f\u043f\u0430&quot; AND -- 8&lt; --           (&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;, &quot;\u0422\u0438\u043f&quot;) = (p.&quot;\u041f\u0435\u0440\u0441\u043e\u043d\u0430&quot;, 'account') -- 8&lt; --       ) &quot;\u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b\u0413\u0440\u0443\u043f\u043f\u044b&quot;     , &quot;\u041f\u043e\u043b&quot;     , &quot;\u041b\u043e\u0433\u0438\u043d&quot;     , &quot;\u0414\u0430\u0442\u0430\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044f&quot;     , &quot;$\u0421\u043e\u0437\u0434\u0430\u043d\u043e&quot;::date &quot;\u0414\u0430\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438&quot;     FROM       p   ) T; -- 8&lt; --<\/code><\/pre>\n<\/div><\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mo\/md\/qh\/momdqh3izpbr3nwqhmdwt1phgue.png\"><\/p>\n<p>  \u0418\u0442\u043e\u0433\u043e, \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0432 2 \u0440\u0430\u0437\u0430, \u0430 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0438 \u2014 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. <b>\u0411\u0443\u0434\u044c\u0442\u0435 \u043b\u0435\u043d\u0438\u0432\u0435\u0435, \u043d\u0435 \u043f\u0438\u0448\u0438\u0442\u0435 \u043c\u043d\u043e\u0433\u043e, \u043d\u0435 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u0435<\/b>!<\/p>\n<h2>#3: \u0414\u0435\u043b\u043e \u043e \u0440\u0430\u0437\u0432\u0435\u0441\u0438\u0441\u0442\u043e\u0439 \u043a\u043b\u044e\u043a\u0432\u0435<\/h2>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xu\/wd\/wd\/xuwdwdjo9mzespxdun3cmdo94-8.png\"><\/div>\n<p>  <\/p>\n<blockquote><p>\u0412 \u0441\u0432\u043e\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/post\/487380\/\">\u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438<\/a> \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u00ab\u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u00bb \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0411\u0414 \u0434\u043e\u043b\u0436\u043d\u0430\/\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <b>\u0446\u0435\u043f\u043e\u0447\u043a\u0430 <code>JOIN<\/code>&#8216;\u043e\u0432<\/b>, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0430\u044f \u043a \u0440\u0430\u0437\u0432\u0435\u0441\u0438\u0441\u0442\u043e\u0439 \u00ab\u043a\u043b\u044e\u043a\u0432\u0435\u00bb \u0438\u0437 <code>Nested Loop\/Hash Join\/Merge Join<\/code> \u0432 \u043f\u043b\u0430\u043d\u0435. \u0412 \u043e\u0441\u043e\u0431\u043e \u043a\u043b\u0438\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043a \u043d\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <b>\u00ab\u0441\u0445\u043b\u0430\u043f\u044b\u0432\u0430\u043d\u0438\u0435\u00bb \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u00ab\u043c\u0430\u0442\u0440\u0438\u0446\u044b\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>DISTINCT\/GROUP BY<\/code><\/b>.  <\/p><\/blockquote>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0433\u043e \u0434\u0435\u043b\u0430:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, 10.1\u043c\u0441, 11600 buffers<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">SELECT DISTINCT ON (db.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;)   group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; &quot;\u0418\u0434\u0413\u0440\u0443\u043f\u043f\u044b&quot; , group_id.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; &quot;\u0418\u043c\u044f\u0413\u0440\u0443\u043f\u043f\u044b&quot; , CASE     WHEN group_id.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = '\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u043c' THEN       TRUE   ELSE     FALSE   END &quot;\u042d\u0442\u043e\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u041e\u0431\u043b\u0430\u043a\u043e\u043c&quot; , group_id.&quot;\u0422\u0438\u043f&quot; &quot;\u0422\u0438\u043f&quot; , group_id.&quot;\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d&quot; &quot;\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d&quot; , CASE     WHEN group_id.&quot;\u0422\u0438\u043f&quot; = 15 THEN       app.&quot;\u041a\u043e\u0434&quot;   ELSE     group_id.&quot;\u041a\u043e\u0434&quot;   END &quot;\u041a\u043e\u0434&quot; , is_demo.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; is not null &quot;\u0414\u0435\u043c\u043e&quot; , group_ext_id.&quot;\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435\u0427\u0438\u0441\u043b\u043e\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439&quot; &quot;\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435\u0427\u0438\u0441\u043b\u043e\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439&quot; , group_ext_id.&quot;\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435&quot; &quot;\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435&quot; , db.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; &quot;\u0418\u0434\u0411\u0414&quot; , db_name.&quot;\u0418\u043c\u044f\u0411\u0414&quot; &quot;\u0418\u043c\u044f\u0411\u0414&quot; , hosts.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; &quot;\u0425\u043e\u0441\u0442\u0411\u0414&quot; , db_name.&quot;\u041f\u043e\u0440\u0442&quot; &quot;\u041f\u043e\u0440\u0442\u0411\u0414&quot; , group_id. &quot;\u041e\u0442\u0441\u0442\u043e\u0439\u043d\u0438\u043a&quot; &quot;\u041e\u0442\u0441\u0442\u043e\u0439\u043d\u0438\u043a&quot; , (     WITH params AS(       SELECT         cpv.&quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot;       , cpv.&quot;\u0421\u0430\u0439\u0442&quot;       FROM         &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; cp       INNER JOIN         &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u041e\u0431\u0449\u0438\u0445\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432&quot; cpv           ON cp.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; = cpv.&quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot;       WHERE         cp.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = 'session_cache_time' AND         (cpv.&quot;\u0421\u0430\u0439\u0442&quot; = 9 or cpv.&quot;\u0421\u0430\u0439\u0442&quot; is null)     )     SELECT       coalesce(         (SELECT &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot; FROM params WHERE &quot;\u0421\u0430\u0439\u0442&quot; = 9)       , (SELECT &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot; FROM params WHERE &quot;\u0421\u0430\u0439\u0442&quot; IS NULL)       , (SELECT &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u041f\u043e\u0423\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e&quot; FROM &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; WHERE &quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = 'session_cache_time')       , 60::text       )::integer   ) &quot;\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u041a\u044d\u0448\u0430&quot; , CASE     WHEN nullif(111, 0) IS NULL THEN       NULL     WHEN 111 = group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; THEN       TRUE     ELSE       FALSE   END &quot;\u042d\u0442\u0430\u043b\u043e\u043d\u043d\u0430\u044f&quot; , site.&quot;@\u0421\u0430\u0439\u0442&quot; &quot;\u0418\u0434\u0421\u0430\u0439\u0442\u0430&quot; , site.&quot;\u0410\u0434\u0440\u0435\u0441&quot; &quot;\u0418\u043c\u044f\u0421\u0430\u0439\u0442\u0430&quot; FROM   &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; group_id JOIN   &quot;\u041f\u0443\u043b\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435&quot; group_ext_id     ON group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = group_ext_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; AND NOT (group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = ANY('{}'::integer[])) JOIN   &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; folder_db     ON group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = folder_db.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; JOIN   &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; db     ON folder_db.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = db.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; LEFT JOIN   &quot;\u0421\u0435\u0440\u0432\u0435\u0440&quot; hosts     ON db.&quot;\u0421\u0435\u0440\u0432\u0435\u0440&quot; = hosts.&quot;@\u0421\u0435\u0440\u0432\u0435\u0440&quot; JOIN   &quot;\u0411\u0430\u0437\u0430\u0414\u0430\u043d\u043d\u044b\u0445&quot; db_name     ON db.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = db_name.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; LEFT JOIN   (     WITH list_demo_app AS (       SELECT         ps0.&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;       FROM         &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; p0       INNER JOIN         &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; p1           ON p1.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = p0.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; AND p0.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = '\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u043c'       INNER JOIN         &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; p2           ON p2.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = p1.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; AND p1.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = '\u0428\u0430\u0439\u0442\u0430\u043d' AND p2.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = '\u042d\u0442\u043e\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f\u0413\u0440\u0443\u043f\u043f\u0430'       INNER JOIN         &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0421\u0435\u0440\u0432\u0438\u0441&quot; ps0           ON ps0.&quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; = p2.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot;     )     , list_demo_srv AS (       SELECT         pool1.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;       FROM         list_demo_app ls       INNER JOIN         &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; pool0           ON ls.&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = pool0.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;       INNER JOIN         &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; pool1           ON pool1.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = pool0.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; AND pool1.&quot;\u0422\u0438\u043f&quot; = 15     )     SELECT       &quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;     FROM       list_demo_srv   ) is_demo     ON is_demo.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; JOIN   &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; app     ON group_id.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = app.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; LEFT JOIN   &quot;\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435&quot; service     ON service.&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; LEFT JOIN   &quot;\u0421\u0430\u0439\u0442\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435&quot; site_app     ON site_app.&quot;\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435&quot; = service.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; LEFT JOIN   &quot;\u0421\u0430\u0439\u0442&quot; site     ON site.&quot;@\u0421\u0430\u0439\u0442&quot; = site_app.&quot;\u0421\u0430\u0439\u0442&quot; WHERE   group_id.&quot;\u0422\u0438\u043f&quot; = 15 AND   folder_db.&quot;\u0422\u0438\u043f&quot; = 8 AND   db.&quot;\u0422\u0438\u043f&quot; = 4 AND   db_name.&quot;\u0418\u043c\u044f\u0411\u0414&quot; IS NOT NULL AND   (     (1 = 1 AND is_demo.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; IS NOT NULL) OR     (1 = 2 AND is_demo.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; IS NULL) OR     1 NOT IN (1, 2)   );<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_g\/87\/sb\/_g87sbeh4ql68wgygmw-3unfa1c.png\"><\/div>\n<\/p><\/div>\n<p>  \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0443 \u043c\u044b\u0441\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<ol>\n<li>\u0412 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <b>11 \u0442\u0430\u0431\u043b\u0438\u0446, \u043f\u0440\u043e\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 JOIN&#8217;\u0430\u043c\u0438<\/b>\u2026 \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043c\u0435\u043b\u043e. \u0427\u0442\u043e\u0431\u044b \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437\u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e, \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e, \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u043c\u0438. \u0418\u043d\u0430\u0447\u0435 \u0440\u0438\u0441\u043a\u0443\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c join 1000 x 1000.<\/li>\n<li>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0441\u0442\u0440\u043e\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0439\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0411\u0414. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0449\u0435 \u2014 \u043e\u043d \u0435\u0435 \u0438 \u0442\u0430\u043a \u00ab\u0437\u043d\u0430\u0435\u0442\u00bb, \u0430 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0431\u044b\u0442\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. \u0412\u043e\u043e\u0431\u0449\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b <a href=\"https:\/\/habr.com\/ru\/post\/488104\/\"><b>\u00ab\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u00bb \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435, \u043a\u0430\u043a \u0443 \u0432\u0430\u0441 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0411\u0414<\/b><\/a>, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0x\/rd\/3d\/0xrd3dahgcfvsxwsv6wegzmvn0o.png\">  <\/li>\n<li>\u0417\u0430 \u0441\u0447\u0435\u0442 <b><code>DISTINCT ON(db.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;)<\/code><\/b> \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0443\u043d\u0438\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 <code>db<\/code>, \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 \u043e\u043d\u0430 \u0432\u043e\u043d \u0430\u0436 \u0432 \u043a\u0430\u043a\u043e\u043c \u043d\u0438\u0437\u0443\u2026 \u041d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0437\u0443 \u2014 \u043e\u043d\u0438 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 <b><code>(group_id, folder_db, db)<\/code><\/b> \u043e\u0442\u0441\u0435\u043a\u0430\u044e\u0442 \u00ab\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\u00bb \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0442\u0438\u043f\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438.<\/li>\n<li>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2014 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0443 <b><code>is_demo<\/code><\/b>. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0435\u0433\u043e <b>\u0442\u0435\u043b\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043d\u0438 \u043e\u0442 \u0447\u0435\u0433\u043e<\/b> \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e <b>\u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e WITH-\u0431\u043b\u043e\u043a\u0430<\/b>. \u0422\u043e \u0435\u0441\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441 \u0442\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0444\u0438\u0442\u0430.<\/li>\n<li>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f <code>is_demo.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = group_id.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;<\/code> \u0438 <code>is_demo.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; IS NOT NULL<\/code> \u043f\u0440\u0438 <code><b>LEFT JOIN<\/b><\/code> \u044d\u0442\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c <b>\u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f PK group_id \u0441\u0440\u0435\u0434\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0432 is_demo<\/b>.\n<p>  \u0421\u0430\u043c\u043e\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435, \u0447\u0442\u043e \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u0442\u0430\u043a \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, <b>\u043e\u0442\u0431\u0438\u0440\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u0438 <code>group_id<\/code> \u043f\u043e \u043d\u0430\u0431\u043e\u0440\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 <code>is_demo<\/code><\/b>.<\/li>\n<li>\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 CTE, \u0438 \u0441 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0411\u0414 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u043e <code>\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432(\u0422\u0438\u043f, \u0420\u0430\u0437\u0434\u0435\u043b)<\/code>. \u041f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u2014 <b>\u0442\u0440\u0438\u043f\u043b\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 <code>\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432(\u0420\u0430\u0437\u0434\u0435\u043b) WHERE \u0422\u0438\u043f = ...<\/code><\/b>.<\/li>\n<li>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/post\/479298\/\">\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 CTE \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u043c<\/a>, \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/485398\/\">\u00abJOIN \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044c\u00bb<\/a>, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0432 \u0435\u0433\u043e \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 group_id, folder_db \u0438 db \u2014 \u0432\u0435\u0434\u044c \u044d\u0442\u043e <b>\u043e\u0434\u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/code><\/b>.<\/li>\n<li>\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u041a\u044d\u0448\u0430<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c, <b>\u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044f \u043e\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 CTE<\/b>.<\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: 0.4\u043c\u0441 (\u0432 25 \u0440\u0430\u0437 \u043b\u0443\u0447\u0448\u0435), 134 buffers (\u0432 86 \u0440\u0430\u0437 \u043b\u0443\u0447\u0448\u0435)<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">WITH demo_app AS (   SELECT     ps0.&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;   FROM     &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; p0   JOIN     &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; p1       ON (p1.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;, p1.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot;) = (p0.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot;, '\u0428\u0430\u0439\u0442\u0430\u043d')   JOIN     &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; p2       ON (p2.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;, p2.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot;) = (p1.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot;, '\u042d\u0442\u043e\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f\u0413\u0440\u0443\u043f\u043f\u0430')   JOIN     &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0421\u0435\u0440\u0432\u0438\u0441&quot; ps0       ON ps0.&quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; = p2.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot;   WHERE     p0.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = '\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u043c' ) , demo_srv as(   SELECT     pool1.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;   FROM     demo_app ls   JOIN     &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; pool0       ON ls.&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = pool0.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;   JOIN     &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; pool1       ON (pool1.&quot;\u0422\u0438\u043f&quot;, pool1.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;) = (15, pool0.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;) -- CREATE INDEX CONCURRENTLY &quot;i\u041f\u0421-tmp0-t15&quot; ON &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;(&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;) WHERE &quot;\u0422\u0438\u043f&quot; = 15; ) , grp AS (   SELECT     grp   FROM     &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; grp   WHERE     &quot;\u0422\u0438\u043f&quot; = 15 AND     &quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = ANY(ARRAY(       SELECT         &quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;       FROM         demo_srv     )) ) , fld AS (   SELECT     fld   FROM     &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; fld   WHERE     &quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = ANY(ARRAY(       SELECT         (grp).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;       FROM         grp     )) AND     &quot;\u0422\u0438\u043f&quot; = 8 -- CREATE INDEX CONCURRENTLY &quot;i\u041f\u0421-tmp0-t8&quot; ON &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;(&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;) WHERE &quot;\u0422\u0438\u043f&quot; = 8; ) , dbs AS (   SELECT     dbs   FROM     &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; dbs   WHERE     &quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; = ANY(ARRAY(       SELECT         (fld).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;       FROM         fld     )) AND     &quot;\u0422\u0438\u043f&quot; = 4 -- CREATE INDEX CONCURRENTLY &quot;i\u041f\u0421-tmp0-t4&quot; ON &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;(&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;) WHERE &quot;\u0422\u0438\u043f&quot; = 4; )  , srvhs AS (   SELECT     hstore(       array_agg((dbs).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot;::text)     , array_agg((dbs)::text)     )   FROM     (       TABLE dbs     UNION ALL       TABLE fld     UNION ALL       TABLE grp     ) T ) SELECT   (grp).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; &quot;\u0418\u0434\u0413\u0440\u0443\u043f\u043f\u044b&quot; , (grp).&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; &quot;\u0418\u043c\u044f\u0413\u0440\u0443\u043f\u043f\u044b&quot; , (grp).&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; IS NOT DISTINCT FROM '\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u043a\u043e\u043c' &quot;\u042d\u0442\u043e\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u041e\u0431\u043b\u0430\u043a\u043e\u043c&quot; , (grp).&quot;\u0422\u0438\u043f&quot; , (grp).&quot;\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d&quot; , CASE     WHEN (grp).&quot;\u0422\u0438\u043f&quot; = 15 THEN       app.&quot;\u041a\u043e\u0434&quot;     ELSE       (grp).&quot;\u041a\u043e\u0434&quot;   END &quot;\u041a\u043e\u0434&quot; , TRUE &quot;\u0414\u0435\u043c\u043e&quot; , grpe.&quot;\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435\u0427\u0438\u0441\u043b\u043e\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439&quot; , grpe.&quot;\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435&quot; , (dbn).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; &quot;\u0418\u0434\u0411\u0414&quot; , dbn.&quot;\u0418\u043c\u044f\u0411\u0414&quot; , dbh.&quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; &quot;\u0425\u043e\u0441\u0442\u0411\u0414&quot; , dbn.&quot;\u041f\u043e\u0440\u0442&quot; &quot;\u041f\u043e\u0440\u0442\u0411\u0414&quot; , (grp).&quot;\u041e\u0442\u0441\u0442\u043e\u0439\u043d\u0438\u043a&quot; , (     SELECT       coalesce(         (           SELECT             &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&quot;           FROM             &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u041e\u0431\u0449\u0438\u0445\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432&quot;           WHERE             &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; = cp.&quot;@\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; AND             coalesce(&quot;\u0421\u0430\u0439\u0442&quot;, 9) = 9           ORDER BY             &quot;\u0421\u0430\u0439\u0442&quot; NULLS LAST           LIMIT 1         )       , &quot;\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u041f\u043e\u0423\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e&quot;       , '60'       )::integer     FROM       &quot;\u041e\u0431\u0449\u0438\u0435\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&quot; cp     WHERE       &quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435&quot; = 'session_cache_time'   ) &quot;\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u041a\u044d\u0448\u0430&quot; , CASE     WHEN nullif(111, 0) IS NULL THEN       NULL     WHEN (grp).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = 111 THEN       TRUE     ELSE       FALSE   END &quot;\u042d\u0442\u0430\u043b\u043e\u043d\u043d\u0430\u044f&quot; , site.&quot;@\u0421\u0430\u0439\u0442&quot; &quot;\u0418\u0434\u0421\u0430\u0439\u0442\u0430&quot; , site.&quot;\u0410\u0434\u0440\u0435\u0441&quot; &quot;\u0418\u043c\u044f\u0421\u0430\u0439\u0442\u0430&quot; -- , * FROM   dbs JOIN   &quot;\u0411\u0430\u0437\u0430\u0414\u0430\u043d\u043d\u044b\u0445&quot; dbn     ON dbn.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = (dbs.dbs).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; JOIN LATERAL   (     SELECT       ((TABLE srvhs)-&gt;((dbs).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;::text))::&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; fld   ) fld ON TRUE JOIN LATERAL   (     SELECT       ((TABLE srvhs)-&gt;((fld).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot;::text))::&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; grp   ) grp ON TRUE JOIN   &quot;\u041f\u0443\u043b\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435&quot; grpe     ON grpe.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = (grp).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; JOIN   &quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; app     ON app.&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = (grp).&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; JOIN   &quot;\u0421\u0435\u0440\u0432\u0435\u0440&quot; dbh     ON dbh.&quot;@\u0421\u0435\u0440\u0432\u0435\u0440&quot; = (dbs).&quot;\u0421\u0435\u0440\u0432\u0435\u0440&quot; LEFT JOIN   &quot;\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435&quot; srv     ON srv.&quot;\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; = (grp).&quot;@\u041f\u0443\u043b\u0421\u0435\u0440\u0432\u0435\u0440\u043e\u0432&quot; LEFT JOIN   &quot;\u0421\u0430\u0439\u0442\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435&quot; site_app     ON site_app.&quot;\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435&quot; = srv.&quot;\u0420\u0430\u0437\u0434\u0435\u043b&quot; LEFT JOIN   &quot;\u0421\u0430\u0439\u0442&quot; site     ON site.&quot;@\u0421\u0430\u0439\u0442&quot; = site_app.&quot;\u0421\u0430\u0439\u0442&quot; WHERE   dbn.&quot;\u0418\u043c\u044f\u0411\u0414&quot; IS NOT NULL;<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/po\/jz\/0w\/pojz0wrhnvqa7yamr56tzicazr4.png\"><\/div>\n<\/p><\/div>\n<p>  <\/p>\n<hr>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u043f\u043e\u0447\u0435\u0440\u043f\u043d\u0443\u043b\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0438\u0437 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430. \u0410 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u043e\u0438\u0445 \u0446\u0438\u043a\u043b\u043e\u0432.<\/p>\n<p>  <b><i>PostgreSQL Antipatterns<\/i><\/b>:<\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/479298\/\">CTE x CTE<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/484670\/\">\u0440\u0435\u0434\u043a\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e\u043b\u0435\u0442\u0438\u0442 \u0434\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b JOIN<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/485398\/\">\u0443\u0434\u0430\u0440\u0438\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u043c \u043f\u043e \u0442\u044f\u0436\u0435\u043b\u043e\u043c\u0443 JOIN<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/501614\/\">\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u0430 \u043a\u0440\u043e\u043b\u0438\u0447\u044c\u044f \u043d\u043e\u0440\u0430? \u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/513324\/\">DISTINCT \u0438 LIMIT: \u00ab\u0414\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d!\u00bb<\/a><\/li>\n<\/ul>\n<p>  <b><i>SQL HowTo<\/i><\/b>:<\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/507056\/\">1000 \u0438 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/486072\/\">\u043f\u0438\u0448\u0435\u043c while-\u0446\u0438\u043a\u043b \u043f\u0440\u044f\u043c\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u0438\u043b\u0438 \u00ab\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u0430\u044f \u0442\u0440\u0435\u0445\u0445\u043e\u0434\u043e\u0432\u043a\u0430\u00bb<\/a><\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/527700\/\"> https:\/\/habr.com\/ru\/company\/tensor\/blog\/527700\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043c\u044b \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043c \u0432 \u0440\u043e\u043b\u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432\u0430, \u043f\u043e \u043a\u0440\u0443\u043f\u0438\u0446\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u043b\u0430, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/sbis.ru\/all_services\">\u0421\u0411\u0418\u0421<\/a>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438 \u043d\u0430\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 SQL \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u043b\u044f <b>PostgreSQL<\/b>-\u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mm\/c_\/dw\/mmc_dwzvdok5abldpwjvawjrbxo.png\"><\/div>\n<p>  \u0414\u0435\u0434\u0443\u043a\u0446\u0438\u044f \u0438 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c, \u0447\u0442\u043e \u0436\u0435 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442 \u0421\u0423\u0411\u0414 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e. \u0418\u0442\u0430\u043a, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u0441 \u0436\u0434\u0443\u0442:<\/p>\n<ul>\n<li><b>\u0414\u0435\u043b\u043e \u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u0432\u0432\u0435\u0440\u0445<\/b><br \/>  \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432 <a href=\"https:\/\/youtu.be\/wscdeLbglqA\">live-\u0432\u0438\u0434\u0435\u043e<\/a> \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/li>\n<li><b>\u0414\u0435\u043b\u043e \u043e \u0445\u0443\u0434\u0435\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435<\/b><br \/>  \u0423\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438.<\/li>\n<li><b>\u0414\u0435\u043b\u043e \u043e \u0440\u0430\u0437\u0432\u0435\u0441\u0438\u0441\u0442\u043e\u0439 \u043a\u043b\u044e\u043a\u0432\u0435<\/b><br \/>  \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0411\u0414 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 11 <code>JOIN<\/code> \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0439 \u0442\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-313347","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=313347"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313347\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=313347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=313347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=313347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}