|
|
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
Всем привет. PostgreSQL 9.2.8 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit Имеется большая таблица hotcore.otahotel Это таблица - партицирована по неделям. в одной партиции около 67 млн. строк Агрегирую некоторые данные таким запросом: Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. такой план: Код: 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. Можно как-то улучшить время выполнения. спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 18:05:26 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
Вот план в чуть более удобном виде . Таблица `otahotel_2014w32` холодная (`Buffers: shared hit=1101 read=47974`), сильно ли меняется время при повторном запуске запроса? Если заменить именованные подзапросы на обычные (избавиться от `WITH` конструкции), будет ли план лучше? Слияние циклами в #13 больно дорого выходит. Чтобы подобрать более вменяемый план, поиграйтесь с `enable_*` опциями на уровне сессии. Скажем, будет ли план лучше при Код: sql 1. ? Мне кажется тут хэширование будет быстрее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 19:19:08 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time, тут похоже поможет только кластеризация партиций otahotel по otahotel_id, чтобы с диска меньше читать. но другие запросы могут замедлиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 21:55:10 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time, Приведите план запроса (ну и результат): Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2014, 22:14:52 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\/\, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. результат 65288691 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 16:04:42 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorovТаблица `otahotel_2014w32` холодная (`Buffers: shared hit=1101 read=47974`), сильно ли меняется время при повторном запуске запроса? теплая работаем заметно лучше, но при работе в кеш она не попадает vyegorovЕсли заменить именованные подзапросы на обычные (избавиться от `WITH` конструкции), будет ли план лучше? Попробовал. Вроде получше. Почему? ) такой план (меняю id'шники, паритции - моделирую холодную работу Код: 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. авторСлияние циклами в #13 больно дорого выходит. Чтобы подобрать более вменяемый план, поиграйтесь с `enable_*` опциями на уровне сессии. Скажем, будет ли план лучше при Код: sql 1. ? Код: sql 1. 2. это пробовал - иногда чуть лучше Alexiusbest_time, тут похоже поможет только кластеризация партиций otahotel по otahotel_id, чтобы с диска меньше читать. но другие запросы могут замедлиться. оставлю пока "про запас" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2014, 18:34:10 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_timevyegorovЕсли заменить именованные подзапросы на обычные (избавиться от `WITH` конструкции), будет ли план лучше? Попробовал. Вроде получше. Почему? Ничего в целом не поменялось. “Получше” потому, что `WITH` конструкции имеют защиту от оптимизаций. При переписывании с обычными подзапросами у оптимизатора развязаны руки на трансформацию запросов, проталкивание предикатов и другие плюшки. best_timevyegorovСлияние циклами в #13 больно дорого выходит. Чтобы подобрать более вменяемый план, поиграйтесь с `enable_*` опциями на уровне сессии. Скажем, будет ли план лучше при Код: sql 1. ? Код: sql 1. 2. это пробовал - иногда чуть лучше А были ли варианты когда Hash Join использовался? Можно пример? Ну а таблица остается “холодной” при использовании SeqScan из-за особенностей работы с кэшем. Чтобы избежать его “вымывания” для SeqScan-ов выделяется маленькая часть кэша, которая используется в цикле ( тут, стр. 10 ). И еще — что возвращает такой запрос? Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 00:32:19 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov, судя по запросу вы зря ударились оптимизировать джойн до свёртки похоже просто надо переписать на джойн после свёртки поскольку со стороны tt тянутся поля однозначно соответствующие tt.id будет свертка (агрегат) по полному скану -- что стоит, как описал автор, 104027.062 ms (что вдвое быстрее) + джойн коротких таблиц. ------------------- если же автор хочет насладиться преимуществом limit 100, то ему вот это надо ускорять Код: sql 1. 2. 3. 4. -- расскажите нам, что это и зачем оно тут, если уже явно всё, какбе, отыскано "внутри", причем много дешевле: Код: sql 1. 2. 3. -- т.е. есть подозрение, что пройти рекурсивно по 100 id из tt "вручную" (в WITH RECURSIVE) будет много дешевле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 10:56:05 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
ЗЫ, если лениво переписывать -- есть подозрение, что индекс типа otahotel_2014w32_otahotel_id_report_date_idx (otahotel_id,report_date) вправят оптимайзеру мозги взад, но надо проверять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 11:04:26 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправилvyegorov, судя по запросу вы зря ударились оптимизировать джойн до свёртки ------------------- если же автор хочет насладиться преимуществом limit 100, то ему вот это надо ускорять Код: sql 1. 2. 3. 4. Вот ради оптимизации `loops=100` и пытаюсь понять, почему оптимизатор выбирает цикл, а не хэш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 11:19:01 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил... лениво переписывать... Не уверен, что переписывать нужно много: Код: 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. Как-то так. Но выбор во временные данные 65 млн строк меня смущает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 11:24:33 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov, не понял, зачем там хеш. тогда уж свернуть сначала, а потом джойнить. получите то, чего хотите, без затрат на джойн (это что, всю миллионную захешировать, потом поджойнить, и результат свернуть ? боец борется за разницу меж лямами [65288691, но последовательно] и килами [48394, но произвольно] ) -- тут интересно то, что эти записи (484) оптимайзер находит (внутри, по индексу) практически без затрат времени (пусть и лупнув 100) -- см. этап 18 плана по ссылке а затем (снаружи) зачем то делает над ними же 17. Bitmap Heap Scan on otahotel_2014w32 av но уже теряя кучу (втрое) времени Код: sql 1. 2. 3. 4. -- я не силён в таких тонкостях -- напрочь не понимаю, чем оно тут занимается. фильтровать оно могло и на проходе 18. считай бесплатно. PS -- если бы в 18 было написано IOS -- я бы хоть что-то понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 11:42:49 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\, не, я не про то. я про 2 абсолютно разные альтернативы 1. свернуть все 65 лямов на проходе (100 секунд --см выше), потом поджойниться - выиграем вполовину, но никак не больше или (совсем другое) 2. взять в CTE 100 id, и для каждого из них в конструкции with recursive взять свой агрегат (что оптимайзер [+-километр] и должен делать, но я как-то это плохо читаю). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 11:50:10 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
авторно уже теряя кучу (втрое в 30 -- 2400 vs 80) времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:00:20 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправилvyegorov, не понял, зачем там хеш. тогда уж свернуть сначала, а потом джойнить. получите то, чего хотите, без затрат на джойн (это что, всю миллионную захешировать, потом поджойнить, и результат свернуть ? боец борется за разницу меж лямами [65288691, но последовательно] и килами [48394, но произвольно] ) Хэшируется меньшая сторона, потом делается проход по большей. В данном случае сделать хэш для 100 записей из подзапроса и потом один раз пройти SeqScan-ом по 67 лимонам мне кажется будет быстрым, в пределах тех же 100 секунд. Я вижу 2 причины почему не используется хэш: невозможно архитектурно (внутренние ограничения СУБД), но это гипотеза, точно не знаю что может быть такого; перекос в статистиках/недостаточный размер гистограммы. Тут можно что-то крутить. Что же касается “переписать” запрос — полностью согласен. Но хочется же разобраться в чем тут дело... --поправил-- тут интересно то, что эти записи (484) оптимайзер находит (внутри, по индексу) практически без затрат времени (пусть и лупнув 100) -- см. этап 18 плана по ссылке а затем (снаружи) зачем то делает над ними же 17. Bitmap Heap Scan on otahotel_2014w32 av но уже теряя кучу (втрое) времени Код: sql 1. 2. 3. 4. -- я не силён в таких тонкостях -- напрочь не понимаю, чем оно тут занимается. фильтровать оно могло и на проходе 18. считай бесплатно. PS -- если бы в 18 было написано IOS -- я бы хоть что-то понял Это особенности работы BitmapScan-а. Сначала он идет по индексу, но возвращает для каждого блока (8Кб) содержащего искомые значения 1, или 0 в противном случае. Понятно, что после этого надо прочитать такие блоки и вытащить из них записи. Потому и получается всегда 2 (и более) этапа: сначала несколько Bitmap Index Scan-ов; наложение битмапов если более 1 индекса на 1-м шаге; результирующий Bitmap Heap Scan. Смысл в том, что если несколько индексов реляции подпадают под предикаты, по ним всем делаются проходы (Bitmap Index Scan), затем полученные битмапы логически накладываются (BitmapAnd / BitmapOr) и только потом идет обращение к записям (Bitmap Heap Scan) — быстрее выходит. Для единственного индекса такой проход выбирается, если селективность не очень. Тут подробнее . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:10:40 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov, 1. люди, пишущие pdf идут строго лесом. (я не типография) 2. т.е. вы хотите сказать, что 18 -- это реально IOS ? а потом BitmapOr с реальным произвольным доступом к 48000 записям (страницам) жрет 240 сек ? по ~5 ms на доступ? [200 в секунду -- 1200 в минуту - не маловато будет? или я где-то провираюсь ?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:29:39 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправилvyegorov, 1. люди, пишущие pdf идут строго лесом. (я не типография) 2. т.е. вы хотите сказать, что 18 -- это реально IOS ? а потом BitmapOr с реальным произвольным доступом к 48000 записям (страницам) жрет 240 сек ? по ~5 ms на доступ? [200 в секунду -- 12000 в минуту - не маловато будет? или я где-то провираюсь ?) бгг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:35:10 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
там при ожиданиях много хуже 48к авторrows=3001390 оптимайзер пускается на NestedLoop -- имхо у ТС косты переставлены супротив дефолтных. или enable seqscan (и т.п.) в off-е ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:44:05 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorovИ еще — что возвращает такой запрос? Код: sql 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 13:52:40 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Я ожидал увидеть больше колонок: тыц . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 14:15:06 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov, там 0 и NULL'ы - все равно важно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 14:51:38 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov, могабыть оно слишком мало ожидает строк от tt ? Код: sql 1. 2. причем (что не очевидно, но вероятно) -- похоже geo.name можно извлечь уже в t коррелированным полем (или ТС ожидает там размножения имен ?) -- тогда оптимизатор будет знать, что предстоит искать в big table по 100 а не по 9 id-кам. но то, что оно планирует Nested Loop при ожидании 3001390 rows Код: sql 1. -- кажется сипанным. что то подкручено с cost-ами ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 15:14:16 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time, SHOW random_page_cost ; ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 15:18:44 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_timevyegorov, там 0 и NULL'ы - все равно важно? Хм, если там NULL-ы, то у меня вопросы: как статистики собираются в системе вообще? что выдаст такой запрос Код: sql 1. как изменится план после запуска следующих команд Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 15:22:14 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправилbest_time, SHOW random_page_cost ; ? 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 15:33:29 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time--поправилbest_time, SHOW random_page_cost ; ? 4это дефолт, если не вру тогда сразу всё прочее, как просит товарисч: select name,setting,source from pg_settings where name ~ '^autovacuum|cost|enable'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 15:38:03 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorovbest_timevyegorov, там 0 и NULL'ы - все равно важно? Хм, если там NULL-ы, то у меня вопросы: как статистики собираются в системе вообще? что выдаст такой запрос Код: sql 1. как изменится план после запуска следующих команд Код: sql 1. 2. 3. 4. 5. виноват - запускал на реплике. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. настройки: Код: 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. ANALYZE - сейчас запущу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 15:56:22 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time, сделайте, если не сложно Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. -- интересно посмотреть на то, что придумает оптимизатор про rows cost и метод ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 16:05:32 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил, Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 16:26:01 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time, он таки упорствует Код: sql 1. а что , если вместо JOIN предложить ему агрегат от where exists (план должен быть похожий, ну а вдруг он устанет упорствовать ~пимерно так~ Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 16:47:25 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправилbest_time, он таки упорствует Код: sql 1. а что , если вместо JOIN предложить ему агрегат от where exists (план должен быть похожий, ну а вдруг он устанет упорствовать ~пимерно так~ Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 16:57:58 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил, Может, вот так в угадайку поиграем: Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 16:58:18 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\, вот да, тоже интересно хотя планы не должны разниться с джойном чо ж оно так упирается ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:03:21 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\, ЗЫ а корреляты кошерно таки прикручивать после агрегации, а не в процессе. так оно дешевле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:05:58 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил, Я исхожу из того, что проще пробежаться по одной табличке и что-то отфильтровать, вместо того, чтобы что-то соединить по условию и потом все равно фильтровать. Достаточно часто бывает удачно. В моем варианте соединения быть не должно. Так, пара-тройка значений отобрана уже в память (где-то 100 значений) и больше не рассчитывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:09:28 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил/\/\/\/\/\/\, ЗЫ а корреляты кошерно таки прикручивать после агрегации, а не в процессе. так оно дешевле. Насколько я здесь вижу, они - часть условия агрегации. То есть все равно агрегация на последнем этапе должна быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:11:44 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправилон таки упорствует Код: sql 1. а что , если вместо JOIN предложить ему агрегат от where exists (план должен быть похожий, ну а вдруг он устанет упорствовать ~пимерно так~ Оценки дикие конечно. Вот эта Код: sql 1. тоже непонятна. Оптимизатор выбирает проход по индексу при возврате 1М записей, что соответствует размеру всей таблицы. best_time, а покажите пожалуйста план для Код: sql 1. Вместе с вариантом `EXISTS` конечно же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:13:36 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\--поправил, <> В моем варианте соединения быть не должно. Так, пара-тройка значений отобрана уже в память (где-то 100 значений) и больше не рассчитывается. у in в пж обычно план как у join , а у NOT IN -- как у ANTI JOIN (LEFT JOIN ...WHERE ...NULL) -- если не врёт память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:14:23 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\, Эм. Я пошел по формальному пути. Верю исходному запросу. А вообще да, эти поля можно прикрутить в последнюю очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:17:22 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\--поправил, Может, вот так в угадайку поиграем: Код: 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. 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. 28. 29. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:18:45 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov <>Оценки дикие конечно. <>Оптимизатор выбирает проход по индексу при возврате 1М записей, что соответствует размеру всей таблицы. да единственное что напрашивается -- enable-ы и cost-ы получены не совсем в том сеансе, что вот эти вот планы. а в том, где планы -- там все несколько иначе выставлено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:19:54 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил... обычно план... Когда "обычно" - проблем никаких. Не очень обращал внимание. А вот когда не обычно... Оптимизатор такие чудеса откаблучивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:20:05 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov--поправилон таки упорствует Код: sql 1. а что , если вместо JOIN предложить ему агрегат от where exists (план должен быть похожий, ну а вдруг он устанет упорствовать ~пимерно так~ Оценки дикие конечно. Вот эта Код: sql 1. тоже непонятна. Оптимизатор выбирает проход по индексу при возврате 1М записей, что соответствует размеру всей таблицы. best_time, а покажите пожалуйста план для Код: sql 1. Вместе с вариантом `EXISTS` конечно же. Код: sql 1. Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:22:03 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил, а если тупо вписать otahotel_2014w32 вместо otahotel ? план не поменяется ? -- может быть он[, оптимайзер бишь 9.2.8,] аппендить при хешджойне не обучен ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:25:52 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил--поправил, а если тупо вписать otahotel_2014w32 вместо otahotel ? план не поменяется ? -- может быть он[, оптимайзер бишь 9.2.8,] аппендить при хешджойне не обучен ? Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:28:50 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил, Было бы интересно глянуть на план в 9.3. Хотя бы только на один запрос по этим 4 таблицам... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:29:03 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time, ну вот раньше 16469948 выяснилось, что таки обучен Код: sql 1. но оценивает в 1.5 раза дороже чем Nested Loop Приведите EXPLAIN ANALYZE этого случая [да и извиняюсь за описки и одумки -- невнимательность] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:33:22 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил, Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:44:15 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_time, да, пожалуй он мало ошибается (2-3 -- допустимо для сложных запросов). т.ч. [намного] лучше уже не будет. ещё выкиньте всё ненужное из агрегата (например константу -- первое поле) -- прикрутите после. -- немного сэкономите работу оптимайзеру. (каким бы путём не пошли). А всю расшифровку прикрутите после свертки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 17:54:57 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил1. свернуть все 65 лямов на проходе (100 секунд --см выше), потом поджойниться - выиграем вполовину, но никак не больше или (совсем другое) 2. взять в CTE 100 id, и для каждого из них в конструкции with recursive взять свой агрегат (что оптимайзер [+-километр] и должен делать, но я как-то это плохо читаю). Первый вариант выглядит оптимальным и выигрыш вполне себе хороший. Второй был представлен ТС в начальном посте (и я на нем зациклился). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 18:31:48 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
vyegorov--поправил1. свернуть все 65 лямов на проходе (100 секунд --см выше), потом поджойниться - выиграем вполовину, но никак не больше или (совсем другое) 2. взять в CTE 100 id, и для каждого из них в конструкции with recursive взять свой агрегат (что оптимайзер [+-километр] и должен делать, но я как-то это плохо читаю). Первый вариант выглядит оптимальным и выигрыш вполне себе хороший. Второй был представлен ТС в начальном посте (и я на нем зациклился).скорее всего тоже выйдет все 200сек с гаком - там ф-я неизвестной стоимости [hotcore.parity_type(av.*, 'OTA') result] 65млн раз посчитается -- по ней, в частности, свертка. не факт, что она immutable ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 18:41:01 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
--поправил, а даже если и имутабна - записи-то все разные бгг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 18:44:15 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
всем спасибо! Выкинул функцию. Стал считать по всей партиции. Укладываюсь вроде в 10 мин. Меня это устраивает. (если и завтра будет будет 10 мин ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 23:13:47 |
|
||
|
улучшить время выполнения
|
|||
|---|---|---|---|
|
#18+
best_timeУкладываюсь вроде в 10 мин. Изначально ж было чуть более 4 минут всего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 23:58:18 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1998523]: |
0ms |
get settings: |
4ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
83ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 360ms |

| 0 / 0 |
