PostgreSQL рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ - 5 (GiST)

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдордиреЗ PostgreSQL рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЗрдВрдЬрди , рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рджреЛ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ: рд╣реИрд╢ рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдмреА-рдЯреНрд░реА рдкрд░ рдЪрд░реНрдЪрд╛ рдХреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо GiST рдЕрдиреБрдХреНрд░рдорд┐рддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рд░


GiST "рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЦреЛрдЬ рдЯреНрд░реА" рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИред рдпрд╣ рдПрдХ рд╕рдВрддреБрд▓рд┐рдд рдЦреЛрдЬ рдкреЗрдбрд╝ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ "рдмреА-рдЯреНрд░реА"ред

рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ? "рдмреАрдЯреНрд░реА" рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдЦреНрддреА рд╕реЗ рддреБрд▓рдирд╛рддреНрдордХ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ: "рдЕрдзрд┐рдХ", "рдХрдо", рдФрд░ "рд╕рдорд╛рди" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдпрд╣ рд╕рдм рд╕рдХреНрд╖рдо рд╣реИ (рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рдХреНрд╖рдо рд╣реИ!) рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдзреБрдирд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпреЗ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ! рдмрд╕ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ: рдЬрд┐рдпреЛрдбреЗрдЯрд╛, рдкрд╛рда рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдЪрд┐рддреНрд░, ...

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

рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдореЗрдВ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЗрд╕ рдЕрдВрдд рддрдХ, рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдордг рддрд░реНрдХ рдХреА рдкреВрд░реНрд╡рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдореИрдкрд┐рдВрдЧ, рддрд╛рд▓реЛрдВ рдХреЗ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд░рд╛рдЗрдЯ-рдлреЙрд░рд╡рд░реНрдб рд▓реЙрдЧ рдХреЗ рд╕рдорд░реНрдерди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рдм рдЙрдЪреНрдЪ рдбреЗрд╡рд▓рдкрд░ рдХреМрд╢рд▓ рдФрд░ рдПрдХ рдмрдбрд╝рд╛ рдорд╛рдирд╡ рдкреНрд░рдпрд╛рд╕ рдорд╛рдирддрд╛ рд╣реИред рдЬреАрдИрдПрд╕рдЯреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд▓реЗрдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкреЗрд╢рдХрд╢ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ: рдХрдИ рдХрд╛рд░реНрдп рддрдХрдиреАрдХреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, рд╣рдо рдирдП рдПрдХреНрд╕реЗрд╕ рддрд░реАрдХреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдврд╛рдВрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреАрдПрд╕рдЯреА рдХреЛ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрд░рдЪрдирд╛


GiST рдПрдХ рдКрдВрдЪрд╛рдИ-рд╕рдВрддреБрд▓рд┐рдд рдкреЗрдбрд╝ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдиреЛрдб рдкреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВред рдиреЛрдбреНрд╕ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред

рд▓реАрдл рдиреЛрдб (рдкрддреНрддреА рдкрдВрдХреНрддрд┐) рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдХреБрдЫ рд╡рд┐рдзреЗрдп (рдмреВрд▓рд┐рдпрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдФрд░ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐ (TID) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реЛрддреА рд╣реИред рдЕрдиреБрдХреНрд░рдорд┐рдд рдбреЗрдЯрд╛ (рдХреБрдВрдЬреА) рдЗрд╕ рд╡рд┐рдзреЗрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдЖрдВрддрд░рд┐рдХ рдиреЛрдб (рдЖрдВрддрд░рд┐рдХ рдкрдВрдХреНрддрд┐) рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╡рд┐рдзреЗрдп рдФрд░ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдмрдЪреНрдЪреЗ рдХреЗ рдЙрдк-рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕ рд╡рд┐рдзреЗрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкрдВрдХреНрддрд┐ рдХреА рд╡рд┐рдзреЗрдп рдореЗрдВ рд╕рднреА рдмрд╛рд▓ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╡рд┐рдзреЗрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред GiST рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдг B- рдЯреНрд░реА рдХреЗ рд╕рд░рд▓ рдХреНрд░рдо рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

GiST рдЯреНрд░реА рдореЗрдВ рдЦреЛрдЬ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдЧрддрддрд╛ рдлрд╝рдВрдХреНрд╢рди ("рд╕реБрд╕рдВрдЧрдд") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд░реНрдерд┐рдд рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рд╕рдВрдЧрддрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╡рд┐рдзреЗрдп рдЦреЛрдЬ рд╡рд┐рдзреЗрдп (" рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб рдСрдкрд░реЗрдЯрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ " рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ) рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдпрд╛ рдирд╣реАрдВред рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдЯреНрд░реА рдкрд░ рдЙрддрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдкрддреНрддрд╛ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдбреЗрдЯрд╛ рд╡рд┐рдзреЗрдп рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИред

рдЦреЛрдЬ рд░реВрдЯ рдиреЛрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреЗрдбрд╝ рдЦреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВред рд╕реНрдерд┐рд░рддрд╛ рд╕рдорд╛рд░реЛрд╣ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдмрдЪреНрдЪрд╛ рдЗрд╕реЗ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдЬреЛ рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдиреЛрдб рдкрддреНрддрд╛ рд╣реИ, рддреЛ рд╕реНрдерд┐рд░рддрд╛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдкрдВрдХреНрддрд┐ рдХреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЦреЛрдЬ рдЧрд╣рд░рд╛рдИ-рдкрд╣рд▓реЗ рд╣реИ: рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╣рд▓реЗ рдПрдХ рдкрддреНрддреА рдиреЛрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬрд▓реНрдж рд╣реА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрди рд╕рднреА рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдХрдИ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ рддреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЖрдЗрдП рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдЧрддрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдЕрдзрд┐рдХ", "рдХрдо", рдпрд╛ "рдмрд░рд╛рдмрд░" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдВрдЧрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо GiST рдореЗрдВ рд╕рдореНрдорд┐рд▓рди рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ: рдХреБрдЫ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИред рдЬрдм рдПрдХ рдирдпрд╛ рдорд╛рди рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреЗрдбрд╝ рдореЗрдВ рдЗрд╕ рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕рдХреА рдореВрд▓ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╡рд┐рдзреЗрдпрдХреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛)ред рд▓реЗрдХрд┐рди рдЬрдм рдХреЛрдИ рдореВрд▓реНрдп рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореВрд▓ рдкрдВрдХреНрддрд┐ рдХреА рд╡рд┐рдзреЗрдп рдЕрдм рдХрдо рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рдкреГрд╖реНрда рджреЛ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЬрдм рдкреГрд╖реНрда рдореЗрдВ рдирдИ рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ) рдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕реНрдХреНрд░реИрдб (REINDEX рдпрд╛ VACUUM FULL рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде) рд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдХреНрд╕рд░ рдмрджрд▓рддреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП GiST рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рджрдХреНрд╖рддрд╛ рд╕рдордп рдХреЗ рд╕рд╛рде рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрдЧреЗ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ GiST рдХреЗ рдЙрдкрдпреЛрдЧреА рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:

  • рдЕрдВрдХ (рдФрд░ рдЕрдиреНрдп рдЬреНрдпрд╛рдорд┐рддреАрдп рдирд┐рдХрд╛рдп) рдФрд░ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЦреЛрдЬред
  • рдЕрдВрддрд░рд╛рд▓ рдФрд░ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ред
  • рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬред

рдЕрдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░-рдЯреНрд░реА


рд╣рдо рдПрдХ рд╡рд┐рдорд╛рди рдореЗрдВ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдКрдкрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ (рд╣рдо рдЕрдиреНрдп рдЬреНрдпрд╛рдорд┐рддреАрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдПрдХ рдирд┐рдпрдорд┐рдд рдмреА-рдЯреНрд░реА рдЗрд╕ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рдЖрд░-рдЯреНрд░реА рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рдорд╛рди рдХреЛ рдЖрдпрддреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдХреБрд▓ рдХрд╡рд░ рдореЗрдВ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрдВрдХреНрддрд┐ рдПрдХ рдЖрдпрдд рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рдФрд░ рд╡рд┐рдзреЗрдп рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: "рджреА рдЧрдИ рдЖрдпрдд рдореЗрдВ рджреА рдЧрдИ рдмрд╛рдд рдирд┐рд╣рд┐рдд рд╣реИ"ред

рдЖрд░-рдЯреНрд░реА рдХреА рдЬрдбрд╝ рдореЗрдВ рдХрдИ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЖрдпрдд (рд╕рдВрднрд╡рддрдГ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж) рд╣реЛрдВрдЧреЗред рдмрд╛рд▓ рдиреЛрдбреНрд╕ рдореЗрдВ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдпрддрд╛рдХрд╛рд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рдореВрд▓ рдПрдХ рдореЗрдВ рдФрд░ рдХреБрд▓ рдХрд╡рд░ рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд▓реАрдл рдиреЛрдбреНрд╕ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рд▓рд┐рдП, рдлрд┐рд░ рд╕реЗ рдЖрдпрддрд╛рдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдВрдХ рдореЗрдВ "рдврд╣ рдЧрдП"ред

рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрд░-рдЯреНрд░реА рдХреЗ рддреАрди рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдкреЙрдЗрдВрдЯреНрд╕ рдПрдпрд░рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рдХреЙрд░реНрдбрд┐рдиреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ ( рдбреЗрдореЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ "рдПрдпрд░рдкреЛрд░реНрдЯреНрд╕ рдЯреЗрдмрд▓" рд╕реЗ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди Openflights.org рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред


рд▓реЗрд╡рд▓ рдПрдХ: рджреЛ рдмрдбрд╝реЗ рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯрд┐рдВрдЧ рдЖрдпрддрд╛рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред


рд╕реНрддрд░ рджреЛ: рдмрдбрд╝реЗ рдЖрдпрдд рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВред


рд▓реЗрд╡рд▓ рддреАрди: рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрдд рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдкреЗрдЬ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд┐рдВрджреБ рд╣реЛрддреЗ рд╣реИрдВред

рдЕрдм рдЖрдЗрдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ "рдПрдХ-рд╕реНрддрд░реАрдп" рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:



postgres=# create table points(p point); postgres=# insert into points(p) values (point '(1,1)'), (point '(3,2)'), (point '(6,3)'), (point '(5,5)'), (point '(7,8)'), (point '(8,6)'); postgres=# create index on points using gist(p); 

рдЗрд╕ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рд╛рде, рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:



рдмрдирд╛рдП рдЧрдП рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрди рдХреНрд╡реЗрд░реА рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: "рджрд┐рдП рдЧрдП рдЖрдпрдд рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдвреВрдВрдвреЗрдВ"ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: p <@ box '(2,1),(6,3)' (рдСрдкрд░реЗрдЯрд░ <@ рд╕реЗ "points_ops" рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рдЕрд░реНрде рд╣реИ "рдореЗрдВ рдирд┐рд╣рд┐рдд"):

 postgres=# set enable_seqscan = off; postgres=# explain(costs off) select * from points where p <@ box '(2,1),(7,4)'; 
  QUERY PLAN ---------------------------------------------- Index Only Scan using points_p_idx on points Index Cond: (p <@ '(7,4),(2,1)'::box) (2 rows) 

рдСрдкрд░реЗрдЯрд░ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдлрд╝рдВрдХреНрд╢рди (" рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб <@ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ", рдЬрд╣рд╛рдВ рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб рдПрдХ рдмрд┐рдВрджреБ рд╣реИ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдЖрдпрдд рд╣реИ) рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдВрддрд░рд┐рдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдпрд╣ "рд╣рд╛рдБ" рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХреА рдЖрдпрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрдпрдд рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреА рд╣реИ ред рдПрдХ рдкрддреНрддрд╛ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди "рд╣рд╛рдБ" рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХрд╛ рдмрд┐рдВрджреБ ("рдврд╣ рдЧрдпрд╛" рдЖрдпрдд) рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрдпрдд рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред



рдЦреЛрдЬ рд░реВрдЯ рдиреЛрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЖрдпрдд (2,1) - (7,4) (1,1) - (6,3) рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди, рд▓реЗрдХрд┐рди (5,5) - (8,8) рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рджреВрд╕рд░реЗ рдЙрдкрд╢реАрд░реНрд╖рдХ рдореЗрдВ рдЙрддрд░рдирд╛ред



рдПрдХ рдкрддреНрддреА рдиреЛрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рд╣рдо рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рддреАрди рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ: (3.2) рдФрд░ (6.3)ред

 postgres=# select * from points where p <@ box '(2,1),(7,4)'; 
  p ------- (3,2) (6,3) (2 rows) 

internals


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░рдерд╛рдЧрдд "рдкреЗрдЬрд┐рдВрд╕реНрдкреЗрдХреНрдЯ" GiST рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ: "рдЬрд╡реЗрд▓" рд╡рд┐рд╕реНрддрд╛рд░ред рдпрд╣ рдорд╛рдирдХ рд╡рд┐рддрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ ред

рдпрджрд┐ рд╕рдм рд╕рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рддреАрди рдХрд╛рд░реНрдп рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреБрдЫ рдЖрдБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# select * from gist_stat('airports_coordinates_idx'); 
  gist_stat ------------------------------------------ Number of levels: 4 + Number of pages: 690 + Number of leaf pages: 625 + Number of tuples: 7873 + Number of invalid tuples: 0 + Number of leaf tuples: 7184 + Total size of tuples: 354692 bytes + Total size of leaf tuples: 323596 bytes + Total size of index: 5652480 bytes+ (1 row) 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рд╡рд╛рдИ рдЕрдбреНрдбреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЖрдХрд╛рд░ 690 рдкреГрд╖реНрдареЛрдВ рдХрд╛ рд╣реИ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдЪрд╛рд░ рд╕реНрддрд░ рд╣реЛрддреЗ рд╣реИрдВ: рдЬрдбрд╝ рдФрд░ рджреЛ рдЖрдВрддрд░рд┐рдХ рд╕реНрддрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдереЗ, рдФрд░ рдЪреМрдерд╛ рд╕реНрддрд░ рдкрддреНрддреА рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрда рд╣рдЬрд╛рд░ рдЕрдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛: рдпрд╣рд╛рдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП 10% рднрд░рд╛рд╡ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рджреВрд╕рд░рд╛, рд╣рдо рдЗрдВрдбреЗрдХреНрд╕ рдЯреНрд░реА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# select * from gist_tree('airports_coordinates_idx'); 
  gist_tree ----------------------------------------------------------------------------------------- 0(l:0) blk: 0 numTuple: 5 free: 7928b(2.84%) rightlink:4294967295 (InvalidBlockNumber) + 1(l:1) blk: 335 numTuple: 15 free: 7488b(8.24%) rightlink:220 (OK) + 1(l:2) blk: 128 numTuple: 9 free: 7752b(5.00%) rightlink:49 (OK) + 1(l:3) blk: 57 numTuple: 12 free: 7620b(6.62%) rightlink:35 (OK) + 2(l:3) blk: 62 numTuple: 9 free: 7752b(5.00%) rightlink:57 (OK) + 3(l:3) blk: 72 numTuple: 7 free: 7840b(3.92%) rightlink:23 (OK) + 4(l:3) blk: 115 numTuple: 17 free: 7400b(9.31%) rightlink:33 (OK) + ... 

рдФрд░ рддреАрд╕рд░рд╛, рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдкреНрд░рдХрд╛рд░ "рдмреЙрдХреНрд╕" (рдПрдХ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрдд) рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдкрд╛рдБрдЪ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

 postgres=# select level, a from gist_print('airports_coordinates_idx') as t(level int, valid bool, a box) where level = 1; 
  level | a -------+----------------------------------------------------------------------- 1 | (47.663586,80.803207),(-39.2938003540039,-90) 1 | (179.951004028,15.6700000762939),(15.2428998947144,-77.9634017944336) 1 | (177.740997314453,73.5178070068359),(15.0664,10.57970047) 1 | (-77.3191986083984,79.9946975708),(-179.876998901,-43.810001373291) 1 | (-39.864200592041,82.5177993774),(-81.254096984863,-64.2382965088) (5 rows) 

рджрд░рдЕрд╕рд▓, рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рд╕рд┐рд░реНрдл рдЗрд╕ рдбреЗрдЯрд╛ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдереЗред

рдЦреЛрдЬ рдФрд░ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реНрд╕


рдСрдкрд░реЗрдЯрд░реЛрдВ рдиреЗ рдЕрдм рддрдХ рдЪрд░реНрдЪрд╛ рдХреА (рдЬреИрд╕реЗ рдХрд┐ <@ in the predicate p <@ box '(2,1),(7,4)' ) рдХреЛ рдЦреЛрдЬ рдСрдкрд░реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд┐рд╕реА рдХреНрд╡реЗрд░реА рдореЗрдВ рдЦреЛрдЬ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рдкреНрд░рдХрд╛рд░ рднреА рд╣реИ: рдСрд░реНрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдЯрд░ред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрддрдВрдн рдирд╛рдореЛрдВ рдХреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрдЬрд╛рдп ORDER BY рдХреНрд▓реЙрдЬ рдореЗрдВ рдХреНрд░рдо рдХреНрд░рдо рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдРрд╕реА рдХреНрд╡реЗрд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 postgres=# select * from points order by p <-> point '(4,7)' limit 2; 
  p ------- (5,5) (7,8) (2 rows) 

p <-> point '(4,7)' рдпрд╣рд╛рдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреЛ рдПрдХ рдСрд░реНрдбрд░рд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ <-> , рдЬреЛ рдПрдХ рддрд░реНрдХ рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдХреА рджреВрд░реА рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдХреНрд╡реЗрд░реА рдХрд╛ рдЕрд░реНрде рдмрд┐рдВрджреБ (4.7) рдХреЗ рдХрд░реАрдм рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЦреЛрдЬ рдХреЛ k-NN - k-рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕реА рдЦреЛрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЙрдкрдпреБрдХреНрдд рдСрдкрд░реЗрдЯрд░ рдХреНрд▓рд╛рд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "points_ops" рдХреНрд▓рд╛рд╕ рдлреЙрд░ рдкреЙрдЗрдВрдЯреНрд╕) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рджреА рдЧрдИ рдХреНрд╡реЗрд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ ("s" - рдЦреЛрдЬ рдФрд░ "o" - рдСрд░реНрдбрд░рд┐рдВрдЧ) рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рддреА рд╣реИ:

 postgres=# select amop.amopopr::regoperator, amop.amoppurpose, amop.amopstrategy from pg_opclass opc, pg_opfamily opf, pg_am am, pg_amop amop where opc.opcname = 'point_ops' and opf.oid = opc.opcfamily and am.oid = opf.opfmethod and amop.amopfamily = opc.opcfamily and am.amname = 'gist' and amop.amoplefttype = opc.opcintype; 
  amopopr | amoppurpose | amopstrategy -------------------+-------------+-------------- <<(point,point) | s | 1 strictly left >>(point,point) | s | 5 strictly right ~=(point,point) | s | 6 coincides <^(point,point) | s | 10 strictly below >^(point,point) | s | 11 strictly above <->(point,point) | o | 15 distance <@(point,box) | s | 28 contained in rectangle <@(point,polygon) | s | 48 contained in polygon <@(point,circle) | s | 68 contained in circle (9 rows) 

рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рдирдВрдмрд░ рднреА рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ, рдЙрдирдХреЗ рдЕрд░реНрде рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ "рдмреАрдЯреНрд░реА" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд░рдгрдиреАрддрд┐рдпрд╛рдВ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЕрдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рджрд┐рдП рдЧрдП рдПрд▓рд┐рдореЗрдВрдЯ рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (" рдЗрдВрдбреЗрдХреНрд╕рдб-рдлреАрд▓реНрдб рдСрд░реНрдбрд░рд┐рдВрдЧ-рдСрдкрд░реЗрдЯрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди ") рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реИрд▓реНрдпреВ рд╕реЗ рдбрд┐рд╕реНрдЯреЗрдВрд╕ (рдЦрд╛рддреЗ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рдХ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП) рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдПрдХ рдкрддреНрддреА рддрддреНрд╡ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдиреБрдХреНрд░рдорд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рджреВрд░реА рд╣реИред рдПрдХ рдЖрдВрддрд░рд┐рдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд╛рдЗрд▓реНрдб рд▓реАрдл рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рджреВрд░реА рд╡рд╛рдкрд╕ рдХрд░рдиреА рд╣реЛрдЧреАред рдЪреВрдВрдХрд┐ рд╕рднреА рдЪрд╛рдЗрд▓реНрдб рд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдХрд╛рдлреА рдорд╣рдВрдЧрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрдВрдХреНрд╢рди рдХреЛ рдЖрд╢рд╛рд╡рд╛рджреА рд░реВрдк рд╕реЗ рджреВрд░реА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЦреЛрдЬ рджрдХреНрд╖рддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреАрдордд рдкрд░ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрднреА рднреА рджреВрд░реА рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдХрд╛рдо рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред

рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдорд╛рдиреЛрдВ рдХреЛ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PostgreSQL, "btree" рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдЙрдкрдпреБрдХреНрдд рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рддреБрд▓рдирд╛ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ )ред

рдПрдХ рд╕рдорддрд▓ рдореЗрдВ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП, рджреВрд░реА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрде рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ: (x1,y1) <-> (x2,y2) рдХрд╛ рдорд╛рди рдПрдмреНрд╕рд┐рд╕ рдФрд░ рдСрд░реНрдбрд░реНрд╕ рдХреЗ рдЕрдВрддрд░ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд╡рд░реНрдЧрдореВрд▓ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдмрд┐рдВрджреБ рдЖрдпрдд рдХреЗ рднреАрддрд░ рд╕реНрдерд┐рдд рд╣реИ рддреЛ рдмрд┐рдВрджреБ рд╕реЗ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрдд рддрдХ рдХреА рджреВрд░реА рдХреЛ рдЗрд╕ рдЖрдпрдд рдпрд╛ рд╢реВрдиреНрдп рд╕реЗ рдмрд┐рдВрджреБ рд╕реЗ рдиреНрдпреВрдирддрдо рджреВрд░реА рдкрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдЪреНрдЪреЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдореВрд▓реНрдп рдХрд┐рд╕реА рднреА рдмрдЪреНрдЪреЗ рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рджреВрд░реА рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред

рдЖрдЗрдП рдЙрдкрд░реЛрдХреНрдд рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред



рдЦреЛрдЬ рд░реВрдЯ рдиреЛрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдиреЛрдб рдореЗрдВ рджреЛ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрддрд╛рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред (1,1) - (6,3) рдХреА рджреВрд░реА 4.0 рд╣реИ рдФрд░ (5,5) - (8,8) 1.0 рд╣реИред

рджреВрд░реА рдмрдврд╝рд╛рдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдмрд╛рд▓ рдиреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рд╣рдо рдкрд╣рд▓реЗ рдирд┐рдХрдЯрддрдо рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдкрд░ рдЙрддрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рджреГрд╢реНрдпрддрд╛ рдореЗрдВ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рджрд┐рдЦрд╛рдПрдВрдЧреЗ:)



рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рджреЛ рдЕрдВрдХ, (5,5) рдФрд░ (7,8) рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдпрдд (1,1) - (6,3) рдХреЗ рднреАрддрд░ рдЭреВрда рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдХреА рджреВрд░реА 4.0 рдпрд╛ рдЕрдзрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдореЗрдВ рдЙрддрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рддреАрди рдмрд┐рдВрджреБ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ?

 postgres=# select * from points order by p <-> point '(4,7)' limit 3; 
  p ------- (5,5) (7,8) (8,6) (3 rows) 

рд╣рд╛рд▓рд╛рдБрдХрд┐ рджреВрд╕рд░реЗ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдореЗрдВ рдпреЗ рд╕рднреА рдмрд┐рдВрджреБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ (8,6) рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдиреЛрдб рдореЗрдВ рдХрд░реАрдм рдмрд┐рдВрджреБ (4.0 <4.1) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред



рдЖрдВрддрд░рд┐рдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреА рджреВрд░реА (рд╡рд╛рд╕реНрддрд╡рд┐рдХ 4.5 рдХреЗ рдмрдЬрд╛рдп 4.0) рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ, рд╣рдордиреЗ рджрдХреНрд╖рддрд╛ рдХрдо рдХрд░ рджреА (рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдиреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдиреЛрдб рдХреА рдЬрд╛рдВрдЪ рд╢реБрд░реВ рдХрд░ рджреА), рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ред

рд╣рд╛рд▓ рддрдХ рддрдХ, GiST рдПрдХрдорд╛рддреНрд░ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдереА рдЬреЛ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереАред рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ: рдЖрд░рдпреВрдПрдо рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ (рдЖрдЧреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рд╣реИ) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрд░реАрдХреЛрдВ рдХреЗ рдЗрд╕ рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдмреА-рдкреЗрдбрд╝ рдЙрдирдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗрдВрдЧреЗ: рдирд┐рдХрд┐рддрд╛ рдЧреНрд▓реБрдЦреЛрд╡, рд╣рдорд╛рд░реЗ рд╕рд╣рдпреЛрдЧреА, рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдкреИрдЪред рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИред
рдорд╛рд░реНрдЪ 2019 рддрдХ, рдЖрдЧрд╛рдореА PostgreSQL 12 рдореЗрдВ SP-GiST рдХреЗ рд▓рд┐рдП k-NN рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдирд┐рдХрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рднреА)ред рдмреА-рдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдЕрднреА рднреА рдЬрд╛рд░реА рд╣реИред

рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдЖрд░-рдЯреНрд░реА


GiST рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЕрдиреБрдХреНрд░рдордг рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдордп рдЕрдВрддрд░рд╛рд▓ ("tsrange" рдкреНрд░рдХрд╛рд░)ред рд╕рднреА рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдиреЛрдбреНрд╕ рдореЗрдВ рдЖрдпрддреЛрдВ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЕрдВрддрд░рд╛рд▓ рд╣реЛрдВрдЧреЗред

рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдПрдХ рдЭреЛрдкрдбрд╝реА рдХреЛ рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдВрдЧреЗ рдФрд░ рдПрдХ рдЯреЗрдмрд▓ рдореЗрдВ рдЖрд░рдХреНрд╖рдг рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ:

 postgres=# create table reservations(during tsrange); postgres=# insert into reservations(during) values ('[2016-12-30, 2017-01-09)'), ('[2017-02-23, 2017-02-27)'), ('[2017-04-29, 2017-05-02)'); postgres=# create index on reservations using gist(during); 

рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрди рдХреНрд╡реЗрд░реА рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 postgres=# select * from reservations where during && '[2017-01-01, 2017-04-01)'; 
  during ----------------------------------------------- ["2016-12-30 00:00:00","2017-01-08 00:00:00") ["2017-02-23 00:00:00","2017-02-26 00:00:00") (2 rows) 

 postgres=# explain (costs off) select * from reservations where during && '[2017-01-01, 2017-04-01)'; 
  QUERY PLAN ------------------------------------------------------------------------------------ Index Only Scan using reservations_during_idx on reservations Index Cond: (during && '["2017-01-01 00:00:00","2017-04-01 00:00:00")'::tsrange) (2 rows) 

рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП && рдСрдкрд░реЗрдЯрд░ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ; рдЗрд╕рд▓рд┐рдП, рдХреНрд╡реЗрд░реА рдХреЛ рджрд┐рдП рдЧрдП рдПрдХ рдХреЗ рд╕рд╛рде рд╕рднреА рдЕрдВрддрд░рд╛рд▓реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рд░рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджрд┐рдП рдЧрдП рдЕрдВрддрд░рд╛рд▓ рдЖрдВрддрд░рд┐рдХ рдпрд╛ рдкрддреНрддреА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП "рдмреАрдЯреАрдЖрд░рдИ" рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЗрди рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 postgres=# select amop.amopopr::regoperator, amop.amoppurpose, amop.amopstrategy from pg_opclass opc, pg_opfamily opf, pg_am am, pg_amop amop where opc.opcname = 'range_ops' and opf.oid = opc.opcfamily and am.oid = opf.opfmethod and amop.amopfamily = opc.opcfamily and am.amname = 'gist' and amop.amoplefttype = opc.opcintype; 
  amopopr | amoppurpose | amopstrategy -------------------------+-------------+-------------- @>(anyrange,anyelement) | s | 16 contains element <<(anyrange,anyrange) | s | 1 strictly left &<(anyrange,anyrange) | s | 2 not beyond right boundary &&(anyrange,anyrange) | s | 3 intersects &>(anyrange,anyrange) | s | 4 not beyond left boundary >>(anyrange,anyrange) | s | 5 strictly right -|-(anyrange,anyrange) | s | 6 adjacent @>(anyrange,anyrange) | s | 7 contains interval <@(anyrange,anyrange) | s | 8 contained in interval =(anyrange,anyrange) | s | 18 equals (10 rows) 

(рд╕рдорд╛рдирддрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬреЛ "btree" рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред)

internals


рд╣рдо рдЙрд╕реА "рдЬрд╡реЗрд▓" рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрджрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреЙрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ gist_print рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 postgres=# select level, a from gist_print('reservations_during_idx') as t(level int, valid bool, a tsrange); 
  level | a -------+----------------------------------------------- 1 | ["2016-12-30 00:00:00","2017-01-09 00:00:00") 1 | ["2017-02-23 00:00:00","2017-02-27 00:00:00") 1 | ["2017-04-29 00:00:00","2017-05-02 00:00:00") (3 rows) 

рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛


GiST рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛рдУрдВ (EXCLUDE) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ рдХрд┐рд╕реА рднреА рджреЛ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ "рдкрддреНрд░рд╛рдЪрд╛рд░" рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИред рдпрджрд┐ "рдмрд░рд╛рдмрд░" рдСрдкрд░реЗрдЯрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рдмрд╛рдзрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ: рдХрд┐рд╕реА рднреА рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рджрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрджреНрд╡рд┐рддреАрдп рдмрд╛рдзрд╛ рднреАред рд╣рдо рдХреЛрдИ рднреА рдСрдкрд░реЗрдЯрд░ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐:

  1. рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ - "can_exclude" рд╕рдВрдкрддреНрддрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "btree", GiST, рдпрд╛ SP-GiST, рд▓реЗрдХрд┐рди GIN рдирд╣реАрдВ)ред
  2. рдпрд╣ рд╕рд░рд╛рд╣рдиреАрдп рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╢рд░реНрдд рдкреВрд░реА рдХреА рдЬрд╛рддреА рд╣реИ: рдПрдХ рдСрдкрд░реЗрдЯрд░ b = b рдСрдкрд░реЗрдЯрд░ aред

рдпрд╣ рдЙрдкрдпреБрдХреНрдд рд░рдгрдиреАрддрд┐рдпреЛрдВ рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ (рдСрдкрд░реЗрдЯрд░реЛрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ):

  • "рдмреАрдЯреНрд░реА" рдХреЗ рд▓рд┐рдП:
    • "рдмрд░рд╛рдмрд░" =
  • GiST рдФрд░ SP-GiST рдХреЗ рд▓рд┐рдП:
    • "рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛" &&
    • "рд╕рдВрдпреЛрдЧ" ~=
    • рдирд┐рдХрдЯрддрд╛ -|-

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИ: рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдмрд╛рдзрд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧреАред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЬрдм рд╣рдордиреЗ рдмреА-рдкреЗрдбрд╝реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рддреЛ рд╣рдордиреЗ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖред

рдЖрдЗрдП рдПрдХ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рди рджреА рдЬрд╛рдПред

 postgres=# alter table reservations add exclude using gist(during with &&); 

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ рдмрдирд╛рдИ, рддреЛ рд╣рдо рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# insert into reservations(during) values ('[2017-06-10, 2017-06-13)'); 

рд▓реЗрдХрд┐рди рдЯреЗрдмрд▓ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯрд┐рдВрдЧ рдЕрдВрддрд░рд╛рд▓ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА:

 postgres=# insert into reservations(during) values ('[2017-05-15, 2017-06-15)'); 
 ERROR: conflicting key value violates exclusion constraint "reservations_during_excl" DETAIL: Key (during)=(["2017-05-15 00:00:00","2017-06-15 00:00:00")) conflicts with existing key (during)=(["2017-06-10 00:00:00","2017-06-13 00:00:00")). 

"Btree_gist" рдПрдХреНрд╕рдЯреЗрдВрд╢рди


рдЖрдЗрдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рдирдореНрд░ рд╡реНрдпрд╡рд╕рд╛рдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдХрдИ рдХреЙрдЯреЗрдЬ рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:

 postgres=# alter table reservations add house_no integer default 1; 

рд╣рдореЗрдВ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдШрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, GiST рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирддрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

 postgres=# alter table reservations drop constraint reservations_during_excl; postgres=# alter table reservations add exclude using gist(during with &&, house_no with =); 
 ERROR: data type integer has no default operator class for access method "gist" HINT: You must specify an operator class for the index or define a default operator class for the data type. 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, " btree_gist " рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рдЬреЛ рдмреА-рдкреЗрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЬреАрдПрд╕рдЯреА рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред GiST, рдЕрдВрддрддрдГ, рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ "рдЕрдзрд┐рдХ", "рдХрдо" рдФрд░ "рдмрд░рд╛рдмрд░" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╕рд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

 postgres=# create extension btree_gist; postgres=# alter table reservations add exclude using gist(during with &&, house_no with =); 

рдЕрдм рд╣рдо рдЕрднреА рднреА рдкрд╣рд▓реА рдЭреЛрдкрдбрд╝реА рдХреЛ рдЙрд╕реА рддрд┐рдерд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# insert into reservations(during, house_no) values ('[2017-05-15, 2017-06-15)', 1); 
 ERROR: conflicting key value violates exclusion constraint "reservations_during_house_no_excl" 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рджреВрд╕рд░реЗ рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# insert into reservations(during, house_no) values ('[2017-05-15, 2017-06-15)', 2); 

рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреАрдПрд╕рдЯреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ "рдЕрдзрд┐рдХ", "рдХрдо" рдФрд░ "рдмрд░рд╛рдмрд░" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмреА-рдЯреНрд░реА рдЕрднреА рднреА рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХрд░рддрд╛ рд╣реИред рддреЛ рдпрд╣ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬрдм рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ GiST рд╕реВрдЪрдХрд╛рдВрдХ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЖрд░рдбреА-рдЯреНрд░реА


рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдЪрд▓рд┐рдП PostgreSQL рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреНрдпреВрдирддрдо рдкрд░рд┐рдЪрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХрд╛ рдХрд╛рд░реНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЙрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ ред (рдпрджрд┐ рдХрдИ рдорд┐рд▓рд╛рди рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд┐рд▓рд╛рди рдЦреЛрдЬрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣реЗрдВрдЧреЗред)

рдЦреЛрдЬ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ "tsvector" рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд▓реЗрдХреНрд╕реЗрдо рдФрд░ рдЙрдирдХреЗ рдкрдж рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдХреНрдореЗрдореНрд╕ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╢рдмреНрдж рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрджреЛрдВ рдХреЛ рдЖрдо рддреМрд░ рдкрд░ рд▓реЛрдЕрд░рдХреЗрд╕ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЪрд░ рдЕрдВрдд рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 postgres=# select to_tsvector('There was a crooked man, and he walked a crooked mile'); 
  to_tsvector ----------------------------------------- 'crook':4,10 'man':5 'mile':11 'walk':8 (1 row) 

рд╣рдо рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рд╢рдмреНрдж (рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдЯреЙрдк рд╢рдмреНрдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ("рд╡рд╣рд╛рдБ", "рдерд╛", "рдП", "рдФрд░", "рд╡рд╣") рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрднрд╡рддрдпрд╛ рдЕрдХреНрд╕рд░ рд╕рдордЭрджрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рд╕рднреА рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИред

рдПрдХ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдХреЛ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: "tsquery"ред рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╕рдВрдпреЛрдЬрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдпреБрдХреНрдд рдПрдХ рдпрд╛ рдХрдИ рд▓реЗрдХреНрд╕рдореЗрд╕ рд╣реЛрддреЗ рд╣реИрдВ: "рдФрд░", "рдпрд╛" | тАЛтАЛ"," рдирд╣реАрдВ "! .. рд╣рдо рдСрдкрд░реЗрд╢рди рдкреВрд░реНрд╡рддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 postgres=# select to_tsquery('man & (walking | running)'); 
  to_tsquery ---------------------------- 'man' & ( 'walk' | 'run' ) (1 row) 

рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдореИрдЪ рдСрдкрд░реЗрдЯрд░ @@ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 postgres=# select to_tsvector('There was a crooked man, and he walked a crooked mile') @@ to_tsquery('man & (walking | running)'); 
  ?column? ---------- t (1 row) 

 postgres=# select to_tsvector('There was a crooked man, and he walked a crooked mile') @@ to_tsquery('man & (going | running)'); 
  ?column? ---------- f (1 row) 

рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЕрдм рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╣рдо GIN рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдбреБрдмрдХреА рд▓рдЧрд╛рдПрдВрдЧреЗред

RD-рдкреЗрдбрд╝


рддреЗрдЬреА рд╕реЗ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рддрд╛рд▓рд┐рдХрд╛ рдХреЛ "tsvector" рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрд▓рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдорд╣рдВрдЧрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕ рд╕реНрддрдВрдн рдкрд░ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреАрдПрд╕рдЯреАред

 postgres=# create table ts(doc text, doc_tsv tsvector); postgres=# create index on ts using gist(doc_tsv); postgres=# insert into ts(doc) values ('Can a sheet slitter slit sheets?'), ('How many sheets could a sheet slitter slit?'), ('I slit a sheet, a sheet I slit.'), ('Upon a slitted sheet I sit.'), ('Whoever slit the sheets is a good sheet slitter.'), ('I am a sheet slitter.'), ('I slit sheets.'), ('I am the sleekest sheet slitter that ever slit sheets.'), ('She slits the sheet she sits on.'); postgres=# update ts set doc_tsv = to_tsvector(doc); 

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЯреНрд░рд┐рдЧрд░ рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ ("tsvector" рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг)ред

 postgres=# select * from ts; 
 -[ RECORD 1 ]---------------------------------------------------- doc | Can a sheet slitter slit sheets? doc_tsv | 'sheet':3,6 'slit':5 'slitter':4 -[ RECORD 2 ]---------------------------------------------------- doc | How many sheets could a sheet slitter slit? doc_tsv | 'could':4 'mani':2 'sheet':3,6 'slit':8 'slitter':7 -[ RECORD 3 ]---------------------------------------------------- doc | I slit a sheet, a sheet I slit. doc_tsv | 'sheet':4,6 'slit':2,8 -[ RECORD 4 ]---------------------------------------------------- doc | Upon a slitted sheet I sit. doc_tsv | 'sheet':4 'sit':6 'slit':3 'upon':1 -[ RECORD 5 ]---------------------------------------------------- doc | Whoever slit the sheets is a good sheet slitter. doc_tsv | 'good':7 'sheet':4,8 'slit':2 'slitter':9 'whoever':1 -[ RECORD 6 ]---------------------------------------------------- doc | I am a sheet slitter. doc_tsv | 'sheet':4 'slitter':5 -[ RECORD 7 ]---------------------------------------------------- doc | I slit sheets. doc_tsv | 'sheet':3 'slit':2 -[ RECORD 8 ]---------------------------------------------------- doc | I am the sleekest sheet slitter that ever slit sheets. doc_tsv | 'ever':8 'sheet':5,10 'sleekest':4 'slit':9 'slitter':6 -[ RECORD 9 ]---------------------------------------------------- doc | She slits the sheet she sits on. doc_tsv | 'sheet':4 'sit':6 'slit':2 

рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЖрд░-рдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП "рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрдд" рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рд╣рдо рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХреБрдЫ рд╕рдВрд╢реЛрдзрди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рддрдерд╛рдХрдерд┐рдд рдЖрд░рдбреА-рдЯреНрд░реА (рдЖрд░рдбреА рдХрд╛ рдЕрд░реНрде "рд░реВрд╕реА рдЧреБрдбрд╝рд┐рдпрд╛" рд╣реИ)ред рдПрдХ рд╕реЗрдЯ рдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓реЗрдХреНрд╕реЗрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рд╕реЗрдЯ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЖрд░рдбреА-рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдПрдХ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрдд рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдПрдХ рд╕реЗрдЯ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рд▓ рд╕реЗрдЯ рдХреЗ рд╕рднреА рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреИрд╕реЗ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рд╕реАрдзрд╛ рддрд░реАрдХрд╛ рд╕рд┐рд░реНрдл рд╕реЗрдЯ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рдд doc_tsv @@ to_tsquery('sit') рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдиреЛрдбреНрд╕ рддрдХ рдЙрддрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ "рдмреИрдардирд╛" рд╣реИ:



рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдореБрджреНрджреЗ рд╣реИрдВред рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд▓реЗрдХреНрд╕рдореЗрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдЯреЛрд╕реНрдЯ рдореЗрдВ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдмрд╣реБрдд рдХрдо рдХреБрд╢рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдкреНрд░рддреНрдпреЗрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдХреБрдЫ рдЕрджреНрд╡рд┐рддреАрдп рд▓реЗрдХреНрд╕реЗрдо рд╣реИрдВ, рддреЛ рд╕реЗрдЯ рдХрд╛ рд╕рдВрдШ рдЕрднреА рднреА рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЬрдбрд╝ рд╕реЗ рдмрдбрд╝реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рддрдХред

рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдПред рдФрд░ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдПрдХ рдФрд░, рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ, рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ - рдПрдХ рддрдерд╛рдХрдерд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреЗрдбрд╝ ред рдЗрд╕рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЙрди рд╕рднреА рд╕реЗ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реИ рдЬреЛ рдмреНрд▓реВрдо рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред

рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдХреНрдореЗ рдХреЛ рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХрд╛ рдПрдХ рд╕рд╛ рддрд╛рд░ рдЬрд╣рд╛рдВ рд╕рднреА рдмрд┐рдЯреНрд╕ рд▓реЗрдХрд┐рди рдПрдХ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ lexeme рдХреЗ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА)ред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрд┐рдЯрдХреНрд╡рд╛рдЗрди рдпрд╛ рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ lexemes рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╣реИред

рдЖрдЗрдП рд▓реЗрдХреНрдореЗрдореНрд╕ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдорд╛рдирддреЗ рд╣реИрдВ:

 1,000,000 рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
 рдХрднреА 0001000
 рдЕрдЪреНрдЫрд╛ 0000010
 рдордгрд┐ 0000100
 рдЪрд╛рджрд░ 0000100
 рд╕рдмрд╕реЗ рдЪрд┐рдХрдирд╛ 0100000
 0010000 рдмреИрдареЗрдВ
 рднрдЯреНрдард╛ 0001000
 рдлрд┐рд╕рд▓рди 0000001
 0000010 рдкрд░
 рдЬреЛ рднреА 0010000

рдлрд┐рд░ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

 рдХреНрдпрд╛ рдПрдХ рд╢реАрдЯ рд╕реНрд▓рд┐рдЯ рд╕реНрд▓рд┐рдЯ рд╢реАрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ?  0001101
 рдПрдХ рд╢реАрдЯ рдореЗрдВ рдХрд┐рддрдиреА рд╢реАрдЯ рдлрд┐рд╕рд▓ рд╕рдХрддреА рд╣реИрдВ?  1001101
 рдореИрдВ рдПрдХ рдЪрд╛рджрд░, рдПрдХ рдЪрд╛рджрд░ рдореИрдВ рднрдЯреНрдард╛ред  0001100
 рдПрдХ рддрд┐рд░рдЫреА рдЪрд╛рджрд░ рдХреЗ рдКрдкрд░ рдореИрдВ рдмреИрдарддрд╛ рд╣реВрдБред  0011110
 рдЬреЛ рднреА рдЪрд╛рджрд░реЛрдВ рдХреЛ рдЦрд┐рд╕рдХрд╛рддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫреА рдЪрд╛рджрд░ рд╣реЛрддреА рд╣реИред  0011111
 рдореИрдВ рдПрдХ рдЪрд╛рджрд░ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реВрдБред  0000101
 рдореИрдВ рдЪрд╛рджрд░ рдУрдврд╝ рд▓реЗрддрд╛ рд╣реВрдВред  0001100
 рдореИрдВ рд╕рдмрд╕реЗ рдЪрд┐рдХрдирд╛ рдЪрд╛рджрд░ рд╣реИ рдЬреЛ рдХрднреА рдЪрд╛рджрд░реЗрдВ рдХрд╛рдЯрддрд╛ рд╣реВрдВред  0101101
 рд╡рд╣ рдЬрд┐рд╕ рдЪрд╛рджрд░ рдкрд░ рдмреИрдарддреА рд╣реИ, рдЙрд╕реЗ рдХрд╛рдЯ рджреЗрддреА рд╣реИред  0011100

рдЗрдВрдбреЗрдХреНрд╕ рдЯреНрд░реА рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЗ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ: рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЦрд╛рдореА рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╕рдЯреАрдХрддрд╛ рдХреЛ рдХреЙрдореНрдкреИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд▓рд┐рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдЗрдП рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ doc_tsv @@ to_tsquery('sit') ред рдФрд░ рдЪрд▓реЛ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдЧрдгрдирд╛ рдЙрд╕реА рддрд░рд╣ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 0010000ред рд╕рдВрдЧрддрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрди рд╕рднреА рдмрд╛рд▓ рдиреЛрдбреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреНрд╡реЗрд░реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ:



рдКрдкрд░ рдХреА рдЖрдХреГрддрд┐ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ: рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрдбрд╝ рдкреАрд▓рд╛ рд╣реЛ рдЧрдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди рдЕрддреНрдпрдзрд┐рдХ рдиреЛрдбреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдордиреЗ "рдЬреЛ рдХреЛрдИ" рд▓реЗрдХреНрдореЗ рдХреЛ рдЙрдард╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ "рд╕рд┐рдЯ" рд▓реЗрдХреНрд╕реЗрдо рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рдорд╛рди рдереЗред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреИрдЯрд░реНрди рдореЗрдВ рдХреЛрдИ рднреА рдЧрд▓рдд рдирдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рдиреЛрдВ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рднреА рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдВрдЧреЗ: рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрд╢реБрдн рджрд╕реНрддрд╛рд╡реЗрдЬ "рдореИрдВ рд╕реНрд▓рд┐рдЯ рдП рд╢реАрдЯ, рд╢реАрдЯ рдЖрдИ рд╕реНрд▓рд┐рдЯ" рдФрд░ "рдЖрдИ рд╕реНрд▓рд┐рдЯ рд╢реАрдЯ" (рджреЛрдиреЛрдВ рдореЗрдВ 0001100 рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ)ред рдФрд░ рдЕрдЧрд░ рдПрдХ рд▓реАрдл рдЗрдВрдбреЗрдХреНрд╕ рдкрдВрдХреНрддрд┐ "tsvector" рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рддреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрд╡рдпрдВ рдЧрд▓рдд рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рджреЗрдЧрд╛ред рдмреЗрд╢рдХ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рдзрд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЗрдВрдЬрди рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреБрди: рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧреА, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрди рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЛ рдирд╣реАрдВ рджреЗрдЦреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЦреЛрдЬ рджрдХреНрд╖рддрд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рджрд░рдЕрд╕рд▓, рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ 7-рдмрд┐рдЯ рдХреЗ рдмрдЬрд╛рдп рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ 124-рдмрд╛рдЗрдЯ рдмрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдореБрджреНрджреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЛ рднреА рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд┐рдзрд┐ рдХреА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдиреБрдХреНрд░рдорд┐рдд "tsvector" рдХреЛ рдкрддреНрддреА рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрднреА рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (1/16 рд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо) рдПрдХ рдкреГрд╖реНрда, рдЬреЛ 8-рдХреЗрдмреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдЖрдзрд╛ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╣реИ)ред

рдЙрджрд╛рд╣рд░рдг


рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдиреБрдХреНрд░рдордг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдЗрдП "pgsql-hackers" рдИрдореЗрд▓ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд▓реЗрдВред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рднреЗрдЬрдиреЗ рдХреА рддрд╛рд░реАрдЦ, рд╡рд┐рд╖рдп, рд▓реЗрдЦрдХ рдФрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде 356125 рд╕рдВрджреЗрд╢ рд╣реИрдВ:

 fts=# select * from mail_messages order by sent limit 1; 
 -[ RECORD 1 ]------------------------------------------------------------------------ id | 1572389 parent_id | 1562808 sent | 1997-06-24 11:31:09 subject | Re: [HACKERS] Array bug is still there.... author | "Thomas G. Lockhart" <Thomas.Lockhart@jpl.nasa.gov> body_plain | Andrew Martin wrote: + | > Just run the regression tests on 6.1 and as I suspected the array bug + | > is still there. The regression test passes because the expected output+ | > has been fixed to the *wrong* output. + | + | OK, I think I understand the current array behavior, which is apparently+ | different than the behavior for v1.0x. + ... 

"Tsvector" рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрд▓рдо рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рднрд░рдирд╛ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ред рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡реЗрдХреНрдЯрд░ (рд╡рд┐рд╖рдп, рд▓реЗрдЦрдХ рдФрд░ рд╕рдВрджреЗрд╢ рдкрд╛рда) рдореЗрдВ рддреАрди рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдПрдХ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдордирдорд╛рдиреЗ рднрд╛рдЧреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 fts=# alter table mail_messages add column tsv tsvector; fts=# update mail_messages set tsv = to_tsvector(subject||' '||author||' '||body_plain); 
 NOTICE: word is too long to be indexed DETAIL: Words longer than 2047 characters are ignored. ... UPDATE 356125 
 fts=# create index on mail_messages using gist(tsv); 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╣реБрдд рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рд╢рдмреНрдж рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рдереЗред рд▓реЗрдХрд┐рди рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдВрддрддрдГ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЦреЛрдЬ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

 fts=# explain (analyze, costs off) select * from mail_messages where tsv @@ to_tsquery('magic & value'); 
  QUERY PLAN ---------------------------------------------------------- Index Scan using mail_messages_tsv_idx on mail_messages (actual time=0.998..416.335 rows=898 loops=1) Index Cond: (tsv @@ to_tsquery('magic & value'::text)) Rows Removed by Index Recheck: 7859 Planning time: 0.203 ms Execution time: 416.492 ms (5 rows) 

рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 898 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рддреЗ рд╣реБрдП, рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдиреЗ 7859 рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓реМрдЯрд╛ рджреАрдВ рдЬрд┐рдиреНрд╣реЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдкреБрди: рдЬрд╛рдБрдЪ рдХрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣ рджрдХреНрд╖рддрд╛ рдкрд░ рд╕рдЯреАрдХрддрд╛ рдХреА рд╣рд╛рдирд┐ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

internals


рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд┐рд░ рд╕реЗ "рдЬрд╡реЗрд▓" рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 fts=# select level, a from gist_print('mail_messages_tsv_idx') as t(level int, valid bool, a gtsvector) where a is not null; 
  level | a -------+------------------------------- 1 | 992 true bits, 0 false bits 2 | 988 true bits, 4 false bits 3 | 573 true bits, 419 false bits 4 | 65 unique words 4 | 107 unique words 4 | 64 unique words 4 | 42 unique words ... 

рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ "gtsvector" рдХреЗ рдорд╛рди рдЬреЛ рдХрд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд▓рд╕, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕реНрд░реЛрдд "tsvector"ред рдпрджрд┐ рд╡реЗрдХреНрдЯрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд▓реЗрдХреНрд╕реЗрдо (рдЕрджреНрд╡рд┐рддреАрдп рд╢рдмреНрдж) рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдиреНрдпрдерд╛, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╕рдЪреНрдЪреЗ рдФрд░ рдЭреВрдареЗ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд░реВрдЯ рдиреЛрдб рдореЗрдВ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ "рд╕рднреА рд▓реЛрдЧреЛрдВ" рдХреЗ рд▓рд┐рдП рдкрддрд┐рдд рд╣реЛ рдЧрдпрд╛, рдЕрд░реНрдерд╛рдд, рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрддрд░ рдмрд┐рд▓реНрдХреБрд▓ рдмреЗрдХрд╛рд░ рд╣реЛ рдЧрдпрд╛ (рдФрд░ рдПрдХ рдФрд░ рд▓рдЧрднрдЧ рдмреЗрдХрд╛рд░ рд╣реЛ рдЧрдпрд╛, рдХреЗрд╡рд▓ рдЪрд╛рд░ рдЭреВрдареЗ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде)ред

рдЧреБрдг


рдЖрдЗрдП GiST рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ (рдкреНрд░рд╢реНрди рдкрд╣рд▓реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдереЗ ):

  amname | name | pg_indexam_has_property --------+---------------+------------------------- gist | can_order | f gist | can_unique | f gist | can_multi_col | t gist | can_exclude | t 

рдореВрд▓реНрдпреЛрдВ рдХреА рдЫрдВрдЯрд╛рдИ рдФрд░ рдЕрджреНрд╡рд┐рддреАрдп рдмрд╛рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдХрдИ рд╕реНрддрдВрднреЛрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ-рдкрд░рдд рдЧреБрдг рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

  name | pg_index_has_property ---------------+----------------------- clusterable | t index_scan | t bitmap_scan | t backward_scan | f 

рдФрд░ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЧреБрдг рд╕реНрддрдВрдн рдкрд░рдд рдХреЗ рд╣реИрдВред рдХреБрдЫ рдЧреБрдг рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ:

  name | pg_index_column_has_property --------------------+------------------------------ asc | f desc | f nulls_first | f nulls_last | f orderable | f search_array | f search_nulls | t 

(рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ; рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛; рдирд▓ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред)

рд▓реЗрдХрд┐рди рджреЛ рд╢реЗрд╖ рдЧреБрдг, "рджреВрд░реА_рдХреНрд░рдордиреАрдп" рдФрд░ "рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдпреЛрдЧреНрдп", рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛:

  name | pg_index_column_has_property --------------------+------------------------------ distance_orderable | t returnable | t 

рдкрд╣рд▓реА рд╕рдВрдкрддреНрддрд┐ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕реА рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рджреВрд░реА рдСрдкрд░реЗрдЯрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдФрд░ рджреВрд╕рд░рд╛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рд▓реАрдл рдЗрдВрдбреЗрдХреНрд╕ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЕрдВрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЖрдпрддреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреА рд╣реИрдВ, рдлрд┐рд░ рднреА рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреА рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдЧреБрдг рд╣реИрдВ:

  name | pg_index_column_has_property --------------------+------------------------------ distance_orderable | f returnable | t 

рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП, рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдФрд░ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

  name | pg_index_column_has_property --------------------+------------------------------ distance_orderable | f returnable | f 

рдЗрдВрдбреЗрдХреНрд╕-рдУрдирд▓реА рд╕реНрдХреИрди рдХрд╛ рд╕рдорд░реНрдерди рдЦреЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрддреНрддрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдорд╛рдореВрд▓реА рдиреБрдХрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА "tsvector" рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдорд╛рди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рд╕реНрд░реЛрдд рдкрд╛рда рд╣реИ рдЬрд┐рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдЧрд╛рдпрдм рд╣реИред

рдЕрдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░


рдЕрдВрдд рдореЗрдВ, рд╣рдо рдХреБрдЫ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЬреНрдпрд╛рдорд┐рддреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ (рдЕрдВрдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ), рдЕрдВрддрд░рд╛рд▓ рдФрд░ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ GiST рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред

рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ, рдпрд╣ IP- рдкрддреЛрдВ рдХреЗ рд▓рд┐рдП " inet " рдкреНрд░рдХрд╛рд░ рд╣реИред рдмрд╛рдХреА рд╕рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • рдХреНрдпреВрдм рдмрд╣реБ-рдЖрдпрд╛рдореА рдХреНрдпреВрдмреНрд╕ рдХреЗ рд▓рд┐рдП "рдХреНрдпреВрдм" рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐рд╕реА рд╡рд┐рдорд╛рди рдореЗрдВ рдЬреНрдпрд╛рдорд┐рддреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, GiST рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЖрд░-рдЯреНрд░реА, рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
  • seg рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП "seg" рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (R- рдЯреНрд░реА) рдХреЗ рд▓рд┐рдП GiST рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИред
  • рдЕрдВрддрд░рд╛рдпрди рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП GiST рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИред рджреЛ рдСрдкрд░реЗрдЯрд░ рдХрдХреНрд╖рд╛рдПрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ: "gist__int_ops" (рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдкреВрд░реНрдг рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдЖрд░рдбреА-рдЯреНрд░реА) рдФрд░ "gist__bigint_ops" (рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЖрд░рдбреА-рдЯреНрд░реА)ред рдкрд╣рд▓реА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫреЛрдЯреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ - рдмрдбрд╝реЗ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдПред
  • ltree рдкреЗрдбрд╝ рдХреА рддрд░рд╣ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП "ltree" рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (RD- рдЯреНрд░реА) рдХреЗ рд▓рд┐рдП GiST рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
  • рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдореЗрдВ рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП pg_trgm рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ "gist_trgm_ops" рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди GIN рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдЖрдЧреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рд╣реИред

рдкрд░ рдкрдврд╝реЗрдВ ред

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


All Articles