рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ , рд╣рдордиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдиреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреА рд╣реЛрдЧреАред рдЖрдЗрдП рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рджреЗрдЦреЗрдВред
рдЧреБрдг
рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ "pg_am" рдЯреЗрдмрд▓ ("am" рд╕реНрдЯреИрдВрдб рдлреЙрд░ рдПрдХреНрд╕реЗрд╕ рдореЗрдердб) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЙрдкрд▓рдмреНрдз рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
postgres=# select amname from pg_am;
amname -------- btree hash gist gin spgist brin (6 rows)
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИред
PostgreSQL рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 9.5 рдФрд░ рдЙрд╕рд╕реЗ рдХрдо рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ "pg_am" рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдВрд╕реНрдХрд░рдг 9.6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдИ рдкрд░рддреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдкрд╣реБрдБрдЪ рд╡рд┐рдзрд┐ рдЧреБрдг - "pg_indexam_has_property"
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЧреБрдг - "pg_index_has_property"
- рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреЙрд▓рдо рдХреЗ рдЧреБрдг - "pg_index_column_has_property"
рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдкрд░рдд рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░рдд рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреА рдУрд░ рдПрдХ рдЖрдВрдЦ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдм рддрдХ, рдПрдХ рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рднреА рдЕрдиреБрдХреНрд░рдорд┐рдд рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рдЧреБрдг рд╣реЛрдВрдЧреЗред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд╛рд░ рдЧреБрдг рдкрд╣реБрдБрдЪ рд╡рд┐рдзрд┐ рдХреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "btree"):
postgres=# select a.amname, p.name, pg_indexam_has_property(a.oid,p.name) from pg_am a, unnest(array['can_order','can_unique','can_multi_col','can_exclude']) p(name) where a.amname = 'btree' order by a.amname;
amname | name | pg_indexam_has_property --------+---------------+------------------------- btree | can_order | t btree | can_unique | t btree | can_multi_col | t btree | can_exclude | t (4 rows)
- can_orderред
рдЬрдм рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рд╣рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЙрд░реНрдЯ рдСрд░реНрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддреА рд╣реИ (рдХреЗрд╡рд▓ рдЕрдм рддрдХ "btree" рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ)ред - can_uniqueред
рдЕрджреНрд╡рд┐рддреАрдп рдмрд╛рдзрд╛ рдФрд░ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рд╕рдорд░реНрдерди (рдХреЗрд╡рд▓ "рдмреАрдЯреНрд░реА" рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред - can_multi_colред
рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрдИ рд╕реНрддрдВрднреЛрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - can_excludeред
рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдзрд╛ рдХрд╛ рд╕рдорд░реНрдердиред
рдПрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ):
postgres=# select p.name, pg_index_has_property('t_a_idx'::regclass,p.name) from unnest(array[ 'clusterable','index_scan','bitmap_scan','backward_scan' ]) p(name);
name | pg_index_has_property ---------------+----------------------- clusterable | t index_scan | t bitmap_scan | t backward_scan | t (4 rows)
- clusterableред
рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреБрди: рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ (рд╕рдорд╛рди-рдирд╛рдо рдХрдорд╛рдВрдб рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ)ред - index_scanред
рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдХрд╛ рд╕рдорд░реНрдердиред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддреА рд╣реИ, рд╕рднреА рдЗрдВрдбреЗрдХреНрд╕ рдПрдХ-рдПрдХ рдХрд░рдХреЗ TID рдирд╣реАрдВ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдХреБрдЫ рд░рд┐рдЯрд░реНрди рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдмрд┐рдЯрдореИрдк рд╕реНрдХреИрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред - bitmap_scanред
рдмрд┐рдЯрдореИрдк рд╕реНрдХреИрди рдХрд╛ рд╕рдорд░реНрдердиред - backward_scanред
рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдкрд░рд┐рдгрд╛рдо рдПрдХ рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд░рдо рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрддрдВрдн рдЧреБрдг рд╣реИрдВ: postgres=# select p.name, pg_index_column_has_property('t_a_idx'::regclass,1,p.name) from unnest(array[ 'asc','desc','nulls_first','nulls_last','orderable','distance_orderable', 'returnable','search_array','search_nulls' ]) p(name);
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 (9 rows)
- asc, desc, nulls_first, nulls_last, рдХреНрд░рдордмрджреНрдзред
рдпреЗ рдЧреБрдг рдорд╛рдиреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ (рдЬрдм рд╣рдо "btree" рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╡рд┐рд╡рд░рдг рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЙрдирдХреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ)ред - distance_orderableред
рдкрд░рд┐рдгрд╛рдо рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреНрд░рдордмрджреНрдз рдХреНрд░рдо рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдЕрдм рддрдХ рдЬреАрдПрд╕рдЯреА рдФрд░ рдЖрд░рдпреВрдПрдо рдЕрдиреБрдХреНрд░рдорд┐рдд рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред - рд╡рд╛рдкрд╕ред
рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛, рдЕрд░реНрдерд╛рдд, рдХреЗрд╡рд▓-рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдХрд╛ рд╕рдорд░реНрдердиред - search_arrayред
" рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб IN ( list_of_constants )", рдЬреЛ " рдЕрдиреБрдХреНрд░рдорд┐рдд-рдлрд╝реАрд▓реНрдб = рдХреЛрдИ рднреА ( array_of_constants )" рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗ рд╕рд╛рде рдХрдИ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд╛ рд╕рдорд░реНрдердиред - search_nullsред
IS NULL рдФрд░ IS рдиреЙрдЯ рдирд╛рдЙрд▓ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ред
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИред рдХреБрдЫ рдЧреБрдг рдХреБрдЫ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред рд╣рдо рдЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдРрд╕реЗ рдЧреБрдгреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
рд╕рдВрдЪрд╛рд▓рдХ рд╡рд░реНрдЧ рдФрд░ рдкрд░рд┐рд╡рд╛рд░
рд╡рд░реНрдгрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдПрдХреНрд╕реЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреМрди рд╕реЗ рдСрдкрд░реЗрдЯрд░ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЕрдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PostgreSQL
рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдФрд░
рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред
рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ (рдФрд░ рд╢рд╛рдпрдж, рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ) рдХрд╛ рдПрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдХрдИ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "integer_ops" рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ "int8_ops", "int4_ops", рдФрд░ "int2_ops" рдкреНрд░рдХрд╛рд░ "bigint", "рдкреВрд░реНрдгрд╛рдВрдХ" рдФрд░ "smallint" рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдХрд╛рд░ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдЕрд░реНрде рд╣реИ:
postgres=# select opfname, opcname, opcintype::regtype from pg_opclass opc, pg_opfamily opf where opf.opfname = 'integer_ops' and opc.opcfamily = opf.oid and opf.opfmethod = ( select oid from pg_am where amname = 'btree' );
opfname | opcname | opcintype -------------+----------+----------- integer_ops | int2_ops | smallint integer_ops | int4_ops | integer integer_ops | int8_ops | bigint (3 rows)
рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг: "рдбреЗрдЯрд╛рдЗрдо_рдУрдкреНрд╕" рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рддрд╛рд░реАрдЦреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рд╕рдордп рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рджреЛрдиреЛрдВ):
postgres=# select opfname, opcname, opcintype::regtype from pg_opclass opc, pg_opfamily opf where opf.opfname = 'datetime_ops' and opc.opcfamily = opf.oid and opf.opfmethod = ( select oid from pg_am where amname = 'btree' );
opfname | opcname | opcintype --------------+-----------------+----------------------------- datetime_ops | date_ops | date datetime_ops | timestamptz_ops | timestamp with time zone datetime_ops | timestamp_ops | timestamp without time zone (3 rows)
рдПрдХ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдореЗрдВ рд╕рдореВрд╣рди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзреЗрдпрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рд╕реА рд╕реЗ рдЕрд▓рдЧ рдХреЛрд▓рд╛рдЬреЗрд╢рди рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ LIKE рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
postgres=# show lc_collate;
lc_collate ------------- en_US.UTF-8 (1 row)
postgres=# explain (costs off) select * from t where b like 'A%';
QUERY PLAN ----------------------------- Seq Scan on t Filter: (b ~~ 'A%'::text) (2 rows)
рд╣рдо рдСрдкрд░реЗрдЯрд░ рд╢реНрд░реЗрдгреА "text_pattern_ops" рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдХрд░ рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреИрд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ):
postgres=# create index on t(b text_pattern_ops); postgres=# explain (costs off) select * from t where b like 'A%';
QUERY PLAN ---------------------------------------------------------------- Bitmap Heap Scan on t Filter: (b ~~ 'A%'::text) -> Bitmap Index Scan on t_b_idx1 Index Cond: ((b ~>=~ 'A'::text) AND (b ~<~ 'B'::text)) (4 rows)
рд╕рд┐рд╕реНрдЯрдо рдХреИрдЯрд▓реЙрдЧ
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЖрд░реЗрдЦ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реАрдзреЗ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧреЛрдВ рдФрд░ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

рдпрд╣ рдмрд┐рдирд╛ рдХрд╣реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрди рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ
рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред
рд╕рд┐рд╕реНрдЯрдо рдХреИрдЯрд▓реЙрдЧ рд╣рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдХрдИ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреМрди рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд╣реБрдВрдЪ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
postgres=# select opcname, opcintype::regtype from pg_opclass where opcmethod = (select oid from pg_am where amname = 'btree') order by opcintype::regtype::text;
opcname | opcintype ---------------------+----------------------------- abstime_ops | abstime array_ops | anyarray enum_ops | anyenum ...
рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдореЗрдВ рдХреМрди рд╕реЗ рдСрдкрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдФрд░ рдЗрд╕рд▓рд┐рдП, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдРрд╕рд╛ рдСрдкрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ)?
postgres=# select amop.amopopr::regoperator from pg_opclass opc, pg_opfamily opf, pg_am am, pg_amop amop where opc.opcname = 'array_ops' and opf.oid = opc.opcfamily and am.oid = opf.opfmethod and amop.amopfamily = opc.opcfamily and am.amname = 'btree' and amop.amoplefttype = opc.opcintype;
amopopr ----------------------- <(anyarray,anyarray) <=(anyarray,anyarray) =(anyarray,anyarray) >=(anyarray,anyarray) >(anyarray,anyarray) (5 rows)
рдкрд░ рдкрдврд╝реЗрдВ ред