|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Почему-то не получется так сделать: Код: plaintext 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. 59. 60. 61. 62.
Когда вызываю Код: plaintext 1.
Пишет вот такую ошибку: PL/pgSQL function "find_all" line 4 at SQL statement ERROR: there is no parameter $1 CONTEXT: SQL statement "create or replace temp view find_tths AS select distinct on (tths.tth) tths.id AS tth_id from files join tths on files.tth = tths.id where files.size > 0 and files.type is not null and to_tsvector('russian', files.name) @@ to_tsquery( $1 )" Странно это все как-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 13:12 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Используйте EXECUTE. Сейчас вы пытаетесь выполнить свой запрос как уже готовый, а на самом деле вам его сначала надо подговить, обеспечив подстановку переменных. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 13:25 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Сейчас попробовал сделать в функции без параметров и опять начало тормозить. Не одно так другое тормозит :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 13:29 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
MBGИспользуйте EXECUTE. Сейчас вы пытаетесь выполнить свой запрос как уже готовый, а на самом деле вам его сначала надо подговить, обеспечив подстановку переменных. Ой, точно! Что-то я уже тупить начинаю %) Видимо, нужно развеяться :) Но из функции выборка делается дольше. Это факт. Видимо, из-за того, что она использует курсор в цикле. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 13:37 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
А зачем вам там курсор? В функции надо создать таблицу, а потом ее прочитать после выхода из функции. Не надо пытаться вернуть таблицу из функции, в постгресе такая операция весьма медленная, не путайте с ораклом. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 13:41 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Нет, к сожалению, я ошибся. Все намного хуже. Сейчас сделал так, как было раньше без функции. Опять тормозит. Так что функция здесь не при чем. Посмотрел план: опять производится seqscan по files. План поменялся. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 13:46 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Обычное дело. Это, собственно, одна из причин, по которой я сам отказался от постгреса. Оптимизировать запрос можно, но изменится количество записей в одной из больших таблиц на порядок и снова несколько дней проведете в переборе вариантов объединений таблиц и создании временных таблиц/видов. А вообще ваш запрос довольно простой, до 10 таблиц оптимизировать можно. Попробуйте переписать запрос, имхо он написан не оптимально. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 13:57 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Вы, случаем, не на рабочей системе тестируете? Планировщик постгреса так устроен, что подстраивается во время работы, то есть если у вас на системе выполнено много одинаковых запросов план будет отличаться от плана первого выполнения запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 14:14 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Нет. Я работаю на статичной базе. Тестирую, экспериментирую, пробую :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 15:34 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Может стоить попробовать условие "text like '%панда%'" разбить на два "text like 'панда%' OR text like '%панда'" ну и по полю построить два индекса - один обычный , а второй со спецальными опциями (поищи на форуме) для "обратного %" "%панда" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 19:13 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Забыл. Код: plaintext
Т.е. если ваши индексы не лезут в предполагаемый размер дискового кеша, то запрос сорвется в seq_scan И еще попробуйте: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 22:47 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Неа. Не помогает. Пока что рулит только set enable_seqscan to on :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2008, 05:49 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYНеа. Не помогает. Пока что рулит только set enable_seqscan to on :) Точнее off ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2008, 05:49 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Если и по колесу стучали и зажигание проверяли (перезапускали после каждого изменения конфига и делали vacuum analyze), тогда надо играть с комбинацией из нескольких view. Далее советы очень трудно давать, не видя базы. Чужие explain analyze не так наглядны, заочно только великие адепты могут помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2008, 10:10 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKY Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2008, 13:00 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYДоброго времени суток, многоуважаемые :) Помогите, пожалуйста, оптимизировать запрос: Я бы начал с того, что убедился, что существуют индексы: Код: plaintext 1. 2. 3.
Кроме того, в позапросе во from (который select distinct on (tths.tth)...) от греха подальше поставил бы limit 10, скажем. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2008, 13:16 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
LeXa NalBat UKY Код: plaintext 1.
Убрал условие. Сделал индекс Код: plaintext 1.
Сделал VACUUM FULL ANALYZE. Немного переделал запрос. Получился вот такой: Код: plaintext 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.
Но один фиг использется последовательный перебор по таблице файлов: Код: plaintext 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.
Делал вид по Код: plaintext 1. 2. 3. 4.
И возник еще один вопрос: Почему не используется индекс Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 10:25 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKY LeXa NalBatв первом подзапросе (от SELECT до UNION) нет условия WHERE files.type IS NULL. поэтому уберите это условие из индекса по files(tth). покажите получившийся EXPLAIN ANALYZE.Убрал условие. Немного переделал запрос.не так. пробуйте запрос через функцию tth_search при наличии индекса без дополнительных условий по files(tth) UKYИ возник еще один вопрос: Почему не используется индекс tths(count DESC NULLS LAST) для сортировки результатов выдачи? (даже если пишу order by count desc nulls last)наверное потому, что индекс только по одному полю count, а order by по трем полям count desc, tth_id, name. но это не важно, потому что 59 строк сортируются быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 11:17 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
LeXa NalBat не так. пробуйте запрос через функцию tth_search при наличии индекса без дополнительных условий по files(tth) Да! Получилось! :) Вот окончательный результат: Код: plaintext 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.
Код: plaintext 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.
Спасибо всем огромное! Вы мне очень сильно помогли! Столько идей, сколько знаний от вас получил, что аж не перечесть :) Спасибо еще раз :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 12:08 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYДа! Получилось! :)ура! UKY Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 12:18 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Да, я сам заметил, что все еще последовательный перебор используется. И не только по таблице папок... Вот какие индексы есть в системе: Код: plaintext 1.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Так что они и здесь почему-то не используются... Это же лечится? 0:) P.S.: Если сделать set enable_seqscan to off то запрос выполняется за 179 ms О_о Я таких скоростей никогда не видел :) Даже подумал нафиг новый сервер покупать и этот неплохо справляется... 0:) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 12:34 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYДа, я сам заметил, что все еще последовательный перебор используется. И не только по таблице папок... Вот какие индексы есть в системе: ... CREATE UNIQUE INDEX folders_pkey ON folders USING btree (id) ... Так что они и здесь почему-то не используются... Это же лечится? 0:) Если сделать set enable_seqscan to off то запрос выполняется за 179 ms О_ода, нужный индекс есть. может получиться запинать до десятков миллисекунд. покажите пожалуйста explain analyze с set enable_seqscan to off, который 179 ms. Код: plaintext 1.
попробуйте выполнить запрос после сбора самой подробной статистики по этой колонке: ALTER TABLE files ALTER COLUMN tths SET STATISTICS 1000; ANALYZE files ( tths ); EXPLAIN ANALYZE SELECT ... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 12:55 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
На кэшированных данных еще быстрее (с set enable_seqscan to off): Код: plaintext 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.
Сделал статистику побольше, как Вы и советовали. Теперь план практически такой же, как и с set enable_seqscan to off: Код: plaintext 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.
Сижу теперь и офигеваю: с 70 секунд ускорить выборку до 10 мс... Офигеть. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 13:07 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYНа кэшированных данных еще быстрее (с set enable_seqscan to off): Код: plaintext 1. 2. 3. 4.
попробуйте после выполнения двух команд: set enable_seqscan to off; set enable_hashjoin to off; ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 13:34 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
После долгих перезапусков выборки удалось получить вот такую вот картину (: Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 13:51 |
|
|
start [/forum/topic.php?fid=53&msg=35454029&tid=1995161]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 277ms |
total: | 437ms |
0 / 0 |