|
|
|
как ускорить 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 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевSYМожет я еще не проснулся, но вышесказанное есть нe что иное как: К этому обсуждение и пришло. (Хотя в общем случае нет ибо truncate внетранзакционен, а значит будет момент времени, когда старое порушили, а нового так и не завезли. :)) возможно уменьшение времени между уничтожением (truncate) и завершением insert с использованием промежуточной таблицы - и swap partition между ней и целевой. наши замеры говорят, что случаи: а) расчет во временной табл - 30 мин, затем truncate и insert (append) в постоянную - еще 30 мин б) расчет во временной (определенной как постоянная с секционированием как у целевой) - около 60 мин, затем truncate и swap partition (0 мин) - почти равны по времени работы (оба около часа, разницы на уровне погрешности замера) есть ли еще способы ускорения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 16:45 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12, У Вас inser во временную идет тоже чехом? И при этом insert туда, а потом в постоянную быстрее? Или просто insert во временную быстрее? Если второе, то понятное дело - все ж таки журналирование операций оно не бесплатное. И ест ввод-вывод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 16:46 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Alexus12есть ли еще способы ускорения? В зависимости от способа заполнения на стадии предварительных расчетов, Может заработать nologging, а потом включить logging и swap partition. Для примера. Если же обновления идут одинарными операциями, то возможно под миллионы добавляемых строк можно будет сменить tablespace на MSSM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 17:07 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевК этому обсуждение и пришло. (Хотя в общем случае нет ибо truncate внетранзакционен, а значит будет момент времени, когда старое порушили, а нового так и не завезли. :)) Ну это-то как раз просто. Партицированная тaблица (например по дням если процесс раз в дeнь). Каждая транзакция ссылающаяся на таблицу сохраняет дату начала транзакции - TRUNC(SYSDATE) и при обращeнии к таблице использует партиционный_ключ = датa_начала_транзакции. Ну и создаем drop old partition по расписанию. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 17:11 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
SY, swap не проще drop? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 17:17 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
SYНу это-то как раз просто. Упс, забыл упомянуть - у меня данные на завтра грузятся сегодня, посeму TRUNC(SYSDATE). Если по-принципу смотреть данные последней загрузки, то нужно хранить дату загрузки в базе и при обращeнии к таблице использoвaть партиционный_ключ = (SELECT MAX(дата_загрузки) FROM таблица_загрузки). SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 17:22 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевSY, swap не проще drop? В общем случае swap не катит - транзакция начавшаяся до последней загрузки должна продолжать их использовать. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 17:25 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
SYВ общем слуае swap не катит - транзакция начавшаяся до последней загрузки должна продолжать их использовать. Согласен. Но тогда, по хорошему, еще нужно следить за самой долгой транзакцией, а до техз пор ничего не дропать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 17:55 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевНо тогда, по хорошему, еще нужно следить за самой долгой транзакцией, а до техз пор ничего не дропать. :) Ну если транзакции долгоиграют сутками то проблема скорее всего куда глубже . SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 13:03 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
Подниму старую тему, нежели создавать новую. Delete из партиции, insert 500 тыс. строк В во время данной операции log file switch начинает пожирать CPU, и иногда это приводит к тормозам в работе пользователей. Если я правильно гуглю, это запись в архивлоги. В поисках решения, подумал о nologging на таблицу и insert append. Но волнует вопрос: влияет ли nologging и insert append на восстановление данных из бэкапа. Если вдруг понадобится восстановить базу из бжкапа, кроме потери данных в таблице, есть еще какие-то нюансы о которых следуте знать? Бэкап полный раз в неделю, а подобную операцию приходится раз в сутки делать. Сокращу: Хочу перейти на truncate, insert append, rebuid index и не логгировать, так как при потере данных можно будет их заново рассчитать за разумное время. Есть ли угроза другим данным при восстановлении ( у Бурлесона прочел что-то страшное и подозрение закралось)? Лучше ли будет перенести в отдельный tablespace такие таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 10:12 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
nata44845, А зафиксировать статистику для этих темп таблиц не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 10:30 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
ссу, 1. Делайте бэкап после ваших манипуляций, например. Возможно, ваш ДБА подозревает, что вы хотите сделать и предусмотрительно включил режим FORCE LOGGING; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2017, 10:37 |
|
||
|
как ускорить MERGE
|
|||
|---|---|---|---|
|
#18+
ссуDelete из партиции, insert 500 тыс. строк В во время данной операции log file switch начинает пожирать CPU, и иногда это приводит к тормозам в работе пользователей. Если я правильно гуглю, это запись в архивлоги. Если Вы правильно гуглите и у Вас долго ждут при переключении активного журнала из-за того, что цепочка замкнулась, а перелететь в архив не успевает. То в ервую очередь стоит подумать над увеличением скорости или удлинением цепочки, чтоб ее хватало на пиковую нагрузку с запасом, а потом она медленно рассасывалась. И IMHO только после того, как это не поможет, над вариантом который увеличит время и трудоемкость восстановления после сбоя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 11:15 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1886555]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
75ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 438ms |

| 0 / 0 |
