Индекс

=> CREATE INDEX ON ticket_flights(amount);
CREATE INDEX

Выборка < 1%

=> EXPLAIN ANALYZE SELECT * FROM ticket_flights WHERE amount > 180000;
                                                                 QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on ticket_flights  (cost=839.45..63797.00 rows=44776 width=32) (actual time=10.525..229.515 rows=55640 loops=1)
   Recheck Cond: (amount > '180000'::numeric)
   Heap Blocks: exact=1653
   ->  Bitmap Index Scan on ticket_flights_amount_idx  (cost=0.00..828.25 rows=44776 width=0) (actual time=9.218..9.218 rows=55640 loops=1)
         Index Cond: (amount > '180000'::numeric)
 Planning time: 8.820 ms
 Execution time: 248.294 ms
(7 rows)

Запретим сканирование по битовой карте.

=> SET enable_bitmapscan = off;
SET
=> EXPLAIN ANALYZE SELECT * FROM ticket_flights WHERE amount > 180000;
                                                                QUERY PLAN                                                                
------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..115263.16 rows=44776 width=32) (actual time=1.258..2722.847 rows=55640 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   ->  Parallel Seq Scan on ticket_flights  (cost=0.00..109785.56 rows=18657 width=32) (actual time=590.010..2563.541 rows=18547 loops=3)
         Filter: (amount > '180000'::numeric)
         Rows Removed by Filter: 2778737
 Planning time: 0.090 ms
 Execution time: 2739.809 ms
(8 rows)

Для небольшой выборки сканирование по битовой карте оказывается эффективнее.

=> RESET enable_bitmapscan;
RESET

Выборка > 90%

=> EXPLAIN ANALYZE SELECT * FROM ticket_flights WHERE amount < 44000;
                                                          QUERY PLAN                                                          
------------------------------------------------------------------------------------------------------------------------------
 Seq Scan on ticket_flights  (cost=0.00..170976.15 rows=7561892 width=32) (actual time=16.425..3722.229 rows=7583228 loops=1)
   Filter: (amount < '44000'::numeric)
   Rows Removed by Filter: 808624
 Planning time: 0.114 ms
 Execution time: 5588.814 ms
(5 rows)

Запретим последовательное сканирование.

=> SET enable_seqscan = off;
SET
=> EXPLAIN ANALYZE SELECT * FROM ticket_flights WHERE amount < 44000;
                                                                       QUERY PLAN                                                                        
---------------------------------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on ticket_flights  (cost=141553.10..302154.75 rows=7561892 width=32) (actual time=2801.096..6475.452 rows=7583228 loops=1)
   Recheck Cond: (amount < '44000'::numeric)
   Heap Blocks: exact=65494
   ->  Bitmap Index Scan on ticket_flights_amount_idx  (cost=0.00..139662.62 rows=7561892 width=0) (actual time=2782.482..2782.482 rows=7583228 loops=1)
         Index Cond: (amount < '44000'::numeric)
 Planning time: 0.109 ms
 Execution time: 8395.476 ms
(7 rows)

Для большой выборки полное сканирование выгоднее.

Следует также учесть, что повторно запрос обычно выполняется быстрее из-за кэширования.