PostgreSQL-เดฒเต† เดธเต‚เดšเดฟเด•เด•เดณเตเดŸเต† เดŽเดฒเตเดฒเดพ เด•เดดเดฟเดตเตเด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต

PostgreSQL-เดฒเต† เดธเต‚เดšเดฟเด•เด•เดณเตเดŸเต† เดŽเดฒเตเดฒเดพ เด•เดดเดฟเดตเตเด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต
เดชเต‹เดธเตเดฑเตเดฑเตโ€Œเด—เตเดฐเต†เดธเต เดฒเต‹เด•เดคเตเดคเต, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดธเด‚เดญเดฐเดฃเด‚ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏเดฟ เดจเดพเดตเดฟเด—เต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดธเต‚เดšเดฟเด•เด•เตพ เดจเดฟเตผเดฃเดพเดฏเด•เดฎเดพเดฃเต (เดนเต€เดชเตเดชเต เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต). Postgres เด…เดคเดฟเดจเตเดณเตเดณ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเด‚เด—เดฟเดจเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, MVCC เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดจเดฟเด™เตเด™เดณเต† เด’เดฐเต‡ เดŸเตเดฏเต‚เดชเตเดชเดฟเดณเดฟเดจเตเดฑเต† เดจเดฟเดฐเดตเดงเดฟ เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเตฝ เดŽเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏ เดธเต‚เดšเดฟเด•เด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเดจเตเดจเดคเต เดตเดณเดฐเต† เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต.

เดธเต‚เดšเดฟเด•เด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด—เด‚ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดšเดฟเดฒ เดจเตเดฑเตเด™เตเด™เตเด•เตพ เดžเดพเตป เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดงเดฏเดฟเตฝเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต.

เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•: เดšเตเดตเดŸเต† เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เดพเดคเตเดคเดตเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต pagila เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดธเดพเดฎเตเดชเดฟเตพ.

เด•เดตเดฑเดฟเด‚เด—เต เด‡เตปเดกเด•เตเดธเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต

เดจเดฟเดทเตโ€Œเด•เตเดฐเดฟเดฏ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เดพเดฏเดฟ เด‡เดฎเต†เดฏเดฟเตฝ เดตเดฟเดฒเดพเดธเด™เตเด™เตพ เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดจเต‹เด•เตเด•เดพเด‚. เดฎเต‡เดถเดฏเดฟเตฝ 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 เด’เดดเดฟเดตเดพเด•เตเด•เตเดจเตเดจเต.

เด‡เดจเตเดจเต, เด•เดตเดฑเดฟเด‚เด—เต เด‡เตปเดกเด•เตเดธเตเด•เตพ เดฌเดฟ-เดŸเตเดฐเต€เด•เตพเด•เตเด•เต เดฎเดพเดคเตเดฐเดฎเต‡ เดฒเดญเตเดฏเดฎเดพเด•เต‚. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เด…เดฑเตเดฑเด•เตเดฑเตเดฑเดชเตเดชเดฃเดฟเด•เตพ เด•เต‚เดŸเตเดคเดฒเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดญเดพเด—เดฟเด• เดธเต‚เดšเดฟเด•เด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต

เดญเดพเด—เดฟเด• เดธเต‚เดšเดฟเด• เดธเต‚เดšเดฟเด• เดชเดŸเตเดŸเดฟเด•เดฏเตเดŸเต† เดตเดฐเดฟเด•เดณเตเดŸเต† เด’เดฐเต เด‰เดชเดตเดฟเดญเดพเด—เด‚ เดฎเดพเดคเตเดฐเด‚. เดธเต‚เดšเดฟเด•เดฏเตเดŸเต† เดตเดฒเตเดชเตเดชเด‚ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเดจเตเด‚ เดตเต‡เด—เดคเตเดคเดฟเตฝ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เดพเดฒเดฟเดซเต‹เตผเดฃเดฟเดฏเดฏเดฟเดฒเต† เดžเด™เตเด™เดณเตเดŸเต† เด‰เดชเดญเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เดพเดฏเดฟ เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดฎเต†เดฏเดฟเตฝ เดตเดฟเดฒเดพเดธเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เดฒเดญเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต†เดจเตเดจเต เดชเดฑเดฏเดพเด‚. เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด‡เดคเตเดชเต‹เดฒเต†เดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚:

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 เดตเดฟเดฒเดฏเตเดณเตเดณ เดซเตเตพ เดนเต€เดชเตเดชเต เดธเตเด•เดพเตป เด…เดญเตเดฏเตผเดคเตเดฅเดฟเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเต เดธเดพเดงเดพเดฐเดฃ เดฌเดฟ-เดŸเตเดฐเต€ เดธเต‚เดšเดฟเด• เดจเดฎเตเดฎเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดฎเต‹ เดŽเดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚:

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)

เดธเต‚เดšเดฟเด• เดชเต‹เดฒเตเด‚ เดชเดฐเดฟเด—เดฃเดฟเดšเตเดšเดฟเดฒเตเดฒ. เดฌเดฟ-เดŸเตเดฐเต€ เดธเต‚เดšเดฟเด•เดฏเตเด•เตเด•เต เด…เดคเต เดธเต‚เดšเดฟเด•เดฏเดฟเดฒเดพเด•เตเด•เดฟเดฏ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเดฟเตฝ เดตเตเดฏเด•เตเดคเดฟเด—เดค เดฎเต‚เดฒเด•เด™เตเด™เดณเตเดŸเต† เดจเดฟเดฒเดจเดฟเตฝเดชเตเดชเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดฏเดพเดคเตŠเดฐเต เดงเดพเดฐเดฃเดฏเตเดฎเดฟเดฒเตเดฒ.

เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต 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)

เด‡เตปเดกเต†เด•เตโ€Œเดธเต เดšเต†เดฏเตโ€Œเดค เดธเด‚เดฏเต‹เดœเดฟเดค เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดตเตเดฏเด•เตเดคเดฟเด—เดค เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดฎเดพเดชเตเดชเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต† เดœเดฟเดเดŽเตป เดธเต‚เดšเดฟเด• เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เด…เดจเตเดตเต‡เดทเดฃ เดชเดฆเตเดงเดคเดฟเดฏเตเดŸเต† เดชเด•เตเดคเดฟเดฏเดฟเดฒเดงเดฟเด•เด‚ เดšเต†เดฒเดตเต เดจเตฝเด•เตเดจเตเดจเต.

เดคเดจเดฟเดชเตเดชเด•เตผเดชเตเดชเต เดธเต‚เดšเดฟเด•เด•เตพ เด’เดดเดฟเดตเดพเด•เตเด•เตเดจเตเดจเต

เดธเต‚เดšเดฟเด•เด•เตพ เด•เดพเดฒเด•เตเดฐเดฎเต‡เดฃ เด•เตเดฎเดฟเดžเตเดžเตเด•เต‚เดŸเตเดจเตเดจเต, เดšเดฟเดฒเดชเตเดชเต‹เตพ เด’เดฐเต เดชเตเดคเดฟเดฏ เดธเต‚เดšเดฟเด•เดฏเดฟเตฝ เดฎเตเดฎเตเดชเดคเตเดคเต† เด’เดจเตเดจเดฟเดจเตเดฑเต† เด…เดคเต‡ เดจเดฟเตผเดตเดšเดจเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚. เดฎเดจเตเดทเตเดฏเตผเด•เตเด•เต เดตเดพเดฏเดฟเด•เตเด•เดพเดตเตเดจเตเดจ 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_index เดฎเต‡เดถเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•