Почему создание несвязанного индекса делает мой запрос быстрее?

У меня есть стол:

debts (
    name       text,
    inv_no     integer,
    inv_type   text,
    status     text,
);

У меня есть следующий выбор:

SELECT COUNT(*) FROM debts WHERE name = '...' AND inv_no = 100 AND inv_type = '...';

Чтобы оптимизировать что-то еще, я добавил:

CREATE INDEX ON debt (status);

Нигде в SELECT я не ссылаюсь на статус, но работает...

EXPLAIN SELECT COUNT(*)... (as above)

... до и после создания индекса дает мне стоимость 16.65..16.66, переходящую в 1.25..1.26. Зачем?

Полный explain (analyze, verbose) до после:

До:

QUERY PLAN
----------
 Aggregate  (cost=16.65..16.66 rows=1 width=0) (actual time=0.126..0.128 rows=1 loops=1)
   Output: count(*)
   ->  Seq Scan on ab123456.debts  (cost=0.00..16.65 rows=1 width=0) (actual time=0.106..0.106 rows=0 loops=1)
         Output: name, inv_no, inv_type, status
         Filter: ((debts.name = '...'::text) AND (debts.inv_type = '...'::text) AND (debts.inv_no = 100))
 Total runtime: 0.387 ms

После:

QUERY PLAN
----------
 Aggregate  (cost=1.25..1.26 rows=1 width=0) (actual time=0.031..0.033 rows=1 loops=1)
   Output: count(*)
   ->  Seq Scan on ab123456.debts  (cost=0.00..1.25 rows=1 width=0) (actual time=0.024..0.024 rows=0 loops=1)
         Output: name, inv_no, inv_type, status
         Filter: ((debts.name = '...'::text) AND (debts.inv_type = '...'::text) AND (debts.inv_no = 100))
 Total runtime: 0.118 ms

1 ответ

Решение

Некоторые служебные заявления (в том числе CREATE INDEX!) обновлять статистику таблицы, находясь при этом. Руководство:

По соображениям эффективности, reltuples а также relpages не обновляются на лету, и поэтому они обычно содержат несколько устаревших значений. Они обновляются VACUUM, ANALYZE и несколько команд DDL, таких как CREATE INDEX,

Жирный акцент мой. Таким образом, даже если ваш индекс кажется совершенно не связанным, обновленная статистика таблицы может оказать влияние - особенно на count() что в первую очередь зависит от двух упомянутых статистических данных.

Связанные с:

Другие вопросы по тегам