LINUX.ORG.RU
ФорумAdmin

postgresql


0

0

Есть в сабже вот такая табличка для сохранения сквидовских логов (очень много записей):
CREATE TABLE logger (
    date date,
    "time" time without time zone,
    elapsed numeric(10,0),
    code smallint,
    status numeric(3,0),
    bytes bigint,
    url character(255),
    host inet
);
Индексы есть:
CREATE INDEX idx_date ON logger USING btree (date);
CREATE INDEX idx_host ON logger USING btree (host);

Запрос "select date from logger group by date order by date desc"
выполняется очень медленно. Подскажите как можно ускорить выборку?
vacuumdb -z делаю каждый день.
anonymous

0. с индексами вроде все ок

1. Запость результат EXPLAIN, может оно быстрее и не может быть?

2. постгреса нет под рукой, вслепую: select distinct date from logger order by date desc - это быстрее проходит?

3. Тебе точно *все* даты нужны? может WHERE какое-нибудь добавить?

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

1. С explain:

QUERY PLAN

Sort  (cost=69100.18..69100.27 rows=38 width=4)

  Sort Key: date

  ->  HashAggregate  (cost=69098.80..69099.18 rows=38 width=4)

        ->  Seq Scan on logger  (cost=0.00..66012.84 rows=123438 width=4)

2.непомогло

3. А как мне ещё вывести список дат для вывода отчета?

anonymous
()
Ответ на: комментарий от LifeWins

Group (cost=0.00..89455.72 rows=38 width=4)

-> Index Scan Backward using idx_date on logger (cost=0.00..86369.53 rows=1234476 width=4)

anonymous
()
Ответ на: комментарий от anonymous

хм, чего-то индекс не использует..


123438/38 = 3248 записей в день. В боевых условиях тоже много записей 
будет? Если да, то не пойти ли с другой стороны:

create table dates(xdate date);
-- вставляем в таблицу даты, 365 штук/год можно лет на 10 вперед вставить.

select xdate from dates where xdate < today() and xdate in (select date from logger);

За год, такой запрос пробежит 300 записей в dates (быстро), и 300 раз заглянет в idx_date... что должно быть быстрее чем то, что у тебя сейчас...

gods-little-toy ★★★
()

<флейм>

Переключайся на MySQL! Там это оптимизировано! Смотри, твоя таблица (забил левых данных):

mysql> select count(*) from logger;
+----------+
| count(*) |
+----------+
|   234256 | 
+----------+
1 row in set (0.00 sec)

Оно собирается "прыгать" по индексу: 

mysql> explain select distinct xdate from logger order by xdate desc\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: logger
         type: range
possible_keys: NULL
          key: xdate
      key_len: 4
          ref: NULL
         rows: 23
        Extra: Using index for group-by; Using temporary; Using filesort
1 row in set (0.00 sec)

И это очень быстро:
mysql> select distinct xdate from logger order by xdate desc\G
...
22 rows in set (0.00 sec)

</флейм>

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

Интересный способ. Спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.