Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Как можно оптимизировать запрос??? 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 12:02 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Приведи create table и create index для таблиц из запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 14:43 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
\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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 14:47 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Индексы типа CREATE INDEX idx ON table(column) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 14:48 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
попробовать изменить запрос на: Код: plaintext 1. 2. 3. 4. 5. 6. 7. построить индекс iptables(source, dest) использовать явное приведение iptables.source='192.168.244.132'::inet, если версия меньше 8.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 16:45 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
попробуйте построить индекс по net_addr.ip ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 10:32 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
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) Что тут можно еще улучшить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2006, 09:13 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
А если GROUP BY name,date_trunc('day',second),dest,source ORDER BY name,date_trunc('day',second); А если построить индекс net_addr(ip, id) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2006, 11:45 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
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? Если да, то можно попробовать переформулировать запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 09:29 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
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 нельзя по причине возникновения ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 14:01 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Самая большая таблица iptables(уже сейчас около 3 млн записей).Может проще выдергивать статистику за месяц по одному клиенту отображать ее и переходить к другому.Но в этом случае встает проблема как перебрать все ip адреса из таблицы net_addr или id из clients2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 14:53 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Помогите оптимизировать запрос.В процессе работы вместо 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) работает очень медленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 13:17 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 09:00 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
mxlPostgresПомогите оптимизировать запрос. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. mxlPostgresМожет подскажете как написать функцию,чтобы это реализовать.Функции тут имхо не нужны, достаточно SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 09:34 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33594267&tid=2006556]: |
0ms |
get settings: |
10ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 266ms |
| total: | 418ms |

| 0 / 0 |
