Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Что нужно сделать,чтобы оптимизировать работы Postgres на огромных таблицах. Например долго выполняется запрос вида ( причем операции с индексом тоже работают долго) EXPLAIN SELECT sum(bytes)::double precision,to_char(date_trunc('day',second),'DD')::text AS ds,name,clients2.id FROM iptables,net_addr,clients2 WHERE net_addr.ip::inet=iptables.dest::inet and clients2.id::int=net_addr.id::int and second BETWEEN '2006-04-01 00:00:00'::date and '2006-04-10 00:00:00'::date GROUP BY clients2.id::int,name::text,ds ORDER BY name,ds; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sort (cost=132056.49..132544.72 rows=195292 width=36) Sort Key: clients2.name, to_char(date_trunc('day'::text, iptables."second"), 'DD'::text) -> GroupAggregate (cost=103396.11..109739.93 rows=195292 width=36) -> Sort (cost=103396.11..104371.93 rows=390331 width=36) Sort Key: clients2.id, clients2.name, to_char(date_trunc('day'::text, iptables."second"), 'DD'::text) -> Hash Join (cost=56.63..42555.41 rows=390331 width=36) Hash Cond: ("outer".dest = "inner".ip) -> Index Scan using idx_second on iptables (cost=0.00..34692.16 rows=390331 width=27) Index Cond: (("second" >= '2006-04-01 00:00:00'::timestamp without time zone) AND ("second" <= '2006-04-10 00:00:00'::timestamp without time zone)) -> Hash (cost=54.26..54.26 rows=947 width=31) -> Hash Join (cost=20.59..54.26 rows=947 width=31) Hash Cond: ("outer".id = "inner".id) -> Seq Scan on net_addr (cost=0.00..19.47 rows=947 width=15) -> Hash (cost=18.47..18.47 rows=847 width=20) -> Seq Scan on clients2 (cost=0.00..18.47 rows=847 width=20) (15 rows) EXPLAIN SELECT sum(bytes)::double precision,to_char(date_trunc('day',second),'DD')::text AS ds,name,clients2.id FROM iptables,net_addr,clients2 WHERE net_addr.ip::inet=iptables.dest::inet and clients2.id::int=net_addr.id::int and second BETWEEN '2006-04-01 00:00:00'::date and '2006-04-10 00:00:00'::date GROUP BY clients2.id::int,name::text,ds ORDER BY name,ds; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sort (cost=132056.49..132544.72 rows=195292 width=36) Sort Key: clients2.name, to_char(date_trunc('day'::text, iptables."second"), 'DD'::text) -> GroupAggregate (cost=103396.11..109739.93 rows=195292 width=36) -> Sort (cost=103396.11..104371.93 rows=390331 width=36) Sort Key: clients2.id, clients2.name, to_char(date_trunc('day'::text, iptables."second"), 'DD'::text) -> Hash Join (cost=56.63..42555.41 rows=390331 width=36) Hash Cond: ("outer".dest = "inner".ip) -> Index Scan using idx_second on iptables (cost=0.00..34692.16 rows=390331 width=27) Index Cond: (("second" >= '2006-04-01 00:00:00'::timestamp without time zone) AND ("second" <= '2006-04-10 00:00:00'::timestamp without time zone)) -> Hash (cost=54.26..54.26 rows=947 width=31) -> Hash Join (cost=20.59..54.26 rows=947 width=31) Hash Cond: ("outer".id = "inner".id) -> Seq Scan on net_addr (cost=0.00..19.47 rows=947 width=15) -> Hash (cost=18.47..18.47 rows=847 width=20) -> Seq Scan on clients2 (cost=0.00..18.47 rows=847 width=20) (15 rows) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 09:17 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Память проверяли? В файле postgresql.conf есть раздел resourse usage->memory. В нём есть параметры work_mem, maintenance_work_mem, max_stack_depth. По умолчанию там стоят до смешного маленькие значения. Попробуйте увеличить их раз в 10-20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 10:09 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Посмотреть в сторону Partitioning. http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.html Очень помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 10:15 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
А explain analyze можно? И оборачивай explain как сырцы (кнопочка SRC при написании топика). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 10:34 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Когда Postgres считает суммы в этом запросе,он сканирует всю таблицу или только часть,ограниченную датой.Если эту часть,то имеет смысл создать Partitioning,а если нет,то не знаю чем он поможет. В БД сейчас около 10 млн записей,но число постоянно растет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 12:15 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Партиции можно сделать по клиентам. А кто что скажет по партициям например по подсетям? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2006, 14:03 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Я думаю: вначале группируй по iptables.dest, а потом связывай с клиентами: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. А значения work_mem и shared_buffers в postgresql.conf каковы (как правильно заметил AlexTheRaven)? Shared Buffers - в твоем случае наверно под гектар стоит выделить ( - на сколько за месяц объем данных увеличивается - чтобы сразу весь месяц в памяти держать) (и вообще: какая железка/ось?). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 10:56 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
posttЧто нужно сделать,чтобы оптимизировать работы Postgres на огромных таблицах. Например долго выполняется запрос вида ( причем операции с индексом тоже работают долго)Нужно не работать с огромными таблицами. Например, если у вас в таблицу iptables добавляются строки с second~=now() и впоследствии не изменяются и не удаляются, то можно один раз в сутки чуть позже полуночи делать "insert into daily_stat_1 as select clients2.id, clients2.name, sum(bytes)::double precision as bytes, to_char(date_trunc('day',second),'DD')::text AS ds from ... where second between now()-'1 day' and now()" и затем делать выборки из этой таблицы. postt Код: plaintext 1. 2. 3. 4. 5. Когда Postgres считает суммы в этом запросе,он сканирует всю таблицу или только часть,ограниченную датой.В сортировку и группировку приходит 600 тыс строк - с учетом ограничения по дате, которое накладывается ранее при IndexScan. P.S.: кстати, из миллиона с лишним строк полученных в IndexScan остаются только 600 тыс. оставшиеся не тарифицируются? это ошибка? Funny_FalconЯ думаю: вначале группируй по iptables.dest, а потом связывай с клиентами:Я уже давал ему такой совет. http://sql.ru/forum/actualthread.aspx?tid=268827#2453909 Но здесь принципиального ускорения по-моему можно ожидать лишь избавившись от сортировки работающей 36 секунд, что составляет 80% от времени выполнения запроса. Но тогда придется пробегать все строки в порядке dest и фильтровать их по second? Хотя можно попобовать HashJoin, такой совет я тоже давал. http://sql.ru/forum/actualthread.aspx?tid=268827#2444761 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 11:11 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat Но здесь принципиального ускорения по-моему можно ожидать лишь избавившись от сортировки работающей 36 секунд, что составляет 80% от времени выполнения запроса. Теоретически можно построить индекс, в котором строки будут перечисляться в заранее определённом порядке, и при выборке вместо того, чтобы устраивать новую сортировку, просто пользоваться этим индексом. Как это реализовано в Postgres и реализовано ли вообще - не знаю, но можно посмотреть в этом направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 11:52 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
AlexTheRaven LeXa NalBat Но здесь принципиального ускорения по-моему можно ожидать лишь избавившись от сортировки работающей 36 секунд, что составляет 80% от времени выполнения запроса.Теоретически можно построить индекс, в котором строки будут перечисляться в заранее определённом порядке, и при выборке вместо того, чтобы устраивать новую сортировку, просто пользоваться этим индексом. Как это реализовано в Postgres и реализовано ли вообще - не знаю, но можно посмотреть в этом направлении.Если ограничения по second заранее неизвестны, то есть нужно чтобы быстро работали запросы "where second between A and B group by dest" и "where second between C and D group by dest", то такого индекса по-меому построить нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 11:56 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Можно для начала поменять местами dest и date_trunc Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Если second имеет тип timestamp (без tz), то можно построить индекс: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 13:52 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
600 тыс. из 1.2 млн возвращается из-за того,что это только строчки,соответствующие входящему трафику,а есть еще исходящий.Не совсем правильно нужно два поля в одной строке,но пока еще не сделал. Об оборудовании: cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 4 model name : Intel(R) Celeron(R) CPU 2.26GHz stepping : 1 cpu MHz : 2260.319 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 5 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe pni monitor ds_cpl cid bogomips : 4508.87 Памяти 512Мб. OC ALTLinux 2.4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2006, 14:01 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2006, 20:10 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. А если нужно быстро делать выборку по клиенту, то для PostgreSQL8.1 имеют смысл еще два отдельных индекса - по source и по dest. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 10:47 |
|
||
|
Оптимизация Postgres для огромных таблиц
|
|||
|---|---|---|---|
|
#18+
Funny_FalconВидимо здесь постгрес не использует второй столбец в индексе (source).Это поле используется, но не для выборки (фильтрации) по индексу, а благодаря ему отсутствует пересортировка перед GroupAggregate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2006, 11:28 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33697397&tid=2006432]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 262ms |
| total: | 403ms |

| 0 / 0 |
