Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / индекс на TIMESTAMPTZ и оператор < (меньше) / 2 сообщений из 2, страница 1 из 1
25.07.2014, 14:57:13
    #38706034
kkv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
индекс на TIMESTAMPTZ и оператор < (меньше)
хочу чистить большую таблицу примерно так
Код: sql
1.
delete from big_table where date_create<now()-interval '3 day'



создал индекс
Код: sql
1.
2.
3.
4.
CREATE INDEX big_table_idx1
  ON big_table 
  USING btree
  (date_create);



но
Код: sql
1.
2.
explain analyze
select count(1) from big_table where date_create<now()-interval '3 day'


выдало вот такое время

Код: plaintext
1.
2.
3.
Aggregate  (cost=844019.38..844019.39 rows=1 width=0) (actual time=39854.121..39854.121 rows=1 loops=1)
  ->  Seq Scan on big_table (cost=0.00..784462.93 rows=23822579 width=0) (actual time=22017.948..39852.223 rows=8211 loops=1)
        Filter: (date_create< (now() - '3 days'::interval))
Total runtime: 39854.158 ms

т.е. индекс не сработал на оператор < (меньше)
а вот на равенство работает отлично.

как быть?
...
Рейтинг: 0 / 0
25.07.2014, 15:08:44
    #38706059
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
индекс на TIMESTAMPTZ и оператор < (меньше)
kkv79хочу чистить большую таблицу примерно так
Код: sql
1.
delete from big_table where date_create<now()-interval '3 day'



создал индекс
Код: sql
1.
2.
3.
4.
CREATE INDEX big_table_idx1
  ON big_table 
  USING btree
  (date_create);



но
Код: sql
1.
2.
explain analyze
select count(1) from big_table where date_create<now()-interval '3 day'


выдало вот такое время

Код: plaintext
1.
2.
3.
Aggregate  (cost=844019.38..844019.39 rows=1 width=0) (actual time=39854.121..39854.121 rows=1 loops=1)
  ->  Seq Scan on big_table (cost=0.00..784462.93 rows=23822579 width=0) (actual time=22017.948..39852.223 rows=8211 loops=1)
        Filter: (date_create< (now() - '3 days'::interval))
Total runtime: 39854.158 ms

т.е. индекс не сработал на оператор < (меньше)
а вот на равенство работает отлично.

как быть?

а с чего бы ему срабатывать?
SEQ SCAN если запрос дергает больше 10% строк - всегда быстрее чем index scan
а база считает что у вас под условие попадает 23822579 строк...

попробуйте analyze big_table; сделать для начала
странно что настолько реальность и то что база считает различаются...
autovacuum у вас чтоли отключен или не успевает?

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / индекс на TIMESTAMPTZ и оператор < (меньше) / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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