Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / "Магическое" число 258, INDEXы & VACUUM / 6 сообщений из 6, страница 1 из 1
17.06.2006, 20:22
    #33797609
R9
R9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Магическое" число 258, INDEXы & VACUUM
Кто знает, что происходит с индексами после 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
17.06.2006, 21:56
    #33797668
landy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Магическое" число 258, INDEXы & VACUUM
А зачем пользовать индекс, если все данные в кэше?
Иногда быстрее их там найти, чем искать сначала в индексе, а потом еще раз в таблице
...
Рейтинг: 0 / 0
17.06.2006, 22:27
    #33797706
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Магическое" число 258, INDEXы & VACUUM
Оптимизатор небезосновательно считает что есть масса ситуаций когда
использование индексов нецелесообразно. 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
17.06.2006, 23:08
    #33797732
R9
R9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Магическое" число 258, INDEXы & VACUUM
Самое интересное что до VACUUM или REINDEX TABLE
оптимизатор использует индексы в условиях,
даже когда в таблице всего одна строка!!! :)
...
Рейтинг: 0 / 0
18.06.2006, 01:20
    #33797793
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Магическое" число 258, INDEXы & VACUUM
Почитайте про VACUUM ANALYZE{ VACUUM FULL} что эти комманды делают со статистикой необходимой для планировщика.
...
Рейтинг: 0 / 0
18.06.2006, 10:20
    #33797881
R9
R9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Магическое" число 258, INDEXы & VACUUM
ShweikПочитайте про VACUUM ANALYZE{ VACUUM FULL} что эти комманды делают со статистикой необходимой для планировщика.
Да-да, я читал, я вкурсе что делают эти команды.
Но получается даже VACUUM а не VACUUM ANALYZE влияет на статистику, и после него не используются индексы в таблицах до 258 строк.

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


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