@NubasLol

Почему Postgres не использует индекс?

explain  analyze  select *
from "articles"
cross join plainto_tsquery(COALESCE('russian', get_current_ts_config()), 'search')
AS "tsquery" where searchable @@ "tsquery" order by "date" desc limit 10 offset 0;


Без сортировки поиск работает крайне быстро, но с ней как показывает практика (explain analyze) , он сканирует все резульаты для сортировки .

Создал индекс
CREATE INDEX articles_desc_index ON articles (date DESC NULLS LAST)


Но он просто игнорируется, есть идеи как исправить?

C order

Limit  (cost=2954.42..2954.44 rows=10 width=1520) (actual time=2999.486..2999.504 rows=10 loops=1)
  ->  Sort  (cost=2954.42..2956.15 rows=692 width=1520) (actual time=2999.484..2999.497 rows=10 loops=1)
        Sort Key: articles.published_at DESC
        Sort Method: top-N heapsort  Memory: 44kB
        ->  Nested Loop  (cost=457.36..2939.47 rows=692 width=1520) (actual time=28.453..2981.421 rows=5577 loops=1)
              ->  Function Scan on tsquery  (cost=0.00..0.01 rows=1 width=32) (actual time=0.004..0.006 rows=1 loops=1)
              ->  Bitmap Heap Scan on articles  (cost=457.36..2932.54 rows=692 width=1488) (actual time=28.441..2970.125 rows=5577 loops=1)
                    Recheck Cond: (searchable @@ tsquery.tsquery)
                    Heap Blocks: exact=5197
                    ->  Bitmap Index Scan on articles_searchable_index  (cost=0.00..457.19 rows=692 width=0) (actual time=27.755..27.755 rows=5587 loops=1)
                          Index Cond: (searchable @@ tsquery.tsquery)
Planning time: 0.180 ms
Execution time: 2999.576 ms


Без сортировки

Limit  (cost=457.36..493.23 rows=10 width=1520) (actual time=2.408..2.429 rows=10 loops=1)
  ->  Nested Loop  (cost=457.36..2939.47 rows=692 width=1520) (actual time=2.407..2.428 rows=10 loops=1)
        ->  Function Scan on tsquery  (cost=0.00..0.01 rows=1 width=32) (actual time=0.005..0.005 rows=1 loops=1)
        ->  Bitmap Heap Scan on articles  (cost=457.36..2932.54 rows=692 width=1488) (actual time=2.396..2.410 rows=10 loops=1)
              Recheck Cond: (searchable @@ tsquery.tsquery)
              Heap Blocks: exact=10
              ->  Bitmap Index Scan on articles_searchable_index  (cost=0.00..457.19 rows=692 width=0) (actual time=1.737..1.737 rows=5587 loops=1)
                    Index Cond: (searchable @@ tsquery.tsquery)
Planning time: 0.179 ms
Execution time: 2.477 ms
  • Вопрос задан
  • 792 просмотра
Решения вопроса 1
@TelepnevDmitriy
Senior Web Developer
Так вы также напишите сортировку как в индексе (date DESC NULLS LAST)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@stul5tul
На маленьких объемах данных без индекса может быть эффективнее, чем с индексом.
Забейте таблицу огромным объемом фиктивных данных и проверьте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы