{"id":364369,"date":"2024-05-21T02:15:37","date_gmt":"2024-05-21T02:15:37","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=364369"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=364369","title":{"rendered":"<span>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e OR \u0432 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0438\u0437\u0431\u0438\u0442\u043e\u0441\u0442\u044c \u0442\u0435\u043c\u044b \u0438 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c OR \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 WHERE\/ON SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0436\u0438\u0437\u043d\u044c \u0432\u043d\u043e\u0441\u0438\u0442 \u0441\u0432\u043e\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0432\u044b. \u0418\u043d\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c OR. \u042f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0430 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u044c\u043c\u0443 \u0431\u044b\u043a\u0430 \u0437\u0430 \u0440\u043e\u0433\u0430 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 OR \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0430\u043c \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d. \u0420\u043e\u0432\u043d\u043e \u0434\u043e \u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u0430, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041d\u0443 \u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438, \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0443 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 MS SQL \u0438 PostgreSQL \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043f\u043e \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">CREATE TABLE tmp_tmp (   ID int PRIMARY KEY,   SessionId int NOT NULL,   Val int NOT NULL,   IsValidated boolean NOT NULL );<\/code><\/pre>\n<p>\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0435\u0439 \u0432 MS SQL:<\/p>\n<pre><code class=\"sql\">CREATE TABLE tmp_tmp (   ID int PRIMARY KEY,   SessionId int NOT NULL,   Val int NOT NULL,   IsValidated bit NOT NULL )<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 MS SQL \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 boolean \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f bit. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0435\u0449\u0451 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 MS SQL \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u043e ID \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u043c. \u0410 \u0432 PostgreSQL \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0435\u0442 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438.<\/p>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">INSERT INTO tmp_tmp(ID, SessionId, Val, IsValidated) SELECT G.n AS ID,   G.n%100 AS SessionId,   G.n%1000 AS Val,   ((G.n\/1000)%2)::boolean AS IsValidated FROM generate_series(1,1000000) G(n);<\/code><\/pre>\n<p>\u0438 \u0432 MS SQL:<\/p>\n<pre><code class=\"sql\">INSERT INTO tmp_tmp(ID, SessionId, Val, IsValidated) SELECT N.number+T.number*1000 AS ID,  N.number%100 AS SessionId,  N.number%1000 AS Val,  (T.number%2) AS IsValidated FROM master.dbo.spt_values T JOIN master.dbo.spt_values N ON N.type='P'   AND N.number BETWEEN 1 AND 1000 WHERE T.type='P'   AND T.number BETWEEN 0 AND 999<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 GENERATE_SERIES()?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e MS SQL 2022 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f GENERATE_SERIES(), \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0449\u0435 \u043d\u0435 \u043c\u0430\u043b\u043e \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u0442\u043e \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043d\u0430 \u0441\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442. \u0417\u0430\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0434\u0430\u0436\u0435 MS SQL 2016. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 master.dbo.spt_values \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b &#8212; \u0433\u043e\u0442\u043e\u0432 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0443 \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0412 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">CREATE INDEX tmp_tmp_IsValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE IsValidated; CREATE INDEX tmp_tmp_IsNotValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE NOT IsValidated;<\/code><\/pre>\n<p>\u0438 \u0432 MS SQL:<\/p>\n<pre><code class=\"sql\">CREATE INDEX tmp_tmp_IsValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE IsValidated=1; CREATE INDEX tmp_tmp_IsNotValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE IsValidated=0; <\/code><\/pre>\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437 \u0438\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c \u0437\u0430 \u0441\u0442\u043e\u043b\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c \u0432 WHERE. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438\u043c \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0431\u044b\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u043c\u0438 (\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 MS). \u0414\u043b\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438. \u0414\u043b\u044f \u043e\u0434\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f, \u043e\u043f\u044f\u0442\u044c \u0441 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">SELECT T.ID FROM tmp_tmp T WHERE T.SessionId BETWEEN 30 AND 49   AND T.Val=530   AND (T.IsValidated OR NOT T.IsValidated);  Bitmap Heap Scan on tmp_tmp t  (cost=3342.26..3557.61 rows=149 width=4) (actual time=5.667..7.586 rows=1000 loops=1)   Recheck Cond: (((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530) AND isvalidated) OR ((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530) AND (NOT isvalidated)))   Heap Blocks: exact=1000   ->  BitmapOr  (cost=3342.26..3342.26 rows=199 width=0) (actual time=5.573..5.574 rows=0 loops=1)         ->  Bitmap Index Scan on tmp_tmp_isvalidated  (cost=0.00..1676.51 rows=100 width=0) (actual time=2.813..2.814 rows=500 loops=1)               Index Cond: ((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530))         ->  Bitmap Index Scan on tmp_tmp_isnotvalidated  (cost=0.00..1665.67 rows=99 width=0) (actual time=2.758..2.758 rows=500 loops=1)               Index Cond: ((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530)) Planning Time: 0.123 ms Execution Time: 7.643 ms<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0432\u0435\u043b \u0441\u0435\u0431\u044f \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e \u0438 \u0441\u0443\u043c\u0435\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 MS SQL?<\/p>\n<pre><code class=\"sql\">SELECT T.ID FROM tmp_tmp T WHERE T.SessionId BETWEEN 30 AND 49   AND T.Val=530   AND T.IsValidated IN (0,1)<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bbf\/37a\/10f\/bbf37a10f9c684f6e2b718b1c81fb8f0.png\" width=\"372\" height=\"115\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bbf\/37a\/10f\/bbf37a10f9c684f6e2b718b1c81fb8f0.png\"\/><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0442\u0443\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a MS SQL \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0438 \u0432\u0446\u0435\u043f\u0438\u043b\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043d\u0435 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u043e. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0431\u044b \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u043c, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u043e:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f7e\/6c1\/30d\/f7e6c130db846d018f924f46965361f2.png\" width=\"223\" height=\"115\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f7e\/6c1\/30d\/f7e6c130db846d018f924f46965361f2.png\"\/><\/figure>\n<p>\u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043a\u0430 \u0441\u0447\u0435\u0442 1:0 \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 PostgreSQL. \u041f\u0440\u043e\u0441\u044c\u0431\u0430 \u0431\u0435\u0437 \u0445\u043e\u043b\u0438\u0432\u0430\u0440\u043e\u0432! \u042f \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 MS SQL \u0432 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0435\u0439, \u0447\u0435\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 PostgreSQL. \u041d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0430 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">CREATE TABLE tmp_sessions AS SELECT G.n AS SessionId FROM generate_series(30,49) G(n);<\/code><\/pre>\n<p>\u0418 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0434\u043b\u044f MS SQL:<\/p>\n<pre><code class=\"sql\">SELECT N.number AS SessionId INTO tmp_sessions FROM master.dbo.spt_values N WHERE N.type='P'   AND N.number BETWEEN 30 AND 49<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0414\u043b\u044f PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">SELECT T.ID FROM tmp_sessions S JOIN tmp_tmp T ON T.SessionId=S.SessionId   AND T.Val=530   AND (T.IsValidated OR NOT T.IsValidated);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b tmp_tmp:<\/p>\n<pre><code class=\"pgsql\">Hash Join  (cost=1067.38..12091.62 rows=9524 width=4) (actual time=0.604..39.444 rows=1000 loops=1)   Hash Cond: (t.sessionid = s.sessionid)   ->  Gather  (cost=1000.00..11689.03 rows=747 width=8) (actual time=0.575..39.272 rows=1000 loops=1)         Workers Planned: 2         Workers Launched: 2         ->  Parallel Seq Scan on tmp_tmp t  (cost=0.00..10614.33 rows=311 width=8) (actual time=0.162..31.718 rows=333 loops=3)               Filter: ((isvalidated OR (NOT isvalidated)) AND (val = 530))               Rows Removed by Filter: 333000   ->  Hash  (cost=35.50..35.50 rows=2550 width=4) (actual time=0.019..0.020 rows=21 loops=1)         Buckets: 4096  Batches: 1  Memory Usage: 33kB         ->  Seq Scan on tmp_sessions s  (cost=0.00..35.50 rows=2550 width=4) (actual time=0.014..0.015 rows=21 loops=1) Planning Time: 0.142 ms Execution Time: 39.499 ms<\/code><\/pre>\n<p>\u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0435\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u043f\u044f\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u043e\u0431\u0435\u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0438 \u0440\u0435\u0437\u043a\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<pre><code class=\"pgsql\">SET max_parallel_workers_per_gather = 0;  Hash Join  (cost=11810.19..13123.60 rows=9524 width=4) (actual time=16.546..18.582 rows=1000 loops=1)   Hash Cond: (t.sessionid = s.sessionid)   ->  Bitmap Heap Scan on tmp_tmp t  (cost=11742.82..12721.01 rows=747 width=8) (actual time=16.516..18.418 rows=1000 loops=1)         Recheck Cond: (((val = 530) AND isvalidated) OR ((val = 530) AND (NOT isvalidated)))         Heap Blocks: exact=1000         ->  BitmapOr  (cost=11742.82..11742.82 rows=996 width=0) (actual time=16.418..16.419 rows=0 loops=1)               ->  Bitmap Index Scan on tmp_tmp_isvalidated  (cost=0.00..5887.52 rows=500 width=0) (actual time=8.470..8.470 rows=500 loops=1)                     Index Cond: (val = 530)               ->  Bitmap Index Scan on tmp_tmp_isnotvalidated  (cost=0.00..5854.93 rows=496 width=0) (actual time=7.947..7.947 rows=500 loops=1)                     Index Cond: (val = 530)   ->  Hash  (cost=35.50..35.50 rows=2550 width=4) (actual time=0.017..0.018 rows=21 loops=1)         Buckets: 4096  Batches: 1  Memory Usage: 33kB         ->  Seq Scan on tmp_sessions s  (cost=0.00..35.50 rows=2550 width=4) (actual time=0.011..0.013 rows=21 loops=1) Planning Time: 0.118 ms Execution Time: 18.640 ms<\/code><\/pre>\n<p>\u0427\u0442\u043e \u0436\u0435 MS SQL?<\/p>\n<pre><code class=\"sql\">SELECT T.ID FROM tmp_sessions S JOIN tmp_tmp T ON T.SessionId=S.SessionId   AND T.Val=530   AND (T.IsValidated=1 OR T.IsValidated=0)<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/887\/1a9\/c3d\/8871a9c3db22ea0e5a59451e6ffc73e6.png\" width=\"515\" height=\"246\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/887\/1a9\/c3d\/8871a9c3db22ea0e5a59451e6ffc73e6.png\"\/><\/figure>\n<p>\u041a\u0430\u043a \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c &#8212; \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043e. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u0438 \u0432 PostgreSQL, \u0438 \u0432 MS SQL \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0430\u0442\u044c \u0432 \u0442\u0443\u043f\u0438\u043a \u0438 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d. \u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043c\u044b \u043b\u044e\u0434\u0438 \u043d\u0435 \u0433\u043e\u0440\u0434\u044b\u0435 \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c, \u043a\u0430\u043a \u0432\u0441\u0435 \u0436\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0414\u043b\u044f PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">SELECT T.ID FROM tmp_sessions S CROSS JOIN LATERAL (   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530     AND V.IsValidated   UNION ALL   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530     AND NOT V.IsValidated ) T;  Nested Loop  (cost=0.42..36996.35 rows=25500 width=4) (actual time=0.045..2.336 rows=1000 loops=1)   ->  Seq Scan on tmp_sessions s  (cost=0.00..35.50 rows=2550 width=4) (actual time=0.011..0.014 rows=21 loops=1)   ->  Append  (cost=0.42..14.39 rows=10 width=4) (actual time=0.008..0.108 rows=48 loops=21)         ->  Index Only Scan using tmp_tmp_isvalidated on tmp_tmp v  (cost=0.42..7.12 rows=5 width=4) (actual time=0.005..0.057 rows=24 loops=21)               Index Cond: ((sessionid = s.sessionid) AND (val = 530))               Heap Fetches: 500         ->  Index Only Scan using tmp_tmp_isnotvalidated on tmp_tmp v_1  (cost=0.42..7.12 rows=5 width=4) (actual time=0.004..0.048 rows=24 loops=21)               Index Cond: ((sessionid = s.sessionid) AND (val = 530))               Heap Fetches: 500 Planning Time: 0.142 ms Execution Time: 2.383 ms<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0448\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0431\u0435\u0437 JOIN \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u044b\u043b\u043e 7.643 ms, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441 \u0437\u0430\u0434\u0443\u0448\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e &#8212; 18.640 ms, \u0442\u043e \u043f\u0440\u0438 \u044f\u0432\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u043f\u043e \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u043e \u0432\u0441\u0435\u0433\u043e 2.383 ms!<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u0438 \u0441 MS SQL:<\/p>\n<pre><code class=\"sql\">SELECT T.ID FROM tmp_sessions S CROSS APPLY (   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530     AND V.IsValidated=1   UNION ALL   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530     AND V.IsValidated=0 ) T<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/08a\/f64\/deb\/08af64deb78a1647a0ca20a5c1fffe23.png\" width=\"765\" height=\"376\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/08a\/f64\/deb\/08af64deb78a1647a0ca20a5c1fffe23.png\"\/><\/figure>\n<p>\u0422\u0443\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0443\u0436\u0435 \u0438\u0437\u043b\u0438\u0448\u043d\u0438. MS SQL \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0434\u0430\u0436\u0435 \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442, \u0432\u044b\u0434\u0430\u0432\u0430\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 0 ms.<\/p>\n<p>\u0420\u0435\u0437\u044e\u043c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e OR \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 WHERE\/ON SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c. \u0418 \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 PostgreSQL \u0438\u043b\u0438 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 \u043d\u0438\u043c \u0436\u0435 \u0438 \u0437\u0430\u0434\u0443\u0448\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043b\u0430\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u0439, \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0435\u0437 OR, \u0447\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0434\u0430\u0441\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u043b\u0430\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043d\u043e \u0435\u0449\u0435 \u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442 \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438. \u0418 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u0434\u0440\u0443\u0433 \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/784076\/\"> https:\/\/habr.com\/ru\/articles\/784076\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0438\u0437\u0431\u0438\u0442\u043e\u0441\u0442\u044c \u0442\u0435\u043c\u044b \u0438 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c OR \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 WHERE\/ON SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0436\u0438\u0437\u043d\u044c \u0432\u043d\u043e\u0441\u0438\u0442 \u0441\u0432\u043e\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0432\u044b. \u0418\u043d\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c OR. \u042f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0430 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u044c\u043c\u0443 \u0431\u044b\u043a\u0430 \u0437\u0430 \u0440\u043e\u0433\u0430 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 OR \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0430\u043c \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d. \u0420\u043e\u0432\u043d\u043e \u0434\u043e \u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0435\u043b\u0430, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041d\u0443 \u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438, \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0443 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 MS SQL \u0438 PostgreSQL \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043f\u043e \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">CREATE TABLE tmp_tmp (   ID int PRIMARY KEY,   SessionId int NOT NULL,   Val int NOT NULL,   IsValidated boolean NOT NULL );<\/code><\/pre>\n<p>\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0435\u0439 \u0432 MS SQL:<\/p>\n<pre><code class=\"sql\">CREATE TABLE tmp_tmp (   ID int PRIMARY KEY,   SessionId int NOT NULL,   Val int NOT NULL,   IsValidated bit NOT NULL )<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 MS SQL \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 boolean \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f bit. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0435\u0449\u0451 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 MS SQL \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043f\u043e ID \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u043c. \u0410 \u0432 PostgreSQL \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0435\u0442 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438.<\/p>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">INSERT INTO tmp_tmp(ID, SessionId, Val, IsValidated) SELECT G.n AS ID,   G.n%100 AS SessionId,   G.n%1000 AS Val,   ((G.n\/1000)%2)::boolean AS IsValidated FROM generate_series(1,1000000) G(n);<\/code><\/pre>\n<p>\u0438 \u0432 MS SQL:<\/p>\n<pre><code class=\"sql\">INSERT INTO tmp_tmp(ID, SessionId, Val, IsValidated) SELECT N.number+T.number*1000 AS ID,  N.number%100 AS SessionId,  N.number%1000 AS Val,  (T.number%2) AS IsValidated FROM master.dbo.spt_values T JOIN master.dbo.spt_values N ON N.type='P'   AND N.number BETWEEN 1 AND 1000 WHERE T.type='P'   AND T.number BETWEEN 0 AND 999<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 GENERATE_SERIES()?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e MS SQL 2022 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f GENERATE_SERIES(), \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0449\u0435 \u043d\u0435 \u043c\u0430\u043b\u043e \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u0442\u043e \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043d\u0430 \u0441\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442. \u0417\u0430\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0434\u0430\u0436\u0435 MS SQL 2016. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 master.dbo.spt_values \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b &#8212; \u0433\u043e\u0442\u043e\u0432 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0443 \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0412 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">CREATE INDEX tmp_tmp_IsValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE IsValidated; CREATE INDEX tmp_tmp_IsNotValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE NOT IsValidated;<\/code><\/pre>\n<p>\u0438 \u0432 MS SQL:<\/p>\n<pre><code class=\"sql\">CREATE INDEX tmp_tmp_IsValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE IsValidated=1; CREATE INDEX tmp_tmp_IsNotValidated   ON tmp_tmp (SessionId, Val) INCLUDE (ID) WHERE IsValidated=0; <\/code><\/pre>\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437 \u0438\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c \u0437\u0430 \u0441\u0442\u043e\u043b\u044c \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c \u0432 WHERE. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438\u043c \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0431\u044b\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u043c\u0438 (\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 MS). \u0414\u043b\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438. \u0414\u043b\u044f \u043e\u0434\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f, \u043e\u043f\u044f\u0442\u044c \u0441 PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">SELECT T.ID FROM tmp_tmp T WHERE T.SessionId BETWEEN 30 AND 49   AND T.Val=530   AND (T.IsValidated OR NOT T.IsValidated);  Bitmap Heap Scan on tmp_tmp t  (cost=3342.26..3557.61 rows=149 width=4) (actual time=5.667..7.586 rows=1000 loops=1)   Recheck Cond: (((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530) AND isvalidated) OR ((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530) AND (NOT isvalidated)))   Heap Blocks: exact=1000   ->  BitmapOr  (cost=3342.26..3342.26 rows=199 width=0) (actual time=5.573..5.574 rows=0 loops=1)         ->  Bitmap Index Scan on tmp_tmp_isvalidated  (cost=0.00..1676.51 rows=100 width=0) (actual time=2.813..2.814 rows=500 loops=1)               Index Cond: ((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530))         ->  Bitmap Index Scan on tmp_tmp_isnotvalidated  (cost=0.00..1665.67 rows=99 width=0) (actual time=2.758..2.758 rows=500 loops=1)               Index Cond: ((sessionid >= 30) AND (sessionid &lt;= 49) AND (val = 530)) Planning Time: 0.123 ms Execution Time: 7.643 ms<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0432\u0435\u043b \u0441\u0435\u0431\u044f \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e \u0438 \u0441\u0443\u043c\u0435\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 MS SQL?<\/p>\n<pre><code class=\"sql\">SELECT T.ID FROM tmp_tmp T WHERE T.SessionId BETWEEN 30 AND 49   AND T.Val=530   AND T.IsValidated IN (0,1)<\/code><\/pre>\n<figure class=\"\"><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0442\u0443\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a MS SQL \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0438 \u0432\u0446\u0435\u043f\u0438\u043b\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043d\u0435 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u043e. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0431\u044b \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u043c, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u043e:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043a\u0430 \u0441\u0447\u0435\u0442 1:0 \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 PostgreSQL. \u041f\u0440\u043e\u0441\u044c\u0431\u0430 \u0431\u0435\u0437 \u0445\u043e\u043b\u0438\u0432\u0430\u0440\u043e\u0432! \u042f \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 MS SQL \u0432 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0435\u0439, \u0447\u0435\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 PostgreSQL. \u041d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0430 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">CREATE TABLE tmp_sessions AS SELECT G.n AS SessionId FROM generate_series(30,49) G(n);<\/code><\/pre>\n<p>\u0418 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0434\u043b\u044f MS SQL:<\/p>\n<pre><code class=\"sql\">SELECT N.number AS SessionId INTO tmp_sessions FROM master.dbo.spt_values N WHERE N.type='P'   AND N.number BETWEEN 30 AND 49<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0414\u043b\u044f PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">SELECT T.ID FROM tmp_sessions S JOIN tmp_tmp T ON T.SessionId=S.SessionId   AND T.Val=530   AND (T.IsValidated OR NOT T.IsValidated);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b tmp_tmp:<\/p>\n<pre><code class=\"pgsql\">Hash Join  (cost=1067.38..12091.62 rows=9524 width=4) (actual time=0.604..39.444 rows=1000 loops=1)   Hash Cond: (t.sessionid = s.sessionid)   ->  Gather  (cost=1000.00..11689.03 rows=747 width=8) (actual time=0.575..39.272 rows=1000 loops=1)         Workers Planned: 2         Workers Launched: 2         ->  Parallel Seq Scan on tmp_tmp t  (cost=0.00..10614.33 rows=311 width=8) (actual time=0.162..31.718 rows=333 loops=3)               Filter: ((isvalidated OR (NOT isvalidated)) AND (val = 530))               Rows Removed by Filter: 333000   ->  Hash  (cost=35.50..35.50 rows=2550 width=4) (actual time=0.019..0.020 rows=21 loops=1)         Buckets: 4096  Batches: 1  Memory Usage: 33kB         ->  Seq Scan on tmp_sessions s  (cost=0.00..35.50 rows=2550 width=4) (actual time=0.014..0.015 rows=21 loops=1) Planning Time: 0.142 ms Execution Time: 39.499 ms<\/code><\/pre>\n<p>\u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0435\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u043f\u044f\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u043e\u0431\u0435\u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0438 \u0440\u0435\u0437\u043a\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<pre><code class=\"pgsql\">SET max_parallel_workers_per_gather = 0;  Hash Join  (cost=11810.19..13123.60 rows=9524 width=4) (actual time=16.546..18.582 rows=1000 loops=1)   Hash Cond: (t.sessionid = s.sessionid)   ->  Bitmap Heap Scan on tmp_tmp t  (cost=11742.82..12721.01 rows=747 width=8) (actual time=16.516..18.418 rows=1000 loops=1)         Recheck Cond: (((val = 530) AND isvalidated) OR ((val = 530) AND (NOT isvalidated)))         Heap Blocks: exact=1000         ->  BitmapOr  (cost=11742.82..11742.82 rows=996 width=0) (actual time=16.418..16.419 rows=0 loops=1)               ->  Bitmap Index Scan on tmp_tmp_isvalidated  (cost=0.00..5887.52 rows=500 width=0) (actual time=8.470..8.470 rows=500 loops=1)                     Index Cond: (val = 530)               ->  Bitmap Index Scan on tmp_tmp_isnotvalidated  (cost=0.00..5854.93 rows=496 width=0) (actual time=7.947..7.947 rows=500 loops=1)                     Index Cond: (val = 530)   ->  Hash  (cost=35.50..35.50 rows=2550 width=4) (actual time=0.017..0.018 rows=21 loops=1)         Buckets: 4096  Batches: 1  Memory Usage: 33kB         ->  Seq Scan on tmp_sessions s  (cost=0.00..35.50 rows=2550 width=4) (actual time=0.011..0.013 rows=21 loops=1) Planning Time: 0.118 ms Execution Time: 18.640 ms<\/code><\/pre>\n<p>\u0427\u0442\u043e \u0436\u0435 MS SQL?<\/p>\n<pre><code class=\"sql\">SELECT T.ID FROM tmp_sessions S JOIN tmp_tmp T ON T.SessionId=S.SessionId   AND T.Val=530   AND (T.IsValidated=1 OR T.IsValidated=0)<\/code><\/pre>\n<figure class=\"\"><\/figure>\n<p>\u041a\u0430\u043a \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c &#8212; \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043e. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u0438 \u0432 PostgreSQL, \u0438 \u0432 MS SQL \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0430\u0442\u044c \u0432 \u0442\u0443\u043f\u0438\u043a \u0438 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d. \u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043c\u044b \u043b\u044e\u0434\u0438 \u043d\u0435 \u0433\u043e\u0440\u0434\u044b\u0435 \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c, \u043a\u0430\u043a \u0432\u0441\u0435 \u0436\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0414\u043b\u044f PostgreSQL:<\/p>\n<pre><code class=\"pgsql\">SELECT T.ID FROM tmp_sessions S CROSS JOIN LATERAL (   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530     AND V.IsValidated   UNION ALL   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530     AND NOT V.IsValidated ) T;  Nested Loop  (cost=0.42..36996.35 rows=25500 width=4) (actual time=0.045..2.336 rows=1000 loops=1)   ->  Seq Scan on tmp_sessions s  (cost=0.00..35.50 rows=2550 width=4) (actual time=0.011..0.014 rows=21 loops=1)   ->  Append  (cost=0.42..14.39 rows=10 width=4) (actual time=0.008..0.108 rows=48 loops=21)         ->  Index Only Scan using tmp_tmp_isvalidated on tmp_tmp v  (cost=0.42..7.12 rows=5 width=4) (actual time=0.005..0.057 rows=24 loops=21)               Index Cond: ((sessionid = s.sessionid) AND (val = 530))               Heap Fetches: 500         ->  Index Only Scan using tmp_tmp_isnotvalidated on tmp_tmp v_1  (cost=0.42..7.12 rows=5 width=4) (actual time=0.004..0.048 rows=24 loops=21)               Index Cond: ((sessionid = s.sessionid) AND (val = 530))               Heap Fetches: 500 Planning Time: 0.142 ms Execution Time: 2.383 ms<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0448\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0431\u0435\u0437 JOIN \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u044b\u043b\u043e 7.643 ms, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441 \u0437\u0430\u0434\u0443\u0448\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e &#8212; 18.640 ms, \u0442\u043e \u043f\u0440\u0438 \u044f\u0432\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0435 \u043f\u043e \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u043e \u0432\u0441\u0435\u0433\u043e 2.383 ms!<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u0438 \u0441 MS SQL:<\/p>\n<pre><code class=\"sql\">SELECT T.ID FROM tmp_sessions S CROSS APPLY (   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530     AND V.IsValidated=1   UNION ALL   SELECT V.ID   FROM tmp_tmp V   WHERE V.SessionId=S.SessionId     AND V.Val=530    <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/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-364369","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364369","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=364369"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364369\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=364369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=364369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=364369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}