powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Partitioning (8.3.4) непонятки с индексами
8 сообщений из 8, страница 1 из 1
Partitioning (8.3.4) непонятки с индексами
    #35702352
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть табличка в которую пишется лог по трафику приблизительное количество записей каждый месяц 1М.

constraint_exclusion = on
партиции сделаны согласно по доке 5.9. Partitioning

Индексы вида
Код: plaintext
CREATE INDEX idx_journal_200811 ON journal_200811 USING btree (ts, username, host)
на каждой партиции.

Вопрос почему делается последовательное сканирование по journal_200812 если по ней есть индекс?

Отключать последовательно сканирование не хочется т.к. запрос простой и планер должен справляца без особых проблем.

п.с. Количество записей в таблицах которые участвуют в запросе ~14К и ~27К остальные пустые.

Код: plaintext
1.
2.
EXPLAIN ANALYZE SELECT host FROM trafic.journal 
WHERE (ts BETWEEN '2008-11-27 00:00:00' AND '2008-11-28 16:00:00') 
OR (ts BETWEEN '2008-12-06 00:00:00' AND '2008-12-08 16:00:00')
Код: plaintext
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.
Result  (cost= 0 . 00 .. 1618 . 28  rows= 9365  width= 32 ) (actual time= 17 . 966 .. 54 . 061  rows= 9699  loops= 1 )
 
  ->  Append  (cost= 0 . 00 .. 1618 . 28  rows= 9365  width= 32 ) (actual time= 17 . 964 .. 45 . 258  rows= 9699  loops= 1 )
 
        ->  Seq Scan on journal  (cost= 0 . 00 .. 16 . 40  rows= 3  width= 32 ) (actual time= 0 . 002 .. 0 . 002  rows= 0  loops= 1 )
 
              Filter: (((ts >= '2008-11-27 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone)) 
OR ((ts >= '2008-12-06 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone)))
 
        ->  Seq Scan on journal_200812 journal  (cost= 0 . 00 .. 1193 . 74  rows= 8030  width= 16 ) (actual time= 17 . 952 .. 35 . 911  rows= 9071  loops= 1 )
 
              Filter: (((ts >= '2008-11-27 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone)) 
OR ((ts >= '2008-12-06 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone)))
 
        ->  Bitmap Heap Scan on journal_200811 journal  (cost= 54 . 50 .. 408 . 14  rows= 1332  width= 16 ) (actual time= 0 . 367 .. 0 . 994  rows= 628  loops= 1 )
 
              Recheck Cond: (((ts >= '2008-11-27 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone)) 
OR ((ts >= '2008-12-06 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone)))
 
              ->  BitmapOr  (cost= 54 . 50 .. 54 . 50  rows= 1332  width= 0 ) (actual time= 0 . 346 .. 0 . 346  rows= 0  loops= 1 )
 
                    ->  Bitmap Index Scan on idx_journal_200811  (cost= 0 . 00 .. 49 . 57  rows= 1332  width= 0 ) (actual time= 0 . 313 .. 0 . 313  rows= 628  loops= 1 )
 
                          Index Cond: ((ts >= '2008-11-27 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone))
 
                    ->  Bitmap Index Scan on idx_journal_200811  (cost= 0 . 00 .. 4 . 26  rows= 1  width= 0 ) (actual time= 0 . 021 .. 0 . 021  rows= 0  loops= 1 )
 
                          Index Cond: ((ts >= '2008-12-06 00:00:00'::timestamp without time zone) 
AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone))
 
...
Рейтинг: 0 / 0
Partitioning (8.3.4) непонятки с индексами
    #35702393
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм походу разобрался планер считает что последовательное сканирование быстрее ведь выбирается 9К из 27К если диапазоны уменьшить то план меняется на вот такой

Код: plaintext
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.
Result  (cost= 0 . 00 .. 787 . 73  rows= 1479  width= 32 ) (actual time= 0 . 381 .. 4 . 298  rows= 1286  loops= 1 )
 
  ->  Append  (cost= 0 . 00 .. 787 . 73  rows= 1479  width= 32 ) (actual time= 0 . 378 .. 3 . 113  rows= 1286  loops= 1 )
 
        ->  Seq Scan on journal  (cost= 0 . 00 .. 16 . 40  rows= 3  width= 32 ) (actual time= 0 . 002 .. 0 . 002  rows= 0  loops= 1 )
 
              Filter: (((ts >= '2008-11-27 00:00:00'::timestamp without time zone) AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone)) OR ((ts >= '2008-12-08 15:00:00'::timestamp without time zone) AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone)))
 
        ->  Bitmap Heap Scan on journal_200812 journal  (cost= 14 . 05 .. 363 . 18  rows= 144  width= 16 ) (actual time= 0 . 366 .. 0 . 991  rows= 658  loops= 1 )
 
              Recheck Cond: (((ts >= '2008-11-27 00:00:00'::timestamp without time zone) AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone)) OR ((ts >= '2008-12-08 15:00:00'::timestamp without time zone) AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone)))
 
              ->  BitmapOr  (cost= 14 . 05 .. 14 . 05  rows= 144  width= 0 ) (actual time= 0 . 334 .. 0 . 334  rows= 0  loops= 1 )
 
                    ->  Bitmap Index Scan on idx_journal_200812  (cost= 0 . 00 .. 4 . 27  rows= 1  width= 0 ) (actual time= 0 . 054 .. 0 . 054  rows= 0  loops= 1 )
 
                          Index Cond: ((ts >= '2008-11-27 00:00:00'::timestamp without time zone) AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone))
 
                    ->  Bitmap Index Scan on idx_journal_200812  (cost= 0 . 00 .. 9 . 70  rows= 144  width= 0 ) (actual time= 0 . 273 .. 0 . 273  rows= 658  loops= 1 )
 
                          Index Cond: ((ts >= '2008-12-08 15:00:00'::timestamp without time zone) AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone))
 
        ->  Bitmap Heap Scan on journal_200811 journal  (cost= 54 . 50 .. 408 . 14  rows= 1332  width= 16 ) (actual time= 0 . 356 .. 0 . 956  rows= 628  loops= 1 )
 
              Recheck Cond: (((ts >= '2008-11-27 00:00:00'::timestamp without time zone) AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone)) OR ((ts >= '2008-12-08 15:00:00'::timestamp without time zone) AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone)))
 
              ->  BitmapOr  (cost= 54 . 50 .. 54 . 50  rows= 1332  width= 0 ) (actual time= 0 . 338 .. 0 . 338  rows= 0  loops= 1 )
 
                    ->  Bitmap Index Scan on idx_journal_200811  (cost= 0 . 00 .. 49 . 57  rows= 1332  width= 0 ) (actual time= 0 . 310 .. 0 . 310  rows= 628  loops= 1 )
 
                          Index Cond: ((ts >= '2008-11-27 00:00:00'::timestamp without time zone) AND (ts <= '2008-11-28 16:00:00'::timestamp without time zone))
 
                    ->  Bitmap Index Scan on idx_journal_200811  (cost= 0 . 00 .. 4 . 26  rows= 1  width= 0 ) (actual time= 0 . 021 .. 0 . 021  rows= 0  loops= 1 )
 
                          Index Cond: ((ts >= '2008-12-08 15:00:00'::timestamp without time zone) AND (ts <= '2008-12-08 16:00:00'::timestamp without time zone))
 

из этого плана напрашивается вопрос. Какого планер для каждой партиции смотрит оба индекса?

Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
Partitioning (8.3.4) непонятки с индексами
    #35702408
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ss25
Вопрос почему делается последовательное сканирование по journal_200812 если по ней есть индекс?

Код: plaintext
1.
2.
EXPLAIN ANALYZE SELECT host FROM trafic.journal 
WHERE (ts BETWEEN '2008-11-27 00:00:00' AND '2008-11-28 16:00:00') 
OR (ts BETWEEN '2008-12-06 00:00:00' AND '2008-12-08 16:00:00')
[src]
Потому что из неё выбирается существенная часть записей, очевидно. 9 тыщ из 14 тыщ возможных.
...
Рейтинг: 0 / 0
Partitioning (8.3.4) непонятки с индексами
    #35702416
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ss25,

Планировщик посчитал, что в таблице journal_200812 будет просканировано 8030 записей, при этом, всего в таблице 14000 записей (как вы сказали), то есть надо пробежать по индексам более половины записей, а потом еще зайти в саму таблицу и вернуть из нее некий host. Если таблица не сильно фрагментирована по диску, то дешевле просканировать саму таблицу.

В journal_200811 планировщик ожидает 1332 записи из 27000, поэтому считает, что выгодней по индексу вычислить все фрагменты таблицы, которые нужны для результата, прочитать эти фрагменты и найти в них все необходимое.

Примерно такая логика.
...
Рейтинг: 0 / 0
Partitioning (8.3.4) непонятки с индексами
    #35702434
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ss25
из этого плана напрашивается вопрос. Какого планер для каждой партиции смотрит оба индекса?

© Lister the Tormentor
Один индекс. Но 2 условия. Если у вас индекс условный, то на этапе планирования запроса одно из условий обрежется.
Проверьте, что индекс у вас условный, как и в доке.
...
Рейтинг: 0 / 0
Partitioning (8.3.4) непонятки с индексами
    #35703428
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
индексы у меня на таблицах указаны в первом посте.
...
Рейтинг: 0 / 0
Partitioning (8.3.4) непонятки с индексами
    #35704303
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ss25индексы у меня на таблицах указаны в первом посте.
Там указан не условный индекс. Создайте индекс с условием, соответствующим данной таблице.
...
Рейтинг: 0 / 0
Partitioning (8.3.4) непонятки с индексами
    #35711946
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kruchinin Pahan, индекс очень даже условный - в селекте используется первое поле из индекса, а следовательно индекс замечательно будет использоваться ( если планер захочет ) ( что, собственно, видно из второго эксплейна ).
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Partitioning (8.3.4) непонятки с индексами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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