ããã«ã¡ã¯ãç³åã§ãã æè¿ãPostgreSQL ã§å®è¡èšç»ãèŠãæ©äŒãå€ãã£ããããããããæ°ã«ãªã£ãå
容ã«ã€ããŠèšèŒããŠããããšæããŸãã ä»åã¯ãINDEX ONLY SCANãã«ã€ããŠè§ŠããŠãããŸãã â»æ¬å
容ã§èŒããæ€èšŒçµæã¯ãAWS RDS (PostgreSQL 15.12) äžã§å®æœããå
容ãšãªããŸãã å®è¡èšç» äžè¬çãªãšããããã«ãªããŸãããã¯ãšãªã®å®è¡ã«ãããŠæ£ããçµæãè¿ãããšã¯åœç¶ã§ãããã¯ãšãªãæããŠããçµæãè¿ããŸã§ã®æéãå€åããããšããããŸãã è²ã
ãªèŠå ã«ãã£ãŠå€åã¯ããŸããããã®äžã§ãéèŠãªã®ããå®è¡èšç»ãã§ãã ãŠãŒã¶ãŒãã¯ãšãªãæããéãå
éšã§ã¯åãåã£ãã¯ãšãªã®å
容ãåæãããã©ã®ããã«ããŒãã«ã確èªããã¹ãããããŸããã©ã®é çªã§çµåãããŠããã°è¯ãã®ãããªã©ããã¡æ©ãçµæãè¿ãæ¹æ³ãäžã§èšç®ããŠéã®ãã瀺ããŠãããã®ããå®è¡èšç»ãã§ãã æ¬å
容ã§ã¯ããã®äžã®ãã©ã®ããã«ããŒãã«ã確èªããã¹ãããã®éšåã«æ³šç®ããŸãã 玢åŒã®æç¡ ããŒãã«ã確èªããæ¹æ³ãšããŠããããã®ãã玢åŒããçšãããåŠãã§ãã äžè¬çã«çŽ¢åŒãçšããããšã§ã¯ãšãªã®ããã©ãŒãã³ã¹ãäžããããšããããŸãã ã¯ãšãªã®æ¡ä»¶ãããŒãã«ã®ã¬ã³ãŒãæ°ãªã©ã«ããããŸãããç¹å®ã®ã¬ã³ãŒããæ¢ãããšããå Žåã玢åŒãååšããªãå Žåã¯ããŒãã«ããã«ã¹ãã£ã³(ãã¹ãŠã®ã¬ã³ãŒãããã§ãã¯)ããåäœãšãªãåãäžèŠãªãããã¯ã¢ã¯ã»ã¹ãè¡ãããé
å»¶ãæããŸãã 玢åŒãååšããå Žåã玢åŒäœææã«æå®ããåã®æ
å ±ã䜿ã£ãŠãç®çã®ã¬ã³ãŒãæ
å ±ãããŒãã«ãã«ã¹ãã£ã³ãããããæ©ãæ¢ãåºãããšãã§ããå¯èœæ§ããããŸãã 玢åŒäœææã«æå®ããåã®å€ã玢åŒèªäœãæã€ã®ã§æ¡ä»¶ãªã©ã«ãã£ãŠã¯ãããŒãã«ãžã®ã¢ã¯ã»ã¹ãè¡ããã«çµæãè¿ãããšãå¯èœãšãªããŸãã ãªãã玢åŒã«å®ããŒã¿ãå
¥ã£ãŠããããšã確èªããæ¹æ³ãšããŠã bt_page_items ãã® data åãã確èªå¯èœã§ãã 以äžã®å Žåã玢åŒã§çšããŠãã ID1 ãš ID2 ã«å¯Ÿã㊠3 ãš 9 ãããŒã¿ãšããŠæ¿å
¥ããŠããŸãã çµæãšããŠãdata åã« 3 ãš 9 ã®åºåã確èªããããšãã§ããŸãã ---ãµã³ãã«è¡šã®äœæ postgres=> create table exam3(id1 integer,id2 integer,name text); CREATE TABLE ---è€å玢åŒã®äœæ postgres=> create index exam3idx1 on exam3(id1,id2); CREATE INDEX ---ããŒã¿ã®æ¿å
¥ postgres=> INSERT INTO exam3 values (3,9,'AAA'); INSERT 0 1 ---玢åŒã®ç¢ºèª postgres=> select * from bt_page_items('exam3idx1',1); itemoffset | ctid | itemlen | nulls | vars | data | dead | htid | tids ------------+-------+---------+-------+------+-------------------------+------+-------+------ 1 | (0,1) | 16 | f | f | 03 00 00 00 09 00 00 00 | f | (0,1) | (1 row) 玢åŒã䜿ã£ãæ€çŽ¢ 玢åŒã䜿çšããæ€çŽ¢ã¯å€§ããäºã€ã«åããããŸãã éåžžã® INDEX ã䜿ã£ãæ€çŽ¢ (INDEXâTABLE ã«ã¢ã¯ã»ã¹ãã) 以äžã®æµãã§ã¢ã¯ã»ã¹ãè¡ããŸãã TABLE ã«ã¢ã¯ã»ã¹ãå¿
èŠãªåãåŠçæéãé·ããªããŸãã â INDEX ã䜿ã£ãŠå¯Ÿè±¡ã®è¡ãæ¢ãã â¡ããŒãïŒTABLE ã®ããŒã¿é åïŒã«ã¢ã¯ã»ã¹ããŠå®éã®ããŒã¿ãååŸããã INDEX ONLY SCANïŒINDEX ã ãã§å®çµïŒ ããŒãã«ã¢ã¯ã»ã¹ããã« INDEX ã ãã§å¿
èŠãªããŒã¿ãååŸã§ããŸãã ããã«ãããTABLE ã¢ã¯ã»ã¹ãè¡ãå¿
èŠããªããããæ€çŽ¢ãé«éã«ãªããŸãã INDEX ONLY SCAN ã䜿çšã§ããæ¡ä»¶ æ€çŽ¢ãæ©ããªã INDEX ONLY SCAN ã¯ã©ãããã䜿çšãããããã«ãªãã®ã§ããããã ãŸãšãããšä»¥äžã®æ¡ä»¶ãå
šãŠæºããå¿
èŠããããŸãã â»æ¡ä»¶ãæºãããŠããå
éšã®èšç®ã§ INDEX ONLY SCAN ãããå¥ã®æ¹æ³ã®æ¹ãæ©ããš PostgreSQL ã倿ããå Žåã¯ãã¡ããéžã°ããŸãã 玢åŒã®çš®é¡ã察å¿ããŠããããš B-tree 玢åŒã¯åžžã«å¯Ÿå¿ããŠããŸãã ä»ã®çŽ¢åŒã¯é察å¿ã§ãããGiST ã SP-GiST ã¯äžéšã®æŒç®åã¯ã©ã¹ã®ã¿å¯Ÿå¿ããŠããŸãã ã¯ãšãªã玢åŒã«å«ãŸããåã ããåç
§ããŠããã㚠玢åŒã§å®çµãããšããããšã¯ã玢åŒäœææã«æå®ããåæ
å ±ã ãã§ã¯ãšãªãå®çµããŠããå¿
èŠããããŸãã 以äžã®äŸã®å ŽåãID1 åãš ID2 åã®çŽ¢åŒãäœæããŠããŸãããå®è¡ããã¯ãšãªã«ãã㊠ID1 ãš ID2 ã®ã¿ã§å®çµããŠããå ŽåãINDEX ONLY SCAN ã確èªã§ããŸãã ããããªããã玢åŒã«å«ãŸããŠããªã ID3 ã䜿çšããã¯ãšãªã®å Žåã¯INDEX ONLY SCAN ã«ã¯ãªã£ãŠããŸããã â»å®è¡èšç»ã¯ãã¯ãšãªå®è¡åã«ã explain(analyze,buffers) ããšãã£ãèšèŒãè¡ãããšã§ç¢ºèªã§ããŸãã ---ãµã³ãã«è¡šã®äœæ postgres=> create table exam4(id1 integer,id2 integer,id3 integer); CREATE TABLE ---ID1ãšID2ã®è€å玢åŒãäœæ postgres=> create index exam4idx1 on exam4(id1,id2); CREATE INDEX ---1000ä»¶æ¿å
¥ãšVACUUMã®å®æœ postgres=> INSERT INTO exam4 (id1,id2,id3) SELECT i,i,i FROM generate_series(1, 1000) as i; INSERT 0 1000 postgres=> vacuum exam4; VACUUM ---ID1ãšID2ãå©çšããã¯ãšãª â INDEX ONLY SCAN ã«ãªã postgres=> explain(analyze,buffers) postgres-> select id1,id2 from exam4 where id1=1; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------- Index Only Scan using exam4idx1 on exam4 (cost=0.28..4.29 rows=1 width=8) (actual time=0.015..0.016 rows=1 loops=1) Index Cond: (id1 = 1) Heap Fetches: 0 Buffers: shared hit=3 Planning Time: 0.090 ms Execution Time: 0.032 ms (6 rows) ---ID1ãšID3ãå©çšããã¯ãšãª â INDEX ONLY SCAN ã«ãªããªã postgres=> explain(analyze,buffers) postgres-> select id1,id3 from exam4 where id1=1; QUERY PLAN ----------------------------------------------------------------------------------------------------------------- Index Scan using exam4idx1 on exam4 (cost=0.28..8.29 rows=1 width=8) (actual time=0.019..0.021 rows=1 loops=1) Index Cond: (id1 = 1) Buffers: shared hit=3 Planning Time: 0.097 ms Execution Time: 0.036 ms (5 rows) æ€çŽ¢ãããåè¡ãåãåããã®ã¹ãããã·ã§ããã«å¯Ÿã㊠ãå¯èŠã ã§ããããš å®ã¯å®è¡èšç»äžã§ã¯äžèšã®2ã€ã®æ¡ä»¶ãæºããããšã§ã Index Only Scan ããéžæãããå¯èœæ§ãåºãŠããŸãã ããããã® INDEX ONLY SCAN ã®ãã©ãããšãèšããåæã§ãã å®è¡èšç»äžã§ ã Index Only Scan ããšãªã£ãŠããŠããå®é㯠INDEX ONLY SCAN ãšã㊠å®è¡ãããŠããªãããšããã ãšããããšã§ãã ããã§äžåºŠåäœãæŽçããŠãããŸãã INDEX ONLY SCAN ã®åäœ â 玢åŒã«ã¢ã¯ã»ã¹ãã â¡ãå¯èŠæ§ããããã§ããŒãžã®ç¢ºèª ãâ ãå¯èŠããšãªã£ãŠãã â ããŒããèŠã«è¡ããã«æžã â 玢åŒã ãã®æ€çŽ¢ã«ãªãããæ©ãïŒ ãâ ãå¯èŠããšãªã£ãŠããªã â ããŒããèŠã«è¡ã â ããŒãã«ã¢ã¯ã»ã¹ãçºçããããé
ãïŒ äžèšã«ã€ããŠè£è¶³ããŸãã ã¯ãšãªãå®è¡ããå Žåããèªã¿åãäžè²«æ§ããå®çŸããåãããããããåçŽã«è©²åœã®ããŒãã«ã®å
šã¬ã³ãŒãæ
å ±ã察象ãšããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ãæèãããã®ã»ãã·ã§ã³ãèŠããŠãããã¬ã³ãŒãæ
å ±ãå
ã«ããŠãããããæ¡ä»¶ãªã©ã«ãã£ãŠè¿ãã¹ãçµæãåºåãããŸãã ãã ãã玢åŒã«ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®ç¶æ³ã«é¢ããŠã¯æ
å ±ãæã£ãŠããªããããå³å¯ã«ã¯çŽ¢åŒã ãã§çµæãè¿ãããšãã§ããŸããã å³å¯ã«ç¢ºèªããããã«ããŒãã«(ããŒã)ãèŠã«è¡ãå¿
èŠããããŸãããPostgreSQL ã§ã¯ããã«äžå·¥å€«å ããŠããŸãã ããããå¯èŠæ§ããããã§ãã å¯èŠæ§ããããšã¯åããŒãã«ã®æŽæ°ç¶æ³ãå¿ããŠããŒãžåäœã§ç®¡çããŠããŸãã äŸãã°ãããããŒãã«ã®ããããŒãžã«å±ããã¬ã³ãŒããæŽæ°ãããããšã«ãã£ãŠå¯èŠæ§ãããã«æŽæ°ãããããŸãã å
·äœçã«ä»¥äžãã確èªãã ããã ---â ãµã³ãã«è¡šã®äœæ postgres=> create table exam4(id integer,name text); CREATE TABLE postgres=> INSERT INTO exam4 (id,name) SELECT i,md5(random()::text) FROM generate_series(1, 241) as i; INSERT 0 241 postgres=> create index examidx4 on exam4(id); CREATE INDEX postgres=> vacuum exam4; VACUUM ---â¡å¯èŠæ§ãããã®ç¢ºèª postgres=> select * from pg_visibility_map('exam4'); blkno | all_visible | all_frozen -------+-------------+------------ 0 | t | f 1 | t | f 2 | t | f (3 rows) ---â¢ããŒãã«ã®ç¶æ³ postgres=> select ctid,xmin,xmax,id from exam4; ctid | xmin | xmax | id ---------+-------+------+----- (0,1) | 62700 | 0 | 1ãâ (0,2) | 62700 | 0 | 2ãâ ïŒ â£ ããŒãžïŒïŒ (0,119) | 62700 | 0 | 119ãâ (0,120) | 62700 | 0 | 120ãâ (1,1) | 62700 | 0 | 121ãâ (1,2) | 62700 | 0 | 122ãâ ïŒ â£ ããŒãžïŒïŒ (1,119) | 62700 | 0 | 239ãâã (1,120) | 62700 | 0 | 240ãâ (2,1) | 62700 | 0 | 241ãâ ããŒãžïŒïŒ (241 rows) ---â£UPDATE ã®å®è¡ postgres=> update exam4 SET id = 1 WHERE id = 1; UPDATE 1 ---â€å¯èŠæ§ãããã®ç¢ºèª postgres=> select * from pg_visibility_map('exam4'); blkno | all_visible | all_frozen -------+-------------+------------ ããã0 | fãâ
ãããã | f ããã1 | t ãããããã| f ããã2 | fãâ
ãããã | f (3 rows) ---â¥ããŒãã«ã®ç¶æ³ postgres=> select ctid,xmin,xmax,id from exam4; ctidãã | xminã| xmax | id ---------+-------+------+----- â
1 (0,2) | 62700 | 0 | 2 ïŒ (1,120) | 62700 | 0 | 240 (2,1) | 62700 | 0 | 241 (2,2) | 62717 | 0 | 1 â
2 (241 rows) â ãµã³ãã«è¡šã®äœæ ããã§ã¯ç°¡åãªããŒãã«ã玢åŒã®äœæãã¬ã³ãŒãã241ä»¶æ¿å
¥ãvacuum ãå®è¡ããŠãŸãã â¡å¯èŠæ§ãããã®ç¢ºèª ãpg_visibility_mapããã確èªå¯èœã§ãã blkno åãåããŒãã«ã®ããŒãžçªå·ãall_vasible åãå¯èŠã倿ããåã§ãã ãtãã¯å¯èŠ OK, ãfãã¯å¯èŠ NG ã§ãã ãã®æ®µéã§ã¯å
šãŠãtãã«ãªã£ãŠããã®ã§ããŒãã«ã¢ã¯ã»ã¹ã¯äžèŠãªç¶æ³ã§ãã â¢ããŒãã«ã®ç¶æ³ æé»çã«å®çŸ©ãããã·ã¹ãã åãæå®ããŠããŸãã ctid åã¯ïŒ<ããŒãžçªå·>, <ã¬ã³ãŒãçªå·>ïŒãšãªã£ãŠããããã®è¡ãã©ã®ããŒãžã«å±ããŠããã確èªããããšãã§ããŸãã çŸåšã0 ïœ 2 ããŒãžã䜿çšããŠãããããã¯å¯èŠæ§ãããã§ç¢ºèªããçµæãšé¢é£ä»ããããšãã§ããŸãã â£UPDATE ã®å®è¡ ããŒã¿äžã§ã¯å€æŽãªãã ID=1 ã ID=1 ãž UPDATE ããŠããŸãã çç±ã«ã€ããŠã¯â¥ããåç
§ãã ããã â€å¯èŠæ§ãããã®ç¢ºèª UPDATE ã®å®è¡ã«ãããå¯èŠæ§ãããã«å€åã確èªã§ããŸãã ããŒãžçªå·ã 0 ãš 2 ã®å¯èŠæ§ã t ãã f ãžãšå€ãã£ãŠããŸãã â¥ããŒãã«ã®ç¶æ³ 1 ãã 1 ãž UPDATE ããŸããããå
éšã§ã¯å
ã
ãã£ãã¬ã³ãŒã(â
1)ãæ¶ãã1 ã®ã¬ã³ãŒãã远å (â
2)ããåããããŸãã â
1 ã®ã¬ã³ãŒãã¯ããŒãžçªå·1ãâ
2 ã®ã¬ã³ãŒãã¯ããŒãžçªå·2 ã«å±ããŠããŸãã çµæãããŒãžãšããŠã¯æŽæ°ããã£ããšèªèããå¯èŠæ§ãããã§ã¯å¯èŠãã§ããªãç¶æ
ãžãšå€æŽãè¡ãããŠããŸãã ãŸãšãããšãå¯èŠæ§ãããã¯åããŒãžã«å±ããã¬ã³ãŒãã1ã€ã§ãæŽæ°ãããã°ãå¯èŠãNG ãšãªãåäœã§ãã ã€ãŸãããå¯èŠããšã¯æŽæ°ããªãããŒãžã®ããšã§ãããæŽæ°ããªãããããããããŒãã確èªããå¿
èŠããªãããããã®ãŸãŸçŽ¢åŒã§ç¢ºèªã§ããçµæã䜿ã£ãŠè¿ãã°ãããšããããšãããããŸãã ãŸãæŽæ°ãããã°ãããŒãã«ã¢ã¯ã»ã¹ãå¿
èŠã«ãªã£ãŠããŸããšããåäœãšãªããŸãã ãã£ãŠå®è¡èšç»ãç«ãŠã段éã§ã¯ãå¯èŠæ§ãããã確èªããããšããªããããäžæŠã¯ ã Index Only Scan ããéžæããŸãããå®éã¯å®è¡ã¿ã€ãã³ã°ã§å¯èŠæ§ããããã¿ãŠå€æãè¡ã£ãŠããç¶æ³ã§ãã å®è¡èšç»äžã«ããã倿 å®è¡èšç»äžãããã Index Only Scan ãã«ãªã£ãŠããããå®éã«ããŒãã¢ã¯ã»ã¹ã®æç¡ã¯ã©ã®ããã«å€æããã¹ãã説æããŸãã 以äžã¯äžèšã®ç¶ããšã㊠WHERE å¥ã«ç¹å®ã®å€ãæå®ããŠå®è¡èšç»ãåºåããããã®ã§ãã åçŽã«å®è¡ããã ãã§ã¯ã¬ã³ãŒãæ°ãå°ãªãåãINDEX ONLY SCAN ã®æ¡ä»¶ãæºãããŠããã®éãã«ãªããªãããããã³ãå¥ã䜿çšããŠããŸãã ã§ã¯ãå€æç®æã§ããäžç·ã«åºåãããŠããã Heap Fetches ãã«ãªããŸãã ãã®å€ã 1 以äžã§ããã°ãããŒãã¢ã¯ã»ã¹ãè¡ã£ãŠããããšã«ãªããŸãã äžèšã® pg_visibility_map ã®çµæãããããŒãžçªå·ã 0 ããã³ 2 㯠all_visible åã®å€ã f ãšãªãã1 㯠t ãšãªã£ãŠããŸãã ãããèžãŸããåããŒãžæ°ã«å±ããå€ã WHERE å¥ã§æå®ããŠå®è¡ããçµæã以äžã®ãšããã§ãã ããŒãžçªå·ã 0 ããã³ 2 ã§ã¯ããHeap Fetchesãã 1 ãšãªã£ãŠããã1 㯠0 ã«ãªã£ãŠããŸãã ãã£ãŠãããŒãžçªå· 1 ã«å±ããå€ã§çµã蟌ã¿ãè¡ã£ãå Žåã®ã¿ã玢åŒã ãã§çµæãè¿ããŠãããšãããŸãã ---ããŒãžçªå·ïŒïŒ postgres=> explain(analyze,buffers) postgres-> /*+ IndexOnlyScan(exam4 examidx4) */ postgres-> select id from exam4 where id=2; QUERY PLAN --------------------------------------------------------------------------------------------------------------------- Index Only Scan using examidx4 on exam4 (cost=0.14..8.16 rows=1 width=4) (actual time=0.017..0.018 rows=1 loops=1) Index Cond: (id = 2) Heap Fetches: 1 â
Buffers: shared hit=3 Planning Time: 0.118 ms Execution Time: 0.030 ms (6 rows) ---ããŒãžçªå·ïŒïŒ postgres=> explain(analyze,buffers) postgres-> /*+ IndexOnlyScan(exam4 examidx4) */ postgres-> select id from exam4 where id=240; QUERY PLAN --------------------------------------------------------------------------------------------------------------------- Index Only Scan using examidx4 on exam4 (cost=0.14..8.16 rows=1 width=4) (actual time=0.014..0.015 rows=1 loops=1) Index Cond: (id = 240) Heap Fetches: 0 â
Buffers: shared hit=2 Planning Time: 0.143 ms Execution Time: 0.026 ms (6 rows) ---ããŒãžçªå·ïŒïŒ postgres=> explain(analyze,buffers) postgres-> /*+ IndexOnlyScan(exam4 examidx4) */ postgres-> select id from exam4 where id=241; QUERY PLAN --------------------------------------------------------------------------------------------------------------------- Index Only Scan using examidx4 on exam4 (cost=0.14..8.16 rows=1 width=4) (actual time=0.017..0.018 rows=1 loops=1) Index Cond: (id = 241) Heap Fetches: 1 â
Buffers: shared hit=3 Planning Time: 0.166 ms Execution Time: 0.028 ms (6 rows) ãå¯èŠããžã®æŽæ° æåŸã«ããå¯èŠãã§ããªããªã£ãããŒãžããå¯èŠãã«æ»ãæ¹æ³ããŸãšããŸãã æ»ãæ¹æ³ã¯ VACUUM ã³ãã³ãã«ãªããŸãã å¿è«ãAUTOVACUUM ã§ã倧äžå€«ã§ãã ---å¯èŠæ§ãããã®ç¢ºèª postgres=> select * from pg_visibility_map('exam4'); blkno | all_visible | all_frozen -------+-------------+------------ 0 | f | f 1 | t | f 2 | f | f (3 rows) ---VACUUM ã®å®æœ postgres=> vacuum exam4; VACUUM ---å¯èŠæ§ãããã®ç¢ºèª postgres=> select * from pg_visibility_map('exam4'); blkno | all_visible | all_frozen -------+-------------+------------ 0 | tãâ
ãããã | f 1 | t | f 2 | tãâ
ãããã | f (3 rows) ãªããANALZYE ã VACUUM FULL ã§ã¯å¯Ÿå¿ã§ããŸããã ---å¯èŠæ§ãããã®ç¢ºèª postgres=> select * from pg_visibility_map('exam5'); blkno | all_visible | all_frozen -------+-------------+------------ 0 | f | f 1 | f | f (2 rows) ---ANALYZE ã®å®æœ postgres=> analyze exam5; ANALYZE postgres=> select * from pg_visibility_map('exam5'); blkno | all_visible | all_frozen -------+-------------+------------ 0 | f | f 1 | f | f (2 rows) ---VACUUM FULL ã®å®æœ postgres=> vacuum full exam5; VACUUM ---å¯èŠæ§ãããã®ç¢ºèª postgres=> select * from pg_visibility_map('exam5'); blkno | all_visible | all_frozen -------+-------------+------------ 0 | f | f 1 | f | f (2 rows) AUTOVACUUM ã§è§£æ¶ããã®ã§ããã°æ°ã«ããªããŠãããšãã倿ãã§ããŸãããINSERT ã UPDATE ãªã©ã® DML ã®æŽæ°éã«ãã£ãŠã¯å¯Ÿè±¡ã«éžã°ããªãããšããããŸãã ãã®å Žåã¯æç€ºçã«å®è¡ããå¿
èŠãåºãŠããŸãã ãã ããVACUUM ã³ãã³ãã¯å¿
ãããå
šãŠã®ã¬ã³ãŒãã«å¯ŸããŠå®æœãããªãããšããããŸãã ãã®å Žåã¯ãINDEX_CLEANUPããªãã·ã§ã³ã䜿çšãããONããã€ããŠå®è¡ããŠãã ããã ãã®ãããæç€ºçã«å®æœããå Žåã¯ãã¡ããå®è¡ããããšããå§ãããŸãã ---â ãµã³ãã«è¡šã®äœæ postgres=> create table exam5(id integer); CREATE TABLE postgres=> INSERT INTO exam5 (id) SELECT i FROM generate_series(1, 1000000) as i; INSERT 0 1000000 postgres=> create index examidx5 on exam5(id); CREATE INDEX postgres=> vacuum exam5; VACUUM ---â¡å¯èŠæ§ãããã®ç¢ºèª postgres=> select all_visible,count(*) from pg_visibility_map('exam5') group by all_visible; all_visible | count -------------+------- t | 4425 (1 row) ---â¢UDPATE ã®å®æœ postgres=> update exam5 set id=id where id <= 20000; UPDATE 20000 ---â£å¯èŠæ§ãããã®ç¢ºèª postgres=> select all_visible,count(*) from pg_visibility_map('exam5') group by all_visible; all_visible | count -------------+------- f | 179ãâ
179ããŒãžåãå¯èŠãã§ããŠããªã t | 4335 (2 rows) ---â€VACUUM ã®å®æœ postgres=> vacuum exam5; VACUUM ---â¥å¯èŠæ§ãããã®ç¢ºèª postgres=> select all_visible,count(*) from pg_visibility_map('exam5') group by all_visible; all_visible | count -------------+------- f | 89ãâ
89ããŒãžåãå¯èŠãã§ããŠããªã t | 4425 (2 rows) ---âŠINDEX_CLEANUP ON ã§å®æœ postgres=> vacuum (INDEX_CLEANUP on) exam5; VACUUM ---â§å¯èŠæ§ãããã®ç¢ºèª postgres=> select all_visible,count(*) from pg_visibility_map('exam5') group by all_visible; all_visible | count -------------+------- t | 4514ãâ
(1 row) æåŸã« ä»å㯠INDEX ONLY SCAN ã«ã€ããŠæ€èšŒãšå
±ã«èŠããçµæããŸãšããŠã¿ãŸããã æ¹ããŠãAUTOVACUUM 㯠PostgreSQL ã«ãšã£ãŠéèŠã§ããããŸãããªãäŸåããŠããããã«ãæããŸãã å®è¡èšç»ã®è¡šç€ºã ãã§ãç°¡åã«å€æãããšçãç®ã«ãããšããæ¬å
容ã§ããããå®è¡èšç»ã®å¥¥æ·±ãã«æåããŸããã ããå®è¡èšç»ã確èªããããšãããã°æ¬å
å®¹ãæ°ã«ããŠãããããšå¹žãã§ãã