Postgres-แแก แกแแแงแแ แแจแ แแแแแฅแกแแแ แแฃแชแแแแแแแแ แแแแแชแแแแ แแแแแก แกแแชแแแจแ แแคแแฅแขแฃแ แ แแแแแแแชแแแกแแแแก (แ.แฌ. "แแ แแแ"). Postgres แแ แฃแญแแ แก แแฎแแ แก แแแแกแขแแ แแ แแแแก แแ MVCC แแ แฅแแขแแฅแขแฃแ แ แแฌแแแแก แแฅแแแ แแแกแ แฃแแแแแก แแ แแ แแ แแแแแ แขแฃแแแแก แแ แแแแแ แแแ แกแแแ. แแแแขแแ, แซแแแแแ แแแแจแแแแแแแแแแ, แ แแ แจแแซแแแ แแคแแฅแขแฃแ แ แแแแแฅแกแแแแก แจแแฅแแแ แแ แจแแแแ แฉแฃแแแแ แแแแแแแชแแแแแก แแฎแแ แแแกแแญแแ แแ.
แแฅ แแแชแแแฃแแแ แ แแแแแแแแ แ แฉแแแ แแแแแฅแกแแแแก แแแขแแแแแแชแแแกแ แแ แแแแแงแแแแแแก แแแกแแฃแแฏแแแแกแแแแแ.
แจแแแแจแแแ: แฅแแแแแ แแแฉแแแแแแ แแแแฎแแแแแแ แแฃแจแแแแก แจแแฃแชแแแแแแ
แแแคแแ แแแก แแแแแฅแกแแแแก แแแแแงแแแแแ
แแแแแ แจแแแฎแแแแ แแแแฎแแแแแก แแ.แคแแกแขแแก แแแกแแแแ แแแแแก แแแแฆแแแแก แจแแกแแฎแแ แแ แแแฅแขแแฃแ แ แแแแฎแแแ แแแแแแแกแแแแก. แแแแแแ customer
แแ แแก แกแแแขแ active
แแ แจแแแแแฎแแ แแแ แขแแแแ:
pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
QUERY PLAN
-----------------------------------------------------------
Seq Scan on customer (cost=0.00..16.49 rows=15 width=32)
Filter: (active = 0)
(2 rows)
แแแแฎแแแแ แแฌแแแแก แชแฎแ แแแแก แกแแแแแ แแแแก แกแ แฃแ แแแแแแแแแแ แแแแก customer
. แแแแแ แจแแแฅแแแแ แแแแแฅแกแ แกแแแขแแ active
:
pagila=# CREATE INDEX idx_cust1 ON customer(active);
CREATE INDEX
pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
QUERY PLAN
-----------------------------------------------------------------------------
Index Scan using idx_cust1 on customer (cost=0.28..12.29 rows=15 width=32)
Index Cond: (active = 0)
(2 rows)
แแแแฎแแแ แ, แจแแแแแแแ แกแแแแแ แแแ แแแแแแฅแชแ "index scan
". แแก แแแจแแแแก, แ แแ Postgres แแแแกแแแแแ แแแก แแแแแฅแกแก.idx_cust1
แแ แจแแแแแ แแแแแแ แซแแ แชแฎแ แแแแก แแ แแแแก แซแแแแ แกแฎแแ แกแแแขแแแแก แแแแจแแแแแแแแแแก แฌแแกแแแแแฎแแ (แแ แจแแแแฎแแแแแจแ, แกแแแขแ email
) แ แแช แแแแฎแแแแแก แกแญแแ แแแแ.
แแแคแแ แแแก แแแแแฅแกแแแ แแแแแ แแแแแ PostgreSQL 11-แจแ. แแกแแแ แกแแจแฃแแแแแแก แแแซแแแแ แจแแแขแแแแ แแ แแ แแ แแแขแ แแแแแขแแแแแ แกแแแขแ แแแแแ แแแแแฅแกแจแ - แแแแ แแแแจแแแแแแแแแ แแแแฎแแแ แแแแแฅแกแแก แแแแแชแแแแ แแแฆแแแแแจแ.
แแฃ แฉแแแ แแแกแแ แแแแแแแแแ แแ แคแฃแแฅแชแแแ แแ แแแแแแแขแแแแแ แแ.แคแแกแขแแก แแแแจแแแแแแแแก แแแแแฅแกแจแ, แแแจแแ Postgres-แก แแ แแแกแญแแ แแแแแแ แแแแจแแแแแแแแก แชแฎแ แแแแก แแ แแแแก แซแแแแ. email
. แแแแฎแแ, แแแฃแจแแแแแก แแฃ แแ แ แแก:
pagila=# CREATE INDEX idx_cust2 ON customer(active) INCLUDE (email);
CREATE INDEX
pagila=# EXPLAIN SELECT email FROM customer WHERE active=0;
QUERY PLAN
----------------------------------------------------------------------------------
Index Only Scan using idx_cust2 on customer (cost=0.28..12.29 rows=15 width=32)
Index Cond: (active = 0)
(2 rows)
ยซIndex Only Scan
แแแแฃแแแแแ, แ แแ แแแแฎแแแแแก แแฎแแ แกแญแแ แแแแ แแฎแแแแ แแแแแฅแกแ, แ แแแแแแช แแแแแฎแแแ แแแแ แแแแแแแ แแแชแแแแ แงแแแแ แแแกแแ I/O แชแฎแ แแแแก แแ แแแแก แฌแแกแแแแแฎแแ.
แแแคแแ แแแก แแแแแฅแกแแแ แแแแแแแ แฎแแแแแกแแฌแแแแแแ แแฎแแแแ B- แฎแแแแแกแแแแก. แแฃแแชแ, แแ แจแแแแฎแแแแแจแ, แจแแแแ แฉแฃแแแแแก แซแแแแกแฎแแแแ แฃแคแ แ แแแฆแแแ แแฅแแแแ.
แแแฌแแแแแ แแแ แแแแแฅแกแแแแก แแแแแงแแแแแ
แแแฌแแแแแ แแแ แแแแแฅแกแแแแก แแแแแฅแกแแ แแแ แฎแแแแ แชแฎแ แแแแก แแฌแแ แแแแแแก แแฎแแแแ แฅแแแฏแแฃแคแแ. แแก แแแแแแแแก แแแแแฅแกแแแแก แแแแแก แแ แแฉแฅแแ แแแก แกแแแแแ แแแแก.
แแแฅแแแ, แแแแแแ แแแแแฆแแ แฉแแแแ แแแแแแขแแแแก แแแคแแกแขแแก แแแกแแแแ แแแแแก แกแแ แแแแแคแแ แแแแจแ. แแแแฎแแแแ แแฅแแแแ แแกแแแ:
SELECT c.email FROM customer c
JOIN address a ON c.address_id = a.address_id
WHERE a.district = 'California';
which has a query plan that involves scanning both the tables that are joined:
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
QUERY PLAN
----------------------------------------------------------------------
Hash Join (cost=15.65..32.22 rows=9 width=32)
Hash Cond: (c.address_id = a.address_id)
-> Seq Scan on customer c (cost=0.00..14.99 rows=599 width=34)
-> Hash (cost=15.54..15.54 rows=9 width=4)
-> Seq Scan on address a (cost=0.00..15.54 rows=9 width=4)
Filter: (district = 'California'::text)
(6 rows)
แ แแก แแแแแชแแแก แฉแแแฃแแแแ แแแ แแแแแฅแกแแแ:
pagila=# CREATE INDEX idx_address1 ON address(district);
CREATE INDEX
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
QUERY PLAN
---------------------------------------------------------------------------------------
Hash Join (cost=12.98..29.55 rows=9 width=32)
Hash Cond: (c.address_id = a.address_id)
-> Seq Scan on customer c (cost=0.00..14.99 rows=599 width=34)
-> Hash (cost=12.87..12.87 rows=9 width=4)
-> Bitmap Heap Scan on address a (cost=4.34..12.87 rows=9 width=4)
Recheck Cond: (district = 'California'::text)
-> Bitmap Index Scan on idx_address1 (cost=0.00..4.34 rows=9 width=0)
Index Cond: (district = 'California'::text)
(8 rows)
แกแแแแแ แแแ address
แจแแแชแแแแ แแแแแฅแกแแก แกแแแแแ แแแแ idx_address1
แแ แจแแแแแ แแแแกแแแแแ แ แแ แแแ address
.
แแแแแแแแ แแก แแ แแก แฎแจแแ แ แแแแฎแแแแ แแ แกแแญแแ แแแแก แแแขแแแแแแชแแแก, แจแแแแแซแแแ แแแแแแแงแแแแ แแแฌแแแแแ แแแ แแแแแฅแกแ, แ แแแแแแช แแแแแฅแกแแแก แแฎแแแแ แแ แกแขแ แแฅแแแแแก แแแกแแแแ แแแแแ, แ แแแแแแจแแช แฃแแแแ โCaliforniaโ
:
pagila=# CREATE INDEX idx_address2 ON address(address_id) WHERE district='California';
CREATE INDEX
pagila=# EXPLAIN SELECT c.email FROM customer c
pagila-# JOIN address a ON c.address_id = a.address_id
pagila-# WHERE a.district = 'California';
QUERY PLAN
------------------------------------------------------------------------------------------------
Hash Join (cost=12.38..28.96 rows=9 width=32)
Hash Cond: (c.address_id = a.address_id)
-> Seq Scan on customer c (cost=0.00..14.99 rows=599 width=34)
-> Hash (cost=12.27..12.27 rows=9 width=4)
-> Index Only Scan using idx_address2 on address a (cost=0.14..12.27 rows=9 width=4)
(5 rows)
แแฎแแ แจแแแแแฎแแ แแฎแแแแ แแแแแฎแแแ idx_address2
แแ แแ แแฎแแแ แแแแแแแก address
.
แแ แแแแแแแแจแแแแแแแแแ แแแแแฅแกแแแแก แแแแแงแแแแแ
แแแแแแ แแ แกแแแขแ, แ แแแแแแช แฃแแแ แแงแแก แแแแแฅแกแแ แแแฃแแ, แจแแแซแแแแ แแ แจแแแชแแแแแก แกแแแแแ แฃแแ แแแแแชแแแแแแก แขแแแก. แกแแแขแแแแก แขแแแแแ, แ แแแแ แแชแแ jsonb
, arrays
ะธ tsvector
แจแแแชแแแก แแแแแแแแขแฃแ แแ แแ แแแแแ แแชแฎแแแแ แแแแจแแแแแแแแก. แแฃ แแญแแ แแแแแ แแกแแแ แกแแแขแแแแก แแแแแฅแกแแ แแแ, แฉแแแฃแแแแ แแ แฃแแแ แแแซแแแแแ แแ แกแแแขแแแแก แงแแแแ แแแแแแแแฃแแแฃแ แ แแแแจแแแแแแแ.
แจแแแแชแแแแ แแแแแแแ แงแแแแ แคแแแแแก แกแแแแฃแ แ, แ แแแแแแช แจแแแชแแแก แฌแแ แฃแแแขแแแแแ แแแแแฆแแแแแแก แญแ แแแแแก. แแแแแแ film
แแ แแก แขแแฅแกแขแแก แกแแแขแ แ.แฌ special_features
. แแฃ แคแแแแก แแฅแแก แแก โแกแแแชแแแแฃแ แ แแแแกแแแโ, แแแจแแ แกแแแขแ แจแแแชแแแก แแแแแแแขแก แขแแฅแกแขแแก แแแกแแแแก แกแแฎแแ Behind The Scenes
. แงแแแแ แแกแแแ แคแแแแแก แแแกแแซแแแแแ, แฉแแแ แฃแแแ แแแแ แฉแแแ แงแแแแ แกแขแ แแฅแแแ โแกแชแแแแแแก แแแฆแแโ, แ แแแแกแแช แแแแแกแแแแ แ แแแกแแแแก แแแแจแแแแแแแแแ special_features
:
SELECT title FROM film WHERE special_features @> '{"Behind The Scenes"}';
แแแแฃแแแ แ แแแแ แแขแแ แ @>
แแแแฌแแแแก แแ แแก แแฃ แแ แ แแแ แฏแแแแ แแฎแแ แ แแแ แชแฎแแแ แแฎแแ แแก แฅแแแกแแแ แแแแ.
แแแแแฎแแแแ แแแแแ:
pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
QUERY PLAN
-----------------------------------------------------------------
Seq Scan on film (cost=0.00..67.50 rows=5 width=15)
Filter: (special_features @> '{"Behind The Scenes"}'::text[])
(2 rows)
แ แแแแแแช แแแฎแแแก แกแ แฃแแ แแ แแแแก แกแแแแแ แแแแก 67 แฆแแ แแแฃแแแแแ.
แแแแฎแแ, แแแแฎแแแ แแแ แแฃ แแ แ แฉแแแฃแแแแ แแแ B-แฎแแก แแแแแฅแกแ:
pagila=# CREATE INDEX idx_film1 ON film(special_features);
CREATE INDEX
pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
QUERY PLAN
-----------------------------------------------------------------
Seq Scan on film (cost=0.00..67.50 rows=5 width=15)
Filter: (special_features @> '{"Behind The Scenes"}'::text[])
(2 rows)
แแแแแฅแกแ แแ แช แแ แแแแแฎแแแแแแแ. B-แฎแแก แแแแแฅแกแแ แแ แแชแแก แชแแแแแฃแแ แแแแแแแขแแแแก แแ แกแแแแแ แแแแแฅแกแแ แแแฃแ แแแแจแแแแแแแแแจแ.
แฉแแแ แแแญแแ แแแแ GIN แแแแแฅแกแ.
pagila=# CREATE INDEX idx_film2 ON film USING GIN(special_features);
CREATE INDEX
pagila=# EXPLAIN SELECT title FROM film
pagila-# WHERE special_features @> '{"Behind The Scenes"}';
QUERY PLAN
---------------------------------------------------------------------------
Bitmap Heap Scan on film (cost=8.04..23.58 rows=5 width=15)
Recheck Cond: (special_features @> '{"Behind The Scenes"}'::text[])
-> Bitmap Index Scan on idx_film2 (cost=0.00..8.04 rows=5 width=0)
Index Cond: (special_features @> '{"Behind The Scenes"}'::text[])
(4 rows)
GIN แแแแแฅแกแ แแฎแแ แก แฃแญแแ แก แชแแแแแฃแแ แแแแจแแแแแแแแแแก แจแแแแ แแแแก แแแแแฅแกแแ แแแฃแแ แแแแแแแแชแแฃแ แ แแแแจแแแแแแแแแแก แฌแแแแแฆแแแแ, แ แแช แแฌแแแแก แจแแแแแฎแแแก แแแแแแก แฆแแ แแแฃแแแแแก, แ แแแแแแช แแแแแฎแแแ แแแฃแแแ.
แแฃแแแแแแขแ แแแแแฅแกแแแแก แแแจแแ แแแ
แแแแแฅแกแแแ แแ แแแ แแแแแแแแแแแจแ แแ แแแแแแ แแ แแแแฏแแ แแฎแแแ แแแแแฅแกแ แจแแแซแแแแ แจแแแชแแแแแก แแแแแ แแแแแแ แขแแแแก, แ แแแแ แช แแ แ-แแ แแ แฌแแแ. แแฅแแแ แจแแแแซแแแแ แแแแแแงแแแแ แแแขแแแแแแก แฎแแแ, แ แแแ แแแแฆแแ แแแแแฅแกแแแแก SQL แแแแแแ แขแแแแแ แแแแแแแแแก แแแแ แฌแแกแแแแแฎแแ. pg_indexes
. แแฅแแแ แแกแแแ แจแแแแซแแแแ แแแ แขแแแแ แแแแแแ แแแแแขแฃแ แ แแแแแแ แขแแแแแ:
SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn
FROM pg_indexes
GROUP BY defn
HAVING count(*) > 1;
And hereโs the result when run on the stock pagila database:
pagila=# SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn
pagila-# FROM pg_indexes
pagila-# GROUP BY defn
pagila-# HAVING count(*) > 1;
indexes | defn
------------------------------------------------------------------------+------------------------------------------------------------------
{payment_p2017_01_customer_id_idx,idx_fk_payment_p2017_01_customer_id} | CREATE INDEX ON public.payment_p2017_01 USING btree (customer_id
{payment_p2017_02_customer_id_idx,idx_fk_payment_p2017_02_customer_id} | CREATE INDEX ON public.payment_p2017_02 USING btree (customer_id
{payment_p2017_03_customer_id_idx,idx_fk_payment_p2017_03_customer_id} | CREATE INDEX ON public.payment_p2017_03 USING btree (customer_id
{idx_fk_payment_p2017_04_customer_id,payment_p2017_04_customer_id_idx} | CREATE INDEX ON public.payment_p2017_04 USING btree (customer_id
{payment_p2017_05_customer_id_idx,idx_fk_payment_p2017_05_customer_id} | CREATE INDEX ON public.payment_p2017_05 USING btree (customer_id
{idx_fk_payment_p2017_06_customer_id,payment_p2017_06_customer_id_idx} | CREATE INDEX ON public.payment_p2017_06 USING btree (customer_id
(6 rows)
แกแฃแแแ แกแแขแแก แแแแแฅแกแแแ
แจแแแซแแแแ แแแฎแแแก, แ แแ แแแกแ แฃแแแแก แแ แแแแแ แแแแแฅแกแ, แ แแแแแแแแแ แแ แ-แแ แแ แแแแแฅแกแแแก แกแแแขแแแแก แกแฃแแแ แฏแแฃแคแก, แ แแแแแแแช แแแแแฅแกแแแก แกแฎแแ แแแแแฅแกแแแก. แแก แจแแแซแแแแ แแงแแก แแ แแ แแงแแก แกแแกแฃแ แแแแ - แกแฃแแแ แแแแแแแฅแขแแ แจแแแซแแแแ แแแแแแฌแแแแก แแฎแแแแ แแแแแฅแกแแก แกแแแแแ แแแ, แ แแช แแแ แแแ, แแแแ แแ แแแ แจแแแซแแแแ แแแแแแแแก แซแแแแแ แแแแ แแแแแแ, แแ แแแแฎแแแแ, แ แแแแแก แแแขแแแแแแชแแแช แแงแ แแแแแแแฃแแ, แแฆแแ แแฅแแแแ แแแแแงแแแแแฃแแ.
แแฃ แแญแแ แแแแแ แแกแแแ แแแแแฅแกแแแแก แแแแแแ แขแแแแก แแแขแแแแขแแแแชแแ, แจแแแแซแแแแ แแแแฌแงแแ pg_catalog
.
แแแแแฃแงแแแแแแแ แแแแแฅแกแแแ
แ แแแแ แช แแแแแแแชแแแแ, แ แแแแแแแช แแงแแแแแแ แแแแแชแแแแ แแแแแแก, แแแแแ แแแแ แแแ แแแแ แแแแแงแแแแแฃแแ แแแแฎแแแแแแ. แแแ แ แแแแแขแแแฃแแ แแแแแฅแกแแแ แแฆแแ แแฅแแแแ แแแแแงแแแแแฃแแ แแแแแกแแแแ แ แแแแฎแแแแแ. แงแแแแ แฏแแ แแ, แ แแแแกแแช แแแแแฅแกแ แกแแแแแ แแแแ, แแก แแฆแแแแจแแแแ แกแขแแขแแกแขแแแแก แแแแแฏแแ แแก แแแแ แแ แกแแกแขแแแแก แแแขแแแแแแก แฎแแแจแ pg_stat_user_indexes
แแฅแแแ แจแแแแซแแแแ แแแฎแแ แฆแแ แแแฃแแแแ idx_scan
, แ แแแแแแช แแ แแก แแฃแแฃแแแชแแฃแ แ แแ แแชแฎแแแแ. แแ แแแแจแแแแแแแแก แแแแแงแฃแ แแก แแแแแแแ แแแ แแแแฃแแ แแแ แแแแแก แแแแแแแแแแแจแ (แแแฅแแแ แแ แแ แแแแก แแแแแแแแแแแจแ) แแแแชแแแ แแแ แ แฌแแ แแแแแแแแก แแแแก แจแแกแแฎแแ, แแฃ แ แแแแแ แแแแแฅแกแแแ แแ แแแแแแงแแแแแ แแ แจแแแซแแแแ แฉแแแแแแแแก.
แแฅ แแ แแก แจแแแแแฎแแ แกแฅแแแแจแ แแ แกแแแฃแแ แงแแแแ แแแแแฅแกแแก แแแแแแแแ แ แกแแแแแ แแแแก แ แแแแแแแแแก แแแกแแฆแแแแ โpublicโ
:
SELECT relname, indexrelname, idx_scan
FROM pg_catalog.pg_stat_user_indexes
WHERE schemaname = 'public';
with output like this:
pagila=# SELECT relname, indexrelname, idx_scan
pagila-# FROM pg_catalog.pg_stat_user_indexes
pagila-# WHERE schemaname = 'public'
pagila-# LIMIT 10;
relname | indexrelname | idx_scan
---------------+--------------------+----------
customer | customer_pkey | 32093
actor | actor_pkey | 5462
address | address_pkey | 660
category | category_pkey | 1000
city | city_pkey | 609
country | country_pkey | 604
film_actor | film_actor_pkey | 0
film_category | film_category_pkey | 0
film | film_pkey | 11043
inventory | inventory_pkey | 16048
(10 rows)
แแแแแฅแกแแแแก แแฆแแแแแ แแแแแแแ แกแแแแขแแแแ
แแแแแฅแกแแแ แฎแจแแ แแ แกแแญแแ แแแแแ แฎแแแแฎแแ แแจแแแแแแก, แแแแแแแแแ, แ แแแแกแแช แแกแแแ แจแแจแฃแแแแฃแแแ แแ แฎแแแแฎแแ แแจแแแแแแ แจแแแซแแแแ แแแแฉแฅแแ แแก แกแแแแแ แแแ. แแกแแแ แแแแแฅแกแแแ แจแแแซแแแแ แแแแแแแแแก. แแแแแฅแกแแก แแแ แแแแขแ แแแแก แจแแชแแแแ แจแแแซแแแแ แแกแแแ แแแแแฎแแแแก แแแกแ แแฆแแแแแ.
แแแ แแแแแฃแ แ แแแแแฅแกแแก แจแแฅแแแแก แฉแแ แแแ
PostgreSQL 11-แจแ B-Tree แแแแแฅแกแแก แจแแฅแแแ แแ แแแ แแฃแแแ แฎแแแแ. แจแแฅแแแแก แแ แแชแแกแแก แแแกแแฉแฅแแ แแแแแ, แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แ แแแแแแแแ แแแ แแแแแฃแ แ แแฃแจแแแ. แแฃแแชแ, แแแ แฌแแฃแแแแ, แ แแ แแก แแแแคแแแฃแ แแชแแแก แแแ แแแแขแ แแแ แกแฌแแ แแ แแ แแก แแแงแแแแแฃแแ:
SET max_parallel_workers = 32;
SET max_parallel_maintenance_workers = 16;
แแแแฃแแแกแฎแแแแ แแแแจแแแแแแแแแ แซแแแแแ แแชแแ แแ. แแแแแแฃแ แจแแแแฎแแแแแจแ, แแก แ แแชแฎแแแแ แฃแแแ แแแแแแ แแแก แแ แแชแแกแแ แแก แแแ แแแแแแก แ แแแแแแแแแกแแแ แแ แแแ. แฌแแแแแแฎแแ แแแขแ แจแ
แคแแแแก แแแแแฅแกแแก แจแแฅแแแ
แแฅแแแ แจแแแแซแแแแ แจแแฅแแแแ แแแแแฅแกแ แคแแแแ แแคแชแแแก แแแแแงแแแแแแ CONCURRENTLY
แแฃแแแแแ CREATE INDEX
:
pagila=# CREATE INDEX CONCURRENTLY idx_address1 ON address(district);
CREATE INDEX
แแแแแฅแกแแก แจแแฅแแแแก แแก แแ แแชแแแฃแ แ แแแแกแฎแแแแแแแ แฉแแแฃแแแแ แแแแกแแแ แแแแ, แ แแ แแ แกแแญแแ แแแแก แฉแแแแขแแแก แแแแแแแแ แแ, แจแแกแแแแแแกแแ, แแ แแแแแแแก แฉแแฌแแ แแก แแแแ แแชแแแแก. แแแแ แแก แแฎแ แแ, แแแแก แแแขแ แแ แ แแ แแแขแ แ แแกแฃแ แกแ แกแญแแ แแแแ.
Postgres แฃแแ แฃแแแแแงแแคแก แฃแแแ แแ แแแฅแแแแแแแก แแแแแฅแกแแแแก แจแแกแแฅแแแแแแ แแ แ แแแแ แแแแกแแแฃแแ แแแฃแแ แจแแแแฎแแแแแก แแแแแญแ แแก แแแแแก, แแกแแแ แแแแแชแแแแ แแแแแก แแแ แแแแก แแแแแก แแ แจแแแแฎแแแแแจแ, แแฃ แแฅแแแแ แแแแแแแชแแ แแแแแแ แแ แแแแแ แแแแ. แแแแแแแแแแแ, แ แแ แแก แ แฉแแแแแ แแแแแฎแแแ แแแแ แกแฌแ แแคแแ แแแแฆแแ แแฅแแแแ แแแแฎแแแแแแ แแ แแฅแแแแ แแแแแชแแแแ แแแแ แแแแ แแงแแก แแแกแจแขแแแแก แแแกแแแแแแ.
แฌแงแแ แ: www.habr.com