{"id":203484,"date":"2013-11-25T10:20:03","date_gmt":"2013-11-25T06:20:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=203484"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=203484","title":{"rendered":"<span class=\"post_title\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041e\u0441\u043d\u043e\u0432\u044b EXPLAIN \u0432 PostgreSQL (\u0447\u0430\u0441\u0442\u044c 3)<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/f6c\/287\/17a\/f6c28717a7325185814bec4274d95bb9.jpg\"\/><br \/>  \u041f\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0443 <a href=\"http:\/\/www.dalibo.org\/_media\/understanding_explain.pdf\">Understanding EXPLAIN<\/a> \u043e\u0442 Guillaume Lelarge. <br \/>  \u0415\u0449\u0451 \u0440\u0430\u0437 \u043e\u0431\u0440\u0430\u0449\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u043e\u043f\u0443\u0449\u0435\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u043e\u043c.  <\/p>\n<h5>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438:<\/h5>\n<p>  <a href=\"http:\/\/habrahabr.ru\/post\/203320\/\">\u0427\u0430\u0441\u0442\u044c 1<\/a><br \/>  <a href=\"http:\/\/habrahabr.ru\/post\/203386\/\">\u0427\u0430\u0441\u0442\u044c 2<\/a><br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>ORDER BY<\/h4>\n<p>  <\/p>\n<pre><code class=\"sql\">DROP INDEX foo_c1_idx; EXPLAIN (ANALYZE) SELECT * FROM foo ORDER BY c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Sort (cost=117993.01..120493.04 rows=1000010 width=37) (actual time=571.591..651.524 rows=1000010 loops=1)<br \/>   Sort Key: c1<br \/>   Sort Method: external merge Disk: 45952kB<br \/>   -&gt; Seq Scan on foo (cost=0.00..18334.10 rows=1000010 width=37) (actual time=0.007..62.041 rows=1000010 loops=1)<br \/>   Total runtime: 690.984 ms<br \/>  (5 rows)  <\/p><\/blockquote>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f <code>Seq Scan<\/code> \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>foo<\/code>. \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 <code>Sort<\/code>. \u0412 \u0432\u044b\u0432\u043e\u0434\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b EXPLAIN \u0437\u043d\u0430\u043a <code>-&gt;<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (<i>node<\/i>). \u0427\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0442\u0435\u043c \u0441 \u0431<b>\u043e<\/b>\u043b\u044c\u0448\u0438\u043c \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u043c \u043e\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f.<br \/>  <code>Sort Key<\/code> \u2014 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<br \/>  <code>Sort Method: external merge Disk<\/code> \u2014 \u043f\u0440\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043e\u0431\u044a\u0451\u043c\u043e\u043c <code>45952kB<\/code>. <\/p>\n<p>  <i>\u041f\u0440\u043e\u0448\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u0442\u0435\u043c\u0435 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 <code>external merge<\/code> \u0438 <code>external sort<\/code><\/i>.<\/p>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 BUFFERS:  <\/p>\n<pre><code class=\"sql\">EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM foo ORDER BY c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Sort (cost=117993.01..120493.04 rows=1000010 width=37) (actual time=568.412..652.308 rows=1000010 loops=1)<br \/>   Sort Key: c1<br \/>   Sort Method: external merge Disk: 45952kB<br \/>   Buffers: shared hit=8334, temp read=5745 written=5745<br \/>   -&gt; Seq Scan on foo (cost=0.00..18334.10 rows=1000010 width=37) (actual time=0.010..68.203 rows=1000010 loops=1)<br \/>   Buffers: shared hit=8334<br \/>   Total runtime: 698.032 ms<br \/>  (7 rows)  <\/p><\/blockquote>\n<p>  \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, <code>temp read=5745 written=5745<\/code> \u2014 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e 5745 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e 8Kb = 45960Kb. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 8334 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u043a\u044d\u0448\u0435.<\/p>\n<p>  \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435, \u0447\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 <code>work_mem<\/code>:  <\/p>\n<pre><code class=\"sql\">SET work_mem TO '200MB'; EXPLAIN (ANALYZE) SELECT * FROM foo ORDER BY c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Sort (cost=117993.01..120493.04 rows=1000010 width=37) (actual time=265.301..296.777 rows=1000010 loops=1)<br \/>   Sort Key: c1<br \/>   Sort Method: quicksort Memory: 102702kB<br \/>   -&gt; Seq Scan on foo (cost=0.00..18334.10 rows=1000010 width=37) (actual time=0.006..57.836 rows=1000010 loops=1)<br \/>   Total runtime: 328.746 ms<br \/>  (5 rows)  <\/p><\/blockquote>\n<p>  <code>Sort Method: quicksort  Memory: 102702kB<\/code> \u2014 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  \u0418\u043d\u0434\u0435\u043a\u0441:  <\/p>\n<pre><code class=\"sql\">CREATE INDEX ON foo(c1); EXPLAIN (ANALYZE) SELECT * FROM foo ORDER BY c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Index Scan using foo_c1_idx on foo (cost=0.42..34327.57 rows=1000010 width=37) (actual time=0.023..126.076 rows=1000010 loops=1)<br \/>   Total runtime: 153.452 ms<br \/>  (2 rows)  <\/p><\/blockquote>\n<p>  \u0418\u0437 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>Index Scan<\/code>, \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043e\u0442\u0440\u0430\u0437\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<h4>LIMIT<\/h4>\n<p>  \u0423\u0434\u0430\u043b\u0438\u043c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441.  <\/p>\n<pre><code class=\"sql\">DROP INDEX foo_c2_idx1; EXPLAIN (ANALYZE,BUFFERS)   SELECT * FROM foo WHERE c2 LIKE 'ab%'; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Seq Scan on foo (cost=0.00..20834.12 rows=100 width=37) (actual time=0.033..94.757 rows=3824 loops=1)<br \/>   Filter: (c2 ~~ &#8216;ab%&#8217;::text)<br \/>   Rows Removed by Filter: 996186<br \/>   Buffers: shared hit=8334<br \/>   Total runtime: 94.924 ms<br \/>  (5 rows)  <\/p><\/blockquote>\n<p>  \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <code>Seq Scan<\/code> \u0438 <code>Filter<\/code>.<\/p>\n<pre><code class=\"sql\">EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM foo WHERE c2 LIKE 'ab%' LIMIT 10; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Limit (cost=0.00..2083.41 rows=10 width=37) (actual time=0.037..0.607 rows=10 loops=1)<br \/>   Buffers: shared hit=26<br \/>   -&gt; Seq Scan on foo (cost=0.00..20834.12 rows=100 width=37) (actual time=0.031..0.599 rows=10 loops=1)<br \/>   Filter: (c2 ~~ &#8216;ab%&#8217;::text)<br \/>   Rows Removed by Filter: 3053<br \/>   Buffers: shared hit=26<br \/>   Total runtime: 0.628 ms<br \/>  (7 rows)  <\/p><\/blockquote>\n<p>  \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 <code>Seq Scan<\/code> \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 <code>Filter<\/code> \u0438\u0445 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0431\u0435\u0440\u0451\u0442\u0441\u044f 10 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044e, \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 10 \u0441\u0442\u0440\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435 \u0432\u0441\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e 3063 \u0437\u0430\u043f\u0438\u0441\u0438, \u0438\u0437 \u043d\u0438\u0445 3053 \u0431\u044b\u043b\u0438 \u043e\u0442\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044b (<code>Rows Removed by Filter<\/code>).<br \/>  \u0422\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043f\u0440\u0438 <code>Index Scan<\/code>.<\/p>\n<h4>JOIN<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0434\u043b\u044f \u043d\u0435\u0451 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443.  <\/p>\n<pre><code class=\"sql\">CREATE TABLE bar (c1 integer, c2 boolean); INSERT INTO bar   SELECT i, i%2=1   FROM generate_series(1, 500000) AS i; ANALYZE bar; <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u0434\u0432\u0443\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c  <\/p>\n<pre><code class=\"sql\">EXPLAIN (ANALYZE) SELECT * FROM foo JOIN bar ON foo.c1=bar.c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Hash Join (cost=13463.00..49297.22 rows=500000 width=42) (actual time=87.441..907.555 rows=500010 loops=1)<br \/>   Hash Cond: (foo.c1 = bar.c1)<br \/>   -&gt; Seq Scan on foo (cost=0.00..18334.10 rows=1000010 width=37) (actual time=0.008..67.951 rows=1000010 loops=1)<br \/>   -&gt; Hash (cost=7213.00..7213.00 rows=500000 width=5) (actual time=87.352..87.352 rows=500000 loops=1)<br \/>   Buckets: 65536 Batches: 1 Memory Usage: 18067kB<br \/>   -&gt; Seq Scan on bar (cost=0.00..7213.00 rows=500000 width=5) (actual time=0.007..33.233 rows=500000 loops=1)<br \/>   Total runtime: 920.967 ms<br \/>  (7 rows)  <\/p><\/blockquote>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f (<code>Seq Scan<\/code>) \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>bar<\/code>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0435\u0451 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u044d\u0448 (<code>Hash<\/code>).<br \/>  \u0417\u0430\u0442\u0435\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f <code>Seq Scan<\/code> \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>foo<\/code>, \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u044d\u0448, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f (<code>Hash Join<\/code>) \u0441 \u0445\u044d\u0448\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>bar<\/code> \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e <code>Hash Cond<\/code>. \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0438\u043d\u0430\u0447\u0435 \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430.<br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e 18067kB \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0445\u044d\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>bar<\/code>.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441  <\/p>\n<pre><code class=\"sql\">CREATE INDEX ON bar(c1); EXPLAIN (ANALYZE) SELECT * FROM foo JOIN bar ON foo.c1=bar.c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Merge Join (cost=1.69..39879.71 rows=500000 width=42) (actual time=0.037..263.357 rows=500010 loops=1)<br \/>   Merge Cond: (foo.c1 = bar.c1)<br \/>   -&gt; Index Scan using foo_c1_idx on foo (cost=0.42..34327.57 rows=1000010 width=37) (actual time=0.019..58.920 rows=500011 loops=1)<br \/>   -&gt; Index Scan using bar_c1_idx on bar (cost=0.42..15212.42 rows=500000 width=5) (actual time=0.008..71.719 rows=500010 loops=1)<br \/>   Total runtime: 283.549 ms<br \/>  (5 rows)  <\/p><\/blockquote>\n<p>  <code>Hash<\/code> \u0443\u0436\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. <code>Merge Join<\/code> \u0438 <code>Index Scan<\/code> \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u043e\u0431\u0435\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0434\u0430\u044e\u0442 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  LEFT JOIN:  <\/p>\n<pre><code class=\"sql\">EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Hash Left Join (cost=13463.00..49297.22 rows=1000010 width=42) (actual time=82.682..926.331 rows=1000010 loops=1)<br \/>   Hash Cond: (foo.c1 = bar.c1)<br \/>   -&gt; Seq Scan on foo (cost=0.00..18334.10 rows=1000010 width=37) (actual time=0.004..68.763 rows=1000010 loops=1)<br \/>   -&gt; Hash (cost=7213.00..7213.00 rows=500000 width=5) (actual time=82.625..82.625 rows=500000 loops=1)<br \/>   Buckets: 65536 Batches: 1 Memory Usage: 18067kB<br \/>   -&gt; Seq Scan on bar (cost=0.00..7213.00 rows=500000 width=5) (actual time=0.003..31.890 rows=500000 loops=1)<br \/>   Total runtime: 950.625 ms<br \/>  (7 rows)  <\/p><\/blockquote>\n<p>  <code>Seq Scan<\/code>?<br \/>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0443\u0434\u0443\u0442, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c Seq Scan.  <\/p>\n<pre><code class=\"sql\">SET enable_seqscan TO off;  EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Merge Left Join (cost=0.85..58290.02 rows=1000010 width=42) (actual time=0.024..353.819 rows=1000010 loops=1)<br \/>   Merge Cond: (foo.c1 = bar.c1)<br \/>   -&gt; Index Scan using foo_c1_idx on foo (cost=0.42..34327.57 rows=1000010 width=37) (actual time=0.011..112.095 rows=1000010 loops=1)<br \/>   -&gt; Index Scan using bar_c1_idx on bar (cost=0.42..15212.42 rows=500000 width=5) (actual time=0.008..63.125 rows=500010 loops=1)<br \/>   Total runtime: 378.603 ms<br \/>  (5 rows)  <\/p><\/blockquote>\n<p>  \u041f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0435\u0435, \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0445\u044d\u0448\u0435\u0439. \u0422\u0430\u043a\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043e\u0431\u044a\u0451\u043c\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u043c\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0438 <code>work_mem<\/code>?<br \/>  \u041d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u0434\u0435\u0444\u0438\u0446\u0438\u0442\u0435, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u0438\u043d\u0430\u0447\u0435:  <\/p>\n<pre><code class=\"sql\">SET work_mem TO '15MB'; SET enable_seqscan TO ON;  EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Merge Left Join (cost=0.85..58290.02 rows=1000010 width=42) (actual time=0.014..376.395 rows=1000010 loops=1)<br \/>   Merge Cond: (foo.c1 = bar.c1)<br \/>   -&gt; Index Scan using foo_c1_idx1 on foo (cost=0.42..34327.57 rows=1000010 width=37) (actual time=0.005..124.698 rows=1000010 loops=1)<br \/>   -&gt; Index Scan using bar_c1_idx on bar (cost=0.42..15212.42 rows=500000 width=5) (actual time=0.006..66.813 rows=500010 loops=1)<br \/>   Total runtime: 401.990 ms<br \/>  (5 rows)  <\/p><\/blockquote>\n<p>  \u0410 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u044b\u0432\u043e\u0434 EXPLAIN \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u043e\u043c <code>Index Scan<\/code>?  <\/p>\n<pre><code class=\"sql\">SET work_mem TO '15MB'; SET enable_indexscan TO off;  EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p> QUERY PLAN <br \/>   \u2014  Hash Left Join (cost=15417.00..63831.18 rows=1000010 width=42) (actual time=93.440..712.056 rows=1000010 loops=1)<br \/>   Hash Cond: (foo.c1 = bar.c1)<br \/>   -&gt; Seq Scan on foo (cost=0.00..18334.10 rows=1000010 width=37) (actual time=0.008..65.901 rows=1000010 loops=1)<br \/>   -&gt; Hash (cost=7213.00..7213.00 rows=500000 width=5) (actual time=93.308..93.308 rows=500000 loops=1)<br \/>   Buckets: 65536 Batches: 2 Memory Usage: 9045kB<br \/>   -&gt; Seq Scan on bar (cost=0.00..7213.00 rows=500000 width=5) (actual time=0.007..33.718 rows=500000 loops=1)<br \/>   Total runtime: 736.726 ms<br \/>  (7 rows)  <\/p><\/blockquote>\n<p>  <code>cost<\/code> \u044f\u0432\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0441\u044f. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 <code>Batches: 2<\/code>. \u0412\u0435\u0441\u044c \u0445\u044d\u0448 \u043d\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0435\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 2 \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u043e 9045kB.<\/p>\n<p>  <i>\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u044f\u0442\u044c \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u043c\u043e\u0449\u0438 \u0433\u0443\u0440\u0443. \u041e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 <code>LEFT JOIN<\/code> \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c <code>work_mem<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Merge Left Join<\/code> \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e, \u0447\u0435\u043c <code>Hash Left Join<\/code>?<\/i><\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c.    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/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=\"http:\/\/habrahabr.ru\/post\/203484\/\"> http:\/\/habrahabr.ru\/post\/203484\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/f6c\/287\/17a\/f6c28717a7325185814bec4274d95bb9.jpg\"\/><br \/>  \u041f\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0443 <a href=\"http:\/\/www.dalibo.org\/_media\/understanding_explain.pdf\">Understanding EXPLAIN<\/a> \u043e\u0442 Guillaume Lelarge. <br \/>  \u0415\u0449\u0451 \u0440\u0430\u0437 \u043e\u0431\u0440\u0430\u0449\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u043e\u043f\u0443\u0449\u0435\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u043e\u043c.  <\/p>\n<h5>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438:<\/h5>\n<p>  <a href=\"http:\/\/habrahabr.ru\/post\/203320\/\">\u0427\u0430\u0441\u0442\u044c 1<\/a><br \/>  <a href=\"http:\/\/habrahabr.ru\/post\/203386\/\">\u0427\u0430\u0441\u0442\u044c 2<\/a>  <\/p>\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-203484","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/203484","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=203484"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/203484\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=203484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=203484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=203484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}