Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 14 сообщений из 14, страница 1 из 1
06.03.2006, 12:02
    #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
06.03.2006, 14:43
    #33584297
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Приведи create table и create index для таблиц из запроса
...
Рейтинг: 0 / 0
06.03.2006, 14:47
    #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
06.03.2006, 14:48
    #33584319
mxlPostgres
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Индексы типа CREATE INDEX idx ON table(column)
...
Рейтинг: 0 / 0
06.03.2006, 16:45
    #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
07.03.2006, 10:32
    #33586042
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
попробуйте построить индекс по net_addr.ip
...
Рейтинг: 0 / 0
11.03.2006, 09:13
    #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
11.03.2006, 11:45
    #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
14.03.2006, 09:29
    #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
14.03.2006, 14:01
    #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
14.03.2006, 14:53
    #33599652
mxlPostgres
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Самая большая таблица iptables(уже сейчас около 3 млн записей).Может проще выдергивать статистику за месяц по одному клиенту отображать ее и переходить к другому.Но в этом случае встает проблема как перебрать все ip адреса из таблицы net_addr или id из clients2.
...
Рейтинг: 0 / 0
15.03.2006, 13:17
    #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
16.03.2006, 09:00
    #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
16.03.2006, 09:34
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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