powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не срабатывае boolean индекс при false
25 сообщений из 32, страница 1 из 2
Не срабатывае boolean индекс при false
    #39192247
nateless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите почему не срабатывает boolean индекс при выборке false ? Я уже даже добавил отрицательный индекс и все равно идет Seq Scan. Vacuum Analyze делал. 9.5 версия.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
prometheus=# \d+ trx;
                                                           Table "public.trx"
     Column      |            Type             |                    Modifiers                     | Storage | Stats target | Description
-----------------+-----------------------------+--------------------------------------------------+---------+--------------+-------------
 id              | integer                     | not null default nextval('trx_id_seq'::regclass) | plain   |              |
 block_id        | integer                     |                                                  | plain   |              |
 trx_id          | integer                     |                                                  | plain   |              |
 version         | integer                     |                                                  | plain   |              |
 index           | integer                     |                                                  | plain   |              |
 lock_time       | bigint                      |                                                  | plain   |              |
 size            | integer                     |                                                  | plain   |              |
 time            | integer                     |                                                  | plain   |              |
 inputs_count    | integer                     |                                                  | plain   |              |
 outputs_count   | integer                     |                                                  | plain   |              |
 mem_pool        | boolean                     | default false                                    | plain   |              |
 total_in_value  | bigint                      | default 0                                        | plain   |              |
 total_out_value | bigint                      | default 0                                        | plain   |              |
 est_out_value   | bigint                      | default 0                                        | plain   |              |
 fee             | bigint                      | default 0                                        | plain   |              |
 created_at      | timestamp without time zone |                                                  | plain   |              |
Indexes:
    "trx_pkey" PRIMARY KEY, btree (id)
    "index_trx_on_block_id" btree (block_id)
    "index_trx_on_mem_pool" btree (mem_pool)
    "index_trx_on_trx_id" btree (trx_id)
    "not_mempool_index" btree (mem_pool) WHERE mem_pool = false

prometheus=# explain select count(id) from trx where mem_pool = true;
                                          QUERY PLAN
----------------------------------------------------------------------------------------------
 Aggregate  (cost=1642.78..1642.79 rows=1 width=4)
   ->  Index Scan using index_trx_on_mem_pool on trx  (cost=0.57..1554.76 rows=35210 width=4)
         Index Cond: (mem_pool = true)
         Filter: mem_pool
(4 rows)

prometheus=# explain select count(id) from trx where mem_pool = false;
                              QUERY PLAN
-----------------------------------------------------------------------
 Aggregate  (cost=3276148.89..3276148.90 rows=1 width=4)
   ->  Seq Scan on trx  (cost=0.00..2982819.13 rows=117331903 width=4)
         Filter: (NOT mem_pool)
(3 rows)
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192255
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nateless,

Потому что при mem_pool = true планировщик ожидает получить 35210 записей,
а при mem_pool = false - 117331903 записей.

Вот он и считает, что для false дешевле сделать sec scan.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192258
nateless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

Хм, а как можно оптимизировать что бы он давал все таки по индексу? так как выборка по seq scan занимает минуту, а надо не больше 10ms уложиться.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192266
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nateless,

А кто сказал, что по индексу будет быстрее?

1. сколько записей в таблице?
2. Что показывает select reltuples from pg_class where oid = 'trx'::regclass;
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192272
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
natelessПавел Лузанов,

Хм, а как можно оптимизировать что бы он давал все таки по индексу? так как выборка по seq scan занимает минуту, а надо не больше 10ms уложиться.
А приведите-ка EXPLAIN ANALYZE SELECT...
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192274
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nateless,

а ваш HDD сможет прочесть 117331903 вайт за 10мс? и да 117331903 ещё умножать на ширину записи надо. недумается что будет быстрее.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192275
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдруг что-нибудь будет заметно.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192277
nateless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

Около 116М и каждый день добавляется около 200к, сначала они все поступают как mem_pool=true потом переходят в false.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
prometheus=# select reltuples from pg_class where oid = 'trx'::regclass;
  reltuples
-------------
 1.16659e+08
(1 row)

prometheus=# select count(id) from trx;
   count
-----------
 116385331
(1 row)
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192279
nateless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nateless,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
prometheus=# explain analyze select count(id) from trx where mem_pool = false;
                                                         QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=3276447.68..3276447.69 rows=1 width=4) (actual time=41721.883..41721.883 rows=1 loops=1)
   ->  Seq Scan on trx  (cost=0.00..2983091.17 rows=117342604 width=4) (actual time=0.252..35494.962 rows=116336854 loops=1)
         Filter: (NOT mem_pool)
         Rows Removed by Filter: 48946
 Planning time: 0.053 ms
 Execution time: 41721.902 ms
(6 rows)
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192287
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХЗ. Вакуум как настраивался?
Может попробовать поагрессивнее настроить?
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192289
nateless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОКТОГЕН,

Он не срабатывает, так как сразу после ваакума он все равно делает seq scan, так что смысла играться с вакумом пока не вижу.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192290
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nateless,

то есть в запросе SHOW ALL;
Что показывают строчки, начинающиеся на
autovacuum?
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192297
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
natelessОКТОГЕН,

Он не срабатывает, так как сразу после ваакума он все равно делает seq scan, так что смысла играться с вакумом пока не вижу.
Ок. А он один раз срабатывает, или постоянно потоком идут запросы такого вида?
Если запросы вызываются потоком, то смысл вижу.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192301
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Индекс включить можно через предварительное отключение:
set enable_seqscan to off;

Но должно стать еще хуже.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192304
nateless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОКТОГЕН,

Пробовали останавливать апдейты так что после вакума не было новых записей когда делали проверку, поэтому и думаю что он тут не причем.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
prometheus=# SELECT name,setting FROM pg_settings WHERE name ~ 'autova|vacuum';
                name                 |  setting
-------------------------------------+-----------
 autovacuum                          | on
 autovacuum_analyze_scale_factor     | 0.05
 autovacuum_analyze_threshold        | 50
 autovacuum_freeze_max_age           | 200000000
 autovacuum_max_workers              | 20
 autovacuum_multixact_freeze_max_age | 400000000
 autovacuum_naptime                  | 60
 autovacuum_vacuum_cost_delay        | -1
 autovacuum_vacuum_cost_limit        | -1
 autovacuum_vacuum_scale_factor      | 0.05
 autovacuum_vacuum_threshold         | 50
 autovacuum_work_mem                 | -1
 log_autovacuum_min_duration         | 1000
 vacuum_cost_delay                   | 5
 vacuum_cost_limit                   | 200
 vacuum_cost_page_dirty              | 20
 vacuum_cost_page_hit                | 1
 vacuum_cost_page_miss               | 10
 vacuum_defer_cleanup_age            | 0
 vacuum_freeze_min_age               | 50000000
 vacuum_freeze_table_age             | 150000000
 vacuum_multixact_freeze_min_age     | 5000000
 vacuum_multixact_freeze_table_age   | 150000000
(23 rows)
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192331
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nateless,

Планировщик всё правильно делает. Индекс не всегда означает, что будет быстрее.
В вашем случае 99% записей. Если вы заставите базу идти через индекс, то она будет читать и 99% индеса, и 99% таблицы.
Это потому, что видимость данных храниться в таблице.

А так — читается только таблица, что очевидно быстрее.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192341
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nateless,

а если попробовать
Код: sql
1.
select count(*) from trx where mem_pool = false;



(т.е. *, а не id)

index only scan появляется в плане?
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192345
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, вы упёрлись в дисковую систему.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192352
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexiusnateless,

а если попробовать
Код: sql
1.
select count(*) from trx where mem_pool = false;



(т.е. *, а не id)

index only scan появляется в плане?
Чтобы он отрабатывал, надо чтоб успевались все необходимые биты проставляться.
Это только после вакуума возможно, даже после вставки. А если поле поменялось в большой части записей - тем более работать не будет. Вот для архивных таблиц - это - тема, что надо.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192356
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОКТОГЕН,

ТС не говорил что какие-то проблемы с вакуумом у него, тем более что руками vacuum запускался.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192357
nateless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Есть какие-то варианты ускорить выполнение? Может партицирование? Будем пробовать кешировать число на сервисе, но хотелось бы исполнение запроса не в минуту как сейчас.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192365
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nateless,

Если таблица часто меняется, то IOS вряд ли можно выжать, иначе — подбирайте запрос с индексом так, чтобы оно завелось.

Если приблизительно сойдёт, то можно из статистики тащить: pg_stats.most_common_freqs[X] * pg_class.reltuples (где Х — индекс для значения `false` из `most_common_vals`). Но это будет очень приблизительно.

А так — через триггера поддерживайте актуальные счётчики во вспомогательной таблице.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192383
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov<>А так — через триггера поддерживайте актуальные счётчики во вспомогательной таблице.
только именно в таблице, а не как тут один, на говнохабре, статью не так давно тискал -- в сиквенсах каунты считал.
даже миша тюрин, и тот -- автора обматерил. а давно ли сам таймстамп как ид транзакции пользовал.

на таблицах каунтов 2 техники. с очередями и без. (вторая -- с подбором кучек ). обе они, к сожалению , пухнут индексами изрядно.
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192394
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

А можно подробнее про две техники? (ссылками на статьи было бы замечательно.)
...
Рейтинг: 0 / 0
Не срабатывае boolean индекс при false
    #39192464
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovqwwq,

А можно подробнее про две техники? (ссылками на статьи было бы замечательно.)да примитивно:

1. с очередями на уникъю.
2. без уникъю, с джобом [тикером] подбора кучи , заменой подобранного на 1 свежую запись с SUM().

-- 1-е -- стандарт вообще.
-- 2.-е даже 1с умеют.

я 2 делал без тикера, но с дополнительной нагрузкой на вставку . лочил no wait то, что было свободно, и подбирал в общую кучку. понятно, что это затратнее разделения труда. правда я не каунты считал, а карту срезов для отложенного сбора статистики составлял.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не срабатывае boolean индекс при false
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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