рдХрд╡рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗрд╡рд▓ рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╛рдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рдЙрдирдХреЗ рдмрд┐рдирд╛, рдХреЗрд╡рд▓ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдПрдХ рдЬреАрдд рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╡рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ: рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓рдирд╛, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рд╕рдорд╛рд╡реЗрд╢реА рдЗрдВрдбреЗрдХреНрд╕ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВред рд▓реЗрдХрд┐рди, рдХреНрд░рдо рдореЗрдВ: рдПрдХ рдХрд╡рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХ рдРрд╕рд╛ рдЗрдВрдбреЗрдХреНрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреЙрд▓рдо рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ; рд╣рд╛рд▓рд╛рдБрдХрд┐, рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓рдЧрднрдЧред рдЖрдк "рд▓рдЧрднрдЧ" рдФрд░
Yegor Rogov рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдЕрдиреНрдп рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдкрдврд╝ рд╕рдХрддреЗ
рд╣реИрдВ , рдЬреЛ рдХрд┐ 10 (!) рднрд╛рдЧреЛрдВ рдХреА рдЙрдирдХреА рд╢реНрд░рдВрдЦрд▓рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдФрд░
рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЬрд┐рди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЦреЛрдЬ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЦреЛрдЬ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ INCLUDE рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдмрдирддреЗ рд╣реИрдВред
рдЕрдирд╛рд╕реНрддрд╛рд╕рд┐рдпрд╛ рд▓реБрдмреЗрдиреАрдХреЛрд╡рд╛ (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬрд╝ рдкреНрд░реЛрдлреЗрд╢рдирд▓) рдиреЗ рдмреАрдЯреАрдЖрд░рдЖрдИ рдкрджреНрдзрддрд┐ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рддрд╛рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрдВрднреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕ рдкреИрдЪ рдХреЛ PostgreSQL 11. рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди GiST / SP-GiST рдкрд╣реБрдБрдЪ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдореЗрдВ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛ред 12 рд╡реЗрдВ рддрдХ рдЬреАрдПрд╕рдЯреА рд▓рд╛рдЧреВ рд╣реЛ рдЧрдпрд╛ред
GiST рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд╡реЗрд╢реА рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рд░рдЪрдирд╛рддреНрдордХ рдЗрдЪреНрдЫрд╛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдкреИрджрд╛ рд╣реБрдИ: рдПрдВрдбреНрд░реА рдмреЛрд░реЛрдбрд┐рди рджреНрд╡рд╛рд░рд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреИрдЪ рдЕрдкреНрд░реИрд▓ 2018 рдХреЗ рдордзреНрдп рдореЗрдВ рд╕рдореБрджрд╛рдп рдХреЛ рд╡рд╛рдкрд╕
рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ рдереАред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА, рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рдХрд┐рдПред
рдЕрдЧрд╕реНрдд 2019 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХреЛрд░реЛрдЯрдХреЛрд╡ рдиреЗ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ рдкреИрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ред
рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдХреБрдЫ рд╢реЛрдз рдХреЗ рд▓рд┐рдП, рд╣рдо 3 рдорд┐рд▓рд┐рдпрди рдЖрдпрддреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЙрд╕реА рд╕рдордп, рдмреЙрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИрдВред
рдмреЙрдХреНрд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ - рдЕрд░реНрдерд╛рдд, рдЖрдпрдд - рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ Postgres рдореЗрдВ рд╣реИ, рдЗрд╕реЗ 2 рдмрд┐рдВрджреБрдУрдВ (рдЬреНрдпрд╛рдорд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рдмрд┐рдВрджреБ) рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЖрдпрдд рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛрдиреЗ (рдпрд╛рдиреА, рдЖрдпрдд рддрд┐рд░рдЫреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХрд┐рдирд╛рд░реЗ рдкрд░ рд▓рд┐рдЯ рдЧрдИ)ред рд╣рдо
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ: "рдЯрд╛рдЗрдк рдмреЙрдХреНрд╕ рдХреЗ рдорд╛рди рдирд┐рдореНрди рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ:
( ( x1 , y1 ) , ( x2 , y2 ) ) ( x1 , y1 ) , ( x2 , y2 ) x1 , y1 , x2 , y2
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
SELECT box('1,2', '3,4'); box
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Postgres рд╣рдореЗрдВ рд╢реАрд░реНрд╖ рджрд╛рдИрдВ рдУрд░ рд╢реАрд░реНрд╖ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдиреАрдЪреЗ рдмрд╛рдИрдВ рдУрд░ред рдЕрдЧрд░ рд╣рдо рдРрд╕рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ,
SELECT box('5,2', '3,4'); box
рдлрд┐рд░ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЯреНрд╕ рдЙрди рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЛ рди рджреЗрдВ рдЬреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрд╕реЗ рджреА рдереАрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдорд╛рд░реЗ рдКрдкрд░реА рдмрд╛рдПрдБ рдФрд░ рдирд┐рдЪрд▓реЗ рджрд╛рдПрдБ рд╕реЗ рдКрдкрд░реА рджрд╛рдПрдБ рдФрд░ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдБ рдХреА рдЧрдгрдирд╛ рдХреАред рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрдм рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдкреАрдврд╝реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдЕрдВрдХрди '1,2', '3,4' рдмрд┐рдВрджреБ (1,2), рдмрд┐рдВрджреБ (3,4) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рд░реВрдк рдХрднреА-рдХрднреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред
рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд┐рдП: 3 рдорд┐рд▓рд┐рдпрди рдЖрдпрддреЛрдВ рдореЗрдВ рдЦреЛрдЬреЗрдВ
CREATE TABLE boxes(id serial, thebox box, name text);
рд╣рдо 3 рдорд┐рд▓рд┐рдпрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрдпрддреЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди
рдЯреЗрдмрд▓рдлрдВрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо "рдЦрд░рд╛рдм" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ () - рдпрд╛рджреГрдЪреНрдЫрд┐рдХ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЕрдЪреНрдЫреА рддрд╕реНрд╡реАрд░ рднреА рджреЗрддрд╛ рд╣реИ (рдЕрдВрдЬреАрд░ рджреЗрдЦреЗрдВред) рдЖрдпрддреЛрдВ рдХреЗ рд╕рд╛рде, рдХреЗрдВрджреНрд░ рдХреЗ рдХрд░реАрдм рдмрдбрд╝рд╛ред рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреЗ рдЙрдирдХреЗ рдХреЗрдВрджреНрд░ рднреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рддрд░рдг рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рд╣рд░ рдбреЗрдЯрд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИрдВред рдФрд░ рдЬреЛ рдЖрдВрдХрдбрд╝реЗ рдпрд╛ рддрд╛рдЬрд╝рд╛ рдпрд╛рджреЛрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдХреЗ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдВ ред

INSERT INTO boxes(thebox, name) SELECT box( point( random()-random(), random()-random() ), point( random()-random(), random()-random() ) ), 'box no.' || x FROM generate_series(1,3000000) AS g(x);
рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐
\dt+
242MB рд╣реИред рдЕрдм рдЖрдк рдЦреЛрдЬ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдмрд┐рдирд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ:
EXPLAIN ANALYZE SELECT thebox, name FROM boxes WHERE thebox @> box('0.5, 0.4','0.3, 0.2'); QUERY PLAN
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ Seq рд╕реНрдХреИрди рд╣реИ - рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди (рдпрджреНрдпрдкрд┐ рд╕рдорд╛рдирд╛рдВрддрд░)ред
рдПрдХ рдирд┐рдпрдорд┐рдд, рдЧреИрд░-рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдПрдБ:
CREATE INDEX ON boxes USING gist(thebox);
boxes_thebox_idx
рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЖрдХрд╛рд░, рдЬреЛ
\di+
, 262MB рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдЙрд╕реА рдЕрдиреБрд░реЛрдз рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, рд╣рдо:
EXPLAIN ANALYZE SELECT thebox, name FROM boxes WHERE thebox @> box('0.5, 0.4','0.3, 0.2'); QUERY PLAN
рдЦреЛрдЬ рдХрд╛ рд╕рдордп рддреАрди рдХреЗ рдПрдХ рдХрд╛рд░рдХ рд╕реЗ рдХрдо рд╣реЛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реАрдХ рд╕реНрдХреИрди рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрд┐рдЯрдореИрдк рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рдпрд╣ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдкреБрд░рд╛рдиреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдорд╛рд░реЗрдВ рдФрд░ рдПрдХ рд╕рдорд╛рд╡реЗрд╢реА рдмрдирд╛рдПрдВ:
CREATE INDEX ON boxes USING spgist(thebox) INCLUDE(name);
boxes_thebox_name_idx
рдХрд╛
boxes_thebox_name_idx
: 356 рдПрдордмреАред рдЖрдЗрдП рдЬрд╛рдиреЗ:
EXPLAIN ANALYZE SELECT thebox, name FROM boxes WHERE thebox @> box('0.5, 0.4','0.3, 0.2'); QUERY PLAN
рдЗрдВрдбреЗрдХреНрд╕ рдУрдирд▓реА рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрд╕реНрд╡реАрд░ рджреБрдЦрдж рд╣реИ: рд╕рдордп рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рд▓рдВрдмрд╛ рд╣реИред рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреА рд╣реИрдВрдбрдмреБрдХ рдХреЛ
рднрд╛рдЧ I рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ:
ред рд░рдВрдЧ PostgreSQL рдЕрдиреБрдХреНрд░рдорд┐рдд рдореЗрдВ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХрд╛ рдиреНрдпрд╛рдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдЦреЛрдЬ рд╕реНрдерд┐рддрд┐ рдХреЗ рддрд╣рдд рдЖрдиреЗ рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд▓реМрдЯрд╛ рджреЗрддреА рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджреЗрдВ рдпрд╛ рдирд╣реАрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рджреГрд╢реНрдпрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордг рддрдВрддреНрд░ рдХреЛ рд╣рд░ рдмрд╛рд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдХреИрдирд┐рдВрдЧ рд╡рд┐рдзрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрдирд┐рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╣рд▓ рд╣реЛрддреА рд╣реИ рдХрд┐ PostgreSQL рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡реИрдХреНрдпреВрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕рднреА рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рд╢реБрд░реБрдЖрддреА рд╕рдордп рдФрд░ рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛред рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рдкрдВрдХреНрддрд┐ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдРрд╕реЗ рдкреГрд╖реНрда рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреГрд╢реНрдпрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред>
рд╣рдо VACUUM рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреЛрд╣рд░рд╛рдиреЗ:
EXPLAIN ANALYZE SELECT thebox, name FROM boxes WHERE thebox @> box('0.5, 0.4','0.3, 0.2'); QUERY PLAN
рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛! рдЧреИрд░-рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рдмрд╛рд░ рд▓рд╛рднред
рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдФрд░ рд▓рд╛рдн
рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИред рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реНрдпреБрддреНрдХреНрд░рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ: рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдмрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рджрд┐рдП рдЧрдП рдмреЙрдХреНрд╕ рдореЗрдВ рдХрд┐рддрдиреЗ рдЕрдВрдХ рдЧрд┐рд░реЗрдВрдЧреЗред рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдбреЙрдЯреНрд╕ рдлреИрд▓рд╛рдПрдВред
CREATE TABLE test_covergist(id serial, tochka point, name text);
INSERT INTO test_covergist(tochka, name) SELECT point(trunc(1000000*random()), trunc(1000000*random())), 'point no.' || gx FROM generate_series(1,3000000) AS g(x);
рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ 211 рдПрдордмреА рд╣реИред
CREATE INDEX on test_covergist USING gist(tochka);
рдЖрдХрд╛рд░ 213 рдПрдордмреАред
рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ:
EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist WHERE box('0,0','3000000,3000000') @> tochka; QUERY PLAN
рд╣рдордиреЗ EXPLAIN рдХреЛ рдмрдлрд╝рд░реНрд╕ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рдпрд╣ рдХрд╛рдо рдЖрдПрдЧрд╛ред рдЕрдм рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп 2 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрдлрд░: рд╕рд╛рдЭрд╛ рдкрдврд╝рд╛ = 54287ред рдПрдХ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рд╕рд╛рдЭрд╛ рд░реАрдб рдФрд░ рд╢реЗрдпрд░реНрдб рд╣рд┐рдЯ рдХрд╛ рдорд┐рд╢реНрд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрд░реНрдерд╛рдд, рдХреБрдЫ рдмрдлрд╝рд░реНрд╕ рдбрд┐рд╕реНрдХ (рдпрд╛ OS рдХреИрд╢ рд╕реЗ) рдФрд░ рдХреБрдЫ рдмрдлрд░ рдХреИрд╢ рд╕реЗ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдХрд╛рд░ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╛рдЭрд╛ рдмрдлрд╝рд░реНрд╕ рд╕реЗрдЯ рдХрд░рдХреЗ рдЦреБрдж рдХреА рд░рдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рдлрд┐рдЯ рд╣реЛ рдЬрд╛рдП - рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЯреНрд╕
-o "-c shared_buffers=1GB"
рдЕрдм:
EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist WHERE box('0,0','3000000,3000000') @> tochka; QUERY PLAN
рдЕрд░реНрдерд╛рддреН, рд╕рд╛рдЭрд╛ рдкрдврд╝рд╛ рдЧрдпрд╛ рдПрдХ рд╕рд╛рдЭрд╛ рд╣рд┐рдЯ рдмрди рдЧрдпрд╛, рдФрд░ рд╕рдордп рддреАрди рдмрд╛рд░ рдХрдо рд╣реЛ рдЧрдпрд╛ред
EXPLAIN рдореЗрдВ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг: 3 рдорд┐рд▓рд┐рдпрди рдЕрдВрдХ рд▓реМрдЯрд╛рдП рдЧрдП рд╣реИрдВ, рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЧрдИ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди 3 рд╣рдЬрд╛рд░ рд╣реИред Spoiler: рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдХрд┐рд╕реА рднреА рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрджрд▓реЗрдЧреАред рдмреЙрдХреНрд╕ рдпрд╛ рдкреЙрдЗрдВрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдЖрд╢рд╛рд╡рд╛рджреА рдХреЛ рдХрд╛рд░реНрдбрд┐рдирд┐рдЯреА рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдФрд░ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧреА: рдЖрдпрдд рдХреЗ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП, test_covergist_tochka_idx рдкрд░ рдПрдХ рдмрд┐рдЯрдореИрдк рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рд╣реЛрдЧрд╛ред
рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рджреЛ рдФрд░ рдорд╛рдк рджрд┐рдП рдЧрдП рд╣реИрдВ, рдкрд░рд┐рдорд╛рдг рдХреЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднрд┐рдиреНрди:
EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist WHERE box('0,0','300000,300000') @> tochka; QUERY PLAN
рдпрд╣ 10-рд╡рд┐рд╖рдо рдмрд╛рд░ рдХрдо рд░рд┐рдХреЙрд░реНрдб (рд╡рд╛рд╕реНрддрд╡рд┐рдХ ... рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 269882) рджреЗрддрд╛ рд╣реИ, рд╕рдордп рд▓рдЧрднрдЧ 5 рдЧреБрдирд╛ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред
EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist WHERE box('0,0','30000,30000') @> tochka; QUERY PLAN
рдПрдХ 30K ├Ч 30K рд╡рд░реНрдЧ (2780) рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреЗрд╡рд▓ 16 рдПрдордПрд╕ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЬрдм рджрд░реНрдЬрдиреЛрдВ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдПрдордПрд╕ рдХреЗ рдЕрдВрд╢реЛрдВ рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдРрд╕реЗ рдорд╛рдк рдмрд╣реБрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╣реА рдорд╛рдкреЗрдВ:
CREATE INDEX on test_covergist USING gist(tochka) INCLUDE(name);
рд╕рд╛рдЗрдЬ 316 рдПрдордмреАред
EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist WHERE box('0,0','3000000,3000000') @> tochka; QUERY PLAN
рд╕рдордп рд▓рдЧрднрдЧ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗрд╡рд▓ рд╕реНрдХреИрдиред
рд▓реЗрдХрд┐рди:
EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist WHERE box('0,0','300000,300000') @> tochka; QUERY PLAN
рдФрд░ рдпрд╣ 151 рдорд┐ред рдФрд░, рддрджрдиреБрд╕рд╛рд░:
EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist WHERE box('0,0','300000,300000') @> tochka; QUERY PLAN
рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2780 рдмрд┐рдВрджреБ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдордПрд╕ рдХрд╛ рдПрдХ рдЕрдВрд╢ рд╣реИред
рдмрдлрд╝рд░реНрд╕ рдХреЛ рдмрдВрджреВрдХреЗрдВ рдкрд╕рдВрдж рд╣реИрдВ
рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдорд╛рдВрдЧрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╢реЙрдЯрдЧрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЕрднреА рддрдХ рдЧреЛрд▓реА рдирд╣реАрдВ рд▓реА рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╣ рджреАрд╡рд╛рд░ рдкрд░ рд▓рдЯрдХрд╛ рд╣реБрдЖ рдерд╛: рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрдврд╝реА рдЧрдИред рдПрдХ рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдХреЗрд╡рд▓ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд╣реА рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣реАрдк рдлреЗрдЯреЗрдХ: 0)ред рддреАрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпреЗ рд╕рдВрдЦреНрдпрд╛ 40492, 3735 рдФрд░ 52 рдереАред рд▓реЗрдХрд┐рди рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдмреНрд▓реЙрдХ рдмрд┐рдЯрдореИрдк рд╣реАрдк рд╕реНрдХреИрди рдЗрдВрдбреЗрдХреНрд╕ (54248 рдореЗрдВ 3 рдорд┐рд▓рд┐рдпрди рд░рд┐рдХреЙрд░реНрдб) рдХреЗ рд╕рд╛рде рдкрдврд╝реЗ рдЧрдП рдмрд┐рдЯреНрд╕ рдХреЗ рдпреЛрдЧ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдвреЗрд░ рд╕реЗ рдкрдврд╝рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ (27223) , рдХреНрдпреЛрдВрдХрд┐ рдирд╛рдо рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 54248 + 27223 = 81471ред рдЕрдирдиреНрдп 40492 рдерд╛ред рджреЛ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП: 29534 + 2510 = 31044 рдФрд░ 2655 + 31 = 2686ред рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реИрд╕реЗ рднреА рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде, рд░реАрдб рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ 2 рдЧреБрдирд╛ рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рдорд╛рдг рдХреЗ рдЖрджреЗрд╢реЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдвреЗрд░ рдмреНрд▓реЙрдХ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред
рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдмрд┐рдВрджреБ рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░? рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрд╕реА рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ 300 рд╣рдЬрд╝рд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ 3 рдорд┐рд▓рд┐рдпрди рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ:
CREATE TABLE test_covergist_small(id serial, tochka point, name text); INSERT INTO test_covergist_small(tochka, name) SELECT point(trunc(1000000*random()), trunc(1000000*random())), 'point no.' || gx FROM generate_series(1,300000) AS g(x); CREATE INDEX ON test_covergist_small USING gist(tochka); EXPLAIN (ANALYZE, buffers) SELECT tochka, name FROM test_covergist_small WHERE box('0,0','3000000,3000000') @> tochka; QUERY PLAN
рдЕрдЧрд▓рд╛, рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рджреЛрд╣рд░рд╛рдПрдВред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
рдЕрдВрдХреЛрдВ рдХреЗ 100% рдХрд╡рд░реЗрдЬ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд╡реЗрд░реА рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝реА рдзреАрдореА рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 3 рдорд┐рд▓рд┐рдпрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛ред рдпрд╣реА рд╣реИ, рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдореЙрд╕реНрдХреЛ рдХреЗ рдирдХреНрд╢реЗ рдкрд░ рдХрдИ рдорд┐рд▓рд┐рдпрди рдЖрдпрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдЯ - рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкрд░ рд╕рдорд╛рд╡реЗрд╢реА рдЬреАрдПрд╕рдЯреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдирд┐рд╖реНрдХрд░реНрд╖ рд╕рдорд╛рди рд╣реИ: рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрддрд┐ рджреЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХреЛ рдЪрд┐рддреНрд░реЛрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдбреЗрдЯрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рдЖрдЗрдП рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдмреЗрддрд░рддреАрдм рдЖрдпрддреЛрдВ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред рдЖрдЗрдП рд╕реНрдкрд┐рдЧрд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЖрдк
PostgreSQL - 6 рдореЗрдВ рд▓реЗрдЦ
рдЗрдВрдбреЗрдХреНрд╕ рдкрдврд╝рдХрд░ рдПрд╕рдкреА-рдЬреАрдПрд╕рдЯреА рдФрд░ рдЬреАрдПрд╕рдЯреА рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдПрдБ:
CREATE INDEX ON boxes USING spgist(thebox) INCLUDE(name); ERROR: access method "spgist" does not support included columns
рдХрд╛рд╢, SP-GiST рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рд╡реЗрд╢реА рд╕реВрдЪрдХрд╛рдВрдХ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рддреЛ рд╕реБрдзрд╛рд░ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ!