|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#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.
EXPLAIN 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. 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.
Пробовал создавать такие индексы: Код: plaintext 1. 2. 3. 4. 5. 6.
Размерность таблиц: files 3,2 mln tths 1,6 mln folders 0,2 mln services 235 servers 222 VACUUM 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. 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. 63.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2008, 15:32 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Возможно поможет кластерный индекс. http://www.postgresql.org/docs/8.2/static/sql-cluster.html Код: 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. 63. 64.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2008, 20:48 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3.
Код: plaintext 1.
Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2008, 11:00 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
2Гостик: Пытался делать кластерный индекс (ох, как это долго все происходило :) по files(name), но не помогло. Этот индекс не использовался. 2LeXa_NalBat: А если я пишу Код: plaintext
Прикрутил полнотекстовый поиск, создал для него GIN индекс. Круто. Быстро. Ничего не скажешь :) Код: 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.
Это можно сделать при помощи полнотекстового поиска? В мануале чего-то такого не нашел... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2008, 12:43 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYА если я пишу Код: plaintext
UKYВо всяком случае создал такой индекс, но СУБД не хочет его использовать (EXPLAIN ANALYZE см. ниже). Код: plaintext 1. 2. 3. 4.
UKY Код: plaintext 1. 2. 3.
UKYВот только хотелось бы найти именно то слово, которое было задано в запросе. Т.е. если спросили "панда", то должно вернуться "Панда", "Пандамима", "Недопандас" и все в этом роде, но не "панды", "пандой"... Это можно сделать при помощи полнотекстового поиска? В мануале чего-то такого не нашел...я с полнотекстовым поиском не работал. может быть можно в качестве разделителя "слов" считать "границу букв"? тогда каждую букву полнотекстовый поиск будет считать отдельным словом, и получите нужны вам поиск. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2008, 13:53 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
"постгрес не умеет оценивать объем выборки по полнотекстовому индексу" может обернуть полнотекстовый поиск по files.name в функцию на языке sql, для которой при создании указать ROWS например равным 10, также можно указать COST. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2008, 15:03 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Попробовал Код: plaintext
LeXa NalBatя с полнотекстовым поиском не работал. может быть можно в качестве разделителя "слов" считать "границу букв"? тогда каждую букву полнотекстовый поиск будет считать отдельным словом, и получите нужны вам поиск. Это сделать реально, но там тогда придется не каждую букву, а все части слова выделять, а это ох сколько памяти и времени на постоение индексов занимать будет... Пока думаю сделать полнотекстовый поиск и уже результаты выборки доколнительно проверять LIKE '%панда%'. Хотя тоже часть результатов теряться будет... LeXa NalBat"постгрес не умеет оценивать объем выборки по полнотекстовому индексу" может обернуть полнотекстовый поиск по files.name в функцию на языке sql, для которой при создании указать ROWS например равным 10, также можно указать COST. Тут я уже Вас не понимаю :) Еще ни разу не писал функции на постгресе. Может быть поэтому... Огромное Вам спасибо за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2008, 19:55 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKY Вот только хотелось бы найти именно то слово, которое было задано в запросе. Т.е. если спросили "панда", то должно вернуться "Панда", "Пандамима", "Недопандас" и все в этом роде, но не "панды", "пандой"... Это можно сделать при помощи полнотекстового поиска? В мануале чего-то такого не нашел... в 8.3 и младше нельзя, в 8.4 будет можно (уже в CVS даже есть) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2008, 02:21 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKY LeXa NalBatможет обернуть полнотекстовый поиск по files.name в функцию на языке sql, для которой при создании указать ROWS например равным 10, также можно указать COST.Тут я уже Вас не понимаю :) Еще ни разу не писал функции на постгресе. Может быть поэтому...думаю, что это ухищрение может ускорить запрос. сделать что-то типа Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2008, 12:31 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
iz UKY Вот только хотелось бы найти именно то слово, которое было задано в запросе. Т.е. если спросили "панда", то должно вернуться "Панда", "Пандамима", "Недопандас" и все в этом роде, но не "панды", "пандой"... Это можно сделать при помощи полнотекстового поиска? В мануале чего-то такого не нашел... в 8.3 и младше нельзя, в 8.4 будет можно (уже в CVS даже есть) Круто :) Надо будет как-нибудь попробовать этот патчик прикрутить... 2 LeXa NalBat: Это ухищрение не сработало :) Постгрес не обманишь... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2008, 20:40 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
До выхода версии 8.4 можно сделать поиск по триграммам - контриб pg_trgm. Он шустро работает, правда UTF-8 не понимает. Принцип такой: 1) Сделать таблицу для хранения отдельных слов Код: plaintext 1.
2) Исходный текст разбить по словам. Можно с помощью ts_vector+ts_stat как в мануале, можно регуляркой Код: plaintext 1. 2. 3.
3) Установить в сессии низкий порог поиска функцией set_limit(), в районе 0.1-0.2. Чем меньше порог, тем больше будет ложных совпадений и медленнее поиск, но зато и нужных слов попадет больше. 4) Поиск должен идти сначала оператором % , а потом из уже ограниченного набора строк надо отсечь мусор обычным like Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2008, 05:38 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKY2 LeXa NalBat: Это ухищрение не сработало :) Постгрес не обманишь...покажите explain analyze ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2008, 10:33 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Оказывается, запрос по словам и не тормозит вовсе :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Все тормоза уходят в join. На построение всяких хэш таблиц и всего такого: Код: 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.
Код: 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. 63.
Еще раз пробовал "set enable_hashjoin to off". Запрос выполнялся 250 секунд и использовался "Merge Join". P.S.: В понедельник уезжаю на военные сборы. Так что полтора месяца не буду вас всех доставать :) P.P.S.: Огромное всем спасибо за предложенные варианты ускорения запроса. Сам бы до такого никогда бы не додумался :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2008, 14:27 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYВсе тормоза уходят в join. На построение всяких хэш таблиц и всего такогода. но для этого запроса возможен быстрый план. тормоза происходят из-за того, что постгрес выбирает неоптимальный порядок (или тип) джоинов. причина этой ошибки в том, что он неправильно оценивает кол-во строк удовлетворяющих условию полнотекстового поиска. попробуйте обернуть полнотекстовый поиск в функцию, созданную с опцией ROWS 10, как я писал, это может помочь. покажите explain analyze с использованием функции-обертки. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2008, 11:04 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Вернулся со сборов. Жив и здоров :) LeXa NalBat UKYВсе тормоза уходят в join. На построение всяких хэш таблиц и всего такогода. но для этого запроса возможен быстрый план. тормоза происходят из-за того, что постгрес выбирает неоптимальный порядок (или тип) джоинов. причина этой ошибки в том, что он неправильно оценивает кол-во строк удовлетворяющих условию полнотекстового поиска. попробуйте обернуть полнотекстовый поиск в функцию, созданную с опцией ROWS 10, как я писал, это может помочь. покажите explain 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. 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.
Получил это: Код: 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.
Индексы, которые есть в СУБД: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ну что-то ни в какую не хочет оптимизироваться запрос... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2008, 16:16 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
- если поиск по %панда% возвращает немного записей, то можно сохранить их во временную таблицу, а уж потом джойнить с остальным хохяйством. - выделить часть запроса во view, часто это позволяет загнать запрос в более оптимальный план. Например подзапрос (select distinct on ...) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2008, 18:45 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
tadmin- если поиск по %панда% возвращает немного записей, то можно сохранить их во временную таблицу, а уж потом джойнить с остальным хохяйством. - выделить часть запроса во view, часто это позволяет загнать запрос в более оптимальный план. Например подзапрос (select distinct on ...) Сделал временную таблицу - не помогло. И вид тоже делал - та же ситуация. P.S.: В основном нагрузка идет на процессор. Жесткий диск не так уж и пыжится. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2008, 06:26 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
а если Код: plaintext 1. 2. 3. 4.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Кстати, я не понял из схемы данных, нельзя ли кое-где указать inner join ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2008, 13:07 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
tadminа если Код: plaintext 1. 2. 3. 4.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Кстати, я не понял из схемы данных, нельзя ли кое-где указать inner join ? PostgreSQL The words INNER and OUTER are optional in all forms. INNER is the default; LEFT, RIGHT, and FULL imply an outer join. Так что здесь и так используется inner join ;) Сделал так, как Вы мне посоветовали за исключением того, что убрал "where type is null and tth is null" из вида, т.к. логика страдает: type - тип файла. Для директории = null tth - контрольная сумма файла. Для директории = null А мне надо найти и файлы, и папки. Запрос Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Главная задача - оптимизация Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2008, 13:34 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
вот этот Код: plaintext
У меня был похожий случай, победил через view. У вас большой pg_dump, можете выложить? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2008, 15:17 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
tadminвот этот Код: plaintext
У меня был похожий случай, победил через view. У вас большой pg_dump, можете выложить? До меня только сейчас дошло как узнать с какого места в запросе тормоза начинаются %) pg_dump большеват. да и скорость интернета не очень большая. сделал set enable_seqscan to off и запрос выполнился за 2,5 секунды: Код: 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.
Это уже хорошо. Даже очень :) Но можно ли как-нибудь без принудительной установки параметров оптимизатора этого добиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2008, 21:32 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKY До меня только сейчас дошло как узнать с какого места в запросе тормоза начинаются %) pg_dump большеват. да и скорость интернета не очень большая. Тормоза (по времени) у вас начинались с hash-join's в памяти, но вот вызвала их никчемная туча записей. Это относительно простой случай, потому что в итоге мало записей возвращается, а sec-scan - большой. Могло быть и так, что делается несколько выборок, которые медленно сужают число записей, делают им hash-join, в то время как в самом конце выполняется условие where, которое и так бы все это отрезало. Стоит заставить планировщик применить первым самое жестокое правило, как все начинает летать. UKY сделал set enable_seqscan to off и запрос выполнился за 2,5 секунды: Но можно ли как-нибудь без принудительной установки параметров оптимизатора этого добиться? При объединении 8-10 таблиц(подзапросов) с кучей условий объединения безумно растет количество возможных планов исполнения. Для 8-10 таблиц оно может измеряться в тысячах. Планировщик видит это и не выбирает аналитически оптимальный, а лишь делает "догадку". (Читать про GQO). Я замечал (не надо мне верить, это догадки), что при большом числе таблиц даже порядок их перечисления в запросе может радикально повлиять на план исполнения, а небольшое изменение в статистике таблиц может внезапно "опрокинуть" до сих пор работавший план запроса. В подобной ситуации я добился оптимального плана через комбинацию нескольких view. Попробуйте разбить ваш запрос на относительно простые части и реализуйте их в виде view так, чтобы финальный запрос можно было построить на их комбинации. Если каждая view будет исполнятся с оптимальным планом, есть шанс на то же самое в целом. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 09:52 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Попробуйте на набор запросов разбить и отлаживайте их по шагам. Если промежуточный запрос дает мало записей - сохраняйте во временную таблицу, много записей - делайте вид. См. http://postgrestips.blogspot.com/2007/07/temp.html ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 11:28 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#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.
Только вот одна маленькая проблема: в вИды нельзя передавать параметры. А мне надо как-то передать строку "панда". Как лечить? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 11:43 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Можно сделать функцию, которая принимает параметры и создает нужные таблицы и виды (временные или постоянные). Если вы смотрели указанную ссылку, там так и делается. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2008, 12:23 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#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 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYПосле долгих перезапусков выборки удалось получить вот такую вот картину (: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
попробуйте после трех команд: set enable_seqscan to off; set enable_hashjoin to off; set enable_mergejoin to off; ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 14:19 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 14:32 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
UKYЯ просто в шоке: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 14:42 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Я приводил результаты отдельно от комманд set enable_*. Меня это время выборки более чем устраивает :) Огромное спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2008, 14:52 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Прошло 10 лет, а чудо осталось чудом set enable_seqscan to off; set enable_hashjoin to off; set enable_mergejoin to off; Ускорение с 7 мин до 3 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2019, 17:44 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
PWWПрошло 10 лет, а чудо осталось чудом set enable_seqscan to off; set enable_hashjoin to off; set enable_mergejoin to off; Ускорение с 7 мин до 3 сек. Это значит 1)сильно более вероятно - неверно (для вашего сервера и данных) выставлены random_page_cost/seq_page_cost и effective_cache_size или 2)планировщик сильно в селективности ошибается ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2019, 19:00 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Maxim BogukPWWПрошло 10 лет, а чудо осталось чудом set enable_seqscan to off; set enable_hashjoin to off; set enable_mergejoin to off; Ускорение с 7 мин до 3 сек. Это значит 1)сильно более вероятно - неверно (для вашего сервера и данных) выставлены random_page_cost/seq_page_cost и effective_cache_size или 2)планировщик сильно в селективности ошибается не-а планировщик пж и на одной таблице бывает лажает. а уж на джойнах как правило. т.ч. я бы предположил в корне неверную мат модель рассчёта костов. оно гораздо более похоже на правду. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2019, 19:27 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
qwwqт.ч. я бы предположил в корне неверную мат модель рассчёта костов. оно гораздо более похоже на правду. А можете предложить корректную модель? Ну или может есть ссылки на публикации по этой теме? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2019, 23:49 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
vyegorovqwwqт.ч. я бы предположил в корне неверную мат модель рассчёта костов. оно гораздо более похоже на правду. А можете предложить корректную модель? Ну или может есть ссылки на публикации по этой теме? как бы я высказал предположение, следующее из наблюдений а насчёт публикаций -- это общее место для практикующих пж--кодеров 21902781 -- последняя искать лениво , но запинывание кривожоптимизатора на 2--3 порядка на нужный план малоосмысленными довесками в where -- и всякое прочее принуждение к нужному индексу -- стандартное занятие. у прошлом годе на хабре было и тут упоминалось. искать просто лень. как правило ваша команда отмалчивается в тряпочку или бухтит невнятно. а я ищи потом. не говоря о том, что оно из коробки многого не умеет, что руками всё время приходится реализовывать. чтонть на тему проходов сиком по индексу -- из разряда луз-сканоподобных переборов. что скучно крайне и озлобляет. ну и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2019, 08:48 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
vyegorov, к тому же искать не всегда удобно. то ли кто-то стыдливо подчищает . то ли случайно оно пропадает с наших экранов. но лежало там примерно это нашёл по старым следам 21025942 а в пердыдущей ссылке сваливание на нормальный план при оффсете вообще ничем кроме отвала башки у пж не объясняется -- там попросту кост с оффсетом меньше коста без оного. чего не может быть никогда. ни при какой непротиворечивой системе оценки костов. т.е. внутре ПеЖе -- рыбу заворачивали. и, видимо, на каждой страничке кода. и много раз. не удивлюсь, если кто--то годами приторговывает патчами, тщательно оберегаемыми от коммита в ".." кактам у вас принято -- эээ...-- "ванильную" версию. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2019, 12:33 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Вот, что я понял из знакомства с Postgres: Postgres рабочий сервер для не ответственных проектов. Планер запросов в Postgres не работает , все надо указывать через хинты. Примеры хинтов https://habr.com/ru/post/169751/. После прямого указания хинтами какими индексами запрос должен воспользоваться, запрос выполняется за 200мс, без него он ... выполняется... он ..., снял его через 20минут ожидания. Установки которые я опробовал ранее топорны set enable_seqscan to off; set enable_hashjoin to off; set enable_mergejoin to off; На одном запросе они работают, на другом похожем запросе который работает быстро и без этих set enable_..., если их поставить, то скорость катастрофически падает (зачесалось еще ускорить). Уж лучше хинты /*+ IndexScan(PK_t_key_id_key IX_Info_page_key_www_id_key IX_Info_page_key_www_id_page) */ SELECT * FROM t_key INNER JOIN ... В данном проекте у меня 3 запроса, 5 статических таблиц на 99,8Гб с индексами, один пользователь и никакой ответственности. Три запроса я могу вылизать. Но я не могу себе представить как можно ухаживать за проектом с >1000 таблиц и >10'000 запросов, планы которых будут протухать по мере добавления данных. Возможно в Postgres еще много разных фичей. К счастью, пока они мне не известны, поэтому меня все устраивает. Бесплатный сыр не только в мышеловке, но и в GNU. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 11:34 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
Дополню - если открыть новую вкладке для запроса в pgAdmin и выполнить запрос с хинтами , то он походит по времени, сели хотя бы один раз запустить запрос с set ..., то после этого запрос выполняется с хинтами без set ... . Мой вопрос конечно решен, но планера запросов просто нет, зато есть шикарный бубен для плясок. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 11:53 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
PWWДополню - если открыть новую вкладке для запроса в pgAdmin и выполнить запрос с хинтами , то он походит по времени, сели хотя бы один раз запустить запрос с set ..., то после этого запрос выполняется с хинтами без set ... . Мой вопрос конечно решен, но планера запросов просто нет, зато есть шикарный бубен для плясок. blahblahblah если бы вместо блаблабла был приведен конкретный запрос с експлейнами (даже без аналайза буфферсов и т.п.) вам было бы немного больше веры . и внимания с пониманием. а пресловутый бубен не используют "не только лишь все". ибо "стандартных" бубенизаций без этого "хинтования" известно довольно много. накоплено, т.с. непосильным трудом. в пж все ж таки есть планировщик, правда, как это видно по планам по ссылкам, ведёт он себя во многих случаях как больной на всю голову двоешник. вот эти случаи бы поподробнее перечислить и проанализировать -- на предмет поиска дыр в реализации и\или логике. ссылки на конкретные случаи абсолютной неадекватности планера я выше давал. к тому же алгоритмически планер беден до невозможности. -- например при наличии индексов по (А) и (Б) запрос вида "выбрать 20 записей вдоль индекса А досортированных по уникализирующему суффиксу Б " (select * from t order by A,B limit 20) он будет не через "взять не менее 20 вдоль А -- до следующего (по отношению к 20-му значению выборки) узла индекса А, результирующую выборку пересортировать с учетом Б и обрезать 20 первых" . а тупо сканом по Б в лучшем случае. или фуллсканом. и сиди, придумывай всякий раз, как это угрёбище заставить делать по--людски: 20794074 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 12:31 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
qwwq, Описано поведение именно этого запроса. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
В итоге его надо всеравно запускать с set... хотябы первый раз (открытая вкладка по видимому держит сессию, поэтому второй раз можно и без set...) План "Unique (cost=120459744.80..120735990.51 rows=22099657 width=104)" " -> Sort (cost=120459744.80..120514993.94 rows=22099657 width=104)" " Sort Key: t_key.keys, t_key.id_key, t_key_1.keys, t_key_1.ch_t" " -> Gather (cost=1090.03..114138126.61 rows=22099657 width=104)" " Workers Planned: 2" " -> Nested Loop (cost=90.03..111927160.91 rows=9208190 width=104)" " -> Nested Loop (cost=89.46..39331434.90 rows=9208190 width=56)" " -> Nested Loop (cost=88.89..107354.46 rows=7283 width=56)" " -> Parallel Bitmap Heap Scan on t_key (cost=88.32..21369.13 rows=2383 width=52)" " Recheck Cond: ((keys)::text ~~* '%e110%'::text)" " -> Bitmap Index Scan on trgm_t_key_idx (cost=0.00..86.89 rows=5719 width=0)" " Index Cond: ((keys)::text ~~* '%e110%'::text)" " -> Index Scan using "IX_Info_page_key_www_id_key" on t_info_page_key (cost=0.57..36.03 rows=5 width=8)" " Index Cond: (id_key = t_key.id_key)" " Filter: (pos_y > 20)" " -> Index Scan using "IX_Info_page_key_www_id_page" on t_info_page_key t_info_page_key_1 (cost=0.57..5376.55 rows=915 width=8)" " Index Cond: (id_page = t_info_page_key.id_page)" " Filter: (pos_y > 20)" " -> Index Scan using "PK_t_key_id_key" on t_key t_key_1 (cost=0.56..7.88 rows=1 width=56)" " Index Cond: (id_key = t_info_page_key_1.id_key)" Следующий запрос выполняется без плясок. Только что проверил, он выполняется с любыми set... on/off. Код: sql 1. 2. 3. 4. 5. 6.
План "Nested Loop (cost=531.24..1266476.13 rows=100 width=214)" " -> Nested Loop (cost=530.67..1265721.81 rows=100 width=170)" " -> Nested Loop (cost=530.10..1088286.28 rows=34 width=162)" " -> Seq Scan on u1 (cost=0.00..1.12 rows=12 width=122)" " -> Bitmap Heap Scan on t_page (cost=530.10..90690.40 rows=3 width=48)" " Recheck Cond: (id_www = u1.k)" " Filter: ((page_)::text ~~* '%E110%'::text)" " -> Bitmap Index Scan on t_page_id_www_idx (cost=0.00..530.10 rows=28560 width=0)" " Index Cond: (id_www = u1.k)" " -> Index Scan using "IX_Info_page_key_www_id_page" on t_info_page_key (cost=0.57..5209.54 rows=915 width=16)" " Index Cond: (id_page = t_page.id_page)" " Filter: ((pos_y > 20) AND (pos_y > 20))" " -> Index Scan using "PK_t_key_id_key" on t_key (cost=0.56..7.54 rows=1 width=52)" " Index Cond: (id_key = t_info_page_key.id_key)" ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 12:57 |
|
Оптимизация большого запроса возможна?
|
|||
---|---|---|---|
#18+
PWW, поскольку вы принуждаете к нестед--лупу, то вместо "сет--енейблов" можно попытаться воспользоваться лейтерал--джойнами. везде или нет -- зависит от мощностей связок (где то могут остаться более выгодными хеш -- джойны) примерно в таком направлении Код: 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.
особо хорошо работает, если вы заведомо знаете что мощность или строго 1 (limit 1) или не выше небольшого числа (limit 7--8). я правильно понимаю, что это у вас какие-то полнотекстовые самопалы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 14:27 |
|
|
start [/forum/topic.php?all=1&fid=53&tid=1995161]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
1ms |
others: | 26ms |
total: | 218ms |
0 / 0 |