|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
сделал без аналайза ну и собственно результат на лицо этот запрос из консоли выдает результат за почти 7 секунд ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 17:52 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
СОбственно теперь вопрос к знатокам - есть ли какие то способы убыстрить count(*) ( судя по всему нет - я почитал доки постгреса) и если так ,то может можно как то достать общее количество из первого запроса который выглядит вот так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 18:00 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
причем count так плохо работает только с этим запросом , напрмер с полнотектовым поиском он за 500 мс Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 18:39 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
таже самая участь стала и селектом на интерсетах Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
теже самые 6.5-7 секунд ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 19:09 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
я так понимаю единственный вменяемый по скорости способ получить количество элементов можно лишь распарсив план ,но там есть допуск около 1% ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 22:06 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
O_79_O я так понимаю единственный вменяемый по скорости способ получить количество элементов можно лишь распарсив план ,но там есть допуск около 1% там допуск и 100% может быть... это как база себе представляет... что может сильно с реальностью расходится. Например есть у вас миллион respondent и есть по 500.000 SMS и 500.000 PUSH база будет предполагать что распределение случайное и соотвественно тех у кого и sms и push есть 250.000 а в реальности их может быть и 0 (у половины только sms а у второй половины только push) и 500.000 (у 500.000 и SMS и PUSH у вторых 500.000 - ничего). В обоих случаях explain вам 250.000 ожидаемых строк вернёт. Так что у этого метода много ограничений и подводных камней. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 22:41 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Maxim Boguk O_79_O я так понимаю единственный вменяемый по скорости способ получить количество элементов можно лишь распарсив план ,но там есть допуск около 1% там допуск и 100% может быть... это как база себе представляет... что может сильно с реальностью расходится. Например есть у вас миллион respondent и есть по 500.000 SMS и 500.000 PUSH база будет предполагать что распределение случайное и соотвественно тех у кого и sms и push есть 250.000 а в реальности их может быть и 0 (у половины только sms а у второй половины только push) и 500.000 (у 500.000 и SMS и PUSH у вторых 500.000 - ничего). В обоих случаях explain вам 250.000 ожидаемых строк вернёт. Так что у этого метода много ограничений и подводных камней. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru понял ,спасибо за совет) а что тогда пагинация на постгресе в своем классическом исполнении не возможна получается? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 22:57 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
попробовал и такой варинат Код: plsql 1. 2. 3. 4.
2.3 секунды но тоже никуда не годится конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 23:00 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
O_79_O Maxim Boguk пропущено... там допуск и 100% может быть... это как база себе представляет... что может сильно с реальностью расходится. Например есть у вас миллион respondent и есть по 500.000 SMS и 500.000 PUSH база будет предполагать что распределение случайное и соотвественно тех у кого и sms и push есть 250.000 а в реальности их может быть и 0 (у половины только sms а у второй половины только push) и 500.000 (у 500.000 и SMS и PUSH у вторых 500.000 - ничего). В обоих случаях explain вам 250.000 ожидаемых строк вернёт. Так что у этого метода много ограничений и подводных камней. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru понял ,спасибо за совет) а что тогда пагинация на постгресе в своем классическом исполнении не возможна получается? А она ни на какой базе не возможна на хоть сколько то разумных обьемах... count(*) по 1.000.000 будет работать ВСЕГДА приблизително столько же сколько select * по этим же миллионам строк (и никакая база вам это не ускорит). Потому что 90% времени это найти нужные вам строки а подсчитать их или отдать как есть - в пределах погрешности. Более того - никто уже не делает пагинацию больше чем на 5-10 страниц потому что это просто никому не нужно в реальности. Ну вот будет у вас пагинация на 10000 страниц... вот кому и какая прикладная для этого польза? Особенно учитывая тот милый факт (про который алогеты "пагинация на постгресе в своем классическом исполнении" не помнят) что она никогда не будет корректно работать на базе в которой идёт запись в используемые в запросе таблицы. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 23:31 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
O_79_O таже самая участь стала и селектом на интерсетах Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
теже самые 6.5-7 секунд Что вполне ожидаемо потому что количество строк к пересчёту округлённо тоже самое или даже выше тут. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 23:32 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
O_79_O причем count так плохо работает только с этим запросом , напрмер с полнотектовым поиском он за 500 мс Код: plsql 1. 2. 3. 4. 5. 6. 7.
Так тут строк намного меньше обрабатывать в процессе надо. count(*) с итогом в 1000.000 вероятнее всего будет не менее чем в 1000 раз медленее чем count(*) с итогом в 1000 если запрос одной структуры. Это не count(*) плохо работает а запрос на выборку сложную 300.000 строк не быстрый выходит. Я бы еще включил track_io_timing в конфиге и делал бы explain (analyze,costs,buffers,timing) запросов может у вас 3/4 времени работа с диском занимает и тогда просто базе надо больше памяти будет выдать и все ускорится заметно. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 23:36 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Maxim Boguk, включил в конфигах что вы сказали Код: plsql 1. 2. 3. 4. 5. 6. 7.
запрос аналитика Код: plsql 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2021, 00:08 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
O_79_O, ну вот 1)у вас оно мало того что временные файлы пишет так ещё и большую часть времени запроса читает данные с диска. Хотите быстрее 1)ставим work_mem в 32MB 2)ставим shared_buffers в 2GB хотя бы (я надеюсь что у вас локально 8GB хотя бы есть.. если есть 16GB то 4GB shared buffers) 3)ставим random_page_cost=1.1 4)перезапускаем базу 5)делает этот же самый explain (analyze,costs,buffers,timing) не 1 раз а раза 3-4 пока время выполенения не перестанет меняться. Смотрим какое время получилось. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2021, 00:48 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Maxim Boguk O_79_O, ну вот 1)у вас оно мало того что временные файлы пишет так ещё и большую часть времени запроса читает данные с диска. Хотите быстрее 1)ставим work_mem в 32MB 2)ставим shared_buffers в 2GB хотя бы (я надеюсь что у вас локально 8GB хотя бы есть.. если есть 16GB то 4GB shared buffers) 3)ставим random_page_cost=1.1 4)перезапускаем базу 5)делает этот же самый explain (analyze,costs,buffers,timing) не 1 раз а раза 3-4 пока время выполенения не перестанет меняться. Смотрим какое время получилось. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru спасибо большее буду пробовать ,завтра отпишусь что вышло ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2021, 01:08 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Maxim Boguk,большое спасибо за советы- вообщем стало быстрее где то раза в два раза.ПРактически влез в SLA Код: plsql 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2021, 17:24 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Максим еще один вопрос хотел спросить,для сортировки по фио я создал вот такой индекс Код: plsql 1.
и так же есть индекс Код: plsql 1. 2. 3. 4. 5. 6.
так вот если я делаю такой запрос Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
не будет ли битри индекс fio_respondent мешать полнотекстовому поиску для которого у меня gin index full_text_search_respondent_gin аналитика по этому запросу Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2021, 17:49 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
я так понимаю это опять сложная тема,так как то что я смог нарыть говорит о том ,что слон вроде и может использовать несколько индексов в одном query но только в булевом выражении,что означает ,что если я хочу полнотекст по gin а сортировку по b tree такое не получится но в любом случае когда считается count(*) используется именно gin это хорошо когда поиск с лимитом используется btree когда поиск без лимит планировщик опять использует gin исходя из этого я предполагаю что эти индексы друг другу не мешают,планировщик сам выберет нужный в зависимости от ситуации ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2021, 19:41 |
|
|
start [/forum/topic.php?fid=53&msg=40083420&tid=1993940]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 255ms |
total: | 396ms |
0 / 0 |