PostgreSQL рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд - 1

рдкрд░рд┐рдЪрдп


рд▓реЗрдЦреЛрдВ рдХреА рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛рдлреА рд╣рдж рддрдХ PostgreSQL рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

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

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

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

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

рдЗрдВрдбреЗрдХреНрд╕


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

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, PostgreSQL 9.6 рдореЗрдВ рдЫрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ - рд╕рдВрд╕реНрдХрд░рдг 9.6 рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЗрд╕рд▓рд┐рдП рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВред

рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд (рдЬрд┐рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рдмреАрдЪ рд╕рднреА рдЕрдВрддрд░реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрддрддрдГ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреБрдВрдЬреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕реНрддрдВрдн рдХрд╛ рдореВрд▓реНрдп) рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХреБрдВрдЬреА рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ TID (tuple id) рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдкрдВрдХреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред рдЬреНрдЮрд╛рдд рдХреБрдВрдЬреА рдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде, рд╣рдо рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдВрдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд┐рдП рдмрд┐рдирд╛ рд╣рдорд╛рд░реА рд░реБрдЪрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред

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

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

  • рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝реЗрдВред
  • рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ TID рджреНрд╡рд╛рд░рд╛ TID рдпрд╛ рдХрд┐рд╕реА рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рдмрд┐рдЯрдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдЪ рдореЗрдВ рд▓рд╛рдПрдВред
  • рдореМрдЬреВрджрд╛ рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЗрд╕рдХреЗ рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗред

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

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

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

рд╢реЗрд╖ рд╕рднреА рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ:

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

рд╣рдо рдкрд╣рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдХреНрд░рдордг рдЗрдВрдЬрди рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рд╡рд┐рднрд┐рдиреНрди рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЕрдиреБрдХреНрд░рдордг рдЗрдВрдЬрди


рдЕрдиреБрдХреНрд░рдордг рдЗрдВрдЬрди PostgreSQL рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

рдореБрдЦреНрдп рд╕реНрдХреИрдирд┐рдВрдЧ рддрдХрдиреАрдХ


рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди


рд╣рдо рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ TID рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

postgres=# create table t(a integer, b text, c boolean); postgres=# insert into t(a,b,c) select s.id, chr((32+random()*94)::integer), random() < 0.01 from generate_series(1,100000) as s(id) order by random(); postgres=# create index on t(a); postgres=# analyze t; 

рд╣рдордиреЗ рддреАрди-рдлрд╝реАрд▓реНрдб рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИред рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рдореЗрдВ 1 рд╕реЗ 100.000 рддрдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ (рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░) рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЧреИрд░-рдореБрджреНрд░рдг рдпреЛрдЧреНрдп рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╡рд┐рднрд┐рдиреНрди ASCII рд╡рд░реНрдг рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рддреАрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ 1% рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИред рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

 postgres=# explain (costs off) select * from t where a = 1; 
  QUERY PLAN ------------------------------- Index Scan using t_a_idx on t Index Cond: (a = 1) (2 rows) 

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

рдмрд┐рдЯрдореИрдк рд╕реНрдХреИрди


рдЬрдм рд╣рдо рдХреЗрд╡рд▓ рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ рддреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕реЗ рд╣реА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рддреА рд╣реИ, рдпрд╣ рдПрдХ рд╣реА рддрд╛рд▓рд┐рдХрд╛ рдкреГрд╖реНрда рдкрд░ рдХрдИ рдмрд╛рд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдмрд┐рдЯрдореИрдк рд╕реНрдХреИрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред

 postgres=# explain (costs off) select * from t where a <= 100; 
  QUERY PLAN ------------------------------------ Bitmap Heap Scan on t Recheck Cond: (a <= 100) -> Bitmap Index Scan on t_a_idx Index Cond: (a <= 100) (4 rows) 

рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕рднреА TID рдХреЛ рд▓реМрдЯрд╛рддреА рд╣реИ рдЬреЛ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ (рдмрд┐рдЯрдореИрдк рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдиреЛрдб), рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдмрд┐рдЯрдореИрдк рдЗрди TID рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рддрдм рддрд╛рд▓рд┐рдХрд╛ (рдмрд┐рдЯрдореИрдк рд╣реАрдк рд╕реНрдХреИрди) рд╕реЗ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

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

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

 postgres=# create index on t(b); postgres=# analyze t; postgres=# explain (costs off) select * from t where a <= 100 and b = 'a'; 
  QUERY PLAN -------------------------------------------------- Bitmap Heap Scan on t Recheck Cond: ((a <= 100) AND (b = 'a'::text)) -> BitmapAnd -> Bitmap Index Scan on t_a_idx Index Cond: (a <= 100) -> Bitmap Index Scan on t_b_idx Index Cond: (b = 'a'::text) (7 rows) 

рдпрд╣рд╛рдВ BitmapAnd рдиреЛрдб рдмрд┐рдЯрд╡рд╛рдЗрдЬ рдФрд░ "рдСрдкрд░реЗрд╢рди" рджреНрд╡рд╛рд░рд╛ рджреЛ рдмрд┐рдЯрдореИрдк рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред

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

 postgres=# select attname, correlation from pg_stats where tablename = 't'; 
  attname | correlation ---------+------------- b | 0.533512 c | 0.942365 a | -0.00768816 (3 rows) 

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

рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди


рддрд╕реНрд╡реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЧреИрд░-рдЪрдпрдирд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде, рдЖрд╢рд╛рд╡рд╛рджреА рд╕рд╣реА рд╣реЛрдЧрд╛ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ:

 postgres=# explain (costs off) select * from t where a <= 40000; 
  QUERY PLAN ------------------------ Seq Scan on t Filter: (a <= 40000) (2 rows) 

рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪрддрд░ рд╣рд╛рд▓рдд рдЪрдпрдирд╛рддреНрдордХрддрд╛ рдХрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдХрдо рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЗрд╕рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рддреА рд╣реИрдВред рдкреНрд░рд╛рдкреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рдиреЗ рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд▓рд╛рдЧрдд рдмрдврд╝ рдЬрд╛рддреА рд╣реИред

рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рддреЗрдЬреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдХреИрди рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрдВрдкрд╛рдЙрдВрдб рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдЪреБрдВрдмрдХреАрдп рд╕рд┐рд░ рдХреЛ рдЯреНрд░реИрдХ рдкрд░ рд▓рд╛рдиреЗ рдХрд╛ рдпрд╛рдВрддреНрд░рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рднрд╛рд╡ рдПрд╕рдПрд╕рдбреА рдХреЗ рд▓рд┐рдП рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдПрдХреНрд╕реЗрд╕ рд▓рд╛рдЧрдд, "seq_page_cost" рдФрд░ "random_page_cost" рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рди рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рдкрд░, рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдбрд┐рд╕реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛


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

 postgres=# vacuum t; postgres=# explain (costs off) select a from t where a < 100; 
  QUERY PLAN ------------------------------------ Index Only Scan using t_a_idx on t Index Cond: (a < 100) (2 rows) 

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЗрдВрдЬрди рдХреЛ рд╣рд░ рдмрд╛рд░ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдХреИрдирд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рдирд┐рдпрдорд┐рдд рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

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

рд╣рдо EXALAIN ANALYZE рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬрдмрд░рди рдкрд╣реБрдВрдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# explain (analyze, costs off) select a from t where a < 100; 
  QUERY PLAN ------------------------------------------------------------------------------- Index Only Scan using t_a_idx on t (actual time=0.025..0.036 rows=99 loops=1) Index Cond: (a < 100) Heap Fetches: 0 Planning time: 0.092 ms Execution time: 0.059 ms (5 rows) 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд╛рд▓рд┐рдХрд╛ (рд╣реАрдк рдмреБрдд: 0) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рдХреНрдпреЛрдВрдХрд┐ рд╡реИрдХреНрдпреВрдорд┐рдВрдЧ рдЕрднреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдмреЗрд╣рддрд░ рд╢реВрдиреНрдп рдХреЗ рдХрд░реАрдм рд╣реИред

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

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

рд╢реВрдиреНрдп


NULLs рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реАрдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдЕрдирдЬрд╛рди рдпрд╛ рдЕрдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╣реИред рдПрдХ рдирд┐рдпрдорд┐рдд рдмреВрд▓рд┐рдпрди рдмреАрдЬрдЧрдгрд┐рдд рдЯрд░реНрдирд░реА рдмрди рдЬрд╛рддрд╛ рд╣реИ; рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ NULL рдирд┐рдпрдорд┐рдд рдорд╛рдиреЛрдВ рд╕реЗ рдЫреЛрдЯрд╛ рдпрд╛ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕рдХреЗ рд▓рд┐рдП рдЫрдВрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдорд╛рдг, NULLS FIRST рдФрд░ NULLS LAST рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ); рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ NULLs рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ; рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

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

рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ NULLs рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ


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

 postgres=# create index on t(a,b); postgres=# analyze t; 

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

 postgres=# explain (costs off) select * from t where a <= 100 and b = 'a'; 
  QUERY PLAN ------------------------------------------------ Index Scan using t_a_b_idx on t Index Cond: ((a <= 100) AND (b = 'a'::text)) (2 rows) 

рдПрдХ рдмрд╣реБрдЙрджреНрджреЗрд╢реАрдп рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд░реНрдд рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкрд╣рд▓реА рдмрд╛рд░ рд╕реЗ рд╢реБрд░реВ:

 postgres=# explain (costs off) select * from t where a <= 100; 
  QUERY PLAN -------------------------------------- Bitmap Heap Scan on t Recheck Cond: (a <= 100) -> Bitmap Index Scan on t_a_b_idx Index Cond: (a <= 100) (4 rows) 

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

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

рднрд╛рд╡реЛрдВ рдкрд░ рдЕрдиреБрдХреНрд░рдордг рдХрд░рддрд╛ рд╣реИ


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

 postgres=# explain (costs off) select * from t where lower(b) = 'a'; 
  QUERY PLAN ------------------------------------------ Seq Scan on t Filter: (lower((b)::text) = 'a'::text) (2 rows) 

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

 postgres=# create index on t(lower(b)); postgres=# analyze t; postgres=# explain (costs off) select * from t where lower(b) = 'a'; 
  QUERY PLAN ---------------------------------------------------- Bitmap Heap Scan on t Recheck Cond: (lower((b)::text) = 'a'::text) -> Bitmap Index Scan on t_lower_idx Index Cond: (lower((b)::text) = 'a'::text) (4 rows) 

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

рдХреГрдкрдпрд╛ рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЖрдБрдХрдбрд╝рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдХреЛ "pg_stats" рджреГрд╢реНрдп рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдирд╛рдо рд╕реЗ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# \dt 
  Table "public.t" Column | Type | Modifiers --------+---------+----------- a | integer | b | text | c | boolean | Indexes: "t_a_b_idx" btree (a, b) "t_a_idx" btree (a) "t_b_idx" btree (b) "t_lower_idx" btree (lower(b)) 
 postgres=# select * from pg_stats where tablename = 't_lower_idx'; 

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

 postgres=# \d t_lower_idx 
  Index "public.t_lower_idx" Column | Type | Definition --------+------+------------ lower | text | lower(b) btree, for table "public.t" 
 postgres=# alter index t_lower_idx alter column "lower" set statistics 69; 

PostgreSQL 11 рдиреЗ ALTER INDEX ... SET STATISTICS рдХрдорд╛рдВрдб рдореЗрдВ рдХреЙрд▓рдо рдирдВрдмрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд▓рд┐рдП рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд▓рдХреНрд╖реНрдп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓реАрдирд░ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИред рдкреИрдЪ рдХреЛ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХреЛрд░реЛрдЯрдХреЛрд╡ рдФрд░ рдПрдбреНрд░рд┐рдпрди рдирд╛рдпрд░рдд рдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред

рдЖрдВрд╢рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ


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

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

 postgres=# create index on t(c); postgres=# analyze t; postgres=# explain (costs off) select * from t where c; 
  QUERY PLAN ------------------------------- Index Scan using t_c_idx on t Index Cond: (c = true) Filter: c (3 rows) 
 postgres=# explain (costs off) select * from t where not c; 
  QUERY PLAN ------------------- Seq Scan on t Filter: (NOT c) (2 rows) 

рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЖрдХрд╛рд░ 276 рдкреГрд╖реНрда рд╣реИ:

 postgres=# select relpages from pg_class where relname='t_c_idx'; 
  relpages ---------- 276 (1 row) 

рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ "c" рдХреЙрд▓рдо рдореЗрдВ рдХреЗрд╡рд▓ 1% рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 99% рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдПрдХ рдЖрдВрд╢рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# create index on t(c) where c; postgres=# analyze t; 

рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЖрдХрд╛рд░ 5 рдкреГрд╖реНрдареЛрдВ рддрдХ рдШрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 postgres=# select relpages from pg_class where relname='t_c_idx1'; 
  relpages ---------- 5 (1 row) 

рдХрднреА-рдХрднреА рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрдВрддрд░ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЫрдВрдЯрд╛рдИ


рдпрджрд┐ рдХреЛрдИ рдкрд╣реБрдБрдЪ рд╡рд┐рдзрд┐ рдкрдВрдХреНрддрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХреНрд░рдо рдореЗрдВ рд▓реМрдЯрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# set enable_indexscan=off; postgres=# explain (costs off) select * from t order by a; 
  QUERY PLAN --------------------- Sort Sort Key: a -> Seq Scan on t (3 rows) 

рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдХреНрд░рдо рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдбреЗрдЯрд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 postgres=# set enable_indexscan=on; postgres=# explain (costs off) select * from t order by a; 
  QUERY PLAN ------------------------------- Index Scan using t_a_idx on t (1 row) 

рд╕рднреА рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ "btree" рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рддрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЪрд░реНрдЪрд╛ рдмрдВрдж рдХрд░ рджреЗрдВред

рд╕рдорд╡рд░реНрддреА рднрд╡рди


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

рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐, "t" рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдПрдХ рдФрд░ рд╕рддреНрд░ рдореЗрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкреНрд░рд╢реНрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ:

 postgres=# select mode, granted from pg_locks where relation = 't'::regclass; 
  mode | granted -----------+--------- ShareLock | t (1 row) 

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

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

 postgres=# create index concurrently on t(a); 

рдпрд╣ рдХрдорд╛рдВрдб SHARE UPDATE EXCLUSIVE рдореЛрдб рдореЗрдВ рдЯреЗрдмрд▓ рдХреЛ рд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд░реАрдбрд┐рдВрдЧ рдФрд░ рдЕрдкрдбреЗрдЯ рджреЛрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдЯреЗрдмрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдмрджрд▓рдирд╛ рдордирд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕ рдЯреЗрдмрд▓ рдкрд░ рд╕рдорд╡рд░реНрддреА рд╡реИрдХреНрдпреВрдорд┐рдВрдЧ, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╛ рдЕрдиреНрдп рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛)ред

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

рджреВрд╕рд░рд╛, рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рдорд╡рд░реНрддреА рдЗрдорд╛рд░рдд рдХреЗ рд╕рд╛рде, рдПрдХ рдЧрддрд┐рд░реЛрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрджреНрд╡рд┐рддреАрдп рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдиреЙрдирдСрдкрд░реЗрдЯрд┐рдВрдЧред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдиреЙрдирдХреЙрд░реНрдкреЛрд░реЗрдЯрд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ psql \ d рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ INVALID рд╢рдмреНрдж рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдиреАрдЪреЗ рджреА рдЧрдИ рдХреНрд╡реЗрд░реА рдЙрди рдХреА рдкреВрд░реА рд╕реВрдЪреА рд▓реМрдЯрд╛рддреА рд╣реИ:

 postgres=# select indexrelid::regclass index_name, indrelid::regclass table_name from pg_index where not indisvalid; 
  index_name | table_name ------------+------------ t_a_idx | t (1 row) 

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

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


All Articles