{"id":34419,"date":"2019-10-31T21:58:13","date_gmt":"2019-10-31T18:58:13","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql\/"},"modified":"2019-10-31T21:58:13","modified_gmt":"2019-10-31T18:58:13","slug":"ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql","title":{"rendered":"Utnyttja alla m\u00f6jligheter med index i PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Utnyttja alla m\u00f6jligheter med index i PostgreSQL\" src=\"\/wp-content\/uploads\/2019\/05\/34a92715e0cfaff2519d1aea460592ea.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI PostgreSQL \u00e4r index extremt viktiga f\u00f6r effektiv navigering genom databasens lagringsutrymme (det kallas \u00abheap\u00bb). PostgreSQL st\u00f6der inte klusterisering, och MVCC-arkitekturen leder till att m\u00e5nga versioner av samma tuple samlas p\u00e5 h\u00f6g. D\u00e4rf\u00f6r \u00e4r det mycket viktigt att kunna skapa och underh\u00e5lla effektiva index f\u00f6r att st\u00f6dja applikationer.<\/p>\n<p>H\u00e4r \u00e4r n\u00e5gra tips f\u00f6r att optimera och f\u00f6rb\u00e4ttra anv\u00e4ndningen av index.<\/p>\n<p><i>Obs: Nedanst\u00e5ende fr\u00e5gor fungerar p\u00e5 en of\u00f6r\u00e4ndrad <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devrimgunduz\/pagila\">exempel p\u00e5 databas pagila.<\/a><\/noindex>.<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Anv\u00e4ndning av t\u00e4ckande index (Covering Indexes)<\/h3>\n<p>\nL\u00e5t oss titta p\u00e5 en fr\u00e5ga f\u00f6r att extrahera e-postadresser f\u00f6r inaktiva anv\u00e4ndare. I tabellen <code>customer<\/code> finns en kolumn <code>active<\/code>, och fr\u00e5gan blir inte komplicerad:<\/p>\n<pre><code class=\"sql\">pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;\n                        QUERY PLAN\n-----------------------------------------------------------\n Seq Scan on customer  (cost=0.00..16.49 rows=15 width=32)\n   Filter: (active = 0)\n(2 rows)<\/code><\/pre>\n<p>\nI fr\u00e5gan anropas en fullst\u00e4ndig sekvens av tabellscanning. <code>customer<\/code>L\u00e5t oss skapa ett index f\u00f6r kolumnen <code>active<\/code>:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_cust1 ON customer(active);\nCREATE INDEX\npagila=# EXPLAIN SELECT email FROM customer WHERE active=0;\n                                 QUERY PLAN\n-----------------------------------------------------------------------------\n Index Scan using idx_cust1 on customer  (cost=0.28..12.29 rows=15 width=32)\n   Index Cond: (active = 0)\n(2 rows)<\/code><\/pre>\n<p>\n\u041f\u043e\u043c\u043e\u0433\u043b\u043e, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 &#171;<code>index scan<\/code>&#171;. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e Postgres \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 &#171;<code>idx_cust1<\/code>&#171;, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u0443\u0447\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u043b\u043e\u043d\u043a\u0443 <code>e-post<\/code>), som beg\u00e4rs av fr\u00e5gan.<\/p>\n<p>I PostgreSQL 11 introducerades t\u00e4ckande index. De g\u00f6r det m\u00f6jligt att inkludera en eller flera extra kolumner i indexet \u2013 deras v\u00e4rden lagras i indexets datalagring.<\/p>\n<p>Om vi hade utnyttjat denna m\u00f6jlighet och lagt till e-postadressen i indexet, skulle PostgreSQL inte beh\u00f6va s\u00f6ka efter v\u00e4rdet i tabellens heap. <code>e-post<\/code>L\u00e5t oss se om det fungerar:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_cust2 ON customer(active) INCLUDE (email);\nCREATE INDEX\npagila=# EXPLAIN SELECT email FROM customer WHERE active=0;\n                                    QUERY PLAN\n----------------------------------------------------------------------------------\n Index Only Scan using idx_cust2 on customer  (cost=0.28..12.29 rows=15 width=32)\n   Index Cond: (active = 0)\n(2 rows)<\/code><\/pre>\n<p>\n\u00ab<code>Index Only Scan<\/code>&#187; \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043b\u0438\u0448\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>I dag \u00e4r t\u00e4ckande index endast tillg\u00e4ngliga f\u00f6r B-tr\u00e4d. Men i detta fall kommer underh\u00e5llet att vara mer kr\u00e4vande.<\/p>\n<h3>Anv\u00e4ndning av partiella index<\/h3>\n<p>\nPartiella index indexerar bara en delm\u00e4ngd av tabellens rader. Det sparar indexstorlek och g\u00f6r skanning snabbare.<\/p>\n<p>Anta att vi beh\u00f6ver f\u00e5 en lista \u00f6ver e-postadresser fr\u00e5n v\u00e5ra kunder i Kalifornien. Fr\u00e5gan kommer att se ut s\u00e5 h\u00e4r:<\/p>\n<pre><code class=\"sql\">SELECT c.email FROM customer c\nJOIN address a ON c.address_id = a.address_id\nWHERE a.district = 'California';\nvilket har en fr\u00e5geplan som involverar att skanna b\u00e5da de ihopslagna tabellerna:\npagila=# EXPLAIN SELECT c.email FROM customer c\npagila-# JOIN address a ON c.address_id = a.address_id\npagila-# WHERE a.district = 'California';\n                              QUERY PLAN\n----------------------------------------------------------------------\n Hash Join  (cost=15.65..32.22 rows=9 width=32)\n   Hash Cond: (c.address_id = a.address_id)\n   -&gt;  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)\n   -&gt;  Hash  (cost=15.54..15.54 rows=9 width=4)\n         -&gt;  Seq Scan on address a  (cost=0.00..15.54 rows=9 width=4)\n               Filter: (district = 'California'::text)\n(6 rows)<\/code><\/pre>\n<p>\nVad ger oss vanliga index:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_address1 ON address(district);\nCREATE INDEX\npagila=# EXPLAIN SELECT c.email FROM customer c\npagila-# JOIN address a ON c.address_id = a.address_id\npagila-# WHERE a.district = 'California';\n                                      QUERY PLAN\n---------------------------------------------------------------------------------------\n Hash Join  (cost=12.98..29.55 rows=9 width=32)\n   Hash Cond: (c.address_id = a.address_id)\n   -&gt;  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)\n   -&gt;  Hash  (cost=12.87..12.87 rows=9 width=4)\n         -&gt;  Bitmap Heap Scan on address a  (cost=4.34..12.87 rows=9 width=4)\n               Recheck Cond: (district = 'California'::text)\n               -&gt;  Bitmap Index Scan on idx_address1  (cost=0.00..4.34 rows=9 width=0)\n                     Index Cond: (district = 'California'::text)\n(8 rows)<\/code><\/pre>\n<p>\nSkanning <code>address<\/code> ersattes av indexskanning <code>idx_address1<\/code>, och sedan skannades h\u00f6gstapeln <code>address<\/code>.<\/p>\n<p>Eftersom detta \u00e4r en vanlig f\u00f6rfr\u00e5gan och beh\u00f6ver optimeras kan vi anv\u00e4nda ett partiellt index som indexerar endast de rader med adresser d\u00e4r distriktet <code>\u2018California\u2019<\/code>:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_address2 ON address(address_id) WHERE district='California';\nCREATE INDEX\npagila=# EXPLAIN SELECT c.email FROM customer c\npagila-# JOIN address a ON c.address_id = a.address_id\npagila-# WHERE a.district = 'California';\n                                           QUERY PLAN\n------------------------------------------------------------------------------------------------\n Hash Join  (cost=12.38..28.96 rows=9 width=32)\n   Hash Cond: (c.address_id = a.address_id)\n   -&gt;  Seq Scan on customer c  (cost=0.00..14.99 rows=599 width=34)\n   -&gt;  Hash  (cost=12.27..12.27 rows=9 width=4)\n         -&gt;  Index Only Scan using idx_address2 on address a  (cost=0.14..12.27 rows=9 width=4)\n(5 rows)<\/code><\/pre>\n<p>\nNu l\u00e4ser f\u00f6rfr\u00e5gan endast <code>idx_address2<\/code> och r\u00f6r inte tabellen <code>address<\/code>.<\/p>\n<h3>Anv\u00e4ndning av flerv\u00e4rdiga index (Multi-Value Indexes)<\/h3>\n<p>\nVissa kolumner som beh\u00f6ver indexeras kan sakna skal\u00e4ra datatyper. Kolumntyper som <code>jsonb<\/code>, <code>arrays<\/code> och <code>tsvector<\/code> kan inneh\u00e5lla sammansatta eller multipla v\u00e4rden. Om du beh\u00f6ver indexera s\u00e5dana kolumner, m\u00e5ste du vanligtvis s\u00f6ka igenom varje individuellt v\u00e4rde i dessa kolumner.<\/p>\n<p>L\u00e5t oss f\u00f6rs\u00f6ka hitta titlarna p\u00e5 alla filmer som inneh\u00e5ller klipp fr\u00e5n misslyckade dubbar. I tabellen <code>film<\/code> finns det en texkolumn som kallas <code>special_features<\/code>. Om en film har denna \"specialfunktion\" s\u00e5 inneh\u00e5ller kolumnen ett element som en textarray <code>Behind The Scenes<\/code>. F\u00f6r att hitta alla s\u00e5dana filmer beh\u00f6ver vi v\u00e4lja alla rader som har \"Behind The Scenes\" vid <b>vilka <\/b>v\u00e4rden som helst i arrayen <code>special_features<\/code>:<\/p>\n<pre><code class=\"sql\">SELECT title FROM film WHERE special_features @&gt; '{\"Behind The Scenes\"}';<\/code><\/pre>\n<p>\nContainment operator <code>@&gt;<\/code> kontrollerar om den h\u00f6gra sidan \u00e4r en delm\u00e4ngd av den v\u00e4nstra sidan.<\/p>\n<p>Fr\u00e5geplan:<\/p>\n<pre><code class=\"sql\">pagila=# EXPLAIN SELECT title FROM film\npagila-# WHERE special_features @&gt; '{\"Behind The Scenes\"}';\n                           QUERY PLAN\n-----------------------------------------------------------------\n Seq Scan on film  (cost=0.00..67.50 rows=5 width=15)\n   Filter: (special_features @&gt; '{\"Behind The Scenes\"}'::text[])\n(2 rows)<\/code><\/pre>\n<p>\nVilken beg\u00e4r en fullst\u00e4ndig skanning av h\u00f6gen med en kostnad av 67.<\/p>\n<p>L\u00e5t oss se om en vanlig B-tr\u00e4d index kan hj\u00e4lpa oss:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_film1 ON film(special_features);\nCREATE INDEX\npagila=# EXPLAIN SELECT title FROM film\npagila-# WHERE special_features @&gt; '{\"Behind The Scenes\"}';\n                           QUERY PLAN\n-----------------------------------------------------------------\n Seq Scan on film  (cost=0.00..67.50 rows=5 width=15)\n   Filter: (special_features @&gt; '{\"Behind The Scenes\"}'::text[])\n(2 rows)<\/code><\/pre>\n<p>\nIndexen beaktades inte ens. B-tr\u00e4d indexet har ingen aning om existensen av individuella element i de indexerade v\u00e4rdena.<\/p>\n<p>Vi beh\u00f6ver ett GIN-index.<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_film2 ON film USING GIN(special_features);\nCREATE INDEX\npagila=# EXPLAIN SELECT title FROM film\npagila-# WHERE special_features @&gt; '{\"Behind The Scenes\"}';\n                                QUERY PLAN\n---------------------------------------------------------------------------\n Bitmap Heap Scan on film  (cost=8.04..23.58 rows=5 width=15)\n   Recheck Cond: (special_features @&gt; '{\"Behind The Scenes\"}'::text[])\n   -&gt;  Bitmap Index Scan on idx_film2  (cost=0.00..8.04 rows=5 width=0)\n         Index Cond: (special_features @&gt; '{\"Behind The Scenes\"}'::text[])\n(4 rows)<\/code><\/pre>\n<p>\nGIN-indexet st\u00f6der matchning av individuella v\u00e4rden med de indexerade sammansatta v\u00e4rdena, vilket resulterar i att kostnaden f\u00f6r fr\u00e5geplanen minskar med mer \u00e4n h\u00e4lften.<\/p>\n<h3>Vi eliminerar dubbletter av index<\/h3>\n<p>\nIndexar samlas \u00f6ver tid, och ibland kan ett nytt index inneh\u00e5lla samma definition som ett tidigare. F\u00f6r att f\u00e5 l\u00e4sbara SQL-definitioner f\u00f6r index kan man anv\u00e4nda katalogvisningen. <code>pg_indexes<\/code>. Du kommer ocks\u00e5 l\u00e4tt kunna hitta identiska definitioner:<\/p>\n<pre><code class=\"sql\"> SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn\n    FROM pg_indexes\nGROUP BY defn\n  HAVING count(*) &gt; 1;\nOch h\u00e4r \u00e4r resultatet n\u00e4r det k\u00f6rs p\u00e5 den stock pagila-databasen:\npagila=#   SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn\npagila-#     FROM pg_indexes\npagila-# GROUP BY defn\npagila-#   HAVING count(*) &gt; 1;\n                                indexes                                 |                                defn\n------------------------------------------------------------------------+------------------------------------------------------------------\n {payment_p2017_01_customer_id_idx,idx_fk_payment_p2017_01_customer_id} | CREATE INDEX  ON public.payment_p2017_01 USING btree (customer_id\n {payment_p2017_02_customer_id_idx,idx_fk_payment_p2017_02_customer_id} | CREATE INDEX  ON public.payment_p2017_02 USING btree (customer_id\n {payment_p2017_03_customer_id_idx,idx_fk_payment_p2017_03_customer_id} | CREATE INDEX  ON public.payment_p2017_03 USING btree (customer_id\n {idx_fk_payment_p2017_04_customer_id,payment_p2017_04_customer_id_idx} | CREATE INDEX  ON public.payment_p2017_04 USING btree (customer_id\n {payment_p2017_05_customer_id_idx,idx_fk_payment_p2017_05_customer_id} | CREATE INDEX  ON public.payment_p2017_05 USING btree (customer_id\n {idx_fk_payment_p2017_06_customer_id,payment_p2017_06_customer_id_idx} | CREATE INDEX  ON public.payment_p2017_06 USING btree (customer_id\n(6 rows)\n<\/code><\/pre>\n<p><\/p>\n<h3>\u00d6vergripande index (Superset Indexes)<\/h3>\n<p>\nDet kan h\u00e4nda att du har samlat m\u00e5nga index, d\u00e4r ett av dem indexerar en \u00f6vergripande m\u00e4ngd kolumner som ocks\u00e5 indexeras av andra index. Detta kan vara b\u00e5de \u00f6nskv\u00e4rt och o\u00f6nskat \u2014 \u00f6vergripande index kan leda till att man skannar endast via index, vilket \u00e4r bra, men kan ocks\u00e5 ta f\u00f6r mycket utrymme, eller s\u00e5 anv\u00e4nds inte den fr\u00e5ga som detta index var avsett att optimera l\u00e4ngre.<\/p>\n<p>Om du beh\u00f6ver automatisera identifieringen av s\u00e5dana index kan du b\u00f6rja med <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/catalog-pg-index.html\">pg_index<\/a><\/noindex> fr\u00e5n tabellen <code>pg_catalog<\/code>.<\/p>\n<h3>Oanv\u00e4nda index<\/h3>\n<p>\nI takt med att applikationer som anv\u00e4nder databaser utvecklas, utvecklas \u00e4ven fr\u00e5gorna de anv\u00e4nder. Tidigare tillagda index kanske inte l\u00e4ngre anv\u00e4nds av n\u00e5gon fr\u00e5ga. Vid varje skanning av indexet markeras det av statistikern, och i systemkatalogens vy <code>pg_stat_user_indexes<\/code> kan man se v\u00e4rdet <code>idx_scan<\/code>, som \u00e4r en ackumulerande r\u00e4knare. Att sp\u00e5ra detta v\u00e4rde \u00f6ver en viss tidsperiod (l\u00e5t oss s\u00e4ga en m\u00e5nad) ger en bra insikt om vilka index som inte anv\u00e4nds och kan tas bort.<\/p>\n<p>H\u00e4r \u00e4r en fr\u00e5ga f\u00f6r att f\u00e5 de aktuella skannerr\u00e4knarna f\u00f6r alla index i schemat <code>\u2018public\u2019<\/code>:<\/p>\n<pre><code class=\"sql\">SELECT relname, indexrelname, idx_scan\nFROM   pg_catalog.pg_stat_user_indexes\nWHERE  schemaname = 'public';\nmed utskrift som denna:\npagila=# SELECT relname, indexrelname, idx_scan\npagila-# FROM   pg_catalog.pg_stat_user_indexes\npagila-# WHERE  schemaname = 'public'\npagila-# LIMIT  10;\n    relname    |    indexrelname    | idx_scan\n---------------+--------------------+----------\n customer      | customer_pkey      |    32093\n actor         | actor_pkey         |     5462\n address       | address_pkey       |      660\n category      | category_pkey      |     1000\n city          | city_pkey          |      609\n country       | country_pkey       |      604\n film_actor    | film_actor_pkey    |        0\n film_category | film_category_pkey |        0\n film          | film_pkey          |    11043\n inventory     | inventory_pkey     |    16048\n(10 rader)<\/code><\/pre>\n<p><\/p>\n<h3>\u00c5terskapande av index med f\u00e4rre l\u00e5s<\/h3>\n<p>\nDet h\u00e4nder ofta att index m\u00e5ste \u00e5terskapas, till exempel n\u00e4r de v\u00e4xer i storlek, och \u00e5terskapande kan snabba upp skanningar. Index kan ocks\u00e5 skadas. \u00c4ndring av indexparametrar kan ocks\u00e5 kr\u00e4va \u00e5terskapande.<\/p>\n<h3>Aktivera parallell skapande av index<\/h3>\n<p>\nI PostgreSQL 11 \u00e4r skapande av B-Tree-index konkurrensutsatt. Flera arbetare kan anv\u00e4ndas parallellt f\u00f6r att snabba upp skapandeprocessen. Se dock till att dessa konfigurationsparametrar \u00e4r inst\u00e4llda korrekt:<\/p>\n<pre><code class=\"sql\">SET max_parallel_workers = 32;\nSET max_parallel_maintenance_workers = 16;<\/code><\/pre>\n<p>\nStandardv\u00e4rdena \u00e4r f\u00f6r sm\u00e5. Idealiskt sett b\u00f6r dessa siffror \u00f6kas i takt med antalet CPU-k\u00e4rnor. L\u00e4s mer i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-ASYNC-BEHAVIOR\">dokumentationen<\/a><\/noindex>.<\/p>\n<h3>Bakgrundsskapande av index<\/h3>\n<p>\nDu kan skapa ett index i bakgrunden genom att anv\u00e4nda parametern <code>CONCURRENTLY<\/code> kommandon <code>CREATE INDEX<\/code>:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX CONCURRENTLY idx_address1 ON address(district);\nCREATE INDEX<\/code><\/pre>\n<p>Denna procedur f\u00f6r att skapa ett index skiljer sig fr\u00e5n den vanliga eftersom den inte kr\u00e4ver l\u00e5sning av tabellen, vilket inneb\u00e4r att den inte blockerar skrivoperationer. \u00c5 andra sidan tar den l\u00e4ngre tid och f\u00f6rbrukar fler resurser.<\/p>\n<p>Postgres erbjuder m\u00e5nga flexibla m\u00f6jligheter f\u00f6r att skapa index och s\u00e4tt att hantera alla specifika fall, samt s\u00e4tt att hantera databasen vid explosiv tillv\u00e4xt av din applikation. Vi hoppas att dessa tips hj\u00e4lper dig att g\u00f6ra dina fr\u00e5gor snabba och din databas beredd att skala.<br \/>\n<br \/>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/453046\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043c\u0438\u0440\u0435 Postgres \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0435\u0433\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u00ab\u043a\u0443\u0447\u0430\u00bb, heap). Postgres \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 MVCC \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":25931,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34419","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043c\u0438\u0440\u0435 Postgres \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043c\u0438\u0440\u0435 Postgres \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:58:13+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:58:13+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Anv\u00e4nd alla m\u00f6jligheter med index i PostgreSQL | ProHoster","description":"I v\u00e4rlden av Postgres \u00e4r index extremt viktiga f\u00f6r.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 PostgreSQL | ProHoster","og:description":"\u0412 \u043c\u0438\u0440\u0435 Postgres \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f.","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:58:13+00:00","article:modified_time":"2019-10-31T18:58:13+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34419","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 19:13:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:52:22","updated":"2026-01-21 19:13:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=34419"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34419\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/25931"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=34419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=34419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=34419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}