|
|
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Все дело в волшебных пузырьках. Если целевая таблица - partitioned, то оптимизатор не может строить предположений, куда конкретно залягут вставляемые денные (кроме случаев эквисекционирования, но и там, подозреваю, сработает ровно так же). Поэтому распараллеливание производится следующим образом: каждый рабочий сервер обслуживает свою секцию целевой таблицы. Соответственно, сервера, читающие источник, раскидывают свои рекордсеты по серверам-приемникам согласно partition key (PX SEND PARTITION (KEY)). Это разумно и правильно, кроме одного ньюанса: в случае ТС де-факто весь поток данных должен свалиться в одну секцию целевой таблицы. Отсюда спецэффект: на запись работает только один сервер из восьми, все "вытягивается в нитку", читатели напрасно греют процессоры вычислением partition key - он все время один и тот же получается :) Если целевая таблица - не partitioned (включая случай, когда оптимизатор может определить, что приемником является единственная секция целевой таблицы - например, если указан partition for), то никакой необходимости вычисления partition key нет ввиду того, что писатели пишут в один общий сегмент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 10:08 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Волшебные пузырькиВсе дело в волшебных пузырьках. Если целевая таблица - partitioned, то оптимизатор не может строить предположений, куда конкретно залягут вставляемые денные (кроме случаев эквисекционирования, но и там, подозреваю, сработает ровно так же). Поэтому распараллеливание производится следующим образом: каждый рабочий сервер обслуживает свою секцию целевой таблицы. Соответственно, сервера, читающие источник, раскидывают свои рекордсеты по серверам-приемникам согласно partition key (PX SEND PARTITION (KEY)). Это разумно и правильно, кроме одного ньюанса: в случае ТС де-факто весь поток данных должен свалиться в одну секцию целевой таблицы. Отсюда спецэффект: на запись работает только один сервер из восьми, все "вытягивается в нитку", читатели напрасно греют процессоры вычислением partition key - он все время один и тот же получается :) Если целевая таблица - не partitioned (включая случай, когда оптимизатор может определить, что приемником является единственная секция целевой таблицы - например, если указан partition for), то никакой необходимости вычисления partition key нет ввиду того, что писатели пишут в один общий сегмент. Было такое предположение, но остаётся объяснить пару "нюансов". Почему если из целевой таблицы удалить bitmap индекс, то оракл вполне может обходится без передачи partition key(через хинт) и не вытягивается в нитку? И вторая штука которую при этом я не смог себе объяснить. Если следовать этой логике, то сколько максимум партиций сможет обслужить сервер при таком подходе? Предположим что в запросе дано 2 параллели, а нужно вставить данные в 200 партиций. Каком будет алгоритм работы PX процессов в этом случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 10:17 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PVПочему если из целевой таблицы удалить bitmap индекс, то оракл вполне может обходится без передачи partition key(через хинт) и не вытягивается в нитку? Покажи что имеешь ввиду. Pavel_PV И вторая штука которую при этом я не смог себе объяснить. Если следовать этой логике, то сколько максимум партиций сможет обслужить сервер при таком подходе? Логически - сколько угодно. Если не PWCP (как в твоем "идеальном" плане), то лишнее тупо буферизуется между PX SEND/PX RECEIVE пока не забьет доступную PGA, затем вываливается в temp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 10:25 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PV, Столько воды, а в итоге все вылилось в "почему не параллелится". Можешь сделать тест-кейс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 13:40 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Волшебные пузырьки, вода сплошная. pdml_reason : bitmap indexes are defined, причина не распаралеливания. Посмотрите статистики выполнения sql monitor отчета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 13:53 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
KamaelВолшебные пузырьки, вода сплошная. pdml_reason : bitmap indexes are defined, причина не распаралеливания. Посмотрите статистики выполнения sql monitor отчета. Пардон, это причина только для не партиционированной таблицы. Но по статистикам выполнения, паралелится всё равно слабо. pdml_reason : bitmap indexes are defined, причина не распаралеливания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 14:48 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Но без индекса паралелится ровненько по всем PX. как бы yне какой нибуть рестрикшн на pdml bitmap ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 15:03 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Да ну...ora601табличку там посмотри, ага) /Я не говорил, что это медленно - я говорил что NOLOGGING операции трудно представить уместным на рабочей базе. Не читайте между строк. Детский сад, штаны на лямках. И в чем проблема NOLOGGING на продукционной базе? Тем более, или это ETL/DWH, и исходные данные в любом случае сохранены? Кроме того, после INSERT /*+ NOLOGGING вполне достаточно сделать SELECT /*+ PARALLEL - это инициирует direct patch read, т.е. форсированный сброс грязных блоков на диск, все счастливы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 15:14 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousora601Pavel_PV, + CTAS NOLOGGING должно работать way more faster > CTAS. Если данные настолько малоценны, что ради производительности их можно гонять в nologging (привет стендбаям, репликами и всяким PITR) - то нет особого смысла пользовать для трансформации оракель. Возможно, достаточно будет продрать исходное файло awk/sed/питоном и использовать результат в БД как external table. Или в хадуп какой свалить. а мужики говорят что хадуп уже не актуален: https://habrahabr.ru/post/303802/ и, кстати, в Oracle давно запилили потоковую пред-обработку external table/file http://www.oracle.com/technetwork/issue-archive/2011/11-mar/o21nanda-312277.html можно "результаты продирания" вообще нигде не хранить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 15:19 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
KamaelНо без индекса паралелится ровненько по всем PX. как бы yне какой нибуть рестрикшн на pdml bitmap ну, структура у bitmap индекса такая, что его довольно проблематично построить методом split/merge вообще говоря для подобных случаев как раз и придумано субпартицирование - Oracle не провидец, и разработчик волен сам задать необходимый ему уровень изоляции (читай распараллеливания) данных. в т.ч. волен сам запускать параллельные сессии, в явном виде, а не через PQ хинты - на direct path insert налагаются ведь простые ограничения - каждая сессия/процесс должна вставлять строго в свой сегмент так почему бы его и не соблюдать в явном виде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 15:26 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
кстати, ТС - включение опции COMPRESS на таблице назначении, как ни странно - может увеличить скорость вставки. там не LZW компрессия, скорее разновидность RLE, тем не менее - она уменьшает число байт на запись, в т.ч. уменьшает объем сгенерированного redo CREATE TABLE test1 NOCOMPRESS AS SELECT * FROM dba_objects; vs CREATE TABLE test2 COMPRESS AS SELECT * FROM dba_objects; дает уменьшение размера redo в ~ два раза. а так как время I/O это чуть менее, чем 90% от total elapsed... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 15:36 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
[quot Pavel_PV]ora601пропущено... В (HYBRID TSM/HWMB) Скорее. Собственно не вижу изменений. Причем знаешь в чем парадокс, стоит убить bitmap index и всё сразу начинает работать как положено, хинт pq_distribute помогает. Но если он оказывает такое влияние на потоки передачи данных, почему при использовании конструкции "partition(for)" это влияние сразу исчезает. "(HYBRID TSM/HWMB)" Я не получил при тестах (что впрочем не суть), но возвращаясь к кейсу партишен ексчендж vs пдмл (Обьем 12 млн) : Код: 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. 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. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 16:21 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
dbpatchKamaelНо без индекса паралелится ровненько по всем PX. как бы yне какой нибуть рестрикшн на pdml bitmap ну, структура у bitmap индекса такая, что его довольно проблематично построить методом split/merge вообще говоря для подобных случаев как раз и придумано субпартицирование - Oracle не провидец, и разработчик волен сам задать необходимый ему уровень изоляции (читай распараллеливания) данных. в т.ч. волен сам запускать параллельные сессии, в явном виде, а не через PQ хинты - на direct path insert налагаются ведь простые ограничения - каждая сессия/процесс должна вставлять строго в свой сегмент так почему бы его и не соблюдать в явном виде? Не уловил идею, каким образом самому запускать параллельные сессии? Речь о пакете dbms_parallel_execute или о чем-то ином? Про COMPRESS спасибо. Он уже есть правда, но изначально был задуман не для этой цели, а куда более банальной - место. ora601, хороший тест-кейс. Но думаю этот перекос во времени ctas VS insert PDML связан с разной длиной строки в моем случае + разным количеством индексов. В моем случае индекса три, я только что провёл тест на своей тестовой таблице(аналог бою) и итог: на создание 3-х индексов я потратил 298sek, при этом строка index maintenance исходя из EM выполнялась 212sek. В твоем тест кейсе мне понравилось наглядно отличие времени вставки с указанием "partition for" и без него, я о последних двух insert-ах. Ниже кину вырезку: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Повторюсь. Грубо говоря, на данный момент, это в точности то, что я хочу победить. Или хотя бы понять почему план 1-го нельзя привести к плану 2-го. Что загадочного в этой конструкции partition for, что такого она подсказывает ораклу чего он не может понять хинтами и штатными средствами(аля DS). Ну т.е. что подсказывает понятно, но неужели нет других вариантов подсказать тоже самое. Что касается ctas. Если необходимо я могу подготовить тест кейс с аналогом моих данных. Но можно поверить, что при определенном кол-ве индексов и определенной длине строки разница между ctas => созданием индексом и insert /*+ APPEND ENABLE_PARALLEL_DML*/ нивелируется. Я хотел сделать тесткейс, но 20 минут ждал заполнения данных в табличку и вырубил - подумал шипко долго ) вставлял всего 10КК. P.S> А помню где-то читал, что оракл собирается в partition for сделать возможность использования переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 06:13 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PVdbpatchтак почему бы его и не соблюдать в явном виде? Не уловил идею, каким образом самому запускать параллельные сессии? Речь о пакете dbms_parallel_execute или о чем-то ином? да как угодно можно запускать, в т.ч. и через этот пакет. я говорил больше о сути - ты через субпартиции максимально изолируешь параллельные сессии друг от друга, чтоб они там не бодались за всякие латчи на ASSM header blocks или free lists какие в т.ч., и не упирались конкуренцией во всякие глобальные и битмап индексы, а workerов запускаешь сам, не надеясь на всякие мутные экристики или предположения от PQ в простейшем случае - на клиенте (чем ты там запускаешь) делаешь несколько соединений и вперед понятное дело, что тождественное субпартицирование желательно сделать и на источнике данных, чтоб не читало несколько раз одно и то-же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 12:52 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
dbpatchPavel_PVпропущено... Не уловил идею, каким образом самому запускать параллельные сессии? Речь о пакете dbms_parallel_execute или о чем-то ином? да как угодно можно запускать, в т.ч. и через этот пакет. я говорил больше о сути - ты через субпартиции максимально изолируешь параллельные сессии друг от друга, чтоб они там не бодались за всякие латчи на ASSM header blocks или free lists какие в т.ч., и не упирались конкуренцией во всякие глобальные и битмап индексы, а workerов запускаешь сам, не надеясь на всякие мутные экристики или предположения от PQ в простейшем случае - на клиенте (чем ты там запускаешь) делаешь несколько соединений и вперед понятное дело, что тождественное субпартицирование желательно сделать и на источнике данных, чтоб не читало несколько раз одно и то-же Понял о чем ты. Это конечно хорошее глобальное решение именно на уровне разработки, но тут не выйдет таким образом поступить. Есть структура и под неё пляшем. Вчера перекопал море документации в надежде понять о чудодействии "partition for", но что-то ничего не нашёл. Думаю, может у Тома спросить, что они туда зашили такого "красивого". На выходных всё равно покопаю, если ответ найду отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 04:37 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39485887&tid=1885622]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
83ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 413ms |

| 0 / 0 |
