|
|
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Всем доброго. Есть задача, нужно быстро вставить порядка 50млн строк. Выполнять каждый день, берём из одной партиции + совершили небольшие манипуляции и вставить в другую. На данный момент самое быстрое Код: plsql 1. 2. Но хочется ещё быстрее. Пробовал и через exchange partition, выйгрыша нет. Смотрел документацию, но может не обратил внимание - есть ли возможность в оракл сделать дубликат партиции? Т.е. аналог exchange partition, но только копию. Есть мысль, что это позволит повысить скорость. Если упустил какой-то вариант буду признателен за подсказку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 11:08 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PV, Можно попробовать CTAS + Exchange Partition ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 12:28 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
CTAS + Exchange partition пробовал, время потраченное на ctas сопоставимо со временем вставки в партицию и это думаю вполне логично. В рамках темы хотел спросить про особенность. Не совсем понятно почему при "partition for" insert работает быстрее чем без него, причем порядка ~30%. При этом во втором случае из плана исчезает строчка partition send key(если верно запомнил), но основная особенность в том что при указании "partition for" таблица из которой читаются данные полноценно читается в параллель, а без "partition for" чтение в 1 нитку. Не думаю, что это связано именно с чтением таблицы, видимо есть какая-то связь именно с распараллеливанием и передачей данных между потоками. Вышеизложенное исходя из поведения в EM. По необходимости могу приложить планы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2017, 05:47 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PVCTAS + Exchange partition пробовал. without validation или с ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 19:34 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PV, + CTAS NOLOGGING должно работать way more faster > CTAS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 19:41 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
ora601Pavel_PV, + CTAS NOLOGGING должно работать way more faster > CTAS.Сомневаюсь, что NOLOGGING хоть где-то применим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 20:54 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Да ну..., табличку там посмотри, ага) https://recurrentnull.wordpress.com/2013/06/30/direct-path-nologging-ctas-and-gtt-a-comparison-of-undo-and-redo-generated/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 21:19 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
ora601табличку там посмотри, ага) /Я не говорил, что это медленно - я говорил что NOLOGGING операции трудно представить уместным на рабочей базе. Не читайте между строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2017, 23:19 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
ora601 c without validation конечно делал, отрабатывает быстро. Но само заполнение той самой таблицы с которой будет осуществляться обмен не очень быстрый. Как итог - профита фактически нет. Но тут мне ещё нужно - INCLUDING INDEXES. CTAS + NOLOGGING разумеется. Но хотя правильнее сказать, что таблица создана с параметром NOLOGGING, и выполняется в ней insert table as select. Справедливости ради нужно сказать, что если выбросить все индексы из таблицы то вставка выполняется на очень хорошем уровне, с индексами всё хуже. По распределению примерно так - 1/3 на голую вставку и 2/3 на всё остальное. Вариант с отключением индексов и их последующим пересчетом не должен дать профит ввиду использования ENABLE_PARALLEL_DML. Guest не совсем понимаю почему NOLOGGING не может быть применена на рабочей базе? В данной ситуации вполне и никаких проблем в этом не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 12:38 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PVНо хотя правильнее сказать, что таблица создана с параметром NOLOGGING, и выполняется в ней insert table as select. Ну так CTAS nologging и insert (не дайрект пас) into nologging разные вещи по производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 14:34 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PV Код: plsql 1. 2. ora601insert ( не дайрект пас ) Ммм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 14:51 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Говорим про кейс partition exchange. " Но само заполнение той самой таблицы с которой будет осуществляться обмен не очень быстрый" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 15:01 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
ora601" Но само заполнение той самой таблицы с которой будет осуществляться обмен не очень быстрый" Нет ни одной разумной причины отказываться от direct insert при заполнении промежуточной таблицы - при условии выполнения всех ограничений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 15:07 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Ну так я о том же. ТС - тоже вопрос, на промежуточной таблице индексы нологгинг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 15:10 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
ora601Pavel_PV, + CTAS NOLOGGING должно работать way more faster > CTAS. Если данные настолько малоценны, что ради производительности их можно гонять в nologging (привет стендбаям, репликами и всяким PITR) - то нет особого смысла пользовать для трансформации оракель. Возможно, достаточно будет продрать исходное файло awk/sed/питоном и использовать результат в БД как external table. Или в хадуп какой свалить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 15:12 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PVесли выбросить все индексы из таблицы то вставка выполняется на очень хорошем уровне, с индексами всё хуже. По распределению примерно так - 1/3 на голую вставку и 2/3 на всё остальное. Вариант с отключением индексов и их последующим пересчетом не должен дать профит ввиду использования ENABLE_PARALLEL_DML.А почему правда не вырубить индексы, вставить данные, и потом ALTER INDEX /*+PARALLEL*/ REBUILD PARTITION ? (возможно, херню сморозил) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 15:22 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
тьфу тоесть ALTER INDEX REBUILD PARTITION PARALLEL [n] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 15:26 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PV сделай так... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. https://www.akadia.com/services/ora_parallel_processing.html Только учти, таблица будет расти прямо пропорционально объему вставленных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2017, 16:26 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Коллеги, запутал вас видимо маленько. Почему insert не direct-path? Может я что-то не понимаю, можешь пояснить по возможности? Ниже опишу всё как есть. Давайте по пунктам, вот этот insert insert /*+ PARALLEL(8) APPEND ENABLE_PARALLEL_DML NO_GATHER_OPTIMIZER_STATISTICS*/ into table1 partition for(date ****) именно и вставляет данные или в основную таблицу или в ту с которой будет потом произведён обмен партицией. Я говорю о хинтах, они сохраняются, общий формат(куда вставлять и т.д.) конечно немного видоизменяется. На данный момент я вообще отказался от промежуточной таблицы и операции exchange partition, вышеуказанным insert-ом сразу вставляю данные из источника. Профита от заполнения сначала промежуточной таблицы и затем перезаписи в основную я не увидел. andrey_anonymous по NOLOGGING тут свои особенности, твою мысль я понял. Считай, что ты просто перекладываешь данные и если что пойдет не так возьмешь и переложишь повторно. --Eugene-- нет смысла отключать индексы, чтобы потом их пересчитать. Скорости от этого много не выйграть. В этом отчасти и заключается смысл использования ENABLE_PARALLEL_DML. Проверить просто, сделай вставку данных в большую таблицу с этим хинтом и без него, параллельно проследи на нагрузку на объекты во время выполнения запроса через ASH. Насколько я помню что-то в документации есть об этом. Evgeny2, я и так использую ENABLE_PARALLEL_DML, но включаю через хинт. Сейчас уже пришёл к итоговому коду который будет использован для вставки. Но проблема с распределением даных между потоками. Не могу сообразить как привести всё к нужному виду. Хинт "pq_distribute(A none)" не помогает так сказать ). Итак поехали: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Далее смотрим вот этот план: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Код: 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. Тот план который нужен: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Код: 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. Второй селект отрабатывает в два раза быстрее на моих данных и моих объемах. Исходя из EM обработка идёт в 8 потоков, первый же вытягивается в нитку и медленно+уныло пытается что-то сделать. Хочется к 1-му запросу хинтами прикрутить план второго, а не выходит. P.S> Использовать конструкцию partition for/partition в самом запросе я не могу ввиду того, что в них нельзя передавать параметры. Пытался использовать функцию dataobj_to_mat_partition => oracle выдает ошибку. Опущу подробности, но в общем эта функция конечно предназначена для другого и что иногда она работает в подобных случаях скорее совпадение. P.P.S> можно конечно засунуть весь запрос в sql_text и затем используя execute immediate....но что-то мне подсказывает, что можно решить проблему хинтами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 10:11 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PVобработка идёт в 8 потокова если ради интереса убрать DEGREE OF PARALLEL вообще (чтобы СУБД сама выставила) - пробовал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 11:39 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Если просто убрать хинт "parallel(8)" то параллели будут те которые были использованы при создании таблицы. Если убрать только 8-ку будет разрешенный максимум который =8. Да и тут не в этом дело, тут скорее дело в строчке плана Код: plsql 1. и в этой радости: Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 12:08 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PV Да и тут не в этом дело, тут скорее дело в строчке плана Код: plsql 1. и в этой радости: Код: plsql 1. В (HYBRID TSM/HWMB) Скорее. Это новый метод direct-path pdml для 12с, который хорошо работает для сингл сегмент вставок. Но хинта на него нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 13:59 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
ora601Pavel_PV Да и тут не в этом дело, тут скорее дело в строчке плана Код: plsql 1. и в этой радости: Код: plsql 1. В (HYBRID TSM/HWMB) Скорее. Это новый метод direct-path pdml для 12с, который хорошо работает для сингл сегмент вставок. Но хинта на него нет. Да знаю про эту фишку новую "HYBRID TSM/HWMB". Если честно эти фичи 12-ки, ну вот честно слов нет. Это так сказать моё общее отношение к 12с, ждали большего от IM и прочего :). Ладно проверим твою гипотезу через отрубание новых фишек используя OPTIMIZER_FEATURES_ENABLE: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Код: 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. Собственно не вижу изменений. Причем знаешь в чем парадокс, стоит убить bitmap index и всё сразу начинает работать как положено, хинт pq_distribute помогает. Но если он оказывает такое влияние на потоки передачи данных, почему при использовании конструкции "partition(for)" это влияние сразу исчезает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 04:35 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
Pavel_PV, egrep -i "deadlock|t1 a" *.trc Может не заметил. Есть что-нибудь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 08:36 |
|
||
|
Быстрая вставка данных
|
|||
|---|---|---|---|
|
#18+
dba123 я привёл эти таблицы как пример, чтобы показать различие в планах точно такое как у меня происходит на боевых. Повторюсь, речь именно о том как идёт распараллеливание. В одном случае всё работает в 8 потоков и отлично, в другом всё вытягивается в одну нитку. Стоит указать "partition for" и всё чудесным образом взлетает. Но в доке нет информации о "таком чуде". Но всё строится в базе своей на планах, поэтому ищем различия в планах и хинтах => приводим всё к тому который работает => получаем то, что нужно. Я считаю, что строчка "PX SEND PARTITION (KEY)" каким-то образом тормозит весь процесс в данном случае. Почему сказать не могу, знаний не хватает имхо ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 08:57 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39482716&tid=1885622]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 477ms |

| 0 / 0 |
