|
|
|
Index Scan vs Seq Scan
|
|||
|---|---|---|---|
|
#18+
Работаю с одним запросом (хотя дело не в нем ситуация, достаточно типична): Код: sql 1. 2. 3. 4. 5. 6. При его выполнении получаю следующий план: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Особенность его в том, что Postgres решает бежать по всему priceListLedger а там 1,3М записей. Выключаю hash_join и merge_join: План становится следующим: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. В 4 раза быстрее, и это на холодную базу (повторный запрос еще быстрее 123 сек). Особенность этого плана в том, что Postgres уже бежит по индексу, и делает это гораздо быстрее. Что интересно cost'ы у них приблизительно равны, но у варианта с index'ом разброс больше 454.81..176907.89 против 62389.54..89004.19 у hash join, при этом верхний Aggregate берет пессимистичный вариант (наверное единственное место во всей СУБД, где постгрес идет по пессимистичному сценарию), и получается, что вариант с индексом СУБД кажется хуже. Конечно ее в чем то можно понять, она не знает что у меня очень быстрый SSD и дофига RAM'а под shared_buffer'ы, но тут вопрос как заставить СУБД в таком случае использовать индексы чаще scan'ов. По идее должен помогать random_page_cost, но я его и так в 1.0 поставил - меньше ставить не хочется, других настроек planner'а я не нашел :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 15:36 |
|
||
|
Index Scan vs Seq Scan
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, попробуйте seq_page_cost=0.1 random_page_cost=0.1 cpu_tuple_cost=0.05 effective_cache_size=адекватный вашему обьему памяти (про него часто забывают вообще) Это ближе к случаю базы в памяти. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 15:40 |
|
||
|
Index Scan vs Seq Scan
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Thx, вроде помогло: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. А какие вообще есть важные параметры (кроме вышеперечисленных) для полу-OLTP, не ORM системы на SSD'ке с базой влезающей в shared_buffers, не критичными данными (то есть потеря 5 минут не критична)? (например мы любим fsync = off выставлять :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:07 |
|
||
|
Index Scan vs Seq Scan
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, Хотя fsync мы как раз для медленных HDD выставляем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:13 |
|
||
|
Index Scan vs Seq Scan
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieЧто интересно cost'ы у них приблизительно равны, но у варианта с index'ом разброс больше 454.81..176907.89 против 62389.54..89004.19 у hash join, при этом верхний Aggregate берет пессимистичный вариант (наверное единственное место во всей СУБД, где постгрес идет по пессимистичному сценарию) 454.81..176907.89 вот такая запись это не разброс, а число попугаев до получения первой строки .. число попугаев до получения последней строки в данной ноде. оптимизатору нужны оба числа чтобы правильней оценивать запросы с limit, например. fsync выключать особого профита нет, если только нет желания из бэкапа при сбое восстанавливаться. тоже самое можно получить и с synchronous_commit=off, wal_writer_delay побольше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:25 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=113&tid=1998079]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 336ms |

| 0 / 0 |
