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

рдЗрдВрдЯрд░рдлрд╝реЗрд╕


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

рдЧреБрдг


рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ "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) 

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

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


All Articles