powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / "Магическое" число 258, INDEXы & VACUUM
6 сообщений из 6, страница 1 из 1
"Магическое" число 258, INDEXы & VACUUM
    #33797609
R9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
R9
Гость
Кто знает, что происходит с индексами после VACUUM ???
У меня после VACUUM перестают работать индексы, если строк в таблице меньше 258 штук!!!

Вот тест-пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- Функция-генератор нужного количества строк
CREATE OR REPLACE FUNCTION insert_data() RETURNS void AS $$
BEGIN
    FOR i IN  1 .. 257  LOOP
        INSERT INTO ttt (a) VALUES ( 9999 );
    END LOOP;
END;
$$ LANGUAGE plpgsql;

DROP TABLE ttt;
CREATE TABLE ttt (id serial PRIMARY KEY, a int4);
-- Генерим строки
SELECT insert_data();

VACUUM ttt;
-- REINDEX TABLE ttt;

EXPLAIN SELECT * FROM ttt WHERE id =  2 ;
EXPLAIN выдает что использовался "Seq Scan" вместо "Index Scan" !!!
Тоже самое происходит и после REINDEX TABLE.

НО! Если строк >= 258 то после VACUUM или REINDEX TABLE
в WHERE используется индекс !!!

Что это, такой "оптимизатор"/planner? или у меня глюки?
...
Рейтинг: 0 / 0
"Магическое" число 258, INDEXы & VACUUM
    #33797668
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем пользовать индекс, если все данные в кэше?
Иногда быстрее их там найти, чем искать сначала в индексе, а потом еще раз в таблице
...
Рейтинг: 0 / 0
"Магическое" число 258, INDEXы & VACUUM
    #33797706
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизатор небезосновательно считает что есть масса ситуаций когда
использование индексов нецелесообразно. Seq scan будет дешевле на практике и при rowcount>258. Ничего магического :-) Схожие проблемы обсуждались уже давно
тут
Были правда ситуации действительно странные

Кстати если в Вашем примере сделать таблицу побольше оптимизатор задействует индексы как и ожидалось :
Код: 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.
tst1=# EXPLAIN ANALYZE select a from ttt where id < 120 ;
                                                         QUERY PLAN

--------------------------------------------------------------------------------
---------------------------------------------
 Bitmap Heap Scan on ttt  (cost= 21830 . 67 .. 112517 . 33  rows= 3333333  width= 4 ) (actua
l time= 0 . 035 .. 0 . 266  rows= 119  loops= 1 )
   Recheck Cond: (id <  120 )
   ->  Bitmap Index Scan on ttt_pkey  (cost= 0 . 00 .. 21830 . 67  rows= 3333333  width= 0 )
 (actual time= 0 . 028 .. 0 . 028  rows= 119  loops= 1 )
         Index Cond: (id <  120 )
 Total runtime:  0 . 505  ms
( 5  rows)

tst1=# EXPLAIN ANALYZE select a from ttt where id < 12000 ;
                                                          QUERY PLAN

--------------------------------------------------------------------------------
-----------------------------------------------
 Bitmap Heap Scan on ttt  (cost= 21830 . 67 .. 112517 . 33  rows= 3333333  width= 4 ) (actua
l time= 3 . 254 .. 29 . 399  rows= 11999  loops= 1 )
   Recheck Cond: (id <  12000 )
   ->  Bitmap Index Scan on ttt_pkey  (cost= 0 . 00 .. 21830 . 67  rows= 3333333  width= 0 )
 (actual time= 3 . 229 .. 3 . 229  rows= 11999  loops= 1 )
         Index Cond: (id <  12000 )
 Total runtime:  50 . 066  ms
( 5  rows)

tst1=# EXPLAIN ANALYZE select a from ttt where id < 12000 ;


Кстати по поводу старых обсуждений - агрегатные функции в PG 8.x.x уже не препятствие для использования индексов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
tst1=# EXPLAIN select count(*) from ttt where id > 100 ;
                                      QUERY PLAN
---------------------------------------------------------------------------------------
 Aggregate  (cost= 120850 . 66 .. 120850 . 67  rows= 1  width= 0 )
   ->  Bitmap Heap Scan on ttt  (cost= 21830 . 67 .. 112517 . 33  rows= 3333333  width= 0 )
         Recheck Cond: (id >  100 )
         ->  Bitmap Index Scan on ttt_pkey  (cost= 0 . 00 .. 21830 . 67  rows= 3333333  width= 0 )
               Index Cond: (id >  100 )
( 5  rows)

tst1=# EXPLAIN select count(*) from ttt where id = 100 ;
                                QUERY PLAN
--------------------------------------------------------------------------
 Aggregate  (cost= 6 . 02 .. 6 . 03  rows= 1  width= 0 )
   ->  Index Scan using ttt_pkey on ttt  (cost= 0 . 00 .. 6 . 01  rows= 1  width= 0 )
         Index Cond: (id =  100 )
( 3  rows)

...
Рейтинг: 0 / 0
"Магическое" число 258, INDEXы & VACUUM
    #33797732
R9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
R9
Гость
Самое интересное что до VACUUM или REINDEX TABLE
оптимизатор использует индексы в условиях,
даже когда в таблице всего одна строка!!! :)
...
Рейтинг: 0 / 0
"Магическое" число 258, INDEXы & VACUUM
    #33797793
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте про VACUUM ANALYZE{ VACUUM FULL} что эти комманды делают со статистикой необходимой для планировщика.
...
Рейтинг: 0 / 0
"Магическое" число 258, INDEXы & VACUUM
    #33797881
R9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
R9
Гость
ShweikПочитайте про VACUUM ANALYZE{ VACUUM FULL} что эти комманды делают со статистикой необходимой для планировщика.
Да-да, я читал, я вкурсе что делают эти команды.
Но получается даже VACUUM а не VACUUM ANALYZE влияет на статистику, и после него не используются индексы в таблицах до 258 строк.

Вообще ноль пролем, просто писал запрос и тестировал его когда в таблице было мало строк, заметил что после VACUUM перестали работать индексы в выражениях WHERE, испугался :) ведь в будущем строк будет в сотни тысяч раз больше.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / "Магическое" число 258, INDEXы & VACUUM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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