{"id":311125,"date":"2020-10-07T21:00:44","date_gmt":"2020-10-07T21:00:44","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=311125"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=311125","title":{"rendered":"PostgreSQL Antipatterns: \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 \u0438 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/522114\/\">\u00ab\u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0421\u0423\u0411\u0414. \u041d\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u0432.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u0444\u043b\u0435\u043a\u0441 <i>\u00ab\u0414\u0430\u0439-\u043a\u0430 \u044f <b>\u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439<\/b> \u044d\u0442\u043e \u0432\u043e\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e!\u00bb<\/i> \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0432 \u0441\u0442\u0430\u0440\u043e\u043c \u0430\u043d\u0435\u043a\u0434\u043e\u0442\u0435:  <\/p>\n<blockquote><p><font color=\"grey\"><i>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0435\u0431\u0435 \u043d\u0430 \u0442\u0443\u043c\u0431\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0434 \u0441\u043d\u043e\u043c \u0434\u0432\u0430 \u0441\u0442\u0430\u043a\u0430\u043d\u0430. \u041e\u0434\u0438\u043d \u0441 \u0432\u043e\u0434\u043e\u0439 \u2014 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043d\u043e\u0447\u044c\u044e \u043f\u0438\u0442\u044c. \u0410 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u2014 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0442.<\/i><\/font><\/p><\/blockquote>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u2014 \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0438 \u043d\u0435\u0441\u0435\u0442 \u0441 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442 \u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u0448\u0435\u0432\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u2014 \u043e\u0434\u043d\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kw\/yz\/cg\/kwyzcgdzcsj-cwbied-cr84brwe.png\"><\/div>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2>#1: \u041d\u0435\u0445\u0432\u0430\u0442\u043a\u0430 work_mem<\/h2>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043b\u0438\u0448\u043d\u0435\u0433\u043e <code>Sort<\/code>-\u0443\u0437\u043b\u0430 \u0432 \u043f\u043b\u0430\u043d\u0435 \u2014 \u043e\u043d \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u0430\u043c\u0438\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e \u0441\u0442\u043e\u0438\u0442 \u0447\u0435\u043c\u0443-\u0442\u043e \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u0443\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438\u2026<\/p>\n<pre><code class=\"sql\">SELECT generate_series(1, 1e6) i ORDER BY i;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/30bf7eab25fb3dcf9fcd2e9eecf2e533:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nz\/us\/v8\/nzusv8rlbaxb_fepjstft1qa8uu.png\"><\/a><\/p>\n<p>  \u0418\u0437-\u0437\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u00ab\u0441\u0432\u0430\u043f\u0430\u0442\u044c\u0441\u044f\u00bb \u043d\u0430 \u0434\u0438\u0441\u043a (<code>buffers temp written<\/code>), \u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 70% \u0432\u0440\u0435\u043c\u0435\u043d\u0438!<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u0430\u043a-\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c. \u0418 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043f\u043e\u0434 \u0438\u043a\u043e\u043d\u043a\u043e\u0439 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e <b>\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/runtime-config-resource#GUC-WORK-MEM\">work_mem<\/a><\/b> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0445\u0432\u0430\u0442\u0430\u043b\u043e:<\/p>\n<pre><code class=\"sql\">ALTER SYSTEM SET work_mem = '128MB';<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/0d8e23101d68874b07778f0a14c5b7e0:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lf\/i1\/5q\/lfi15q74hxgffhyyifabxib2fho.png\"><\/a><\/p>\n<p>  \u041d\u0430 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0445\u043e\u0442\u044f \u043c\u044b \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b\u0438 \u043d\u0438 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043d\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0431\u0430\u0437\u044b! \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448 <a href=\"https:\/\/sbis.ru\/all_services\">\u0421\u0411\u0418\u0421<\/a> \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 PostgreSQL, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043e-\u043d\u0430\u043b\u0435\u0432\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u0435\u0431\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c. \u041c\u043e\u0436\u0435\u0442, \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438?..<\/p>\n<h2>#2: \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e<\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u2014 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"sql\">SELECT   * FROM   (     SELECT generate_series(1, 1e6) i   ) T ORDER BY   i;<\/code><\/pre>\n<p>  \u041f\u043e\u0447\u0442\u0438 <b>2\/3 \u0432\u0441\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/b> \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u044f\u043b\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u0445\u043e\u0442\u044c \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0432\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:<br \/>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/652f58b32442ab2c743a255d5ecd4491:0:2020-10-05\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/it\/ux\/-s\/itux-sdbvd6fg1xh3d2kkgc1f5a.png\"><\/a><\/p>\n<p>  \u041d\u043e \u0431\u044b\u043b \u043b\u0438 \u0432 \u043d\u0435\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u043c\u044b\u0441\u043b? \u041d\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <b>\u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/b> \u0438 \u0442\u0430\u043a. \u041f\u043e\u043f\u0440\u0430\u0432\u0438\u043c:<\/p>\n<pre><code class=\"sql\">SELECT   * FROM   (     SELECT generate_series(1, 1e6) i   ) T;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/7260f742fb047bb453e79d729ca5d20e:0:2020-10-05\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/na\/jx\/fg\/najxfgvpaj0hdbeopvdd5y_kndi.png\"><\/a><\/p>\n<p>  \u0412\u0440\u043e\u0434\u0435 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0436\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 2 \u0440\u0430\u0437\u0430.  <\/p>\n<blockquote><p>\u042d\u0442\u0438\u043c \u0436\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 <b>CTE<\/b> (Common Table Expression, \u0443\u0437\u0435\u043b <code>CTE Scan<\/code> \u0432 \u043f\u043b\u0430\u043d\u0435), <b>SRF<\/b> (Set-Returning Function, <code>Function Scan<\/code>) \u0438\u043b\u0438 <b>VALUES<\/b> (<code>Values Scan<\/code>).<\/p><\/blockquote>\n<p>  <\/p>\n<h2>#3: \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430<\/h2>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0442\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u0432 \u00ab\u043e\u0431\u0432\u044f\u0437\u043a\u0443\u00bb \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e:<\/p>\n<pre><code class=\"sql\">SELECT   i , 1e6 - i FROM   (     SELECT       *     FROM       generate_series(1, 1e6) i     WHERE       (i % 2, i % 3, i % 5, i % 7) = (1, 2, 4, 6)     ORDER BY -- \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043e\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0438       i DESC   ) T ORDER BY   i; <\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/fc324748fb6ad18d659217b41bb167b5:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yj\/p6\/gp\/yjp6gpzse41j-4d8ha2_6bhgxve.png\"><\/a><\/p>\n<p>  \u041c\u044b-\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e <b>\u00ab\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f\u00bb \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442<\/b> (\u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432), \u043d\u043e \u0421\u0423\u0411\u0414 \u2014 \u043d\u0435\u0442. \u041f\u043e\u043f\u0440\u0430\u0432\u0438\u043c:<\/p>\n<pre><code class=\"sql\">SELECT   i , 1e6 - i FROM   (     SELECT       *     FROM       generate_series(1, 1e6) i     WHERE       (i % 2, i % 3, i % 5, i % 7) = (1, 2, 4, 6)   ) T ORDER BY   i; <\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/61a486284080d7c77d31d2bd97cd3509:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jz\/wn\/93\/jzwn93bl-nywarzrjvxcpfsnccs.png\"><\/a><\/p>\n<p>  \u041c\u0438\u043d\u0443\u0441 \u043e\u0434\u043d\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430. \u041d\u043e \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u043d\u0430\u0441\u0447\u0435\u0442 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 SRF, \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u0434\u043e \u043a\u043e\u043d\u0446\u0430:<\/p>\n<pre><code class=\"sql\">SELECT   i , 1e6 - i FROM   generate_series(1, 1e6) i WHERE   (i % 2, i % 3, i % 5, i % 7) = (1, 2, 4, 6); <\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/98bcb4e77152eafa93c41906a92976ce:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ki\/fp\/1w\/kifp1wbrvc4n-2ngxgltchxgyxy.png\"><\/a><\/p>\n<p>  \u0412\u043e\u0442 \u0438 \u043c\u0438\u043d\u0443\u0441 \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043c\u044b \u0432\u044b\u0438\u0433\u0440\u0430\u043b\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 5%, \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0443\u0431\u0440\u0430\u0432 \u043b\u0438\u0448\u043d\u0435\u0435.<\/p>\n<h2>#4: Index Scan \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438<\/h2>\n<p>  \u041e\u0434\u043d\u0430 \u0438\u0437 \u00ab\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445\u00bb \u043f\u0440\u0438\u0447\u0438\u043d \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/492694\/\">\u00ab\u0420\u0435\u0446\u0435\u043f\u0442\u044b \u0434\u043b\u044f \u0445\u0432\u043e\u0440\u0430\u044e\u0449\u0438\u0445 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\u00bb<\/a>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE tbl AS SELECT   (random() * 1e4)::integer fk -- 10K \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 , now() - ((random() * 1e8) || ' sec')::interval ts FROM   generate_series(1, 1e6) pk;  -- 1M &quot;\u0444\u0430\u043a\u0442\u043e\u0432&quot;  CREATE INDEX ON tbl(fk); -- \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f foreign key<\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0431\u0430\u0437\u044b \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 FOREIGN KEY, \u043f\u043e\u0432\u0435\u0441\u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 <b>\u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u043b\u0435<\/b>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u0431\u044b\u0441\u0442\u0440\u043e\u2026 \u0410 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0448\u043b\u0438 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0431\u044b\u043b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0447\u0435\u0442 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443:<\/p>\n<pre><code class=\"sql\">SELECT   ts FROM   tbl WHERE   fk = 1 -- \u043e\u0442\u0431\u043e\u0440 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 ORDER BY   ts DESC -- \u0445\u043e\u0442\u0438\u043c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 &quot;\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e&quot; \u0437\u0430\u043f\u0438\u0441\u044c LIMIT 1;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/ce4045fdb5fb26fab6faf0b2dbdaf19f:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gx\/eb\/1u\/gxeb1uff9kjbc_nmy4mlbwkclwq.png\"><\/a><\/p>\n<p>  \u041d-\u0434\u0430\u2026 \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u2014 \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e. \u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 <b>\u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u043b\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438<\/b>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435:<\/p>\n<pre><code class=\"sql\">DROP INDEX tbl_fk_idx; CREATE INDEX ON tbl(fk, ts DESC);<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/4fab2d1b9475d443e27b7d28a1f86992:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jp\/ey\/dl\/jpeydlkrqgig_r1ou5l_haloydk.png\"><\/a><\/p>\n<p>  \u0423\u0445! \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0441\u044c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043e\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435.<\/p>\n<h2>#5: UNION ALL \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438<\/h2>\n<p>  \u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043e\u0442 \u043d\u0430\u0441 \u0445\u043e\u0442\u044f\u0442 \u0442\u0430\u043a\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0443 \u043d\u0438\u043a\u0430\u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0445\u043e\u0442\u044f \u0432\u0440\u043e\u0434\u0435 \u0438 \u0434\u043e\u043b\u0436\u043d\u0430?<\/p>\n<pre><code class=\"sql\">TRUNCATE TABLE tbl;  INSERT INTO tbl SELECT   CASE     WHEN random() &gt;= 1e-5       THEN (random() * 1e4)::integer   END fk -- 10K \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439, \u0438\u0437 \u043d\u0438\u0445 0.0001 - NULL'\u044b , now() - ((random() * 1e8) || ' sec')::interval ts FROM   generate_series(1, 1e6) pk;  -- 1M &quot;\u0444\u0430\u043a\u0442\u043e\u0432&quot;<\/code><\/pre>\n<p>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u00ab\u0442\u043e\u043f\u043e\u0432\u044b\u0435\u00bb 10 \u0437\u0430\u044f\u0432\u043e\u043a \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u0435 \u00ab\u043d\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435\u00bb \u0437\u0430\u044f\u0432\u043a\u0438 (<code>fk IS NULL<\/code>), \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0441\u0430\u043c\u044b\u0445 \u0441\u0442\u0430\u0440\u044b\u0445, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u00ab\u0435\u0433\u043e\u00bb (<code>fk = 1<\/code>):<\/p>\n<pre><code class=\"sql\">SELECT   * FROM   tbl WHERE   fk IS NULL OR   fk = 1 ORDER BY   fk NULLS FIRST, ts DESC LIMIT 10;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/be5f73c7ec67908f021cd3bf2a1a8564:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wo\/4g\/uc\/wo4gucop0q7mu2gqhk0ii5cnffm.png\"><\/a><\/p>\n<p>  \u0412\u0440\u043e\u0434\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c, \u0432\u0440\u043e\u0434\u0435 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043d\u0443\u0436\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0430\u043c, \u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0432\u0441\u0435 \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432 \u043f\u043b\u0430\u043d\u0435\u2026 \u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u2014 <b>\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043d\u0430\u0448\u0443 \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u043d\u0430 \u0434\u0432\u0435 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f<\/b> \u0438 \u0441\u043d\u043e\u0432\u0430 \u00ab\u0441\u043a\u043b\u0435\u0438\u043c\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>UNION ALL<\/code>, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/491162\/\">\u00abPostgreSQL Antipatterns: \u0441\u043a\u0430\u0437 \u043e\u0431 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e, \u0438\u043b\u0438 \u00ab\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0443\u0434\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u00bb\u00bb<\/a>:<\/p>\n<pre><code class=\"sql\">(   SELECT     *   FROM     tbl   WHERE     fk IS NULL   ORDER BY     fk, ts DESC   LIMIT 10 ) UNION ALL (   SELECT     *   FROM     tbl   WHERE     fk = 1   ORDER BY     fk, ts DESC   LIMIT 10 ) LIMIT 10;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/fb2ce9d632223576123243b0d0a06f5c:0:2020-10-06\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/je\/ax\/jr\/jeaxjrpvumfrsabwzrbds0fmvmw.png\"><\/a><\/p>\n<p>  \u0418 \u2014 \u0441\u043d\u043e\u0432\u0430 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u043f\u043b\u0430\u043d\u0435, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0442\u0430\u043b \u043f\u043e\u0447\u0442\u0438 \u0432 5 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<h2>#6: \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 <b>\u043f\u043e \u043f\u0435\u0440\u0432\u044b\u043c 10 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c<\/b> \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u044f\u0432\u043e\u043a \u0438 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/tutorial-window\">\u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/a>:<\/p>\n<pre><code class=\"sql\">SELECT DISTINCT ON(fk)   * , count(*) OVER(PARTITION BY fk ORDER BY ts) -- \u0431\u0435\u0437 DESC! FROM   tbl WHERE   fk &lt; 10 ORDER BY   fk, ts DESC; -- \u0445\u043e\u0442\u0438\u043c &quot;\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435&quot; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ts<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/24824fc871c776bea62e0152721ecf56:0:2020-10-07\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/la\/a8\/eq\/laa8eq-hy48rjqipuzpqxxvf19s.png\"><\/a><\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e <code>(fk, ts)<\/code> \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u00ab\u043e\u043a\u043e\u043d\u043d\u043e\u0433\u043e\u00bb <code>count(*)<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e <code>(fk, ts <b>DESC<\/b>)<\/code> \u2014 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>DISTINCT<\/code>.<\/p>\n<p>  \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043a\u0430\u043a \u0432 \u0441\u0430\u043c\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 <code>count(*) OVER(PARTITION BY fk ORDER BY ts <b>DESC<\/b>)<\/code>, \u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u2014 \u0432\u0435\u0437\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u043d\u0438 \u0435\u0434\u0438\u043d\u0438\u0447\u043a\u0438.<\/p>\n<p>  \u041d\u043e \u0432\u0435\u0434\u044c <code>count<\/code>, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 <code>first_value\/lead\/lag\/...<\/code>, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0435\u0440\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e:<\/p>\n<pre><code class=\"sql\">SELECT DISTINCT ON(fk)   * , count(*) OVER(PARTITION BY fk) FROM   tbl WHERE   fk &lt; 10 ORDER BY   fk, ts DESC;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/467b21420f82e4c55468437548f327c3:0:2020-10-07\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/n8\/dy\/_o\/n8dy_oeu_rdn8ryndqrlqjhd3w8.png\"><\/a><\/p>\n<p>  \u0422\u0430\u043a, \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c. \u041f\u0440\u0430\u0432\u0434\u0430, \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 <code>buffers<\/code>, \u043e\u0431\u043c\u0435\u043d\u044f\u0432 <code>Bitmap Heap Scan<\/code> \u043d\u0430 <code>Index Only Scan<\/code> \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u2014 \u0437\u0430\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435!<\/p>\n<p>  \u0425\u043c\u2026 \u041d\u043e \u0432\u0435\u0434\u044c \u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441 \u043d\u0438\u043c \u0442\u043e\u0436\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0438 \u043e\u0442 \u043d\u0435\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0438\u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430? \u0412\u043f\u043e\u043b\u043d\u0435! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c <b>\u0443\u043a\u0430\u0436\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-expressions#SYNTAX-WINDOW-FUNCTIONS\">\u00ab\u0440\u0430\u043c\u043a\u0443\u00bb \u043e\u043a\u043d\u0430<\/a><\/b> \u00ab\u043f\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u00bb (<code>ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING<\/code>):<\/p>\n<pre><code class=\"sql\">SELECT DISTINCT ON(fk)   * , count(*) OVER(PARTITION BY fk ORDER BY ts DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM   tbl WHERE   fk &lt; 10 ORDER BY   fk, ts DESC;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/f23f215664509296efd478e4139d636b:0:2020-10-07\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ij\/rn\/9j\/ijrn9jjy0gylcxibw1d-wkbwbnu.png\"><\/a><\/p>\n<p>  \u0418\u0442\u043e\u0433\u043e \u2014 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 2.5 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0438 \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u043b\u0438\u0448\u043d\u0435\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<h2>Bonus: \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <b>\u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a<\/b> \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0437\u0430\u044f\u0432\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e, \u0440\u0430\u0437 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441:<\/p>\n<pre><code class=\"sql\">SELECT DISTINCT ON(fk)   * FROM   tbl ORDER BY   fk, ts DESC; <\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/a6aa187a6ba61e06314ea9d208857448:0:2020-10-07\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9b\/ga\/r6\/9bgar66wr6uan9v5on3mpnsfxp4.png\"><\/a><\/p>\n<p>  \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 8GB \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0434\u0438 10K \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u2014 \u043a\u0430\u043a-\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0432\u0430\u0442\u043e\u2026 \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u043e\u0439 <b>\u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e DISTINCT\u00bb<\/b>:<\/p>\n<pre><code class=\"sql\">WITH RECURSIVE T AS (   (     SELECT       fk     , ts     FROM       tbl     ORDER BY       fk, ts DESC     LIMIT 1 -- \u043f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c   ) UNION ALL   SELECT     X.*   FROM     T   , LATERAL(       SELECT         fk       , ts       FROM         tbl       WHERE         fk &gt; T.fk       ORDER BY         fk, ts DESC       LIMIT 1 -- \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0437\u0430\u043f\u0438\u0441\u044c     ) X   WHERE     T.fk IS NOT NULL ) TABLE T;<\/code><\/pre>\n<p>  <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/1a4cf800457b57d462648df21810e121:0:2020-10-07\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gt\/mx\/uz\/gtmxuzxamv08mpuzccvna_fxr78.png\"><\/a><\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432 12 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0447\u0438\u0442\u0430\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 <code>Index Only Scan<\/code>. \u0425\u043e\u0442\u044c \u043c\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u0432\u0430\u0436\u0434\u044b \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 <code>ORDER BY<\/code>, \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u043f\u043b\u0430\u043d\u0435 \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c.  <\/p>\n<blockquote><p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0432 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 PostgreSQL \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u00ab\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0445\u00bb \u0447\u0442\u0435\u043d\u0438\u0439 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u0443\u0437\u043b\u0430 <a href=\"https:\/\/commitfest.postgresql.org\/19\/1741\/\"><code>Index Skip Scan<\/code><\/a>. \u041d\u043e \u0441\u043a\u043e\u0440\u043e \u0435\u0433\u043e \u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p><\/blockquote>\n<p>\u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u2014 \u0432\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441 <code>fk IS NULL<\/code>. \u041d\u043e \u043a\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u2014 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u0442 \u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0417\u043d\u0430\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043e\u043a? \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/p><\/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\/522114\/\"> https:\/\/habr.com\/ru\/company\/tensor\/blog\/522114\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/522114\/\">\u00ab\u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0421\u0423\u0411\u0414. \u041d\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u0432.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u0444\u043b\u0435\u043a\u0441 <i>\u00ab\u0414\u0430\u0439-\u043a\u0430 \u044f <b>\u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439<\/b> \u044d\u0442\u043e \u0432\u043e\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e!\u00bb<\/i> \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0432 \u0441\u0442\u0430\u0440\u043e\u043c \u0430\u043d\u0435\u043a\u0434\u043e\u0442\u0435:  <\/p>\n<blockquote><p><font color=\"grey\"><i>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0435\u0431\u0435 \u043d\u0430 \u0442\u0443\u043c\u0431\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0434 \u0441\u043d\u043e\u043c \u0434\u0432\u0430 \u0441\u0442\u0430\u043a\u0430\u043d\u0430. \u041e\u0434\u0438\u043d \u0441 \u0432\u043e\u0434\u043e\u0439 \u2014 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043d\u043e\u0447\u044c\u044e \u043f\u0438\u0442\u044c. \u0410 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u2014 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0442.<\/i><\/font><\/p><\/blockquote>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u2014 \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0438 \u043d\u0435\u0441\u0435\u0442 \u0441 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442 \u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u0448\u0435\u0432\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u2014 \u043e\u0434\u043d\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kw\/yz\/cg\/kwyzcgdzcsj-cwbied-cr84brwe.png\"><\/div>\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-311125","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311125","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=311125"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311125\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=311125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=311125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=311125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}