powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск по GIN индексу
6 сообщений из 6, страница 1 из 1
Поиск по GIN индексу
    #39696541
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня, коллеги.

Вопрос по использованию GIN индекса для посика в текстовых данных.

Есть таблица логов и в ней столбец LOG_REQUEST, который содержит текст запроса.
По этому столбцу построен индекс:

Код: sql
1.
create index concurrently if not exists IDX_GIN_LOG_REQUEST on LOG_EXT_SYS using GIN (to_tsvector('english', lower(LOG_REQUEST)));



При поиске по строке из букв индекс отрабатывает быстро:
Код: sql
1.
2.
3.
explain analyze select l__r.LOG_EXT_SYS_ID as __ID
  from LOG_EXT_SYS l__r
 where lower(l__r.LOG_REQUEST) like '%иванов%'



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Bitmap Heap Scan on log_ext_sys l__r  (cost=1092.60..7524.54 rows=1626 width=8) (actual time=169.392..1192.972 rows=14010 loops=1)
  Recheck Cond: (lower((log_request)::text) ~~ '%иванов%'::text)
  Rows Removed by Index Recheck: 238
  Heap Blocks: exact=13614
  ->  Bitmap Index Scan on idx_gin_log_request  (cost=0.00..1092.20 rows=1626 width=0) (actual time=160.034..160.034 rows=14248 loops=1)
        Index Cond: (lower((log_request)::text) ~~ '%иванов%'::text)

Planning time: 8.555 ms
Execution time: 1196.950 ms



При поиске по строке из цифр индекс отрабатывает очень медленно:
Код: sql
1.
2.
3.
explain analyze select l__r.LOG_EXT_SYS_ID as __ID
  from LOG_EXT_SYS l__r
 where lower(l__r.LOG_REQUEST) like '%0535537%'



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Bitmap Heap Scan on log_ext_sys l__r  (cost=1108.60..7540.54 rows=1626 width=8) (actual time=3248.475..84303.859 rows=3 loops=1)
  Recheck Cond: (lower((log_request)::text) ~~ '%0535537%'::text)
  Rows Removed by Index Recheck: 394733
  Heap Blocks: exact=391763
  ->  Bitmap Index Scan on idx_gin_log_request  (cost=0.00..1108.20 rows=1626 width=0) (actual time=2752.620..2752.620 rows=394736 loops=1)
        Index Cond: (lower((log_request)::text) ~~ '%0535537%'::text)

Planning time: 15.799 ms
Execution time: 84357.465 ms



Если в запросе используется комбинация букв и цифр, то запрос отрабатывает быстро. Если только цифры - медленно...

Может кто сталкивался с подобной проблемой?
...
Рейтинг: 0 / 0
Поиск по GIN индексу
    #39696569
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sKot,

1)Full text search индексы вообще не предназначены для ускорения ILIKE/LIKE операций а для полнотекстового поиска
это раз
2)для like/ilike нужен триграмный индекс https://www.postgresql.org/docs/10/static/pgtrgm.html

что касается разницы по скорости с неподходящим индексом
1)включаете track_io_timing и делаете вместо explain analyze - explain (analyze, costs, buffers, timing) чтобы понять сколько времени у вас на ввод-вывод ушло

2)разница в 14248 строк в первом запросе и в 394736 строк во втором - вам ничего не говорит что второй запрос в 30 раз больше строк отдает и вполне ожидаемо может работать минимум в 30 раз дольше?

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Поиск по GIN индексу
    #39696948
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Максим, спасибо!

Триграммные индексы в данном случае не подошли, т.к. строка, по которой выполняется поиск может быть до 64kb, поэтому они по 99% записей вообще не строятся...

Код: sql
1.
2)разница в 14248 строк в первом запросе и в 394736 строк во втором - вам ничего не говорит 



Говорит, но я всё же надеялся, что есть какое-то решение... :(

Это таблица логов (~37млн строк), в ней каша из XML, кусков smtp запросов (в т.ч. и в base64) и прочего аналогичного мусора. Хотелось сделать поиск по этим строкам аналогичный триграммному...
...
Рейтинг: 0 / 0
Поиск по GIN индексу
    #39726905
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, всем спасибо, все свободны :)

Открыл для себя опцию "gin_trgm_ops" для индекстов GIN.

Построение индекса выглядит так:
Код: sql
1.
create index concurrently if not exists IDX_TRGM_GIN_LOG_REQUEST on LOG_EXT_SYS using GIN (lower(LOG_REQUEST) gin_trgm_ops);


На табл > 40 млн записей, при объёме столбца LOG_REQUEST > 132 Gb запросы, содержащие LIKE по этому столбцу по любой последовательности символов выполняются < 1 сек.

НО! Включение сортировки по любому ( даже индексированному ! полю) увеличивают время выполнения до 60-120 сек!

Тему можно считать закрытой.
...
Рейтинг: 0 / 0
Поиск по GIN индексу
    #39726998
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sKotКоллеги, всем спасибо, все свободны :)

Открыл для себя опцию "gin_trgm_ops" для индекстов GIN.



Входит в противоречие с

sKotТриграммные индексы в данном случае не подошли, т.к. строка, по которой выполняется поиск может быть до 64kb, поэтому они по 99% записей вообще не строятся...



Вы уж там определитесь у себя :).
...
Рейтинг: 0 / 0
Поиск по GIN индексу
    #39730008
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BoguksKotКоллеги, всем спасибо, все свободны :)

Открыл для себя опцию "gin_trgm_ops" для индекстов GIN.



Входит в противоречие с

sKotТриграммные индексы в данном случае не подошли, т.к. строка, по которой выполняется поиск может быть до 64kb, поэтому они по 99% записей вообще не строятся...



Вы уж там определитесь у себя :).

Максим, вы абсолютно правы. Я некорректно сформулировал вопрос в части триграммных индексов: я имел в виду GIST индексы с опцией "gist_trgm_ops". При попытке построения GIST индекса выдавалось сообщение о большой длине строки, и по этим строкам индекс вообще не строился.
Про "gin_trgm_ops" я вообще не знал, т.е. я считал, что триграммы - только для GIST. В данном случае противоречие возникло не от злого умысла, а от скудости познаний.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск по GIN индексу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]