Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не срабатывае boolean индекс при false / 25 сообщений из 32, страница 1 из 2
15.03.2016, 13:41
    #39192247
nateless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывае boolean индекс при false
Подскажите почему не срабатывает 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
15.03.2016, 13:48
    #39192255
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывае boolean индекс при false
nateless,

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

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

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

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

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

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

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

Около 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
15.03.2016, 14:03
    #39192279
nateless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывае boolean индекс при false
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
15.03.2016, 14:06
    #39192287
ОКТОГЕН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывае boolean индекс при false
ХЗ. Вакуум как настраивался?
Может попробовать поагрессивнее настроить?
...
Рейтинг: 0 / 0
15.03.2016, 14:08
    #39192289
nateless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывае boolean индекс при false
ОКТОГЕН,

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

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

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

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

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

Код: 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
15.03.2016, 14:27
    #39192331
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывае boolean индекс при false
nateless,

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

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

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



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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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


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