Индекс

=> CREATE INDEX ON tickets(passenger_name);
CREATE INDEX

Наличие статистики

Некоторые основные значения:

=> SELECT reltuples, relpages FROM pg_class WHERE relname = 'tickets';
  reltuples  | relpages 
-------------+----------
 2.94986e+06 |    48788
(1 row)

=> SELECT attname, null_frac, n_distinct, left(most_common_vals::text,50) mcv, correlation
  FROM pg_stats WHERE tablename = 'tickets';
    attname     | null_frac | n_distinct |                        mcv                         | correlation 
----------------+-----------+------------+----------------------------------------------------+-------------
 ticket_no      |         0 |         -1 |                                                    |           1
 book_ref       |         0 |  -0.501751 | {1B1D8A,01FE41,033F6B,074AC9,0955E2,0A1321,0BA271, | -0.00195225
 passenger_id   |         0 |         -1 |                                                    |  0.00159387
 passenger_name |         0 |      10279 | {"ALEKSANDR IVANOV","SERGEY IVANOV","ALEKSANDR KUZ | 0.000930794
 contact_data   |         0 |         -1 |                                                    |  0.00181343
(5 rows)

Планы запросов

=> EXPLAIN SELECT * FROM tickets;
                            QUERY PLAN                             
-------------------------------------------------------------------
 Seq Scan on tickets  (cost=0.00..78286.57 rows=2949857 width=104)
(1 row)

Кардинальность равна числу строк в таблице; выбрано полное сканирование.

=> EXPLAIN SELECT * FROM tickets WHERE passenger_name = 'ALEKSANDR IVANOV';
                                          QUERY PLAN                                          
----------------------------------------------------------------------------------------------
 Bitmap Heap Scan on tickets  (cost=182.35..20187.94 rows=7473 width=104)
   Recheck Cond: (passenger_name = 'ALEKSANDR IVANOV'::text)
   ->  Bitmap Index Scan on tickets_passenger_name_idx  (cost=0.00..180.48 rows=7473 width=0)
         Index Cond: (passenger_name = 'ALEKSANDR IVANOV'::text)
(4 rows)

Селективность оценена по списку наиболее частых значений; выбрано сканирование по битовой карте.

=> EXPLAIN SELECT * FROM tickets WHERE passenger_name = 'ANNA VASILEVA';
                                         QUERY PLAN                                         
--------------------------------------------------------------------------------------------
 Bitmap Heap Scan on tickets  (cost=10.48..1015.20 rows=265 width=104)
   Recheck Cond: (passenger_name = 'ANNA VASILEVA'::text)
   ->  Bitmap Index Scan on tickets_passenger_name_idx  (cost=0.00..10.42 rows=265 width=0)
         Index Cond: (passenger_name = 'ANNA VASILEVA'::text)
(4 rows)

Селективность оценена исходя из равномерного распределения; выбрано сканирование по битовой карте.

=> EXPLAIN SELECT * FROM tickets WHERE ticket_no = '0005432000284';
                                  QUERY PLAN                                  
------------------------------------------------------------------------------
 Index Scan using tickets_pkey on tickets  (cost=0.43..8.45 rows=1 width=104)
   Index Cond: (ticket_no = '0005432000284'::bpchar)
(2 rows)

Кардинальность равна 1, так как значения этого столбца уникальны; выбрано индексное сканирование.