# Индекс

    => 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)

- Ни один столбец не содержит неопределенных значений.
- Уникальных номеров бронирования примерно в два раза меньше, чем строк в таблице (то есть на каждое бронирование в среднем приходится два билета). Имеется около 10000 разных имен. Все остальные столбцы содержат уникальные значения.
- Для номеров бронирований и имен пассажиров есть гистограммы. Для других столбцов гистограмма не имеет смысла, так как все значения уникальны.
- Строки таблицы физически упорядочены по номеру билета. Данные в других столбцах расположены более или менее хаотично.

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

    => 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, так как значения этого столбца уникальны; выбрано индексное сканирование.