Re: Поиск ближайшего - Mailing list pgsql-ru-general

From Evgeny M. Baldin
Subject Re: Поиск ближайшего
Date
Msg-id Pine.LNX.4.58.0504062006120.31034@star.inp.nsk.su
Whole thread Raw
In response to Re: Поиск ближайшего  (Oleg Bartunov <oleg@sai.msu.su>)
List pgsql-ru-general
Добрый день

On Wed, 6 Apr 2005, Oleg Bartunov wrote:

> а ты vacuum analyze давно делал ? Похоже, что здесь у тебя проблемы.
> rows=82047 - это то, что планнер оценивает исходя из pg_stats,
> а получает реально - rows=2 ! Ну куда это годится :)
> Либо у тебя распределение сильно неправильное, что обычная гисторграмма на
> 10 бинов недостаточна (тогда надо увеличивать количесвто), либо элементарно
> не делал vacuum analyze;

Что за гистограммы и что надо с ними делать?

vacuum analyze делается раз в сутки вместе с бэкапом

строчка в crontab:

00 3 * * * vacuumdb -a -z  ; /volume/3/var_lib_pgsql/bin/dumpdb.pl

Делать vacuum analyze чаще чем раз в сутки не реально - машина слабая, а
база используется довольно активно. Не сменили её по причине
исключительной стабильности конкретной машины (последняя пара попыток
закончилась крахом - так что теперь на воду дуем).

Я попробовал сделать VACUUM ANALYZE руками, но не сработало. Повторный
запуск прошёл быстрее, но это потому что всё в кэш закачалось, так как
после обращения к другим таблицам при обращении к исследуемой результаты
остались те, что я привёл.

А, кажется нашёл: тест на равенство я делал сразу после неравенства, то
есть данные уже были в кэше, ежели обратиться к той таблице, к которой не
обращался, то вообще ужас получается

calibrations=# EXPLAIN ANALYZE select begintime from kelktemp_key where
begintime='yesterday' order by begintime limit 1;
                                                                   QUERY
PLAN

------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..5.80 rows=1 width=8) (actual time=525.04..525.04
rows=0 loops=1)
   ->  Index Scan using kelktemp_key_time_ver_key on kelktemp_key
(cost=0.00..5.80 rows=1 width=8) (actual time=525.02..525.02 rows=0
loops=1)
         Index Cond: (begintime = '2005-04-05 00:00:00+07'::timestamp with
time zone)
 Total runtime: 525.30 msec
                -----
(записей: 4)

> > Видно, что отличие в 30 раз (50 мс против 1.3 мс) - хотелось бы это как-то
> > ликвидировать. Странно, что ничего подобного мне обнаружить не удалось -
> > вроде поиск по времени вполне распространённая задача.
>
> Если интересно, какие ключевые слова вы использовали и где ?

по сайту PostgreSQL, слова сейчас даже и не вспомню - что-то вроде time
interval. Изначально идея была основываться на временных интервалах - то
есть каждая запись имеет BeginTime и EndTime - но проблемы с поиском
перекрытий, а так же отсутствие реальной необходимости трансформировали
всё к ключу по одному времени.

> как совет на будущее, использовать явный cast
>
>   'yesterday'::timestamp with time zone;
>
> планнер, конечно, все понял, но иногда могут быть проблемы

В программе так и делаю, а прилагаемый select был просто набран для
примера, поэтому явного каста писать не стал. Кстати, замечено, что если
указать просто timestamp без timezone, то наступают вилы - видимо, это
чем-то объясняется, хотя странно - и там и сям время.

С уважением
    Евгений

P.S. Странно, что max и min сканируют всю таблицу как любые агрегатные
функции - причина понятна, но конкретно эти функции можно было вполне
сделать и поинтеллектуальнее. Я так понял, что не я один на эти грабли
наступил.

P.P.S. На сколько 8 с копейками стабильно по сравнению с 7.3.4 например
для тех же задач?

pgsql-ru-general by date:

Previous
From: Teodor Sigaev
Date:
Subject: Re: Поиск ближ
Next
From: "Evgeny M. Baldin"
Date:
Subject: Re: Поиск ближайшего