Check the bloat of GiST index on PostgreSQL 12.

A patch to prevent GiST index bloat has been merged in 12.

Environment

PostgreSQL 12beta1 rev:2cd4e835701e15f5e32dd8bde488f8669ddf7ae8

Schema

w/ range type

create table events_range (id bigint, during int8range);

create index during_range_idx on events_range using gist (during);

w/ 2 columns

create table events_int8s (id bigint, start_at bigint, finish_at bigint);

create index during_int8s_idx on events_int8s using gist (int8range(start_at, finish_at, '[]'));

Populate

Populate 10M

$ time ./gen_data_gist_on_range.py 10000000 | psql test
COPY 10000000
./gen_data_gist_on_range.py 10000000  26.56s user 0.12s system 13% cpu 3:20.90 total
psql test  1.32s user 0.50s system 0% cpu 3:21.07 total
$ time ./gen_data_gist_on_int8s.py 10000000 | psql test
`COPY 10000000
./gen_data_gist_on_int8s.py 10000000  26.02s user 0.12s system 13% cpu 3:19.16 total
psql test  1.24s user 0.44s system 0% cpu 3:19.25 total
test=# \d+
                       List of relations
 Schema |     Name     | Type  |  Owner  |  Size  | Description
--------|--------------|-------|---------|--------|-------------
 public | events_int8s | table | keisuke | 498 MB |
 public | events_range | table | keisuke | 575 MB |
(2 rows)

test=# \di+
                                 List of relations
 Schema |       Name       | Type  |  Owner  |    Table     |  Size  | Description
--------|------------------|-------|---------|--------------|--------|-------------
 public | during_int8s_idx | index | keisuke | events_int8s | 528 MB |
 public | during_range_idx | index | keisuke | events_range | 529 MB |
(2 rows)

Profile

w/ range type

Flame Graph Reset Zoom Search postgres (119,700 samples, 100.00%) postgres entry_SYSCALL_64 (32 samples, 0.03%) __set_page_dirty (15 samples, 0.01%) LockBuffer (50 samples, 0.04%) pq_getbytes (40 samples, 0.03%) crc32c_pcl_intel_update (14 samples, 0.01%) scsi_softirq_done (11 samples, 0.01%) DirectFunctionCall2Coll (22 samples, 0.02%) ext4_end_bio (24 samples, 0.02%) __generic_file_write_iter (500 samples, 0.42%) range_cmp_bounds (475 samples, 0.40%) ksys_lseek (11 samples, 0.01%) range_in (49 samples, 0.04%) NextCopyFrom (60 samples, 0.05%) __ctype_b_loc (12 samples, 0.01%) gistdoinsert (652 samples, 0.54%) entry_SYSCALL_64 (53 samples, 0.04%) __handle_mm_fault (18 samples, 0.02%) datum_write (47 samples, 0.04%) copy_user_enhanced_fast_string (93 samples, 0.08%) unix_stream_read_generic (40 samples, 0.03%) range_cmp_bounds (34 samples, 0.03%) scsi_end_request (27 samples, 0.02%) lru_cache_add (19 samples, 0.02%) tts_buffer_heap_materialize (13 samples, 0.01%) ext4_mark_iloc_dirty (44 samples, 0.04%) index_form_tuple (35 samples, 0.03%) FunctionCall2Coll (7,588 samples, 6.34%) Function.. ResourceOwnerForgetBuffer (20 samples, 0.02%) __libc_pwrite64 (580 samples, 0.48%) create_empty_buffers (24 samples, 0.02%) generic_write_end (100 samples, 0.08%) blk_update_request (25 samples, 0.02%) enlargeStringInfo (24 samples, 0.02%) kmem_cache_alloc (14 samples, 0.01%) hrtimer_interrupt (16 samples, 0.01%) gistchoose (7,705 samples, 6.44%) gistchoose gistgetadjusted (75 samples, 0.06%) scanint8 (18 samples, 0.02%) handle_mm_fault (29 samples, 0.02%) ext4_finish_bio (23 samples, 0.02%) XLogInsert (175 samples, 0.15%) range_gist_penalty (7,364 samples, 6.15%) range_gi.. bio_endio (11 samples, 0.01%) range_get_typcache (2,514 samples, 2.10%) r.. __generic_write_end (70 samples, 0.06%) LWLockAcquire (13 samples, 0.01%) gistdentryinit (16 samples, 0.01%) hash_any (133 samples, 0.11%) __ext4_journal_stop (12 samples, 0.01%) do_sys_open (43 samples, 0.04%) ExecInsertIndexTuples (20 samples, 0.02%) InputFunctionCall (83 samples, 0.07%) ext4_block_write_begin (71 samples, 0.06%) AllocSetAlloc (1,707 samples, 1.43%) GetPrivateRefCountEntry (95 samples, 0.08%) range_parse_bound.part.0 (218 samples, 0.18%) heap_compute_data_size (46 samples, 0.04%) ksys_pwrite64 (537 samples, 0.45%) get_page_from_freelist (22 samples, 0.02%) alloc_page_buffers (15 samples, 0.01%) pg_strncasecmp (14 samples, 0.01%) unix_stream_recvmsg (41 samples, 0.03%) tts_buffer_heap_clear (31 samples, 0.03%) random (74 samples, 0.06%) pfree (39 samples, 0.03%) ResourceArrayRemove (44 samples, 0.04%) __mark_inode_dirty (62 samples, 0.05%) vfs_write (532 samples, 0.44%) do_syscall_64 (66 samples, 0.06%) gistfillitupvec (27 samples, 0.02%) __x64_sys_pwrite64 (538 samples, 0.45%) CopyReadLine (452 samples, 0.38%) CopyLoadRawBuf (19 samples, 0.02%) XLogRegisterBuffer (20 samples, 0.02%) path_openat (25 samples, 0.02%) range_gist_consider_split (162 samples, 0.14%) gistplacetopage (14 samples, 0.01%) range_gist_picksplit (207 samples, 0.17%) BufferGetTag (12 samples, 0.01%) palloc (747 samples, 0.62%) __alloc_pages_nodemask (27 samples, 0.02%) gistplacetopage (49 samples, 0.04%) account_page_dirtied (11 samples, 0.01%) qsort_arg (202 samples, 0.17%) ext4_es_insert_delayed_block (11 samples, 0.01%) [unknown] (106,603 samples, 89.06%) [unknown] ext4_dirty_inode (62 samples, 0.05%) heap_fill_tuple (105 samples, 0.09%) range_in (13 samples, 0.01%) __hrtimer_run_queues (16 samples, 0.01%) scsi_io_completion (27 samples, 0.02%) heap_prepare_insert (52 samples, 0.04%) LWLockRelease (173 samples, 0.14%) NextCopyFrom (19 samples, 0.02%) gistpenalty (3,022 samples, 2.52%) gi.. __do_page_fault (26 samples, 0.02%) irq_exit (27 samples, 0.02%) pg_comp_crc32c_sse42 (85 samples, 0.07%) LWLockReleaseClearVar (57 samples, 0.05%) BufferGetBlockNumber (13 samples, 0.01%) do_filp_open (26 samples, 0.02%) get_gist_range_class (21 samples, 0.02%) BufferGetLSNAtomic (19 samples, 0.02%) range_get_flags (47 samples, 0.04%) tick_sched_timer (14 samples, 0.01%) FormIndexDatum (13 samples, 0.01%) alloc_empty_file (15 samples, 0.01%) ext4_mark_inode_dirty (61 samples, 0.05%) ext4_do_update_inode (41 samples, 0.03%) XLogBytePosToEndRecPtr (30 samples, 0.03%) range_serialize (26 samples, 0.02%) do_IRQ (29 samples, 0.02%) XLogRegisterBufData (19 samples, 0.02%) [libc-2.29.so] (35 samples, 0.03%) __mark_inode_dirty (30 samples, 0.03%) BufferGetLSNAtomic (18 samples, 0.02%) gistinsert (16 samples, 0.01%) __sigsetjmp (11 samples, 0.01%) heap_form_tuple (44 samples, 0.04%) gistdoinsert (88 samples, 0.07%) XLogInsertRecord (223 samples, 0.19%) NextCopyFromRawFields (20 samples, 0.02%) gistDeCompressAtt (216 samples, 0.18%) ReadBufferExtended (119 samples, 0.10%) range_parse_bound.part.0 (17 samples, 0.01%) ResourceArrayAdd (28 samples, 0.02%) FunctionCall3Coll (2,593 samples, 2.17%) F.. gistXLogUpdate (23 samples, 0.02%) __add_to_page_cache_locked (33 samples, 0.03%) ext4_da_write_end (114 samples, 0.10%) LWLockAcquire (174 samples, 0.15%) XLogRegisterData (12 samples, 0.01%) do_page_fault (35 samples, 0.03%) range_super_union (147 samples, 0.12%) page_fault (52 samples, 0.04%) PageAddItemExtended (100 samples, 0.08%) block_write_end (29 samples, 0.02%) pg_comp_crc32c_sse42 (17 samples, 0.01%) __x64_sys_recvfrom (45 samples, 0.04%) do_IRQ (13 samples, 0.01%) bio_endio (25 samples, 0.02%) gistinserttuples (13 samples, 0.01%) generic_update_time (30 samples, 0.03%) do_syscall_64 (29 samples, 0.02%) rw_verify_area (11 samples, 0.01%) __open64 (74 samples, 0.06%) pg_detoast_datum (27 samples, 0.02%) malloc (67 samples, 0.06%) ext4_end_bio (11 samples, 0.01%) unix_stream_read_actor (13 samples, 0.01%) ext4_mark_iloc_dirty (11 samples, 0.01%) alloc_buffer_head (15 samples, 0.01%) MemoryContextResetOnly (15 samples, 0.01%) gistSplit (12 samples, 0.01%) getname (15 samples, 0.01%) make_range (19 samples, 0.02%) palloc (2,236 samples, 1.87%) p.. mark_buffer_dirty (18 samples, 0.02%) file_update_time (33 samples, 0.03%) pg_comp_crc32c_sse42 (57 samples, 0.05%) LWLockReleaseClearVar (23 samples, 0.02%) ext4_reserve_inode_write (16 samples, 0.01%) appendStringInfoChar (45 samples, 0.04%) int8range_subdiff (2,870 samples, 2.40%) i.. LWLockAttemptLock (511 samples, 0.43%) handle_mm_fault (21 samples, 0.02%) [postgres] (15 samples, 0.01%) __block_commit_write.isra.41 (29 samples, 0.02%) appendStringInfoChar (225 samples, 0.19%) NextCopyFromRawFields (266 samples, 0.22%) __lru_cache_add (18 samples, 0.02%) qsort_arg (196 samples, 0.16%) page_fault (35 samples, 0.03%) add_to_page_cache_lru (58 samples, 0.05%) irq_exit (11 samples, 0.01%) int8range_canonical (25 samples, 0.02%) FormIndexDatum (46 samples, 0.04%) ExecInsertIndexTuples (43 samples, 0.04%) gistinsert (11 samples, 0.01%) ExecStoreVirtualTuple (13 samples, 0.01%) heap_fill_tuple (11 samples, 0.01%) hash_search_with_hash_value (784 samples, 0.65%) med3 (14 samples, 0.01%) slot_getsomeattrs_int (11 samples, 0.01%) RelationPutHeapTuple (47 samples, 0.04%) int8range_canonical (18 samples, 0.02%) ext4_da_write_begin (220 samples, 0.18%) ResourceOwnerEnlargeBuffers (13 samples, 0.01%) pagevec_lru_move_fn (16 samples, 0.01%) alloc_pages_current (30 samples, 0.03%) range_gist_penalty (6,723 samples, 5.62%) range_g.. entry_SYSCALL_64 (567 samples, 0.47%) smp_apic_timer_interrupt (18 samples, 0.02%) crypto_shash_update (14 samples, 0.01%) gistMakeUnionKey (45 samples, 0.04%) interval_cmp_upper (39 samples, 0.03%) CopyFrom (37 samples, 0.03%) UnpinBuffer.constprop.11 (187 samples, 0.16%) index_form_tuple (14 samples, 0.01%) pq_getmessage (53 samples, 0.04%) heap_multi_insert (46 samples, 0.04%) end_page_writeback (18 samples, 0.02%) scanint8 (520 samples, 0.43%) int8in (44 samples, 0.04%) skb_release_all (20 samples, 0.02%) cfree (15 samples, 0.01%) hash_search_with_hash_value (498 samples, 0.42%) palloc0 (16 samples, 0.01%) do_syscall_64 (50 samples, 0.04%) gistgetadjusted (48 samples, 0.04%) skb_copy_datagram_iter (13 samples, 0.01%) getname_flags (15 samples, 0.01%) MarkBufferDirty (100 samples, 0.08%) __put_page (13 samples, 0.01%) __put_compound_page (12 samples, 0.01%) [libc-2.29.so] (80 samples, 0.07%) AllocSetAlloc (10,600 samples, 8.86%) AllocSetAlloc __sys_recvfrom (45 samples, 0.04%) BufTableLookup (14 samples, 0.01%) heap_multi_insert (15 samples, 0.01%) consume_skb (23 samples, 0.02%) generic_perform_write (458 samples, 0.38%) __do_page_fault (32 samples, 0.03%) ext4_dirty_inode (27 samples, 0.02%) LWLockWaitListLock (80 samples, 0.07%) range_cmp_bounds (4,592 samples, 3.84%) rang.. range_gist_consider_split (27 samples, 0.02%) __ext4_journal_start_sb (18 samples, 0.02%) blk_update_request (11 samples, 0.01%) [unknown] (17 samples, 0.01%) __libc_recv (55 samples, 0.05%) new_sync_write (512 samples, 0.43%) FunctionCall2Coll (2,896 samples, 2.42%) Fu.. range_gist_same (42 samples, 0.04%) ext4_file_write_iter (509 samples, 0.43%) btint8cmp (2,978 samples, 2.49%) bt.. tts_buffer_heap_getsomeattrs (100 samples, 0.08%) interval_cmp_lower (37 samples, 0.03%) gistfillbuffer (29 samples, 0.02%) initStringInfo (22 samples, 0.02%) heap_tuple_untoast_attr (22,224 samples, 18.57%) heap_tuple_untoast_attr get_range_io_data (33 samples, 0.03%) PinBuffer (557 samples, 0.47%) scsi_io_completion (11 samples, 0.01%) swapgs_restore_regs_and_return_to_usermode (21 samples, 0.02%) NextCopyFrom (37 samples, 0.03%) ext4_mark_inode_dirty (17 samples, 0.01%) range_gist_same (21 samples, 0.02%) ext4_finish_bio (11 samples, 0.01%) __handle_mm_fault (23 samples, 0.02%) ReleaseBuffer (17 samples, 0.01%) index_insert (15 samples, 0.01%) __alloc_file (15 samples, 0.01%) [unknown] (14,074 samples, 11.76%) [unknown] gistXLogUpdate (12 samples, 0.01%) iov_iter_fault_in_readable (15 samples, 0.01%) skb_release_data (13 samples, 0.01%) ret_from_intr (14 samples, 0.01%) __page_cache_alloc (32 samples, 0.03%) blk_done_softirq (27 samples, 0.02%) index_form_tuple (11 samples, 0.01%) apic_timer_interrupt (20 samples, 0.02%) appendBinaryStringInfo (17 samples, 0.01%) palloc0 (85 samples, 0.07%) gistfillitupvec (78 samples, 0.07%) prepare_exit_to_usermode (13 samples, 0.01%) ReadBuffer (13 samples, 0.01%) ret_from_intr (29 samples, 0.02%) do_page_fault (26 samples, 0.02%) find_get_entry (20 samples, 0.02%) AllocSetFree (49 samples, 0.04%) ext4_inode_csum_set (32 samples, 0.03%) ext4_inode_csum.isra.64 (29 samples, 0.02%) FunctionCall3Coll (39 samples, 0.03%) tts_buffer_heap_clear (51 samples, 0.04%) [libc-2.29.so] (750 samples, 0.63%) range_eq_internal (71 samples, 0.06%) grab_cache_page_write_begin (116 samples, 0.10%) datum_compute_size.constprop.11 (52 samples, 0.04%) __x64_sys_lseek (12 samples, 0.01%) GetPrivateRefCountEntry (40 samples, 0.03%) heap_fill_tuple (13 samples, 0.01%) sock_recvmsg (41 samples, 0.03%) gistgetadjusted (17 samples, 0.01%) check_stack_depth (17 samples, 0.01%) gistchoose (405 samples, 0.34%) scsi_finish_command (11 samples, 0.01%) ReservePrivateRefCountEntry (35 samples, 0.03%) __do_softirq (11 samples, 0.01%) swapfunc (78 samples, 0.07%) scsi_end_request (11 samples, 0.01%) ExecFetchSlotHeapTuple (14 samples, 0.01%) __x64_sys_openat (46 samples, 0.04%) CopyFrom (120 samples, 0.10%) malloc (22 samples, 0.02%) pg_detoast_datum (2,323 samples, 1.94%) p.. AllocSetReset (68 samples, 0.06%) range_serialize (105 samples, 0.09%) CopyGetData (33 samples, 0.03%) range_deserialize (13,106 samples, 10.95%) range_deserialize gistcheckpage (590 samples, 0.49%) MemoryContextResetOnly (11 samples, 0.01%) FunctionCall2Coll (17 samples, 0.01%) PageAddItemExtended (15 samples, 0.01%) all (119,700 samples, 100%) ReadBuffer_common (121 samples, 0.10%) [unknown] (66 samples, 0.06%) pagecache_get_page (114 samples, 0.10%) swapfunc (52 samples, 0.04%) gistSplitByKey (50 samples, 0.04%) random_r (86 samples, 0.07%) GetCurrentTransactionIdIfAny (11 samples, 0.01%) blk_done_softirq (11 samples, 0.01%) GetXLogBuffer (20 samples, 0.02%) scsi_softirq_done (27 samples, 0.02%) gistFormTuple (24 samples, 0.02%) LWLockRelease (353 samples, 0.29%) jbd2__journal_start (14 samples, 0.01%) ext4_da_get_block_prep (40 samples, 0.03%) entry_SYSCALL_64 (70 samples, 0.06%) scsi_finish_command (27 samples, 0.02%) do_syscall_64 (555 samples, 0.46%) iov_iter_copy_from_user_atomic (95 samples, 0.08%) FunctionCall1Coll (17 samples, 0.01%) gistinserttuples (34 samples, 0.03%) gistFormTuple (15 samples, 0.01%) range_gist_union (34 samples, 0.03%) __do_softirq (27 samples, 0.02%) __skb_datagram_iter (13 samples, 0.01%) __libc_lseek64 (52 samples, 0.04%) ReadBuffer_common (199 samples, 0.17%) __vfs_write (512 samples, 0.43%)

w/ 2 columns

Flame Graph Reset Zoom Search __put_compound_page (12 samples, 0.01%) gistSplitByKey (46 samples, 0.04%) FormIndexDatum (41 samples, 0.04%) ext4_da_write_end (117 samples, 0.10%) ext4_mark_inode_dirty (53 samples, 0.05%) DirectFunctionCall2Coll (26 samples, 0.02%) heap_prepare_insert (39 samples, 0.03%) CopyFrom (49 samples, 0.04%) FunctionCall2Coll (7,809 samples, 6.82%) FunctionC.. random (89 samples, 0.08%) __handle_mm_fault (17 samples, 0.01%) XLogRegisterData (12 samples, 0.01%) DataChecksumsEnabled (12 samples, 0.01%) gistgetadjusted (71 samples, 0.06%) pg_detoast_datum (1,455 samples, 1.27%) ext4_reserve_inode_write (11 samples, 0.01%) index_form_tuple (40 samples, 0.03%) __block_commit_write.isra.41 (34 samples, 0.03%) ExecInsertIndexTuples (45 samples, 0.04%) unix_stream_recvmsg (53 samples, 0.05%) __ext4_journal_stop (10 samples, 0.01%) page_fault (44 samples, 0.04%) NextCopyFrom (54 samples, 0.05%) tlb_flush_mmu (26 samples, 0.02%) page_fault (11 samples, 0.01%) ResourceOwnerForgetBuffer (24 samples, 0.02%) copy_user_enhanced_fast_string (63 samples, 0.06%) entry_SYSCALL_64 (69 samples, 0.06%) pagecache_get_page (85 samples, 0.07%) do_syscall_64 (13 samples, 0.01%) range_get_typcache (2,801 samples, 2.45%) ra.. gistpenalty (3,024 samples, 2.64%) gi.. [postgres] (11 samples, 0.01%) unix_stream_read_generic (53 samples, 0.05%) palloc0 (25 samples, 0.02%) UnpinBuffer.constprop.11 (169 samples, 0.15%) crypto_shash_update (15 samples, 0.01%) unmap_single_vma (10 samples, 0.01%) find_get_entry (19 samples, 0.02%) alloc_empty_file (17 samples, 0.01%) __x64_sys_openat (48 samples, 0.04%) ksys_pwrite64 (452 samples, 0.39%) flush_tlb_mm_range (18 samples, 0.02%) __ext4_journal_start_sb (19 samples, 0.02%) PinBuffer (549 samples, 0.48%) AllocSetAlloc (1,599 samples, 1.40%) jbd2__journal_start (18 samples, 0.02%) interval_cmp_upper (30 samples, 0.03%) heap_multi_insert (24 samples, 0.02%) gistfillitupvec (114 samples, 0.10%) ExecInterpExpr (94 samples, 0.08%) page_fault (25 samples, 0.02%) smp_apic_timer_interrupt (10 samples, 0.01%) slot_getsomeattrs_int (13 samples, 0.01%) heap_fill_tuple (17 samples, 0.01%) brk (60 samples, 0.05%) [libc-2.29.so] (98 samples, 0.09%) XLogRegisterBufData (26 samples, 0.02%) FunctionCall3Coll (2,614 samples, 2.28%) F.. ResourceArrayAdd (26 samples, 0.02%) range_eq_internal (61 samples, 0.05%) tts_buffer_heap_materialize (18 samples, 0.02%) hash_search_with_hash_value (557 samples, 0.49%) do_page_fault (26 samples, 0.02%) ext4_da_write_begin (176 samples, 0.15%) FunctionCall3Coll (42 samples, 0.04%) hrtimer_interrupt (13 samples, 0.01%) skb_release_all (21 samples, 0.02%) __generic_write_end (61 samples, 0.05%) iov_iter_fault_in_readable (21 samples, 0.02%) LockBuffer (48 samples, 0.04%) __handle_mm_fault (16 samples, 0.01%) exprType (25 samples, 0.02%) flush_tlb_func_common.constprop.9 (18 samples, 0.02%) med3 (19 samples, 0.02%) __set_page_dirty (21 samples, 0.02%) pfree (40 samples, 0.03%) PageIndexTupleDelete (11 samples, 0.01%) _nv029483rm (15 samples, 0.01%) mark_buffer_dirty (28 samples, 0.02%) __x64_sys_pwrite64 (452 samples, 0.39%) FunctionCall1Coll (36 samples, 0.03%) range_constructor3 (23 samples, 0.02%) gistinserttuples (31 samples, 0.03%) ksys_lseek (10 samples, 0.01%) ext4_block_write_begin (56 samples, 0.05%) __libc_pwrite64 (496 samples, 0.43%) malloc (65 samples, 0.06%) CopyLoadRawBuf (29 samples, 0.03%) swapfunc (57 samples, 0.05%) simple_copy_to_iter (18 samples, 0.02%) heap_fill_tuple (20 samples, 0.02%) copy_user_enhanced_fast_string (13 samples, 0.01%) LWLockRelease (150 samples, 0.13%) __generic_file_write_iter (12 samples, 0.01%) XLogRegisterBuffer (18 samples, 0.02%) __libc_recv (72 samples, 0.06%) smp_apic_timer_interrupt (11 samples, 0.01%) pq_getbytes (45 samples, 0.04%) range_deserialize (13,056 samples, 11.40%) range_deserialize crc32c_pcl_intel_update (15 samples, 0.01%) start_this_handle (14 samples, 0.01%) ReservePrivateRefCountEntry (45 samples, 0.04%) gistdentryinit (13 samples, 0.01%) gistfillbuffer (23 samples, 0.02%) LWLockReleaseClearVar (20 samples, 0.02%) AllocSetReset (45 samples, 0.04%) gistplacetopage (62 samples, 0.05%) gistgetadjusted (68 samples, 0.06%) palloc (2,370 samples, 2.07%) p.. pg_detoast_datum (28 samples, 0.02%) entry_SYSCALL_64 (59 samples, 0.05%) range_gist_consider_split (188 samples, 0.16%) range_gist_penalty (7,190 samples, 6.28%) range_gi.. ext4_file_write_iter (12 samples, 0.01%) gistdoinsert (641 samples, 0.56%) page_fault (10 samples, 0.01%) swapfunc (98 samples, 0.09%) hash_any (144 samples, 0.13%) ext4_inode_csum.isra.64 (25 samples, 0.02%) entry_SYSCALL_64 (75 samples, 0.07%) __do_munmap (50 samples, 0.04%) LWLockRelease (364 samples, 0.32%) __x64_sys_brk (57 samples, 0.05%) hash_search_with_hash_value (777 samples, 0.68%) vfs_write (12 samples, 0.01%) range_cmp_bounds (475 samples, 0.41%) FunctionCall2Coll (20 samples, 0.02%) postgres (114,545 samples, 100.00%) postgres CopyReadLine (322 samples, 0.28%) NextCopyFromRawFields (17 samples, 0.01%) do_page_fault (24 samples, 0.02%) apic_timer_interrupt (11 samples, 0.01%) ResourceArrayRemove (41 samples, 0.04%) XLogInsertRecord (246 samples, 0.21%) tts_buffer_heap_clear (24 samples, 0.02%) heap_multi_insert (32 samples, 0.03%) palloc0 (121 samples, 0.11%) generic_update_time (21 samples, 0.02%) heap_fill_tuple (83 samples, 0.07%) interval_cmp_lower (32 samples, 0.03%) gistplacetopage (10 samples, 0.01%) gistchoose (383 samples, 0.33%) do_syscall_64 (59 samples, 0.05%) btint8cmp (3,052 samples, 2.66%) bt.. __x64_sys_lseek (10 samples, 0.01%) entry_SYSCALL_64 (43 samples, 0.04%) tts_buffer_heap_clear (29 samples, 0.03%) gistchoose (7,632 samples, 6.66%) gistchoose do_filp_open (32 samples, 0.03%) qsort_arg (214 samples, 0.19%) do_syscall_64 (62 samples, 0.05%) prepare_exit_to_usermode (13 samples, 0.01%) path_openat (32 samples, 0.03%) BufferGetLSNAtomic (15 samples, 0.01%) ksys_pwrite64 (12 samples, 0.01%) hrtimer_interrupt (10 samples, 0.01%) int8in (34 samples, 0.03%) handle_mm_fault (22 samples, 0.02%) kmem_cache_alloc (12 samples, 0.01%) unmap_vmas (10 samples, 0.01%) do_page_fault (25 samples, 0.02%) BufTableLookup (14 samples, 0.01%) jbd2_journal_stop (10 samples, 0.01%) __libc_pwrite64 (13 samples, 0.01%) [unknown] (75 samples, 0.07%) unix_stream_read_actor (21 samples, 0.02%) ext4_do_update_inode (37 samples, 0.03%) gistXLogUpdate (10 samples, 0.01%) gistfillitupvec (34 samples, 0.03%) __alloc_pages_nodemask (18 samples, 0.02%) entry_SYSCALL_64 (13 samples, 0.01%) int8range_canonical (24 samples, 0.02%) __page_cache_alloc (19 samples, 0.02%) generic_write_end (98 samples, 0.09%) [unknown] (14,147 samples, 12.35%) [unknown] heap_compute_data_size (67 samples, 0.06%) heap_tuple_untoast_attr (20,715 samples, 18.08%) heap_tuple_untoast_attr ReadBuffer_common (172 samples, 0.15%) skb_release_data (16 samples, 0.01%) getname (12 samples, 0.01%) XLogInsert (166 samples, 0.14%) do_syscall_64 (34 samples, 0.03%) apic_timer_interrupt (16 samples, 0.01%) gistgetadjusted (18 samples, 0.02%) qsort_arg (219 samples, 0.19%) ext4_inode_csum_set (25 samples, 0.02%) pg_comp_crc32c_sse42 (23 samples, 0.02%) range_constructor3 (19 samples, 0.02%) PageAddItemExtended (98 samples, 0.09%) LWLockWaitListLock (86 samples, 0.08%) __mark_inode_dirty (18 samples, 0.02%) add_to_page_cache_lru (42 samples, 0.04%) __hrtimer_run_queues (10 samples, 0.01%) UnpinBuffer.constprop.11 (12 samples, 0.01%) tts_buffer_heap_materialize (11 samples, 0.01%) heap_compute_data_size (11 samples, 0.01%) cfree (21 samples, 0.02%) [libc-2.29.so] (37 samples, 0.03%) __handle_mm_fault (25 samples, 0.02%) __sigsetjmp (13 samples, 0.01%) __x64_sys_pwrite64 (12 samples, 0.01%) ResourceOwnerEnlargeBuffers (16 samples, 0.01%) __do_page_fault (26 samples, 0.02%) get_hash_value (12 samples, 0.01%) pg_comp_crc32c_sse42 (109 samples, 0.10%) getname_flags (12 samples, 0.01%) native_flush_tlb_one_user (18 samples, 0.02%) do_page_fault (14 samples, 0.01%) ReadBufferExtended (111 samples, 0.10%) enlargeStringInfo (22 samples, 0.02%) range_serialize (139 samples, 0.12%) gistinsert (15 samples, 0.01%) CopyFrom (69 samples, 0.06%) gistcheckpage (577 samples, 0.50%) do_syscall_64 (63 samples, 0.06%) file_update_time (22 samples, 0.02%) sock_recvmsg (56 samples, 0.05%) gistdoinsert (91 samples, 0.08%) pg_comp_crc32c_sse42 (15 samples, 0.01%) palloc (635 samples, 0.55%) heap_multi_insert (11 samples, 0.01%) RelationPutHeapTuple (49 samples, 0.04%) range_gist_penalty (6,814 samples, 5.95%) range_g.. range_get_flags (62 samples, 0.05%) range_serialize (25 samples, 0.02%) GetXLogBuffer (19 samples, 0.02%) get_page_from_freelist (13 samples, 0.01%) __x64_sys_recvfrom (60 samples, 0.05%) smp_apic_timer_interrupt (15 samples, 0.01%) GetPrivateRefCountEntry (85 samples, 0.07%) page_fault (15 samples, 0.01%) tlb_finish_mmu (26 samples, 0.02%) alloc_pages_current (19 samples, 0.02%) ext4_da_get_block_prep (22 samples, 0.02%) malloc (34 samples, 0.03%) __add_to_page_cache_locked (32 samples, 0.03%) handle_mm_fault (19 samples, 0.02%) ReleaseBuffer (20 samples, 0.02%) __generic_file_write_iter (418 samples, 0.36%) unmap_region (41 samples, 0.04%) swapgs_restore_regs_and_return_to_usermode (16 samples, 0.01%) random_r (71 samples, 0.06%) __ext4_get_inode_loc (10 samples, 0.01%) GetPrivateRefCountEntry (64 samples, 0.06%) MarkBufferDirty (98 samples, 0.09%) arch_tlb_finish_mmu (26 samples, 0.02%) block_write_end (34 samples, 0.03%) gistFormTuple (11 samples, 0.01%) FunctionCall2Coll (2,840 samples, 2.48%) Fu.. range_gist_consider_split (24 samples, 0.02%) __vfs_write (12 samples, 0.01%) __open64 (83 samples, 0.07%) datum_write (49 samples, 0.04%) generic_perform_write (11 samples, 0.01%) range_gist_union (14 samples, 0.01%) range_gist_picksplit (212 samples, 0.19%) new_sync_write (430 samples, 0.38%) do_sys_open (47 samples, 0.04%) grab_cache_page_write_begin (88 samples, 0.08%) __handle_mm_fault (12 samples, 0.01%) PageAddItemExtended (16 samples, 0.01%) range_super_union (132 samples, 0.12%) AllocSetFree (31 samples, 0.03%) range_cmp_bounds (4,605 samples, 4.02%) rang.. text_to_cstring (12 samples, 0.01%) ExecFetchSlotHeapTuple (15 samples, 0.01%) create_empty_buffers (19 samples, 0.02%) [libc-2.29.so] (832 samples, 0.73%) AllocSetAlloc (8,013 samples, 7.00%) AllocSetA.. ext4_dirty_inode (18 samples, 0.02%) [unknown] (102,157 samples, 89.19%) [unknown] gistMakeUnionKey (55 samples, 0.05%) index_insert (42 samples, 0.04%) pg_comp_crc32c_sse42 (51 samples, 0.04%) account_page_dirtied (13 samples, 0.01%) NextCopyFrom (65 samples, 0.06%) pq_getmessage (52 samples, 0.05%) __do_page_fault (25 samples, 0.02%) entry_SYSCALL_64 (485 samples, 0.42%) ReadBuffer_common (93 samples, 0.08%) datum_compute_size.constprop.11 (37 samples, 0.03%) __do_page_fault (24 samples, 0.02%) range_gist_union (46 samples, 0.04%) __do_page_fault (14 samples, 0.01%) ExecInsertIndexTuples (21 samples, 0.02%) scanint8 (10 samples, 0.01%) alloc_buffer_head (11 samples, 0.01%) page_fault (33 samples, 0.03%) gistXLogUpdate (23 samples, 0.02%) skb_copy_datagram_iter (21 samples, 0.02%) LWLockAttemptLock (522 samples, 0.46%) iov_iter_copy_from_user_atomic (66 samples, 0.06%) __sys_recvfrom (60 samples, 0.05%) LWLockReleaseClearVar (51 samples, 0.04%) tts_buffer_heap_getsomeattrs (125 samples, 0.11%) generic_perform_write (388 samples, 0.34%) do_syscall_64 (475 samples, 0.41%) scanint8 (237 samples, 0.21%) __libc_lseek64 (62 samples, 0.05%) make_range (38 samples, 0.03%) _nv029483rm (10 samples, 0.01%) int8range_subdiff (2,855 samples, 2.49%) in.. __mark_inode_dirty (56 samples, 0.05%) get_gist_range_class (23 samples, 0.02%) consume_skb (24 samples, 0.02%) __skb_datagram_iter (21 samples, 0.02%) ext4_mark_inode_dirty (12 samples, 0.01%) [unknown] (27 samples, 0.02%) CopyGetData (24 samples, 0.02%) heap_form_tuple (41 samples, 0.04%) gistFormTuple (24 samples, 0.02%) __vfs_write (431 samples, 0.38%) ext4_dirty_inode (55 samples, 0.05%) int8range_canonical (14 samples, 0.01%) range_gist_same (27 samples, 0.02%) _copy_to_iter (14 samples, 0.01%) vfs_write (445 samples, 0.39%) new_sync_write (12 samples, 0.01%) alloc_page_buffers (14 samples, 0.01%) InputFunctionCall (59 samples, 0.05%) ext4_file_write_iter (425 samples, 0.37%) XLogBytePosToEndRecPtr (40 samples, 0.03%) gistDeCompressAtt (163 samples, 0.14%) NextCopyFromRawFields (225 samples, 0.20%) range_cmp_bounds (21 samples, 0.02%) handle_mm_fault (25 samples, 0.02%) handle_mm_fault (13 samples, 0.01%) apic_timer_interrupt (10 samples, 0.01%) LWLockAcquire (169 samples, 0.15%) __put_page (12 samples, 0.01%) range_gist_same (35 samples, 0.03%) __alloc_file (17 samples, 0.01%) ext4_mark_iloc_dirty (41 samples, 0.04%) all (114,545 samples, 100%)

Bloat

test=# select count(*) from events_int8s ;
  count
----------
 10000000
(1 row)

test=# delete from events_int8s where id < 5000000;
DELETE 5000000
test=# select count(*) from events_int8s ;
  count
---------
 5000000
(1 row)

test=# \di+
                                 List of relations
 Schema |       Name       | Type  |  Owner  |    Table     |  Size  | Description
--------|------------------|-------|---------|--------------|--------|-------------
 public | during_int8s_idx | index | keisuke | events_int8s | 528 MB |
(1 row)

test=# vacuum events_int8s ;
VACUUM
test=# \di+
                                 List of relations
 Schema |       Name       | Type  |  Owner  |    Table     |  Size  | Description
--------|------------------|-------|---------|--------------|--------|-------------
 public | during_int8s_idx | index | keisuke | events_int8s | 528 MB |
(1 row)
$ time ./gen_data_gist_on_int8s.py 5000000 | psql test
COPY 5000000
./gen_data_gist_on_int8s.py 5000000  13.17s user 0.05s system 12% cpu 1:45.12 total
psql test  0.69s user 0.22s system 0% cpu 1:45.23 total
test=# select count(*) from events_int8s ;
  count
----------
 10000000
(1 row)

test=# \di+
                                 List of relations
 Schema |       Name       | Type  |  Owner  |    Table     |  Size  | Description
--------|------------------|-------|---------|--------------|--------|-------------
 public | during_int8s_idx | index | keisuke | events_int8s | 542 MB |
(1 row)

test=# delete from events_int8s where id < 5000000;
DELETE 5000000
test=# vacuum ;
VACUUM
test=# \di+
                                 List of relations
 Schema |       Name       | Type  |  Owner  |    Table     |  Size  | Description
--------|------------------|-------|---------|--------------|--------|-------------
 public | during_int8s_idx | index | keisuke | events_int8s | 542 MB |
(1 row)
$ time ./gen_data_gist_on_int8s.py 5000000 | psql test
COPY 5000000
./gen_data_gist_on_int8s.py 5000000  13.23s user 0.07s system 12% cpu 1:46.96 total
psql test  0.62s user 0.22s system 0% cpu 1:47.06 total
test=# \di+
                                 List of relations
 Schema |       Name       | Type  |  Owner  |    Table     |  Size  | Description
--------|------------------|-------|---------|--------------|--------|-------------
 public | during_int8s_idx | index | keisuke | events_int8s | 549 MB |
(1 row)