Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
Наблюдение. Результаты сложного запроса, возвращающего небольшое число строк удобно записать во врем. таблицу, прежде чем делать JOIN с большими списками. Если число записей во временной таблице меньше 900-1100, то время исполнения Код: plaintext 1. 2. 3. Если записей 1200+, то время исполнения растет экспоненциально. На статических таблицах все довольно линейно, планы запросов предсказуемы и пр. С чем это связано? Похоже, при каком-то пороговом размере temp_table ее начинают писать на диск... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 18:07 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
Попробуйте увеличить temp_buffers. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 18:41 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
Обычно свап происходит в директории pgsql_tmp внутри $PGDATA. Если там не создаются временные файлы в момент выполнения запроса, значит на диск ничего временного не скидывается. Что касается вашего наблюдения про джойны больших таблиц, то оно абсолютно верное. Постгрес не всегда может оптимизировать такие запросы самостоятельно. Если по какой-то таблице из джойна в условиях имеется большая селективность (то есть заранее известно, что рядов это условие вернет не очень много, меньше 10^4, к примеру), то зачастую переписывание джойна на подзапрос дает прирост производительности на пару порядков. И делать при этом временную таблицу нет необходимости -- вы просто в большой запрос добавляете подзапросом тот SQL, которым вы делаете временную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 22:02 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
начиная с 8.3 ещё в explain analyze можно посмотреть какой метод используется для сортировки, там же пишется в памяти или на диске: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 00:46 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
Ёшначиная с 8.3 ещё в explain analyze можно посмотреть какой метод используется для сортировки, там же пишется в памяти или на диске: Спасибо, я что-то не мог сообразить, что можно в транзакции заполнить врем. таблицу, а уж потом explain analyze ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 11:16 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
iz Если по какой-то таблице из джойна в условиях имеется большая селективность (то есть заранее известно, что рядов это условие вернет не очень много, меньше 10^4, к примеру), то зачастую переписывание джойна на подзапрос дает прирост производительности на пару порядков. Верно ли я понимаю, что конструкуция select ... from ( select ... from ( select ....from ( select ....from ) as A00 ) as A01 )as A02 всегда будет исполнена в явном порядке: - A00 (тут должна быть хорошая селективность) - А01 - А02 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 11:22 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
извините, теги не поставил Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 11:23 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
tadminизвините, теги не поставил Код: plaintext 1. 2. 3. 4. 5. 6. Да, такой запрос будет выполняться наиболее естественным способом, начиная от самого внутреннего подзапроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2008, 00:04 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
izвы просто в большой запрос добавляете подзапросом тот SQL, которым вы делаете временную таблицу. tadminВерно ли я понимаю, что конструкуция Код: plaintext 1. 2. 3. 4. 5. 6. - A00 (тут должна быть хорошая селективность) - А01 - А02 izДа, такой запрос будет выполняться наиболее естественным способом, начиная от самого внутреннего подзапроса.нет. порядок обращения к двум самым внутренним таблицам (A00, A01 у вас, или t2 и t3 в моем примере) задать нельзя, даже уменьшив from_collapse_limit и join_collapse_limit Код: 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. 65. 66. 67. 68. 69. 70. 71. 72. 73. Код: 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. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2008, 12:16 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
я, господа, пока так и не решил свой вопрос. Не стал постить сюда свои explain, потому что слишком много таблиц и дело не в конкретном примере, а в моем понимании. До этого случая у меня в большинстве случаев планы получались довольно оптимальны. Там, где это не работало - делал view и, как правило, их комбинация давала отличный результат. задача возникла при сложной комбинации условий: - для поиска и отображения товара используется функция, которая выдает динамический sql для формирования курсора. - параметры поиска - фрагмент названия артикула, или имени (nullable), ID каталога (nullable) - в курсор отдается список найденных артикулов с остатками товара и ценами. - view (или запросы), которые подтягивают действующие цены и остатки довольно сложны. Решение: Экспериментально обнаружил, что если сделать предсказание о релевантность поиска (длина поисковой строки), то можно сделать более менее оптимальный выбор. Если найдено мало артикулов, то они запихиваются во врем. таблицу, а уж потом JOIN с дорогими запросами. Если ожидается большой список (пустая строка поиска или 1-2 символа), то дешевле оказывается делать запрос, используя естественный порядок сортировки индексов. В чем проблемы сейчас: есть (упрощенно) 2 больших таблицы (~40K), по которым может идти поиск: - собственно артикулы (поиск по коду, названию и пр.) - их членство в каталогах Если используются оба критерия, то hash join между ними может занять слишком много времени, так что выдача 5-6 строк или 800-1000 строк занимает одинаковое время. Как заставить планировщик первым делать более "релевантный" запрос - не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2008, 12:49 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
tadminВ чем проблемы сейчас: есть (упрощенно) 2 больших таблицы (~40K), по которым может идти поиск: - собственно артикулы (поиск по коду, названию и пр.) - их членство в каталогах Если используются оба критерия, то hash join между ними может занять слишком много времени, так что выдача 5-6 строк или 800-1000 строк занимает одинаковое время. Как заставить планировщик первым делать более "релевантный" запрос - не понимаю.если я правильно понял ("hash join между ними может занять слишком много времени"), задача не только "первым делать более релевантный запрос", но и после этого выбирать во втором подзапросе ограничивая по join-критерию по данным, полученным в первом подзапросе, а условие на второй подзапрос проверять фильтром. получилось так сделать, только внимание, этот запрос эквивалентен outer join. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2008, 13:49 |
|
||
|
накладные расходы для временной таблицы
|
|||
|---|---|---|---|
|
#18+
Спасибо! Кажется, начинаю понимать. У меня, похоже, на каждом уровне select были заданы недостаточно жесткие критерии. Т.е. итоговый результат был правильным, но на уровне каждого подзапроса оставалось много лишнего, что потом и отсекалось по окончании hash join. Проверю - отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2008, 16:33 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35277875&tid=2004403]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 364ms |

| 0 / 0 |
