powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Из-за чего такие тормоза
14 сообщений из 14, страница 1 из 1
Из-за чего такие тормоза
    #33808609
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 EXPLAIN ANALYZE SELECT bytes/ 1024 / 1024 ,to_char(second,'HH24:MI:SS'),to_char(first,'HH24:MI:SS'),dest from iptables,net_addr where net_addr.id='1888' and net_addr.ip=iptables.dest and to_char(second,'YYYY-MM-DD')='2006-05-18' order by second;
                                                                 QUERY PLAN                                                                 
---------------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost= 68771 . 63 .. 68771 . 81  rows= 73  width= 35 ) (actual time= 8561 . 915 .. 8561 . 927  rows= 24  loops= 1 )
   Sort Key: iptables."second"
   ->  Nested Loop  (cost= 0 . 00 .. 68769 . 37  rows= 73  width= 35 ) (actual time= 8 . 239 .. 8561 . 857  rows= 24  loops= 1 )
         ->  Index Scan using idx_net_addr_id on net_addr  (cost= 0 . 00 .. 4 . 89  rows= 2  width= 11 ) (actual time= 0 . 023 .. 0 . 027  rows= 1  loops= 1 )
               Index Cond: (id =  1888 )
         ->  Index Scan using idx_ipt_dest on iptables  (cost= 0 . 00 .. 34381 . 31  rows= 45  width= 35 ) (actual time= 8 . 181 .. 8561 . 506  rows= 24  loops= 1 )
               Index Cond: ("outer".ip = iptables.dest)
               Filter: (to_char("second", 'YYYY-MM-DD'::text) = '2006-05-18'::text)
 Total runtime:  8562 . 073  ms
(çàïèñåé:  9 )
Почему так медленно выполняется запрос?
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33808806
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из-за того, что условие "Filter: (to_char("second", 'YYYY-MM-DD'::text) = '2006-05-18'::text)" проверяется фильтрацией, а не поиском по индексу. Надо, чтобы использовался индекс по комбинации полей dest, second.
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33808882
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Индекс по ("second",dest) есть,но он не используется. А индекс с to_char не создается.
CREATE INDEX idx_iptables_MMDD_dest ON iptables(to_char(second,'MM-DD'),dest);
ERROR: functions in index expression must be marked IMMUTABLE
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33809308
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
to_char(second,'YYYY-MM-DD')='2006-05-18'
=>
Код: plaintext
second=to_timestamp('2006-05-18', 'yyyy-mm-dd')
?
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33809890
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXPLAIN SELECT bytes/ 1024 / 1024 ,to_char(second,'HH24:MI:SS'),to_char(first,'HH24:MI:SS'),dest from iptables,net_addr where net_addr.id='1888' and net_addr.ip=iptables.dest and to_timestamp(second,'YYYY-MM-DD')::timestamp without time zone=to_timestamp('2006-05-18 00:00:00','YYYY-MM-DD')::timestamp without time zone order by second;
                                                                                                QUERY PLAN                                  
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost= 69064 . 26 .. 69064 . 44  rows= 73  width= 35 )
   Sort Key: iptables."second"
   ->  Nested Loop  (cost= 0 . 00 .. 69062 . 00  rows= 73  width= 35 )
         ->  Index Scan using idx_net_addr_id on net_addr  (cost= 0 . 00 .. 4 . 89  rows= 2  width= 11 )
               Index Cond: (id =  1888 )
         ->  Index Scan using idx_ipt_dest on iptables  (cost= 0 . 00 .. 34527 . 62  rows= 45  width= 35 )
               Index Cond: ("outer".ip = iptables.dest)
               Filter: ((to_timestamp(("second")::text, 'YYYY-MM-DD'::text))::timestamp without time zone = (to_timestamp('2006-05-18 00:00:00'::text, 'YYYY-MM-DD'::text))::timestamp without time zone)
(çàïèñåé:  8 )


to_timestamp(second,'YYYY-MM-DD')::timestamp without time zone=to_timestamp('2006-05-18 00:00:00','YYYY-MM-DD')::timestamp without time zone ,если не писать это,то возвращает 0 строк,но время оч малое (быстро выполняется).
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33809894
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EXPLAIN SELECT bytes/1024/1024,to_char(second,'HH24:MI:SS'),to_char(first,'HH24:MI:SS'),dest from iptables,net_addr where net_addr.id='1888' and net_addr.ip=iptables.dest and second=to_timestamp('2006-05-18 00:00:00','YYYY-MM-DD')::timestamp without time zone order by second;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=22.56..22.57 rows=4 width=35)
Sort Key: iptables."second"
-> Nested Loop (cost=0.00..22.52 rows=4 width=35)
-> Index Scan using idx_net_addr_id on net_addr (cost=0.00..4.89 rows=2 width=11)
Index Cond: (id = 1888)
-> Index Scan using iptables_idx_day_dest2 on iptables (cost=0.00..8.77 rows=2 width=35)
Index Cond: ((iptables."second" = (to_timestamp('2006-05-18 00:00:00'::text, 'YYYY-MM-DD'::text))::timestamp without time zone) AND ("outer".ip = iptables.dest))
(çàïèñåé: 7)
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33809960
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
CREATE INDEX idx ON iptables(to_date(second,'YYYY-MM-DD'));
ERROR:  functions in index expression must be marked IMMUTABLE
Как создать такой индекс?
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33810567
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поле second какого типа?
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33810633
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
posttEXPLAIN SELECT bytes/1024/1024,to_char(second,'HH24:MI:SS'),to_char(first,'HH24:MI:SS'),dest from iptables,net_addr where net_addr.id='1888' and net_addr.ip=iptables.dest and second=to_timestamp('2006-05-18 00:00:00','YYYY-MM-DD')::timestamp without time zone order by second;попробуйте second
between to_timestamp('2006-05-18 00:00:00','YYYY-MM-DD')::timestamp without time zone
and to_timestamp('2006-05-19 00:00:00','YYYY-MM-DD')::timestamp without time zone
при наличии индекса (dest,second)

postt
Код: plaintext
1.
CREATE INDEX idx ON iptables(to_date(second,'YYYY-MM-DD'));
ERROR:  functions in index expression must be marked IMMUTABLE
Как создать такой индекс? http://www.postgresql.org/docs/8.1/static/sql-createfunction.html
см. IMMUTABLE

st_sergПоле second какого типа?timestamp without time zone
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33810666
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если timestamp without time zone, то создавай по date_trunc('day', second) и в запросе: date_trunc('day', second) = '2006-05-18'

или даже лучше по second::date и в запросе second::date = '2006-05-18'
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33810701
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант использовать индекс по функции date_trunc(), хотя, думаю, что between всеже лучше будет использовать, если в таблицу часто вставляются данные (не надо будет поддерживать индекс по функции).

Только вот правильно ли between использовать?.. хз может лучше
Код: plaintext
1.
2.
second >= to_timestamp('2006-05-18 00:00:00', 'YYYY-MM-DD')::timestamp without time zone
and second < to_timestamp('2006-05-19 00:00:00', 'YYYY-MM-DD')::timestamp without time zone
т.е. интервал времени от 2006-05-18 00:00:00 до 2006-05-18 23:59:59 включительно
или between
Код: plaintext
1.
2.
second between to_timestamp('2006-05-18 00:00:00', 'YYYY-MM-DD')::timestamp without time zone
and (to_timestamp('2006-05-19 00:00:00', 'YYYY-MM-DD') - interval '1 second')::timestamp without time zone
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33810843
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
second имеет тип timestamp whith out timezone.
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33812560
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_serg
Код: plaintext
1.
second between to_timestamp('2006-05-18 00:00:00', 'YYYY-MM-DD')::timestamp without time zone
and (to_timestamp('2006-05-19 00:00:00', 'YYYY-MM-DD') - interval '1 second')::timestamp without time zone


Зафиг столько to_timestamp ?
У меня second between '2006-05-18' and '2006-05-19' катят.
...
Рейтинг: 0 / 0
Из-за чего такие тормоза
    #33815926
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да так... несовсем приятный опыт неявных преобразований...
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Из-за чего такие тормоза
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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