@Entity34

Как уменьшить время выполнения запроса like '%uri%' в Postgresql?

В базе 40,984,424 записей

делаю запрос
select * from "db1" ps where "Url" like '%profilesettings%'

6528346ea513e446571465.png
Как уменьшить время до 1 секунды на запрос ?

explain analyse select * from "db1" ps where "Url" like '%profilesettings%'

Gather  (cost=1000.00..2359455.91 rows=3141 width=439) (actual time=0.590..4487.742 rows=220 loops=1)
  Workers Planned: 2
  Workers Launched: 2
  ->  Parallel Seq Scan on "db1" ps  (cost=0.00..2358141.81 rows=1309 width=439) (actual time=13.173..4311.107 rows=73 loops=3)
        Filter: ("Url" ~~ '%profilesettings%'::text)
        Rows Removed by Filter: 13994795
Planning Time: 0.214 ms
Execution Time: 4487.844 ms
  • Вопрос задан
  • 312 просмотров
Решения вопроса 2
iMedved2009
@iMedved2009
Не люблю людей
1. GIN индексы - https://medium.com/@maanavshah/performance-optimiz...

2. Через костыли: сделать составной индекс на url и на reverse(url) и искать как url like 'setting%' and reverse(url) like reverse('%setting')
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
create extension pg_trgm;
create index concurrently db_url_trgm_idx on db1 using gin ("Url" gin_trgm_ops);

https://www.postgresql.org/docs/current/pgtrgm.html
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Entity34 Автор вопроса
GIN индексы это скорость )
теперь запросы за 200ms делаются

select * from "db1" ps where "Url" like '%profilesettings%'
652964a5ebe4f862664643.png

Bitmap Heap Scan on "db1 " ps  (cost=740.34..12974.90 rows=3141 width=439) (actual time=139.469..139.912 rows=220 loops=1)
  Recheck Cond: ("Url" ~~ '%profilesettings%'::text)
  Rows Removed by Index Recheck: 19
  Heap Blocks: exact=238
  ->  Bitmap Index Scan on db_url_trgm_idx  (cost=0.00..739.56 rows=3141 width=0) (actual time=139.435..139.436 rows=239 loops=1)
        Index Cond: ("Url" ~~ '%profilesettings%'::text)
Planning Time: 0.418 ms
Execution Time: 139.946 ms
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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