|
Странное поведение gin индекса
|
|||
---|---|---|---|
#18+
Всем привет Есть PostgreSQL 13.1 (Debian 13.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit Есть для меня крайне странная ситуация при НЕ использовании индексов. Запрос 1 Код: sql 1. 2. 3. 4.
Где tags - text[] и создан gin индекс (array_ops). Если ввожу массив с частотным данным - идет seq scan. Если ввожу массив с не частотными данными - используется индекс. Вроде все логично. План Код: sql 1. 2. 3. 4. 5. 6.
Проблема 1. Если переписать запрос Запрос 2 Код: sql 1. 2. 3. 4.
Где tags будет json массивом, то индекс будет использоваться ВСЕГДА. План Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Почему так происходит? Фактически наблюдаю проблему, что по частотным тегам использование индекса лучше и запрос выполняется быстрее. Проблема 2. Если в первом варианте запроса со string_to_array применить какие-то еще условия в where, то индексы для них вообще не используются (и выполнение запроса занимает вплоть до 10 секунд). А для второго - всегда используются (время запроса - около 1s). Могу тут тоже представить планы, но для 1 запрос там остается обычный seq scan, для второго все корректно - все индексы используются. Почему не используются индексы для первого запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2021, 23:16 |
|
Странное поведение gin индекса
|
|||
---|---|---|---|
#18+
Идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2022, 10:03 |
|
Странное поведение gin индекса
|
|||
---|---|---|---|
#18+
andrei07 Идеи? 1)сделайте для теста set enable_seq_scan to 0; и заново explain analyze исходного запроса... надо сравнить цену (cost) с точки зрения базы для seq scan и bitmap scan и если цена отличается от реальных времязатрат - думать о том что и как в *_cost параметрах у вас в настройках базы не соответствует реальности. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2022, 10:33 |
|
Странное поведение gin индекса
|
|||
---|---|---|---|
#18+
Maxim Boguk, В таблице немного данные поменялись, поэтому заново приведу исходный план set enable_seqscan = on; plan: Код: plsql 1. 2. 3. 4. 5.
set enable_seqscan = off; plan: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Т.е. cost=0.00..2860.96, а у исходного cost=0.00..58035.59. Т.е. вывод, что все же планировщик должен был выбрать сканирование по индексу? По *_cost параметрам - никаких изменений не вносилось, все стоит дефолтное. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 18:12 |
|
|
start [/forum/topic.php?fid=53&msg=40125450&tid=1993711]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 257ms |
total: | 374ms |
0 / 0 |