powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка по времени
5 сообщений из 5, страница 1 из 1
Выборка по времени
    #34071529
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
\d iptables
                                              Table "public.iptables"
   Column    |            Type             |                               Modifiers
-------------+-----------------------------+------------------------------------------------------------------------
 id_iptables | integer                     | not null default nextval(('iptables_id_iptables_seq'::text)::regclass)
 bytes       | double precision            |
 prot        | text                        |
 source      | inet                        |
 dest        | inet                        |
 second      | timestamp without time zone |
 first       | timestamp without time zone |
 file        | integer                     |
 type        | integer                     |
Indexes:
    "iptables_pkey" PRIMARY KEY, btree (id_iptables)
    "idx_second" btree ("second")
    "iptables_ix_day_dest" btree (date_trunc('day'::text, "second"), dest)
    "iptables_ix_day_source" btree (date_trunc('day'::text, "second"), source)

Из нее нужно получить данные за определенный период времени отдельно за ночной и дневной период времени.
Запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN SELECT sum(bytes)/ 1024 / 1024  AS bytes FROM iptables WHERE  second>= '2006-10-01 00:00:00' and ( second <= '2006-10-21 00:00:00') and to_char(second,'HH24,MI,SS')>='07:00:00' and to_char(second,'HH24,MI,SS')<='24:00:00' and dest='192.168.1.32';
                                                                                     QUERY PLAN                                             
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost= 55448 . 17 .. 55448 . 19  rows= 1  width= 8 )
   ->  Index Scan using idx_second on iptables  (cost= 0 . 00 .. 55448 . 16  rows= 3  width= 8 )
         Index Cond: (("second" >= '2006-10-01 00:00:00'::timestamp without time zone) AND ("second" <= '2006-10-21 00:00:00'::timestamp without time zone))
         Filter: ((to_char("second", 'HH24,MI,SS'::text) >= '07:00:00'::text) AND (to_char("second", 'HH24,MI,SS'::text) <= '24:00:00'::text) AND (dest = '192.168.1.32'::inet))
( 4  rows)
работает слишком медленно (несколько секунд). Как оптимизировать таблицу и запрос?
Стоит ли удалить поле id_iptables PRIMARY KEY, насколько сильно он тормозит работу?
...
Рейтинг: 0 / 0
Выборка по времени
    #34072114
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
  SELECT sum(bytes) FROM iptables WHERE  second>= '2006-10-01 07:00:00' 
          AND second <= '2006-10-21 24:00:00' 
          AND dest='192.168.1.32';
to_char не понятно зачем и с идексами что-то у вас вообще не понятное :-)
...
Рейтинг: 0 / 0
Выборка по времени
    #34072261
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jelis
Код: plaintext
1.
2.
3.
  SELECT sum(bytes) FROM iptables WHERE  second>= '2006-10-01 07:00:00' 
          AND second <= '2006-10-21 24:00:00' 
          AND dest='192.168.1.32';
to_char не понятно зачем и с идексами что-то у вас вообще не понятное :-)
Этот запрос делает не то, что нужно. Нужно разделить ночной и дневной трафик, а не просто выдать трафик за все часы в указанном интервале.
Отчет должен вернуть:
Наработка за месяц с 00:00 по 07:00
Наработка за месяц с 07:00 по 24:00
Нужен для расчета ночных скидок.
...
Рейтинг: 0 / 0
Выборка по времени
    #34072278
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аааа.... вот к чему у вас эти пляски с to_char! :-)
Тогда лучше используйте EXTRACT(field FROM source)

Код: plaintext
1.
2.
3.
4.
5.
  SELECT sum(bytes) FROM iptables WHERE  second>= '2006-10-01' 
          AND second < '2006-10-31'::timestamp + '1 day':interval 
          AND extract('hour' from second) >=  7  
          AND extract('hour' from second) <  24  
          AND dest='192.168.1.32';

И индексы по second и по extract('hour' from second) (даже можно попробовать это к integer приводить, поскольку екстракт, вроде, double возвращает)
'2006-10-31'::timestamp + '1 day':interval это к тому, что для timestamp'ов
'2006-10-31 15:24:32' <= '2006-10-31' будет false, так как '2006-10-31' это на самом деле '2006-10-31 00:00:00'. Тут, так же можете попробывать преобразовывать second к date, делать по этому индекс,и делать соответствующим образом проверки, что бы этот индекс использовался.
...
Рейтинг: 0 / 0
Выборка по времени
    #34073059
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postt
Код: plaintext
1.
2.
3.
4.
5.
WHERE
 second>='2006-10-01 00:00:00' and
 second<='2006-10-21 00:00:00' and
 to_char(second,'HH24,MI,SS')>='07:00:00' and
 to_char(second,'HH24,MI,SS')<='24:00:00' and
 dest='192.168.1.32'
Как оптимизировать таблицу и запрос?Создайте индекс (dest, second).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка по времени
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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