|
|
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
дано: oracle 11.2 временная таблица, в которую сваливается результат многошагового расчета (10 млн строк на дату) целевая постоянная таблица, в которую нужно сMERGEить то, что получилось во временной, а именно: 1) апдейт измененного 2) инсерт нового 3) ДЕЛЕТ существующего в постоянной, но отстутствующего во временной текущий код - MERGE над результатом full outer join этих таблиц - работает от 1 до 6 часов в зависимости от того, как лягут звезды (везде FTS) вопрос - можно ли его ускорить и КАК? например, заменой MERGE на 3 вышеперечисленных отдельных действия? сомнения: а) merge не работает как append, т.о. insert+append должен быть быстрее б) но в 11.2 нельзя сделать update соединения , т.к. хинт bypass_ujvc не работает - все равно нужен merge? или есть хитрый массовый update? индексов на таблицах нет, на таких объемах они - зло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 16:52 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12, Если можно заблокировать таблицу целиком (а при массовом update всего и вся это нормально), То можно сделать в три прохода не заморачиваясь. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 16:59 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, А если EE с партиционированием, то и того проще. Меняешь партицию и все. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:00 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, В смысле в два прохода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:01 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus121) апдейт измененного 2) инсерт нового 3) ДЕЛЕТ существующего в постоянной, но отстутствующего во временной а может просто инсерт в пустую таблицу ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:05 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
123ййа может просто инсерт в пустую таблицу ? А чтобы она стала пустой перед этим delete :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:09 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Песец в том, что этот МЕРЖЕ сейчас (на пилоте) и работает как инсерт, т.к. в целевой таблице пусто, однако работает от 1 до 6 часов как раз пробуем заменить его на "просто инсерт+аппенд" ;) идея со swap partition тоже пришла, но уперлась в необходимость переобъявить временную постоянной, тк для временной партицирование запрещено. надо пробовать - возможно, это самый быстрый вариант для ПОЛНОГО пересчета но есть еще и ИНКРЕМЕНТАЛЬНЫЙ (внести изменения по ряду строк - несоклько млн) неужели здесь МЕРЖЕ тоже проиграет извратоконструкции "слить во временную новое, потом добавить из постоянной неизменное старое, потом поменять партиции"? если да - на кой ляд был придуман МЕРЖЕ вообще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 17:13 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
У меня были проблемы с мерже на временных таблицах из за невозможности их оценить, поотключала мерже на базе вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 21:11 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12если да - на кой ляд был придуман МЕРЖЕ вообще?Как минимум для апдейта, чтоб избежать коррелированного подзапроса для каждой строки когда обновляемый рекордсет не является key preserved. Кроме того, для возможности сделать update + insert + delete в одной транзакции. Да, есть системы к которых выполняются конкурентные merge с хитрой логикой и все работает транзакционно. Ты вместо того, чтоб здесь изливать свои эмоции лучше выложи в тег SRC результат для твоего SQL ID Код: plaintext Если подавляющее число строк вставляется, то, конечно, имеет смысл рассмотреть insert + append + parallel. nata44845У меня были проблемы с мерже на временных таблицах из за невозможности их оценить, поотключала мерже на базе вообще.Лучше б ты мозги включила, если есть что включать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2016, 22:31 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
nata44845У меня были проблемы с мерже на временных таблицах из за невозможности их оценить, поотключала мерже на базе вообще.Девушка, видимо, перепутала способ соединения источников данных( https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm#TGSQL94690]Sort Merge Join ) и оператор DML ( https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm] Merge statement ). И если первой (способ соединения источников данных) можно отключить на уровне параметров инстанса, то второе - только переписыванием кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 04:38 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopКроме того, для возможности сделать update + insert + delete в одной транзакции. Рамках одной операции же. В транзакцию несколько операций загнать не вопрос. А c режимом SERIALAZIBLE заморачиваться лень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 09:56 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Да, думаю про стейтмент, пишу про транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 10:29 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Если редакция EE, то insert select + (вместо commit) exchange partition. - если целевая табличка - секционированная, то повторять для каждой секции, ins в не-секционированню - если целевая табличка - не секционированная, то ins в табличку с единственной секцией (partition by range, key less than maxvalue). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2016, 13:51 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
А вообще, согласно моим наблюдениям, merge statement на заметном объеме - суть зло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2016, 13:53 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев123ййа может просто инсерт в пустую таблицу ? А чтобы она стала пустой перед этим delete :) а чтобы вообще без таблицы то то create ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2016, 15:00 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12, а можешь код скинуть посмотреть? Просто интересно. У меня похожая задача сейчас. Только кол-во данных в разы меньше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 17:45 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99, а нет смысла: заменили на truncat + insert(append) - работает в 2 раза быстрее чем МЕРЖЕ также попробовали заменить временную (global temp) таблицу на постоянную (с прицелом на swap partition) - но результат пока отрицательный - время работы по заливке данных во временную (полчаса) плюс последующий insert(append) в постоянную (еще полчаса) примерно равно работе сразу с постоянной (час) интересно узнать, какие у вас объемы и время работы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 19:42 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12также попробовали заменить временную (global temp) таблицу на постоянную (с прицелом на swap partition) - но результат пока отрицательный - Странно - а в новую таблицу Вы без append что-ли заливаете? Ибо перелив из временной в очищенную таблицу, не должен быть быстрее прямой заливки в очищенную (новую). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2016, 10:09 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12, у меня пока всего 3542 записи, будет больше, но не превысит 1000. Done in 0,203 seconds ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2016, 15:08 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99Alexus12, у меня пока всего 3542 записи, будет больше, но не превысит 1000. Done in 0,203 seconds *10000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2016, 15:59 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12интересно узнать, какие у вас объемы и время работы 250тыс записей "мерджится" из временной в постоянные таблицы общим объемом 250млн записей за 2.5часа 1.5млн записей из tmp в аналогичные таблицы общим объемом 50млн записей "мерджится" - 1.5часа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2016, 16:13 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Avotge, а инсертится сколько? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 11:12 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12дано: oracle 11.2 временная таблица, в которую сваливается результат многошагового расчета (10 млн строк на дату) целевая постоянная таблица, в которую нужно сMERGEить то, что получилось во временной, а именно: 1) апдейт измененного 2) инсерт нового 3) ДЕЛЕТ существующего в постоянной, но отстутствующего во временной Может я еще не проснулся, но вышесказанное есть нe что иное как: 1. ТRUNCATE постоянная таблица 2. INSERT /*+ APPEND */ постоянная таблица SELECT * FROM временная таблица Разве-что апдейт измененного касаeтся не всех полей постоянной таблицы. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 16:18 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
SYМожет я еще не проснулся, но вышесказанное есть нe что иное как: К этому обсуждение и пришло. (Хотя в общем случае нет ибо truncate внетранзакционен, а значит будет момент времени, когда старое порушили, а нового так и не завезли. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 16:30 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, именно так, но в случае когда важнее быстрее, чем транзакционно, выиграет именно truncate + insert(append) было бы интересно понять, почему insert(append) во временную таблицу около двух раз быстрее, чем в постоянную. конечно, постоянная секционирована (нужно сортировать) и журналируется, но только ли это дает замедление в 2 раза? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 16:37 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1886555]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 211ms |
| total: | 348ms |

| 0 / 0 |
