PostgreSQL рдЧреНрд▓рд╛рдЗрдбрд░ рд╕рдВрдХреЗрдд

рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдПрд╕рдХреНрдпреВрдПрд▓ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ "рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреНрдпрд╛ рдЪреБрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ", рдФрд░ "рдХреИрд╕реЗ" рдЗрд╕реЗ рдХрд░рдирд╛ рд╣реИ - DBMS рдЦреБрдж рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред SQL рдХреНрд╡реЗрд░реА рдХреЛ рдЙрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди (рдпреЛрдЬрдирд╛) рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЪреБрдирдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХреНрд╡реЗрд░реА рдкреНрд▓рд╛рдирд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА DBMS рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╡рд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдпреЛрдЬрдирд╛ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрдИ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ DBMS рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП "рд╕рдВрдХреЗрдд" рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдУрдкрди рд╕реЛрд░реНрд╕ рдореЗрдВ, PostgreSQL рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рдерд╛ред

рдФрд░ рдлрд┐рд░, рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреБрдЫ рдРрд╕рд╛ рд╣реБрдЖ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╕рдкрдиреЗ рджреЗрдЦрддреЗ рдереЗ рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ-рдХрд░рддреЗ рдердХ рдЧрдП рдереЗ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдбрд░ рдЧрдП рдереЗред рдЬрд╛рдкрд╛рдиреА NTT рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ PostgreSQL рдЧреНрд▓рд╛рдЗрдбрд░ рд╕рдВрдХреЗрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдХрд░реНрдиреЗрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ pg_hint_plan рдХреЗ рд░реВрдк рдореЗрдВ , PostgreSQL рд╕рдВрд╕реНрдХрд░рдгреЛрдВ 9.1 рдФрд░ 9.2 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реБрдПред рдореЙрдбреНрдпреВрд▓ рд╕рдВрдХреЗрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдХреИрдирд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, GUC рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


рд╕рд╛рдЗрдЯ рд╕реЗ рдЖрдк 9.1 рдФрд░ 9.2 рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд┐рд▓реНрдХреБрд▓ рдХреБрдЫ рднреА рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдУрд╣ рдареАрдХ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдФрд░ рд╕реНрдерд╛рдкрдирд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддреА рд╣реИ: & & make рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рддрд░рдг рд╕реЗ рдПрдХ PostgreSQL рджреЗрд╡ рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП PostgreSQL рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА SQL рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕рдХреНрдХрд▓.рдХреЙрдиреНрдлрд╝ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ (рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pg_hint_plan рдЪрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pg_hint_plan рдЬреЛрдбрд╝реЗрдВ (рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЖрд╡рд╢реНрдпрдХ рд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рддреНрд░ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рддреАрди рдирдП рдЬреАрдпреВрд╕реА рдЪрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ: pg_hint_plan.enable_hint, pg_hint_plan.debug_print, pg_hint_plan.parse -messagesред рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рд╕рдВрдХреЗрдд рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо), рд╢реЗрд╖ рджреЛ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдПред

рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, / * рдФрд░ * / рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ + рд╕рдВрдХреЗрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП / * + SeSScan (t1) * /ред рд╕рдВрдХреЗрдд рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред

рдЯреЗрдмрд▓ рд╕реНрдХреИрди рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд


рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдХреНрд╡реЗрд░реА рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдирд╛рдо рджреЛрдиреЛрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд╕рдВрдХреЗрдд


рддрд╛рд▓рд┐рдХрд╛ рдирд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдПрдХ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред рдпрд╣ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрдиреЗрдХреНрд╢рди рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреЛ рд╕рдВрдХреЗрдд рднреА рдЕрд▓рдЧ рд╕реЗ рджрд┐рдП рдЧрдП рд╣реИрдВ:

рдпрд╣ рд╕рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдпрд╣ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЖрдЗрдП рдЯреЗрд╕реНрдЯ рдЯреЗрдмрд▓, рдЗрдВрдбреЗрдХреНрд╕, рдЖрдВрдХрдбрд╝реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред

CREATE TABLE test1 AS (SELECT id, (random()*1000)::int AS id_2, random() AS value1, random() AS value2 FROM generate_series(1,1000000) id); CREATE TABLE test2 AS (SELECT id, random() AS value FROM generate_series(1,1000) id); CREATE INDEX test1_id_idx ON test1 (id); CREATE INDEX test1_id_2_idx ON test1 (id_2); CREATE INDEX test1_value1_idx ON test1 (value1); CREATE INDEX test1_value2_idx ON test1 (value2); CREATE INDEX test2_id_idx ON test2 (id); CREATE INDEX test2_value_idx ON test2 (value); VACUUM ANALYZE; 


рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреНрд╡реЗрд░реА рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдорд╛рди рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреА рд╣реИред
 SELECT * FROM test1 WHERE value1 BETWEEN 0.5 and 0.505 AND value2 BETWEEN 0.6 and 0.61; 


рдЧреНрд▓рд╛рдЗрдбрд░ рдмрд┐рдЯрдореИрдк рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред
  QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on test1 (cost=319.82..514.76 rows=52 width=24) (actual time=9.575..9.736 rows=59 loops=1) Recheck Cond: ((value1 >= 0.5::double precision) AND (value1 <= 0.505::double precision) AND (value2 >= 0.6::double precision) AND (value2 <= 0.61::double precision)) -> BitmapAnd (cost=319.82..319.82 rows=52 width=0) (actual time=9.529..9.529 rows=0 loops=1) -> Bitmap Index Scan on test1_value1_idx (cost=0.00..113.54 rows=5318 width=0) (actual time=2.839..2.839 rows=5072 loops=1) Index Cond: ((value1 >= 0.5::double precision) AND (value1 <= 0.505::double precision)) -> Bitmap Index Scan on test1_value2_idx (cost=0.00..206.00 rows=9764 width=0) (actual time=5.385..5.385 rows=10070 loops=1) Index Cond: ((value2 >= 0.6::double precision) AND (value2 <= 0.61::double precision)) Total runtime: 9.805 ms 


рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 /*+ IndexScan(test1) */ SELECT * FROM test1 WHERE value1 BETWEEN 0.5 and 0.505 AND value2 BETWEEN 0.6 and 0.61; 


  QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------- Index Scan using test1_value1_idx on test1 (cost=0.00..15198.71 rows=52 width=24) (actual time=0.124..10.704 rows=59 loops=1) Index Cond: ((value1 >= 0.5::double precision) AND (value1 <= 0.505::double precision)) Filter: ((value2 >= 0.6::double precision) AND (value2 <= 0.61::double precision)) Total runtime: 10.776 ms 


рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 /*+ IndexScan(test1 test1_value2_idx) */ SELECT * FROM test1 WHERE value1 BETWEEN 0.5 and 0.505 AND value2 BETWEEN 0.6 and 0.61; 


  QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------- Index Scan using test1_value2_idx on test1 (cost=0.00..22463.60 rows=52 width=24) (actual time=0.787..15.757 rows=59 loops=1) Index Cond: ((value2 >= 0.6::double precision) AND (value2 <= 0.61::double precision)) Filter: ((value1 >= 0.5::double precision) AND (value1 <= 0.505::double precision)) Total runtime: 15.816 ms (4 rows) 


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реБрдП, рджреВрд╕рд░реЗ рдФрд░ LIMIT рдХреЗ рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЫрдБрдЯрд╛рдИред
 SELECT * FROM test1 t1 JOIN test2 t2 ON t1.id_2 = t2.id WHERE t2.value BETWEEN 0.5 AND 0.51 ORDER BY t1.value1 LIMIT 100; 


рдЧреНрд▓рд╛рдЗрдбрд░ test1_value1_idx рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реА рдпреЛрдЬрдирд╛ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред
  QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=4.33..2149.77 rows=100 width=36) (actual time=0.274..34.784 rows=100 loops=1) -> Nested Loop (cost=4.33..171467.82 rows=7992 width=36) (actual time=0.271..34.753 rows=100 loops=1) Join Filter: (t1.id_2 = t2.id) -> Index Scan using test1_value1_idx on test1 t1 (cost=0.00..51457.05 rows=1000000 width=24) (actual time=0.022..10.338 rows=11873 loops=1) -> Materialize (cost=4.33..10.80 rows=8 width=12) (actual time=0.000..0.001 rows=8 loops=11873) -> Bitmap Heap Scan on test2 t2 (cost=4.33..10.76 rows=8 width=12) (actual time=0.035..0.046 rows=8 loops=1) Recheck Cond: ((value >= 0.5::double precision) AND (value <= 0.51::double precision)) -> Bitmap Index Scan on test2_value_idx (cost=0.00..4.33 rows=8 width=0) (actual time=0.026..0.026 rows=8 loops=1) Index Cond: ((value >= 0.5::double precision) AND (value <= 0.51::double precision)) Total runtime: 34.870 ms 


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЯреЗрдмрд▓ рдЬреЙрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╣реИрд╢рдУрдЗрдиред
 /*+ HashJoin(t1 t2) */ EXPLAIN ANALYZE SELECT * FROM test1 t1 JOIN test2 t2 ON t1.id_2 = t2.id WHERE t2.value BETWEEN 0.5 AND 0.51 ORDER BY t1.value1 LIMIT 100; 


рдЯреЗрд╕реНрдЯ 2 рджреНрд╡рд╛рд░рд╛ рдмрд┐рдЯрдореИрдк рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреА рд╕реАрдорд╛ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдЧреНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------ Limit (cost=20516.23..20516.48 rows=100 width=36) (actual time=156.219..156.230 rows=100 loops=1) -> Sort (cost=20516.23..20536.21 rows=7992 width=36) (actual time=156.217..156.225 rows=100 loops=1) Sort Key: t1.value1 Sort Method: top-N heapsort Memory: 32kB -> Hash Join (cost=10.86..20210.78 rows=7992 width=36) (actual time=0.248..154.286 rows=7889 loops=1) Hash Cond: (t1.id_2 = t2.id) -> Seq Scan on test1 t1 (cost=0.00..16370.00 rows=1000000 width=24) (actual time=0.013..63.210 rows=1000000 loops=1) -> Hash (cost=10.76..10.76 rows=8 width=12) (actual time=0.066..0.066 rows=8 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Bitmap Heap Scan on test2 t2 (cost=4.33..10.76 rows=8 width=12) (actual time=0.044..0.057 rows=8 loops=1) Recheck Cond: ((value >= 0.5::double precision) AND (value <= 0.51::double precision)) -> Bitmap Index Scan on test2_value_idx (cost=0.00..4.33 rows=8 width=0) (actual time=0.034..0.034 rows=8 loops=1) Index Cond: ((value >= 0.5::double precision) AND (value <= 0.51::double precision)) Total runtime: 156.335 ms 


рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ MergeJoin рдФрд░ IndexScan рдХреЛ index test__value_idx рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧреНрд▓рд╛рдЗрдбрд░ рдлрд┐рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЫрдВрдЯрд╛рдИ рдФрд░ рд╕реАрдорд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
 /*+ MergeJoin(t1 t2) IndexScan (t2 test2_value_idx) */ EXPLAIN ANALYZE SELECT * FROM test1 t1 JOIN test2 t2 ON t1.id_2 = t2.id WHERE t2.value BETWEEN 0.5 AND 0.51 ORDER BY t1.value1 LIMIT 100; 


  QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=54410.09..54410.34 rows=100 width=36) (actual time=446.031..446.041 rows=100 loops=1) -> Sort (cost=54410.09..54430.07 rows=7992 width=36) (actual time=446.029..446.032 rows=100 loops=1) Sort Key: t1.value1 Sort Method: top-N heapsort Memory: 32kB -> Merge Join (cost=71.79..54104.65 rows=7992 width=36) (actual time=12.501..444.501 rows=7889 loops=1) Merge Cond: (t1.id_2 = t2.id) -> Index Scan using test1_id_2_idx on test1 t1 (cost=0.00..51460.24 rows=1000000 width=24) (actual time=0.033..377.392 rows=900401 loops=1) -> Sort (cost=24.52..24.54 rows=8 width=12) (actual time=0.074..0.545 rows=6927 loops=1) Sort Key: t2.id Sort Method: quicksort Memory: 25kB -> Index Scan using test2_value_idx on test2 t2 (cost=0.00..24.40 rows=8 width=12) (actual time=0.026..0.047 rows=8 loops=1) Index Cond: ((value >= 0.5::double precision) AND (value <= 0.51::double precision)) Total runtime: 446.182 ms 


рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджрд┐рдП рдЧрдП рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдХреЗрд╡рд▓ рд╕рдВрдХреЗрдд рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдЦрд░рд╛рдм рд╣реЛ рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛, рдореИрдВ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдХреЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рддреЗрдЬ рд╣реИ, рддреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ:

рдлрд┐рд░ рднреА, рдХрдо рд╕реЗ рдХрдо рджреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдХреЗрдд рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ:

PS рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдУрд▓реЗрдЧ рдмрд╛рд░реНрдЯреБрдиреЛрд╡ (рдЙрд░реНрдл рдЬрд╝реЗрди )!

Source: https://habr.com/ru/post/In169751/


All Articles