powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
14 сообщений из 14, страница 1 из 1
Оптимизация запроса
    #33583623
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно оптимизировать запрос???

EXPLAIN ANALYZE SELECT sum(bytes/1024/1024),source,dest,to_char(date_second,'DD'),name FROM iptables,net_addr,clients2 WHERE ((net_addr.ip=iptables.source and clients2.id=net_addr.id) or (net_addr.ip=iptables.dest and clients2.id=net_addr.id)) and source='192.168.244.132' GROUP BY dest,source,name,date_second ORDER BY name,date_second;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=19768.46..19768.47 rows=1 width=50) (actual time=1624.499..1624.518 rows=29 loops=1)
Sort Key: clients2.name, iptables.date_second
-> HashAggregate (cost=19768.44..19768.45 rows=1 width=50) (actual time=1623.808..1624.088 rows=29 loops=1)
-> Hash Join (cost=37.48..19768.43 rows=1 width=50) (actual time=5.690..1612.697 rows=686 loops=1)
Hash Cond: ("outer".id = "inner".id)
Join Filter: ((("inner".id = "outer".id) OR ("outer".ip = "outer".source)) AND (("outer".ip = "outer".dest) OR ("inner".id = "outer".id)))
-> Nested Loop (cost=18.84..19711.19 rows=1544 width=49) (actual time=3.495..1603.445 rows=686 loops=1)
Join Filter: (("inner".ip = "outer".dest) OR ("inner".ip = "outer".source))
-> Index Scan using idx_ipt_src on iptables (cost=0.00..2785.85 rows=765 width=34) (actual time=0.034..8.134 rows=686 loops=1)
Index Cond: (source = '192.168.244.132'::inet)
-> Materialize (cost=18.84..27.68 rows=884 width=15) (actual time=0.001..0.672 rows=884 loops=686)
-> Seq Scan on net_addr (cost=0.00..18.84 rows=884 width=15) (actual time=0.005..1.473 rows=884 loops=1)
-> Hash (cost=16.71..16.71 rows=771 width=20) (actual time=2.165..2.165 rows=0 loops=1)
-> Seq Scan on clients2 (cost=0.00..16.71 rows=771 width=20) (actual time=0.011..1.312 rows=771 loops=1)
Total runtime: 1624.798 ms
(15 rows)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33584297
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведи create table и create index для таблиц из запроса
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33584310
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\d iptables
Table "public.iptables"
Column | Type | Modifiers
-------------+------------------------+------------------------------------------------------------
id_iptables | integer | not null default nextval('iptables_id_iptables_seq'::text)
bytes | double precision |
prot | text |
source | inet |
dest | inet |
date_second | date |
time_second | time without time zone |
date_first | date |
time_first | time without time zone |
Indexes:
"iptables_pkey" primary key, btree (id_iptables)
"idx_ipt_dest" btree (dest)
"idx_ipt_src" btree (source)

\d net_addr
Table "public.net_addr"
Column | Type | Modifiers
----------------+---------+------------------------------------------------------------
id_net_addr | integer | not null default nextval('net_addr_id_net_addr_seq'::text)
id | integer | not null
id_uzl | integer |
ip | inet | not null
gw | inet |
mac | macaddr |
addr_rasp | integer |
kv_rasp | text |
addr_d_cl_rasp | integer |


\d clients2
Table "public.clients2"
Column | Type | Modifiers
--------+---------+---------------------------------------------------
id | integer | not null default nextval('clients2_id_seq'::text)
type | text | not null
name | text | not null
tel | text |
status | text |
Indexes:
"clients2_pkey" primary key, btree (id)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33584319
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Индексы типа CREATE INDEX idx ON table(column)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33584780
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовать изменить запрос на:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT sum(bytes/ 1024 / 1024 ),source,dest,to_char(date_second,'DD'),name
FROM iptables,net_addr,clients2 
WHERE 
  ((net_addr.ip='192.168.244.132'::inet or net_addr.ip=iptables.dest) and
   (and clients2.id=net_addr.id)) 
  and iptables.source='192.168.244.132'::inet 
GROUP BY dest,source,name,date_second
ORDER BY name,date_second;

построить индекс iptables(source, dest)

использовать явное приведение iptables.source='192.168.244.132'::inet, если версия меньше 8.0
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33586042
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте построить индекс по net_addr.ip
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33594196
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EXPLAIN ANALYZE SELECT sum(bytes/1024/1024),source,dest,date_trunc('day',second),name FROM iptables,net_addr,clients2 WHERE ((net_addr.ip=iptables.dest) and(clients2.id=net_addr.id)) GROUP BY dest,source,name,date_trunc('day',second) ORDER BY name,date_trunc('day',second);
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=23395.40..23408.79 rows=5356 width=54) (actual time=98876.160..98922.299 rows=36694 loops=1)
Sort Key: clients2.name, date_trunc('day'::text, iptables."second")
-> GroupAggregate (cost=22929.78..23063.68 rows=5356 width=54) (actual time=90269.036..96966.828 rows=36694 loops=1)
-> Sort (cost=22929.78..22943.17 rows=5356 width=54) (actual time=90268.712..91495.366 rows=886844 loops=1)
Sort Key: iptables.dest, iptables.source, clients2.name, date_trunc('day'::text, iptables."second")
-> Nested Loop (cost=18.64..22598.06 rows=5356 width=54) (actual time=42.106..19939.427 rows=886844 loops=1)
-> Hash Join (cost=18.64..50.74 rows=884 width=27) (actual time=2.247..15.285 rows=876 loops=1)
Hash Cond: ("outer".id = "inner".id)
-> Seq Scan on net_addr (cost=0.00..18.84 rows=884 width=15) (actual time=0.003..3.734 rows=884 loops=1)
-> Hash (cost=16.71..16.71 rows=771 width=20) (actual time=2.221..2.221 rows=0 loops=1)
-> Seq Scan on clients2 (cost=0.00..16.71 rows=771 width=20) (actual time=0.011..1.387 rows=771 loops=1)
-> Index Scan using idx_ipt_dest on iptables (cost=0.00..25.41 rows=6 width=38) (actual time=2.522..16.765 rows=1012 loops=876)
Index Cond: ("outer".ip = iptables.dest)
Total runtime: 98976.845 ms
(14 rows)
Что тут можно еще улучшить?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33594267
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если GROUP BY name,date_trunc('day',second),dest,source ORDER BY name,date_trunc('day',second);

А если построить индекс net_addr(ip, id) ?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33598465
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgresactual rows=36694Действительно ли необходим запрос, возвращающий десятки тысяч строк?

mxlPostgres -> GroupAggregate (cost=22929.78..23063.68 rows=5356 width=54) (actual time=90269.036..96966.828 rows=36694 loops=1)
-> Sort (cost=22929.78..22943.17 rows=5356 width=54) (actual time=90268.712..91495.366 rows=886844 loops=1)Попытаться сделать так, чтобы постгрес использовал здесь Hash Aggregate? (set enable_hashagg to on? set enable_sort to off?)

mxlPostgresGROUP BY dest,source,name,date_secondЗдесь группировка по clients2.name избыточна? То есть id уникален в clients2? И ip уникален в net_addr? Если да, то можно попробовать переформулировать запрос.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33599418
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat mxlPostgresactual rows=36694Действительно ли необходим запрос, возвращающий десятки тысяч строк?

mxlPostgres -> GroupAggregate (cost=22929.78..23063.68 rows=5356 width=54) (actual time=90269.036..96966.828 rows=36694 loops=1)
-> Sort (cost=22929.78..22943.17 rows=5356 width=54) (actual time=90268.712..91495.366 rows=886844 loops=1)Попытаться сделать так, чтобы постгрес использовал здесь Hash Aggregate? (set enable_hashagg to on? set enable_sort to off?)

mxlPostgresGROUP BY dest,source,name,date_secondЗдесь группировка по clients2.name избыточна? То есть id уникален в clients2? И ip уникален в net_addr? Если да, то можно попробовать переформулировать запрос.
Поле clients2.id уникально-это PRIMARY KEY,net_addr.ip тоже не повторяются.
Запрос нужен,так как это суммарная статистика по дням за месяц достаточно большого числа клиентов.
Просто убрать из GROUP BY нельзя по причине возникновения ошибки.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33599652
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самая большая таблица iptables(уже сейчас около 3 млн записей).Может проще выдергивать статистику за месяц по одному клиенту отображать ее и переходить к другому.Но в этом случае встает проблема как перебрать все ip адреса из таблицы net_addr или id из clients2.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33602123
mxlPostgres
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите оптимизировать запрос.В процессе работы вместо 192.168.128.160 подставляются адреса из net_addr. Может подскажете как написать функцию,чтобы это реализовать.
EXPLAIN ANALYZE SELECT sum(bytes/1024/1024),to_char(date_trunc('day',second),'DD') FROM iptables,net_addr WHERE ((net_addr.ip=iptables.source)) and second BETWEEN '2006-03-01' and '2006-04-01' and iptables.source='192.168.128.160' ::inet GROUP BY to_char(date_trunc('day',second),'DD') ORDER BY to_char(date_trunc('day',second),'DD');
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GroupAggregate (cost=8.83..8.86 rows=1 width=16) (actual time=1337.567..1338.681 rows=14 loops=1)
-> Sort (cost=8.83..8.83 rows=2 width=16) (actual time=1337.462..1337.671 rows=335 loops=1)
Sort Key: to_char(date_trunc('day'::text, iptables."second"), 'DD'::text)
-> Nested Loop (cost=0.00..8.82 rows=2 width=16) (actual time=3.760..1335.681 rows=335 loops=1)
-> Index Scan using idx_second on iptables (cost=0.00..3.02 rows=1 width=27) (actual time=3.655..1318.899 rows=335 loops=1)
Index Cond: (("second" >= '2006-03-01 00:00:00'::timestamp without time zone) AND ("second" <= '2006-04-01 00:00:00'::timestamp without time zone))
Filter: (source = '192.168.128.163'::inet)
-> Index Scan using idx_net_ip on net_addr (cost=0.00..5.77 rows=2 width=11) (actual time=0.019..0.021 rows=1 loops=335)
Index Cond: ('192.168.128.163'::inet = ip)
Total runtime: 1338.831 ms
(10 rows)



\d iptables
Table "public.iptables"
Column | Type | Modifiers
-------------+-----------------------------+------------------------------------------------------------
id_iptables | integer | not null default nextval('iptables_id_iptables_seq'::text)
bytes | double precision |
prot | text |
source | inet |
dest | inet |
second | timestamp without time zone |
first | timestamp without time zone |
Indexes:
"iptables_pkey" primary key, btree (id_iptables)
"idx_first" btree ("first")
"idx_ipt_dest" btree (dest)
"idx_ipt_src" btree (source)
"idx_second" btree ("second")

\d net_addr
Table "public.net_addr"
Column | Type | Modifiers
----------------+---------+------------------------------------------------------------
id_net_addr | integer | not null default nextval('net_addr_id_net_addr_seq'::text)
id | integer | not null
id_uzl | integer |
ip | inet | not null
gw | inet |
mac | macaddr |
addr_rasp | integer |
kv_rasp | text |
addr_d_cl_rasp | integer |
Indexes:
"idx_id_net_addr" btree (id)
"idx_net_ip" btree (ip)


При формировании сводной таблицы (ip подставляются из таблицы net_addr) работает очень медленно.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33604094
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgres LeXa NalBat mxlPostgresactual rows=36694Действительно ли необходим запрос, возвращающий десятки тысяч строк?Запрос нужен,так как это суммарная статистика по дням за месяц достаточно большого числа клиентов.То есть эта портянка целиком выдается например на печать или на экран монитора?

mxlPostgresСамая большая таблица iptables(уже сейчас около 3 млн записей).Может проще выдергивать статистику за месяц по одному клиенту отображать ее и переходить к другому.Но в этом случае встает проблема как перебрать все ip адреса из таблицы net_addr или id из clients2.select distinct ip from net_addr [id from clients2]

mxlPostgres LeXa NalBat mxlPostgresGROUP BY dest,source,name,date_secondЗдесь группировка по clients2.name избыточна? То есть id уникален в clients2? И ip уникален в net_addr? Если да, то можно попробовать переформулировать запрос.
Поле clients2.id уникально-это PRIMARY KEY,net_addr.ip тоже не повторяются.
Просто убрать из GROUP BY нельзя по причине возникновения ошибки.Дык точно! Поэтому надо не "просто убрать", а "переформулировать".

Попробуйте запрос такого типа при наличии индексов iptables(dest,source,date_trunc('day',second)), net_addr.ip, clients2.id
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT
 bytes,
 source,dest,day,name
FROM
 net_addr,
 clients2,
 (
  SELECT
   sum(bytes/ 1024 / 1024 ) as bytes,
   source,dest,date_trunc('day',second) as day
  FROM
   iptables
  GROUP BY
   dest,source,date_trunc('day',second)
 ) as A
WHERE
 net_addr.ip=A.dest and
 clients2.id=net_addr.id
ORDER BY
 name,day
...
Рейтинг: 0 / 0
Оптимизация запроса
    #33604160
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mxlPostgresПомогите оптимизировать запрос.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
 sum(bytes/ 1024 / 1024 ),source,to_char(date_trunc('day',second),'DD')
FROM
 iptables,net_addr
WHERE
 net_addr.ip=iptables.source and
 second BETWEEN '2006-03-01' and '2006-04-01' and
 iptables.source='192.168.128.160'::inet
GROUP BY
 source,to_char(date_trunc('day',second),'DD')
ORDER BY
 source,to_char(date_trunc('day',second),'DD')
при наличии индекса iptables(source,to_char(date_trunc('day',second),'DD'))

mxlPostgresМожет подскажете как написать функцию,чтобы это реализовать.Функции тут имхо не нужны, достаточно SQL.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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