{"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\/lv\/blog\/administrirovanie\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql","title":{"rendered":"Izmantojam visas PostgreSQL indeksa iesp\u0113jas","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Izmantojam visas PostgreSQL indeksa iesp\u0113jas\" src=\"\/wp-content\/uploads\/2019\/05\/34a92715e0cfaff2519d1aea460592ea.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPostgres pasaul\u0113 indeksi ir \u0101rk\u0101rt\u012bgi svar\u012bgi efekt\u012bvai navig\u0101cijai datu b\u0101zes kr\u0101tuv\u0113 (to sauc par \u00abheap\u00bb). Postgres neatbalsta klasteriz\u0101ciju un MVCC arhitekt\u016bra noved pie t\u0101, ka jums uzkr\u0101jas daudz vienas un t\u0101s pa\u0161as rindi\u0146as versiju. T\u0101p\u0113c ir \u013coti svar\u012bgi sp\u0113t veidot un uztur\u0113t efekt\u012bvus indeksus, lai atbalst\u012btu lietojumprogrammas.<\/p>\n<p>Pied\u0101v\u0101ju j\u016bsu uzman\u012bbai vair\u0101kus padomus par indeksu optimiz\u0101ciju un uzlabo\u0161anu.<\/p>\n<p><i>Piez\u012bme: zem\u0101k redzamie vaic\u0101jumi darbojas neizmain\u012bt\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devrimgunduz\/pagila\">datub\u0101zes paraug\u0101 pagila<\/a><\/noindex>.<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>P\u0101rkl\u0101jo\u0161o indeksu izmanto\u0161ana (Covering Indexes)<\/h3>\n<p>\nApskat\u012bsim vaic\u0101jumu, lai ieg\u016btu e-pasta adreses neakt\u012bviem lietot\u0101jiem. Tabul\u0101 <code>customer<\/code> ir kolonna <code>active<\/code>, un vaic\u0101jums izn\u0101k vienk\u0101r\u0161s:<\/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>\nVaic\u0101jum\u0101 tiek izsaukti visi sken\u0113\u0161anas sec\u012bba tabul\u0101. <code>customer<\/code>Izveidosim indeksu kolonnai <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>\nPal\u012bdz\u0113ja, un turpm\u0101k\u0101 sken\u0113\u0161ana p\u0101rv\u0113rt\u0101s par \u201c<code>index scan<\/code>\u201d. Tas noz\u012bm\u0113, ka Postgres apskat\u012bs indeksu \u201c<code>idx_cust1<\/code>\u201d, un tad turpin\u0101s mekl\u0113t pa tabulas heap, lai izlas\u012btu citu kolonnu v\u0113rt\u012bbas (\u0161aj\u0101 gad\u012bjum\u0101 kolonnu <code>email<\/code>), kas nepiecie\u0161amas vaic\u0101jumam.<\/p>\n<p>PostgreSQL 11 ieviesa p\u0101rkl\u0101jo\u0161os indeksus. Tie \u013cauj iek\u013caut pa\u0161\u0101 indeks\u0101 vienu vai vair\u0101kas papildu kolonnas \u2014 to v\u0113rt\u012bbas tiek saglab\u0101tas indeksa datu kr\u0101tuv\u0113.<\/p>\n<p>Ja m\u0113s izmantotu \u0161o iesp\u0113ju un pievienotu e-pasta v\u0113rt\u012bbu indeksam, tad Postgres\u2019\u0101 vairs neb\u016btu j\u0101mekl\u0113 tabul\u0101 heap v\u0113rt\u012bba <code>email<\/code>. Paskat\u012bsimies, vai tas darbosies:<\/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\u201c<code>Index Only Scan<\/code>\u00bb mums saka, ka piepras\u012bjumam tagad ir pietiekami tikai viens indekss, kas pal\u012bdz izvair\u012bties no vis\u0101m diska ievades\/izvades oper\u0101cij\u0101m, lai las\u012btu datu lapu.<\/p>\n<p>\u0160odien seguma indeksi ir pieejami tikai B-kokiem. Tom\u0113r \u0161aj\u0101 gad\u012bjum\u0101 apkop\u0161anas izmaksas b\u016bs augst\u0101kas.<\/p>\n<h3>Da\u013c\u0113ju indeksu izmanto\u0161ana<\/h3>\n<p>\nDa\u013c\u0113jie indeksi indekse tikai apak\u0161kopu tabulas rind\u0101m. Tas \u013cauj ietaup\u012bt indeksu izm\u0113rus un \u0101tr\u0101k veikt sken\u0113\u0161anu.<\/p>\n<p>Pie\u0146emam, ka mums nepiecie\u0161ams sa\u0146emt klientu e-pasta adreses no Kalifornijas. Piepras\u012bjums b\u016bs \u0161\u0101ds:<\/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';\nkuram ir piepras\u012bjuma pl\u0101ns, kas ietver abu savienoto tabulu sken\u0113\u0161anu:\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                              PIEPRAS\u012aJUMA PL\u0100NS\n----------------------------------------------------------------------\n Hash Join  (izmaksas=15.65..32.22 rindas=9 platums=32)\n   Hash Cond: (c.address_id = a.address_id)\n   -&gt;  Sec Scan uz customer c  (izmaksas=0.00..14.99 rindas=599 platums=34)\n   -&gt;  Hash  (izmaksas=15.54..15.54 rindas=9 platums=4)\n         -&gt;  Sec Scan uz address a  (izmaksas=0.00..15.54 rindas=9 platums=4)\n               Filtrs: (district = 'California'::text)\n(6 rindas)<\/code><\/pre>\n<p>\nKo mums sniegs parastie indeksi:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_address1 ON address(district);\nIZVEIDO 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                                      PIEPRAS\u012aJUMA PL\u0100NS\n---------------------------------------------------------------------------------------\n Hash Join  (izmaksas=12.98..29.55 rindas=9 platums=32)\n   Hash Cond: (c.address_id = a.address_id)\n   -&gt;  Sec Scan uz customer c  (izmaksas=0.00..14.99 rindas=599 platums=34)\n   -&gt;  Hash  (izmaksas=12.87..12.87 rindas=9 platums=4)\n         -&gt;  Bitmap Heap Scan uz address a  (izmaksas=4.34..12.87 rindas=9 platums=4)\n               P\u0101rbaudes nosac\u012bjums: (district = 'California'::text)\n               -&gt;  Bitmap Index Scan uz idx_address1  (izmaksas=0.00..4.34 rindas=9 platums=0)\n                     Indeksa nosac\u012bjums: (district = 'California'::text)\n(8 rindas)<\/code><\/pre>\n<p>\nSken\u0113\u0161ana <code>address<\/code> tika aizst\u0101ta ar indeksu sken\u0113\u0161anu <code>idx_address1<\/code>, p\u0113c tam tika sken\u0113ta datu lapa <code>address<\/code>.<\/p>\n<p>T\u0101 k\u0101 \u0161is ir bie\u017es piepras\u012bjums un to nepiecie\u0161ams optimiz\u0113t, m\u0113s varam izmantot da\u013c\u0113ju indeksu, kas indeks\u0113 tikai t\u0101s rindas ar adres\u0113m, kuras attiec\u0101s uz rajonu <code>\u2018California\u2019<\/code>:<\/p>\n<pre><code class=\"sql\">pagila=# CREATE INDEX idx_address2 ON address(address_id) WHERE district='California';\nIZVEIDO 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                                           PIEPRAS\u012aJUMA PL\u0100NS\n------------------------------------------------------------------------------------------------\n Hash Join  (izmaksas=12.38..28.96 rindas=9 platums=32)\n   Hash Cond: (c.address_id = a.address_id)\n   -&gt;  Sec Scan uz customer c  (izmaksas=0.00..14.99 rindas=599 platums=34)\n   -&gt;  Hash  (izmaksas=12.27..12.27 rindas=9 platums=4)\n         -&gt;  Index Only Scan izmantojot idx_address2 uz address a  (izmaksas=0.14..12.27 rindas=9 platums=4)\n(5 rindas)<\/code><\/pre>\n<p>\nTagad piepras\u012bjums lasa tikai <code>idx_address2<\/code> un netrauc\u0113 tabulu <code>address<\/code>.<\/p>\n<h3>Daudzk\u0101rt\u012bgu indeksu izmanto\u0161ana (Multi-Value Indexes)<\/h3>\n<p>\nDa\u017eas kolonnas, kuras j\u0101indeks\u0113, var nesatur\u0113t skalaru datu tipu. Kolonn\u0101m, piem\u0113ram, t\u0101d\u0101m k\u0101 <code>jsonb<\/code>, <code>arrays<\/code> un <code>tsvector<\/code> var b\u016bt kompoz\u012btas vai vair\u0101kk\u0101rt\u0113jas v\u0113rt\u012bbas. Ja jums j\u0101indeks\u0113 \u0161\u0101das kolonnas, parasti ir j\u0101mekl\u0113 visos atsevi\u0161\u0137ajos v\u0113rt\u012bb\u0101s \u0161aj\u0101s kolonn\u0101s.<\/p>\n<p>M\u0113\u0123in\u0101sim atrast visu filmu nosaukumus, kuros ir iek\u013cautas neveiksmju dub\u013cu griezumi. Tabul\u0101 <code>film<\/code> ir teksta kolonna, kuru d\u0113v\u0113 par <code>special_features<\/code>. Ja filmai ir \u0161\u012b \u00ab\u012bpa\u0161\u0101 iez\u012bme\u00bb, tad kolonn\u0101 ir elements tekstu mas\u012bv\u0101 <code>Behind The Scenes<\/code>. Lai atrastu visas \u0161\u0101das filmas, m\u0113s j\u0101izv\u0113las visi rindi\u0146as ar \u00abBehind The Scenes\u00bb pie <b>jebk\u0101d\u0101m <\/b>mas\u012bva v\u0113rt\u012bb\u0101m <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>\nNostiprin\u0101\u0161anas operators (containment operator) <code>@&gt;<\/code> p\u0101rbauda, \u200b\u200bvai lab\u0101 puse ir kreis\u0101s puses apak\u0161kopums.<\/p>\n<p>Vaic\u0101juma pl\u0101ns:<\/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>\nKas pieprasa pilnu kaudzes sken\u0113\u0161anu ar izmaks\u0101m 67.<\/p>\n<p>Paskat\u012bsimies, vai mums pal\u012bdz\u0113s parastais B-koka indekss:<\/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>\nIndekss pat netika \u0146emts v\u0113r\u0101. B-koka indekss nenojau\u0161 par atsevi\u0161\u0137iem elementiem indeks\u0113taj\u0101s v\u0113rt\u012bb\u0101s.<\/p>\n<p>Mums nepiecie\u0161ams GIN indekss.<\/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 indekss atbalsta atsevi\u0161\u0137u v\u0113rt\u012bbu sal\u012bdzin\u0101\u0161anu ar indeks\u0113taj\u0101m kompoz\u012bcijas v\u0113rt\u012bb\u0101m, t\u0101d\u0113j\u0101di samazinot vaic\u0101juma pl\u0101na izmaksas vair\u0101k nek\u0101 divk\u0101rt.<\/p>\n<h3>Izvair\u0101mies no indeksu dubl\u0113\u0161an\u0101s<\/h3>\n<p>\nIndeksi uzkr\u0101jas laika gait\u0101, un da\u017ereiz jauns indekss var satur\u0113t to pa\u0161u defin\u012bciju k\u0101 viens no iepriek\u0161\u0113jiem. Lai ieg\u016btu cilv\u0113kiem las\u0101mus SQL indeksu defin\u012bcijas, var izmantot katalogu skat\u012bjumu. <code>pg_indexes<\/code>. J\u016bs var\u0113sit viegli atrast identiskas defin\u012bcijas:<\/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;\nUn \u0161eit ir rezult\u0101ts, kad tas tiek izpild\u012bts uz kr\u0101jumu pagila datub\u0101zes:\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>Superset indeksi<\/h3>\n<p>\nVar gad\u012bties, ka jums uzkr\u0101jas daudz indeksu, no kuriem viens indeks\u0113 kolonnu superset, kas indeks\u0113 citus indeksus. Tas var b\u016bt gan v\u0113lams, gan n\u0113 \u2014 superset var novest pie to indeksu sken\u0113\u0161anas, kas ir labi, ta\u010du tas var aiz\u0146emt p\u0101r\u0101k daudz vietas vai piepras\u012bjums, kura optimiz\u0101cijai \u0161is superset tika paredz\u0113ts, vairs netiek izmantots.<\/p>\n<p>Ja jums nepiecie\u0161ams automatiz\u0113t \u0161\u0101du indeksu noteik\u0161anu, varat s\u0101kt ar <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/catalog-pg-index.html\">pg_index<\/a><\/noindex> no tabulas <code>pg_catalog<\/code>.<\/p>\n<h3>Nepiepras\u012btie indeksi<\/h3>\n<p>\nAtt\u012bstoties lietojumprogramm\u0101m, kas izmanto datub\u0101zes, att\u012bst\u0101s ar\u012b taj\u0101s izmantotie piepras\u012bjumi. Agr\u0101k pievienotie indeksi var vairs netikt izmantoti nevien\u0101 piepras\u012bjum\u0101. Katru reizi, kad indekss tiek sken\u0113ts, to atz\u012bm\u0113 statistikas p\u0101rvaldnieks, un sist\u0113mas katalogu skat\u012bjum\u0101 <code>pg_stat_user_indexes<\/code> var apskat\u012bt v\u0113rt\u012bbu <code>idx_scan<\/code>, kas ir uzkr\u0101jo\u0161s skait\u012bt\u0101js. \u0160\u012b r\u0101d\u012bt\u0101ja izseko\u0161ana noteikt\u0101 laika posm\u0101 (piem\u0113ram, m\u0113nes\u012b) sniegs labu priek\u0161statu par to, kuri indeksi netiek izmantoti un var tikt dz\u0113sti.<\/p>\n<p>L\u016bk, piepras\u012bjums, lai ieg\u016btu pa\u0161reiz\u0113jos skait\u012bt\u0101jus par visiem indeksi sh\u0113m\u0101 <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';\nrezult\u0101ts b\u016bs \u0161\u0101ds:\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 rindi\u0146as)<\/code><\/pre>\n<p><\/p>\n<h3>Indeksu p\u0101rveido\u0161ana ar maz\u0101ku blo\u0137\u0113\u0161anas apjomu<\/h3>\n<p>\nBie\u017ei indeksi j\u0101veido no jauna, piem\u0113ram, kad tie palielin\u0101s apjom\u0101, un p\u0101rveido\u0161ana var pa\u0101trin\u0101t sken\u0113\u0161anu. Indeksi var ar\u012b tikt boj\u0101ti. Indeksa parametru mai\u0146a var ar\u012b pras\u012bt t\u0101 p\u0101rveido\u0161anu.<\/p>\n<h3>Iesl\u0113dzam paral\u0113lu indeksu veido\u0161anu<\/h3>\n<p>\nPostgreSQL 11 B-Tree indeksa izveide ir konkur\u0113tsp\u0113j\u012bga. Procesa pa\u0101trin\u0101\u0161anai var izmantot vair\u0101kus paral\u0113li str\u0101d\u0101jo\u0161us darbiniekus. Tom\u0113r p\u0101rliecinieties, ka \u0161ie konfigur\u0101cijas parametri ir iestat\u012bti pareizi:<\/p>\n<pre><code class=\"sql\">SET max_parallel_workers = 32;\nSET max_parallel_maintenance_workers = 16;<\/code><\/pre>\n<p>\nNoklus\u0113juma v\u0113rt\u012bbas ir p\u0101r\u0101k mazas. Ide\u0101l\u0101 gad\u012bjum\u0101 \u0161ie skait\u013ci j\u0101palielina kop\u0101 ar procesoru kodolu skaitu. Vair\u0101k lasiet <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-ASYNC-BEHAVIOR\">dokument\u0101cij\u0101<\/a><\/noindex>.<\/p>\n<h3>Fona indeksa izveide<\/h3>\n<p>\nJ\u016bs varat izveidot indeksu fona re\u017e\u012bm\u0101, izmantojot parametru <code>CONCURRENTLY<\/code> komandas <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>\u0160\u012b indeksa izveides proced\u016bra at\u0161\u0137iras no parast\u0101s ar to, ka t\u0101 neprasa blo\u0137\u0113t tabulu, t\u0101d\u0113j\u0101di neblo\u0137\u0113jot rakst\u012b\u0161anas oper\u0101cijas. No otras puses, t\u0101 aiz\u0146em vair\u0101k laika un pat\u0113r\u0113 vair\u0101k resursu.<\/p>\n<p>Postgres pied\u0101v\u0101 daudz elast\u012bgu iesp\u0113ju indeksu izveido\u0161anai un risin\u0101jumu jebkuru specifisku gad\u012bjumu risin\u0101\u0161anai, k\u0101 ar\u012b sniedz datub\u0101zu p\u0101rvald\u012bbas metodes j\u016bsu lietojumprogrammas strauja pieauguma gad\u012bjum\u0101. Ceram, ka \u0161ie padomi pal\u012bdz\u0113s jums padar\u012bt piepras\u012bjumus \u0101tr\u0101kus un datub\u0101zi gatavu m\u0113rogot.<br \/>\n<br \/>Avots: <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\/lv\/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=\"lv_LV\" \/>\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\/lv\/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\udd47Izmantojam visas PostgreSQL indeksu iesp\u0113jas | ProHoster","description":"PostgreSQL pasaul\u0113 indeksi ir \u0101rk\u0101rt\u012bgi svar\u012bgi.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/ispolzuem-vse-vozmozhnosti-indeksov-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/34419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=34419"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/34419\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/25931"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=34419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=34419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=34419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}