рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА PostgreSQL
рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЗрдВрдЬрди рдФрд░
рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ , рд╕рд╛рде рд╣реА
рд╣реИрд╢ рдЗрдВрдбреЗрдХреНрд╕ , рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИред рдЕрдм рд╣рдо рдмреА-рдЯреНрд░реА, рд╕рдмрд╕реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд▓реЗрдЦ рдмрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдзреИрд░реНрдп рд░рдЦреЗрдВред
BTREE
рд╕рдВрд░рдЪрдирд╛
рдмреА-рдЯреНрд░реА рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕реЗ "рдмреАрдЯреАрдЖрд░рдИ" рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрд┐рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, "рдЕрдзрд┐рдХ", "рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░", "рдХрдо", "рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░", рдФрд░ "рдмрд░рд╛рдмрд░" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХреЛ рдХрднреА-рдХрднреА рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ
рд╣рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░
рд╡рд╛рдкрд╕ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ ред
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдмреА-рдЯреНрд░реА рдХреА рдЗрдВрдбреЗрдХреНрд╕ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрддреНрддреА рдкреГрд╖реНрдареЛрдВ рдореЗрдВ, рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд (рдЪрд╛рдмрд┐рдпрд╛рдБ) рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ (TID) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдЖрдВрддрд░рд┐рдХ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдПрдХ рдмрд╛рд▓ рдкреГрд╖реНрда рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреГрд╖реНрда рдореЗрдВ рдиреНрдпреВрдирддрдо рдорд╛рди рд╕рдорд╛рд╣рд┐рдд рдХрд░рддреА рд╣реИред
рдмреА-рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдХреНрд╖рдг рд╣реИрдВ:
- рдмреА-рдкреЗрдбрд╝ рд╕рдВрддреБрд▓рд┐рдд рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрддреА рдкреГрд╖реНрда рдХреЛ рдЖрдВрддрд░рд┐рдХ рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЬрдбрд╝ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреА рдЦреЛрдЬ рдореЗрдВ рд╕рдорд╛рди рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
- рдмреА-рдкреЗрдбрд╝ рдмрд╣реБ-рд╢рд╛рдЦрд╛рдУрдВ рд╡рд╛рд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда (рдЖрдорддреМрд░ рдкрд░ 8 рдХреЗрдмреА) рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ (рд╕реИрдХрдбрд╝реЛрдВ) рдЯреАрдЖрдИрдбреА тАЛтАЛрд╣реЛрддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рдмреА-рдкреЗрдбрд╝реЛрдВ рдХреА рдЧрд╣рд░рд╛рдИ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП 4-5 рддрдХред
- рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рд░реВрдк рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рджреЛрдиреЛрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмреАрдЪ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░), рдФрд░ рд╕рдорд╛рди рд╕реНрддрд░ рдХреЗ рдкреГрд╖реНрда рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдПрдХ рджреНрд╡рд┐рджрд┐рд╢ рд╕реВрдЪреА рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╣рд░ рдмрд╛рд░ рд░реВрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдП рдмрд┐рдирд╛ рдПрдХ рд╕реВрдЪреА рд╡реЙрдХ рдпрд╛ рдПрдХ рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЪрд▓рддреЗ рд╣реБрдП рдПрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдиреАрдЪреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд╖реЗрддреНрд░ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред

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

рдЦреЛрдЬ рд░реВрдЯ рдиреЛрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдмрдЪреНрдЪреЗ рдХреЛ рдЙрддрд░рдирд╛ рд╣реИред рд░реВрдЯ рдиреЛрдб (4, 32, 64) рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдЗрд╕рд▓рд┐рдП рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдореЗрдВ рдореВрд▓реНрдп рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред 32 to 49 <64 рдХреЗ рдмрд╛рдж рд╕реЗ, рд╣рдореЗрдВ рджреВрд╕рд░реЗ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдореЗрдВ рдЙрддрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдЧрд▓рд╛, рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрдм рддрдХ рд╣рдо рдПрдХ рдкрддреНрддреА рдиреЛрдб рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ TID рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рд╡рд┐рд╡рд░рдг рдЗрд╕ рд╕рд░рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдЧреИрд░-рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╕рдорд╛рди рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдПрдХ рдкреГрд╖реНрда рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ 49 рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдиреЛрдб рд╕реЗ рдЙрддрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдВрдХрдбрд╝реЗ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЗрд╕ рддрд░рд╣ рд╣рдо рдкреВрд░реНрд╡рд╡рд░реНрддреА рдкрддреНрддреА рдкреГрд╖реНрда рдореЗрдВ "49" рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред ред рдЗрд╕рд▓рд┐рдП, рдЬрдм рд╣рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдкреГрд╖реНрда рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдмрд░рд╛рдмрд░ рдХреБрдВрдЬреА рдорд┐рд▓ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрд╛рдпреАрдВ рдУрд░ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдиреАрдЪреЗ рдЙрддрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдорд╛рдВрдЧреА рдЧрдИ рдХреБрдВрдЬреА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рддрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрддрд░ рдХреА рд╕реВрдЪрдХрд╛рдВрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИред
(рдПрдХ рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВ: рдкреЗрдбрд╝ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкреГрд╖реНрдареЛрдВ рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐ рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрди рд╕рдорд╡рд░реНрддреА рд╕рдВрдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рдиреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд╛рд▓реЗ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реИрдВред рдЬрд╣рд╛рдБ рднреА рд╕рдВрднрд╡ рд╣реЛред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВрдЧреЗред)
рдЕрд╕рдорд╛рдирддрд╛ рд╕реЗ рдЦреЛрдЬреЗрдВ
рдЬрдм рд╕реНрдерд┐рддрд┐ "
рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб (
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ " (рдпрд╛ "
рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб "
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ") рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реА рдмрд╛рд░ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╕рдорддрд╛ рд╢рд░реНрдд"
рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб =
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "рджреНрд╡рд╛рд░рд╛ рдПрдХ рдорд╛рди (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЪрд▓рддреЗ рд╣реИрдВ рдЕрдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ рдкрддреНрддреА рдкреГрд╖реНрдареЛрдВред
рдЖрдВрдХрдбрд╝рд╛ тЙд 35 рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

"рдЕрдзрд┐рдХ" рдФрд░ "рдХрдо" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдореВрд▓реНрдп рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд░реЗрдВрдЬ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗрдВ
рдЬрдм "
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 1 ed
рдЕрдиреБрдХреНрд░рдорд┐рдд-рдХреНрд╖реЗрддреНрд░ "
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 2 "рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реНрдерд┐рддрд┐"
рдЕрдиреБрдХреНрд░рдорд┐рдд-рдХреНрд╖реЗрддреНрд░ =
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 1 "рджреНрд╡рд╛рд░рд╛ рдПрдХ рдореВрд▓реНрдп рдкрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрддреНрддреА рдХреЗ рдкрдиреНрдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕реНрдерд┐рддрд┐"
рдЕрдиреБрдХреНрд░рдорд┐рдд-рдХреНрд╖реЗрддреНрд░ тЙд
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 2 "рд╕реЗ рдорд┐рд▓рддреА рд╣реИ; рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд: рджреВрд╕рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЪрд▓реЗрдВ рдЬрдм рддрдХ рд╣рдо рдкрд╣рд▓реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗред
рдЖрдВрдХрдбрд╝рд╛ 23 23 n this 64 рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

рдЙрджрд╛рд╣рд░рдг
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдПрдВ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИрдВред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдбреЗрдореЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдмрд╛рд░ рд╣рдо рд╡рд┐рдорд╛рди рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдореЗрдВ рдиреМ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рдпреЛрдЬрдирд╛рдХрд╛рд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рдкреГрд╖реНрда рдлрд┐рдЯ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
demo=# select * from aircrafts;
aircraft_code | model | range ---------------+---------------------+------- 773 | Boeing 777-300 | 11100 763 | Boeing 767-300 | 7900 SU9 | Sukhoi SuperJet-100 | 3000 320 | Airbus A320-200 | 5700 321 | Airbus A321-200 | 5600 319 | Airbus A319-100 | 6700 733 | Boeing 737-300 | 4200 CN1 | Cessna 208 Caravan | 1200 CR2 | Bombardier CRJ-200 | 2700 (9 rows)
demo=# create index on aircrafts(range); demo=# set enable_seqscan = off;
(рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, "рдмреАрдЯреНрд░реА (рд░реЗрдВрдЬ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдорд╛рди рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдПрдВ", рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмреА-рдЯреНрд░реА рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред)
рд╕рдорд╛рдирддрд╛ рд╕реЗ рдЦреЛрдЬреЗрдВ:
demo=# explain(costs off) select * from aircrafts where range = 3000;
QUERY PLAN --------------------------------------------------- Index Scan using aircrafts_range_idx on aircrafts Index Cond: (range = 3000) (2 rows)
рдЕрд╕рдорд╛рдирддрд╛ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗрдВ:
demo=# explain(costs off) select * from aircrafts where range < 3000;
QUERY PLAN --------------------------------------------------- Index Scan using aircrafts_range_idx on aircrafts Index Cond: (range < 3000) (2 rows)
рдФрд░ рд╕реАрдорд╛ рд╕реЗ:
demo=# explain(costs off) select * from aircrafts where range between 3000 and 5000;
QUERY PLAN ----------------------------------------------------- Index Scan using aircrafts_range_idx on aircrafts Index Cond: ((range >= 3000) AND (range <= 5000)) (2 rows)
рдЫрдВрдЯрд╛рдИ
рдЖрдЗрдП рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рд╕реНрдХреИрди (рдЗрдВрдбреЗрдХреНрд╕, рдЗрдВрдбреЗрдХреНрд╕-рдУрдирд▓реА рдпрд╛ рдмрд┐рдЯрдореИрдк) рдХреЗ рд╕рд╛рде, "btree" рдПрдХреНрд╕реЗрд╕ рдореЗрдердб рдиреЗ рдбреЗрдЯрд╛ рдСрд░реНрдбрд░ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реЙрд░реНрдЯ рд╕реНрдерд┐рддрд┐ рдкрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рд╣реИ, рддреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛: рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди, рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рдж рдХреА рдЫрдБрдЯрд╛рдИ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИред
рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ
рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╕рдордп рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЙрд░реНрдЯ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдбрд╝рд╛рди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
demo=# create index on aircrafts(range desc);
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╛рдИрдВ рдУрд░ рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдмрдбрд╝реЗ рдореВрд▓реНрдп рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдЫреЛрдЯреЗ рдореВрд▓реНрдп рджрд╛рдИрдВ рдУрд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдпрджрд┐ рд╣рдо рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ?
рдЙрджреНрджреЗрд╢реНрдп рдорд▓реНрдЯреА-рдХреЙрд▓рдо рдЗрдВрдбреЗрдХреНрд╕ рд╣реИред рдЖрдЗрдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ, рдордзреНрдп, рдФрд░ рд▓рдВрдмреА рджреВрд░реА рдХреЗ рд╢рд┐рд▓реНрдк рдореЗрдВ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рд╛рде рд╡рд┐рдорд╛рди рдореЙрдбрд▓ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ:
demo=# create view aircrafts_v as select model, case when range < 4000 then 1 when range < 10000 then 2 else 3 end as class from aircrafts; demo=# select * from aircrafts_v;
model | class ---------------------+------- Boeing 777-300 | 3 Boeing 767-300 | 2 Sukhoi SuperJet-100 | 1 Airbus A320-200 | 2 Airbus A321-200 | 2 Airbus A319-100 | 2 Boeing 737-300 | 2 Cessna 208 Caravan | 1 Bombardier CRJ-200 | 1 (9 rows)
рдФрд░ рдЖрдЗрдП рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):
demo=# create index on aircrafts( (case when range < 4000 then 1 when range < 10000 then 2 else 3 end), model);
рдЕрдм рд╣рдо рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рджреЛрдиреЛрдВ рд╕реНрддрдВрднреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЫрд╛рдВрдЯреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
demo=# select class, model from aircrafts_v order by class, model;
class | model -------+--------------------- 1 | Bombardier CRJ-200 1 | Cessna 208 Caravan 1 | Sukhoi SuperJet-100 2 | Airbus A319-100 2 | Airbus A320-200 2 | Airbus A321-200 2 | Boeing 737-300 2 | Boeing 767-300 3 | Boeing 777-300 (9 rows)
demo=# explain(costs off) select class, model from aircrafts_v order by class, model;
QUERY PLAN -------------------------------------------------------- Index Scan using aircrafts_case_model_idx on aircrafts (1 row)
рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
demo=# select class, model from aircrafts_v order by class desc, model desc;
class | model -------+--------------------- 3 | Boeing 777-300 2 | Boeing 767-300 2 | Boeing 737-300 2 | Airbus A321-200 2 | Airbus A320-200 2 | Airbus A319-100 1 | Sukhoi SuperJet-100 1 | Cessna 208 Caravan 1 | Bombardier CRJ-200 (9 rows)
demo=# explain(costs off) select class, model from aircrafts_v order by class desc, model desc;
QUERY PLAN ----------------------------------------------------------------- Index Scan BACKWARD using aircrafts_case_model_idx on aircrafts (1 row)
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрд╕ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдПрдХ рдХреЙрд▓рдо рджреНрд╡рд╛рд░рд╛ рдФрд░ рджреВрд╕рд░реЗ рдХреЙрд▓рдо рдореЗрдВ рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдЫрдВрдЯрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
demo=# explain(costs off) select class, model from aircrafts_v order by class ASC, model DESC;
QUERY PLAN ------------------------------------------------- Sort Sort Key: (CASE ... END), aircrafts.model DESC -> Seq Scan on aircrafts (3 rows)
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд▓рд╛рдирд░ рдиреЗ рдкрд╣рд▓реЗ рдХреА рдЧрдИ "enable_seqscan = off" рд╕реЗрдЯрд┐рдВрдЧ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рдХреЛ рдЪреБрдирд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рд╕реНрдХреИрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдордирд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХреА рдЦрдЧреЛрд▓рд┐рдп рд▓рд╛рдЧрдд рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ - рдХреГрдкрдпрд╛ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рджреЗрдЦреЗрдВред "рд▓рд╛рдЧрдд рдкрд░"
рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕реЙрд░реНрдЯ рджрд┐рд╢рд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
demo=# create index aircrafts_case_asc_model_desc_idx on aircrafts( (case when range < 4000 then 1 when range < 10000 then 2 else 3 end) ASC, model DESC); demo=# explain(costs off) select class, model from aircrafts_v order by class ASC, model DESC;
QUERY PLAN ----------------------------------------------------------------- Index Scan using aircrafts_case_asc_model_desc_idx on aircrafts (1 row)
рд╕реНрддрдВрднреЛрдВ рдХрд╛ рдХреНрд░рдо
рдПрдХ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдЬреЛ рдорд▓реНрдЯреА-рдХреЙрд▓рдо рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рд╡рд╣ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдХреЙрд▓рдо рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдХреНрд░рдо рд╣реИред рдмреА-рдЯреНрд░реА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЖрджреЗрд╢ рдХрд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡ рд╣реИ: рдкреГрд╖реНрдареЛрдВ рдХреЗ рдЕрдВрджрд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛, рдлрд┐рд░ рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдо рдЙрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд░реЗрдВрдЬ рдЕрдВрддрд░рд╛рд▓ рдФрд░ рдореЙрдбрд▓ рдкрд░ рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рд╣реИ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдЯ рдкреЗрдЬ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред рдЖрдХреГрддрд┐ рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмреАрдЪ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдЪрд╛рд░реНрдЯ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ "рд╡рд░реНрдЧ = 3" (рдХреЗрд╡рд▓ рдкреНрд░рдердо рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ) рдпрд╛ "рд╡рд░реНрдЧ = 3 рдФрд░ рдореЙрдбрд▓ = 'рдмреЛрдЗрдВрдЧ 777-300' (рдЬреИрд╕реЗ рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ) рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░реЗрдЧреАред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд┐рдзреЗрдп "рдореЙрдбрд▓ = 'рдмреЛрдЗрдВрдЧ 777-300' рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрд╛ рдЬрд╛рдирд╛ рдХрдо рдХреБрд╢рд▓ рд╣реЛрдЧрд╛: рдЬрдбрд╝ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЛ рдЙрддрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрддрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕рдХреА рджрдХреНрд╖рддрд╛ рдЬрд╛рд░реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рддреАрди рд╢реНрд░реЗрдгреА рдХреЗ рд╡рд┐рдорд╛рди рдФрд░ рдПрдХ рдорд╣рд╛рди рдХрдИ рдореЙрдбрд▓ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рддрд┐рд╣рд╛рдИ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдкреВрд░реНрдг рдЯреЗрдмрд▓ рд╕реНрдХреИрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ... рдпрд╛ рдирд╣реАрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:
demo=# create index on aircrafts( model, (case when range < 4000 then 1 when range < 10000 then 2 else 3 end));
рдЦреЗрддреЛрдВ рдХрд╛ рдХреНрд░рдо рдмрджрд▓реЗрдЧрд╛:

рдЗрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде, рд╡рд┐рдзреЗрдп "рдореЙрдбрд▓ = 'рдмреЛрдЗрдВрдЧ 777-300' рдХреА рдЦреЛрдЬ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рд╡рд┐рдзреЗрдп" рд╡рд░реНрдЧ = 3 "рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
NULLs
"рдмреАрдЯреАрдЖрд░рдИ" рдПрдХреНрд╕реЗрд╕ рдкрджреНрдзрддрд┐ NULLs рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ IS NULL рдФрд░ IS NOT NULL рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦреЛрдЬ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред
рдЖрдЗрдП рдЙрдбрд╝рд╛рдиреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ NULL рд╣реЛрддреЗ рд╣реИрдВ:
demo=# create index on flights(actual_arrival); demo=# explain(costs off) select * from flights where actual_arrival is null;
QUERY PLAN ------------------------------------------------------- Bitmap Heap Scan on flights Recheck Cond: (actual_arrival IS NULL) -> Bitmap Index Scan on flights_actual_arrival_idx Index Cond: (actual_arrival IS NULL) (4 rows)
NULLs рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдкрддреНрддреЗ рдХреЗ рдЫреЛрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (NULLS FIRST рдпрд╛ NULLS LAST)ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреНрд╡реЗрд░реА рдореЗрдВ рдЫрдБрдЯрд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реИ: рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕реЗрд▓реЗрдХреНрдЯ рдХрдорд╛рдВрдб рдЕрдкрдиреЗ ORDER BY рдХреНрд▓реЙрдЬрд╝ рдореЗрдВ NULL рдХреЗ рд╕рдорд╛рди рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рд▓реНрдЯ рдЗрдВрдбреЗрдХреНрд╕ (NULLS FIRST рдпрд╛ NULLS LAST) рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрджреЗрд╢ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпреЗ рдЖрджреЗрд╢ рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
demo=# explain(costs off) select * from flights order by actual_arrival NULLS LAST;
QUERY PLAN -------------------------------------------------------- Index Scan using flights_actual_arrival_idx on flights (1 row)
рдФрд░ рдпрд╣рд╛рдБ рдпреЗ рдЖрджреЗрд╢ рдЕрд▓рдЧ рд╣реИрдВ, рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдмрд╛рдж рдореЗрдВ рдЫрдБрдЯрд╛рдИ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рдЪреБрдирддрд╛ рд╣реИ:
demo=# explain(costs off) select * from flights order by actual_arrival NULLS FIRST;
QUERY PLAN ---------------------------------------- Sort Sort Key: actual_arrival NULLS FIRST -> Seq Scan on flights (3 rows)
рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ NULL рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
demo=# create index flights_nulls_first_idx on flights(actual_arrival NULLS FIRST); demo=# explain(costs off) select * from flights order by actual_arrival NULLS FIRST;
QUERY PLAN ----------------------------------------------------- Index Scan using flights_nulls_first_idx on flights (1 row)
рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ NULLs рдХреЗ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, NULL рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ:
demo=# \pset null NULL demo=# select null < 42;
?column? ---------- NULL (1 row)
рдпрд╣ рдмреА-рдЯреНрд░реА рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред NULLs, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рдмрдирд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ NULLs рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд▓рдЧрд╛рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд┐рдирд╛ рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдЪреВрдВрдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ)ред рдпрджрд┐ рдХреНрд╡реЗрд░реА рдХреЛ рдбреЗрдЯрд╛ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдЖрд╡рд╢реНрдпрдХ рдЖрджреЗрд╢ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЛрдЬрдирд╛рдХрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЫрдВрдЯрд╛рдИ рдкрд░ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЧреБрдг
рдЖрдЗрдП "btree" рдПрдХреНрд╕реЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ (рдкреНрд░рд╢реНрди
рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВ )ред
amname | name | pg_indexam_has_property --------+---------------+------------------------- btree | can_order | t btree | can_unique | t btree | can_multi_col | t btree | can_exclude | t
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛ рд╣реИ, рдмреА-рдЯреНрд░реА рдбреЗрдЯрд╛ рдСрд░реНрдбрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдЗрди рдЬреИрд╕реЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред рдмрд╣реБрд░рдВрдЧреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреА рднреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЕрднрд┐рдЧрдо рд╡рд┐рдзрд┐рдпрд╛рдБ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдирд╣реАрдВ) рднреА рдРрд╕реЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреА рд╣реИрдВред рд╣рдо рдЕрдЧрд▓реА рдмрд╛рд░ EXCLUDE рдмрд╛рдзрд╛ рдХреЗ рд╕рдорд░реНрдерди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдмрд┐рдирд╛ рдХрд╛рд░рдг рдХреЗред
name | pg_index_has_property ---------------+----------------------- clusterable | t index_scan | t bitmap_scan | t backward_scan | t
"рдмреАрдЯреАрдЖрд░рдИ" рдПрдХреНрд╕реЗрд╕ рдкрджреНрдзрддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ: рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди, рд╕рд╛рде рд╣реА рдмрд┐рдЯрдореИрдк рд╕реНрдХреИрдиред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ "рдЖрдЧреЗ" рдФрд░ "рдкрд┐рдЫрдбрд╝реЗ" рджреЛрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЗрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓ рд╕рдХрддреА рд╣реИред
name | pg_index_column_has_property --------------------+------------------------------ asc | t desc | f nulls_first | f nulls_last | t orderable | t distance_orderable | f returnable | t search_array | t search_nulls | t
рдЗрд╕ рдкрд░рдд рдХреЗ рдкрд╣рд▓реЗ рдЪрд╛рд░ рдЧреБрдг рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрддрдВрдн рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдорд╛рдиреЛрдВ рдХреЛ рдЖрд░реЛрд╣реА рдХреНрд░рдо ("asc") рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ NULL рдХреЛ рдЕрдВрддрд┐рдо ("nulls_last") рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ, рдЕрдиреНрдп рд╕рдВрдпреЛрдЬрди рд╕рдВрднрд╡ рд╣реИрдВред
"Search_array" рдЧреБрдг рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рддрд░рд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ:
demo=# explain(costs off) select * from aircrafts where aircraft_code in ('733','763','773');
QUERY PLAN ----------------------------------------------------------------- Index Scan using aircrafts_pkey on aircrafts Index Cond: (aircraft_code = ANY ('{733,763,773}'::bpchar[])) (2 rows)
"рд░рд┐рдЯрд░реНрдиреЗрдмрд▓" рд╕рдВрдкрддреНрддрд┐ рдЗрдВрдбреЗрдХреНрд╕-рдУрдирд▓реА рд╕реНрдХреИрди рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ, рдЬреЛ рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдЯреЛрд░ рдЗрдВрдбреЗрдХреНрд╕ рд╡реИрд▓реНрдпреВ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рд╕реЗ рд╕реНрд╡рдпрдВ (рд╣реИрд╢ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдЙрдЪрд┐рдд рд╣реИред рдпрд╣рд╛рдВ рдмреА-рдЯреНрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрджреНрд╡рд┐рддреАрдп рдЕрдиреБрдХреНрд░рдорд┐рдд
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ
рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА, рдПрдХ рдХрд╡рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рд╡рд╣ рд╣реИ рдЬреЛ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдЖрд╡рд╢реНрдпрдХ (рд▓рдЧрднрдЧ) рдирд╣реАрдВ рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЕрдирдиреНрдп рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рд╕рдордЧреНрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреБрдВрдЬреА рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕реНрддрдВрдн рдкрд░ рджреЛ рдЕрдиреБрдХреНрд░рдорд┐рддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рдПрдХ рдЕрдЦрдВрдбрддрд╛ рдмрд╛рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╖рдо рд╣реИред
рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдЕрдирд╛рд╕реНрддрд╛рд╕рд┐рдпрд╛ рд▓реБрдмреЗрдиреАрдХреЛрд╡рд╛
рд▓реБрдмреЗрдирд┐рдХреЛрд╡рд╛рд╡ рдореЗрдВ "рдмреАрдЯреАрдЖрд░рдЖрдИ" рдкрджреНрдзрддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ, рддрд╛рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЧреИрд░-рдЕрджреНрд╡рд┐рддреАрдп, рд╕реНрддрдВрднреЛрдВ рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ, рдЗрд╕ рдкреИрдЪ рдХреЛ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ PostgreSQL рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг 10 рдореЗрдВ рдЬрд▓реНрджреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдкреИрдЪ рдкреНрд░реЛ рдорд╛рдирдХ 9.5+ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдпрд╣реА рджрд┐рдЦрддрд╛ рд╣реИ рдХреА рддрд░рд╣ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкреИрдЪ PostgreSQL 11 рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдерд╛ред
рдЖрдЗрдП рдмреБрдХрд┐рдВрдЧ рдЯреЗрдмрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
demo=# \d bookings
Table "bookings.bookings" Column | Type | Modifiers --------------+--------------------------+----------- book_ref | character(6) | not null book_date | timestamp with time zone | not null total_amount | numeric(10,2) | not null Indexes: "bookings_pkey" PRIMARY KEY, btree (book_ref) Referenced by: TABLE "tickets" CONSTRAINT "tickets_book_ref_fkey" FOREIGN KEY (book_ref) REFERENCES bookings(book_ref)
рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ, рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА (book_ref, рдмреБрдХрд┐рдВрдЧ рдХреЛрдб) рдПрдХ рдирд┐рдпрдорд┐рдд "btree" рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдЗрдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЕрдиреВрдард╛ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдПрдБ:
demo=# create unique index bookings_pkey2 on bookings(book_ref) INCLUDE (book_date);
рдЕрдм рд╣рдо рдореМрдЬреВрджрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдПрдХ рдирдП (рд▓реЗрди-рджреЗрди рдореЗрдВ, рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
demo=# begin; demo=# alter table bookings drop constraint bookings_pkey cascade; demo=# alter table bookings add primary key using index bookings_pkey2; demo=# alter table tickets add foreign key (book_ref) references bookings (book_ref); demo=# commit;
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
demo=# \d bookings
Table "bookings.bookings" Column | Type | Modifiers --------------+--------------------------+----------- book_ref | character(6) | not null book_date | timestamp with time zone | not null total_amount | numeric(10,2) | not null Indexes: "bookings_pkey2" PRIMARY KEY, btree (book_ref) INCLUDE (book_date) Referenced by: TABLE "tickets" CONSTRAINT "tickets_book_ref_fkey" FOREIGN KEY (book_ref) REFERENCES bookings(book_ref)
рдЕрдм рдПрдХ рдФрд░ рдПрдХ рд╣реА рд╕реВрдЪрдХрд╛рдВрдХ рдЕрджреНрд╡рд┐рддреАрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╡рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
demo=# explain(costs off) select book_ref, book_date from bookings where book_ref = '059FC4';
QUERY PLAN -------------------------------------------------- Index Only Scan using bookings_pkey2 on bookings Index Cond: (book_ref = '059FC4'::bpchar) (2 rows)
рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рдпрд╣ рд╕рд░реНрд╡рд╡рд┐рджрд┐рдд рд╣реИ, рдлрд┐рд░ рднреА рдХреЛрдИ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХрд┐ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП, рдмрд┐рдирд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╡рд╣рд╛рдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рди рдХреЗрд╡рд▓ рддреЗрдЬ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЖрдХрд╛рд░ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛ред
рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ "рдмреАрдЯреАрдЖрд░рдИ" рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреЗрдбрд╝ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкрдВрдХреНрддрд┐-рд╡рд╛рд░ рд╕рдореНрдорд┐рд▓рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореЛрдЯреЗ рддреМрд░ рдкрд░, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдкрддреНрддреА рдкреГрд╖реНрда рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рддрдм рдЖрдВрддрд░рд┐рдХ рдкреГрд╖реНрда рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ "рдирд┐рд░реНрдорд┐рдд" рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдкреВрд░рд╛ рдкрд┐рд░рд╛рдорд┐рдб рдЬрдбрд╝ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рди рд╣реЛ рдЬрд╛рдПред
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЧрддрд┐ рдЙрдкрд▓рдмреНрдз рд░реИрдо рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЬреЛ "рдореЗрдВрдЯреЗрдиреЗрдВрд╕_рд╡рд░реНрдХ_рдо" рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред рддреЛ, рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдмрдврд╝рд╛рдиреЗ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рддреЗрдЬреА рдЖ рд╕рдХрддреА рд╣реИред рдЕрджреНрд╡рд┐рддреАрдп рдЕрдиреБрдХреНрд░рдорд┐рддреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдХрд╛рд░ рдХреА рдореЗрдореЛрд░реА "work_mem" рдХреЛ "рдореЗрдиреНрдЯреЗрдиреЗрдВрд╕_рд╡рд░реНрдХ_рдо" рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреБрд▓рдирд╛ рд╢рдмреНрджрд╛рд░реНрде
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ PostgreSQL рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╣реИрд╢ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрд╕реЛрд╕рд┐рдПрд╢рди "рд╣реИрд╢" рдПрдХреНрд╕реЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдЗрд╕реА рддрд░рд╣, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдСрд░реНрдбрд░ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реЙрд░реНрдЯрд┐рдВрдЧ, рдЧреНрд░реБрдкрд┐рдВрдЧ (рдХрднреА-рдХрднреА), рдорд░реНрдЬ рдЬреЙрдЗрди рд╡рдЧреИрд░рд╣ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред PostgreSQL рдСрдкрд░реЗрдЯрд░ рдирд╛рдореЛрдВ (рдЬреИрд╕реЗ рдХрд┐,>, <, =) рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЛ рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред "Btree" рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдСрдкрд░реЗрдЯрд░ рдирд╛рдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ "bool_ops" рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
postgres=# select amop.amopopr::regoperator as opfamily_operator, amop.amopstrategy from pg_am am, pg_opfamily opf, pg_amop amop where opf.opfmethod = am.oid and amop.amopfamily = opf.oid and am.amname = 'btree' and opf.opfname = 'bool_ops' order by amopstrategy;
opfamily_operator | amopstrategy ---------------------+-------------- <(boolean,boolean) | 1 <=(boolean,boolean) | 2 =(boolean,boolean) | 3 >=(boolean,boolean) | 4 >(boolean,boolean) | 5 (5 rows)
рдпрд╣рд╛рдВ рд╣рдо рдкрд╛рдВрдЪ рддреБрд▓рдирд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрдирдХреЗ рдирд╛рдореЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕ рддреБрд▓рдирд╛ рдХреЛ рдХрд░рддрд╛ рд╣реИ, рд░рдгрдиреАрддрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдСрдкрд░реЗрдЯрд░ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- 1 - рдХрдо
- 2 - рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░
- 3 - рдмрд░рд╛рдмрд░
- 4 - рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░
- 5 - рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ
рдХреБрдЫ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рд░рдгрдиреАрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдСрдкрд░реЗрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "integer_ops" рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рд░рдгрдиреАрддрд┐ 1 рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
postgres=# select amop.amopopr::regoperator as opfamily_operator from pg_am am, pg_opfamily opf, pg_amop amop where opf.opfmethod = am.oid and amop.amopfamily = opf.oid and am.amname = 'btree' and opf.opfname = 'integer_ops' and amop.amopstrategy = 1 order by opfamily_operator;
opfamily_operator ---------------------- <(integer,bigint) <(smallint,smallint) <(integer,integer) <(bigint,bigint) <(bigint,integer) <(smallint,integer) <(integer,smallint) <(smallint,bigint) <(bigint,smallint) (9 rows)
рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдЖрд╢рд╛рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред
рдирдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рдорд░реНрдерди
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдПрдХ
рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕реА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЧрддрд┐ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдиреЗ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рдЙрдЪрд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддреБрд▓рдирд╛рддреНрдордХ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдз рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИред
рдЪрд▓реЛ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рдХрд╛рд▓реНрдкрдирд┐рдХ рднрд╛рдЧред
postgres=# create type complex as (re float, im float);
рд╣рдо рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рдорд╛рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
postgres=# create table numbers(x complex); postgres=# insert into numbers values ((0.0, 10.0)), ((1.0, 3.0)), ((1.0, 1.0));
рдЕрдм рдПрдХ рдкреНрд░рд╢реНрди рдЙрдарддрд╛ рд╣реИ: рдпрджрд┐ рдЧрдгрд┐рддреАрдп рдЕрд░реНрдереЛрдВ рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрджреЗрд╢ рд╕рдВрдмрдВрдз рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ:
postgres=# select * from numbers order by x;
x -------- (0,10) (1,1) (1,3) (3 rows)
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЫрдБрдЯрд╛рдИ рдПрдХ рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддреА рд╣реИ: рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рджреВрд╕рд░реЗ рдлрд╝реАрд▓реНрдб рдХреА, рдФрд░ рдЗрд╕реА рддрд░рд╣, рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдЪрд░рд┐рддреНрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЖрджреЗрд╢ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡реИрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдорд╛рдкрд╛рдВрдХ (рд▓рдВрдмрд╛рдИ) рджреНрд╡рд╛рд░рд╛ рдЖрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдкрд╛рдпрдерд╛рдЧреЛрд░рд╕ рдкреНрд░рдореЗрдп) рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд╡рд░реНрдЧрдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рдорд╛рдкрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:
postgres=# create function modulus(a complex) returns float as $$ select sqrt(a.re*a.re + a.im*a.im); $$ immutable language sql;
рдЕрдм рд╣рдо рдЗрд╕ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рднреА рдкрд╛рдБрдЪ рддреБрд▓рдирд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:
postgres=# create function complex_lt(a complex, b complex) returns boolean as $$ select modulus(a) < modulus(b); $$ immutable language sql; postgres=# create function complex_le(a complex, b complex) returns boolean as $$ select modulus(a) <= modulus(b); $$ immutable language sql; postgres=# create function complex_eq(a complex, b complex) returns boolean as $$ select modulus(a) = modulus(b); $$ immutable language sql; postgres=# create function complex_ge(a complex, b complex) returns boolean as $$ select modulus(a) >= modulus(b); $$ immutable language sql; postgres=# create function complex_gt(a complex, b complex) returns boolean as $$ select modulus(a) > modulus(b); $$ immutable language sql;
рдФрд░ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдСрдкрд░реЗрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ ">", "<", рдФрд░ рдЗрддрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ "рдЕрдЬреАрдм" рдирд╛рдо рджреЗрдВред
postgres=# create operator #<#(leftarg=complex, rightarg=complex, procedure=complex_lt); postgres=# create operator #<=#(leftarg=complex, rightarg=complex, procedure=complex_le); postgres=# create operator #=#(leftarg=complex, rightarg=complex, procedure=complex_eq); postgres=# create operator #>=#(leftarg=complex, rightarg=complex, procedure=complex_ge); postgres=# create operator #>#(leftarg=complex, rightarg=complex, procedure=complex_gt);
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
postgres=# select (1.0,1.0)::complex #<# (1.0,3.0)::complex;
?column? ---------- t (1 row)
рдкрд╛рдВрдЪ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рдмреАрдЯреАрдЖрд░рдЖрдИ" рдПрдХреНрд╕реЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди (рдЕрддреНрдпрдзрд┐рдХ рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдЗрд╕реЗ -1, 0, рдпрд╛ 1 рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд╣рд▓рд╛ рдореВрд▓реНрдп рджреВрд╕рд░реЗ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдПрдХред рдЗрд╕ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд░реНрдерди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдиреНрдп рд╕рдорд░реНрдерди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
postgres=# create function complex_cmp(a complex, b complex) returns integer as $$ select case when modulus(a) < modulus(b) then -1 when modulus(a) > modulus(b) then 1 else 0 end; $$ language sql;
рдЕрдм рд╣рдо рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ (рдФрд░ рдЙрд╕реА рдирд╛рдо рдХреЗ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛):
postgres=# create operator class complex_ops default for type complex using btree as operator 1 #<#, operator 2 #<=#, operator 3 #=#, operator 4 #>=#, operator 5 #>#, function 1 complex_cmp(complex,complex);
рдЕрдм рдЫрдВрдЯрдиреА рдХрд╛рдо рд╡рд╛рдВрдЫрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ:
postgres=# select * from numbers order by x;
x -------- (1,1) (1,3) (0,10) (3 rows)
рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ "рдмреАрдЯреАрдЖрд░рдИ" рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдЧрд╛ред
рдЪрд┐рддреНрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд░реНрдерди рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
postgres=# select amp.amprocnum, amp.amproc, amp.amproclefttype::regtype, amp.amprocrighttype::regtype from pg_opfamily opf, pg_am am, pg_amproc amp where opf.opfname = 'complex_ops' and opf.opfmethod = am.oid and am.amname = 'btree' and amp.amprocfamily = opf.oid;
amprocnum | amproc | amproclefttype | amprocrighttype -----------+-------------+----------------+----------------- 1 | complex_cmp | complex | complex (1 row)
internals
рд╣рдо "рдкреЗрдЬрд┐рдВрд╕реНрдкреЗрдХреНрдЯ" рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреА-рдЯреНрд░реА рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред
demo=# create extension pageinspect;
рд╕реВрдЪрдХрд╛рдВрдХ рд░реВрдкрдХ:
demo=# select * from bt_metap('ticket_flights_pkey');
magic | version | root | level | fastroot | fastlevel --------+---------+------+-------+----------+----------- 340322 | 2 | 164 | 2 | 164 | 2 (1 row)
рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрддрд░: рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рд╕реНрддрдВрднреЛрдВ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд▓рд╛рдЦ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ 2 рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИ (рдЬрдбрд╝ рд╕рд╣рд┐рдд рдирд╣реАрдВ)ред
рдмреНрд▓реЙрдХ 164 (рд░реВрдЯ) рдкрд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдЬрд╛рдирдХрд╛рд░реА:
demo=# select type, live_items, dead_items, avg_item_size, page_size, free_size from bt_page_stats('ticket_flights_pkey',164);
type | live_items | dead_items | avg_item_size | page_size | free_size ------+------------+------------+---------------+-----------+----------- r | 33 | 0 | 31 | 8192 | 6984 (1 row)
рдФрд░ рдмреНрд▓реЙрдХ рдореЗрдВ рдбреЗрдЯрд╛ ("рдбреЗрдЯрд╛" рдлрд╝реАрд▓реНрдб, рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рддрдХ рдмрд▓рд┐рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореЗрдВ рдмрд╛рдЗрдирд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордг рдХреБрдВрдЬреА рдХрд╛ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ):
demo=# select itemoffset, ctid, itemlen, left(data,56) as data from bt_page_items('ticket_flights_pkey',164) limit 5;
itemoffset | ctid | itemlen | data ------------+---------+---------+---------------------------------------------------------- 1 | (3,1) | 8 | 2 | (163,1) | 32 | 1d 30 30 30 35 34 33 32 33 30 35 37 37 31 00 00 ff 5f 00 3 | (323,1) | 32 | 1d 30 30 30 35 34 33 32 34 32 33 36 36 32 00 00 4f 78 00 4 | (482,1) | 32 | 1d 30 30 30 35 34 33 32 35 33 30 38 39 33 00 00 4d 1e 00 5 | (641,1) | 32 | 1d 30 30 30 35 34 33 32 36 35 35 37 38 35 00 00 2b 09 00 (5 rows)
рдкрд╣рд▓рд╛ рддрддреНрд╡ рддрдХрдиреАрдХреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдКрдкрд░реА рд╕реАрдорд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ (рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА), рдЬрдмрдХрд┐ рдбреЗрдЯрд╛ рдЦреБрдж рджреВрд╕рд░реЗ рддрддреНрд╡ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдмрдЪреНрдЪрд╛ рдиреЛрдб рдмреНрд▓реЙрдХ 163 рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдмреНрд▓реЙрдХ 323, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдмрджрд▓реЗ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм, рдПрдХ рдЕрдЪреНрдЫреА рдкрд░рдВрдкрд░рд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдкреНрд░рд▓реЗрдЦрди,
README рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдлрд┐рд░ рднреА рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╕реНрддрд╛рд░ "
amcheck " рд╣реИ, рдЬрд┐рд╕реЗ PostgreSQL 10 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдирд┐рдЪрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ
рдЬреАрдердм рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдмреА-рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рджреЛрд╖реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рдЪ рд╣реИ, "amcheck" рд╕рдВрд╕реНрдХрд░рдг 10 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ PostgreSQL рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рдкрд░ рдкрдврд╝реЗрдВ ред