SAPфорум.RU https://sapboard.ru/forum/ |
|
UPDATE в цикле https://sapboard.ru/forum/viewtopic.php?f=13&t=95958 |
Страница 1 из 1 |
Автор: | art9-3 [ Ср, янв 17 2018, 21:31 ] |
Заголовок сообщения: | UPDATE в цикле |
Добрый день! Подскажите, пожалуйста. Как можно заменить UPDATE в цикле Code: LOOP AT mt_data REFERENCE INTO DATA(lr_data).
UPDATE zsd_nrv SET zprpst = '' WHERE zmode IN ('1', '2', '3') AND gjahr = lr_data->gjahr AND monat = lr_data->monat AND bukrs = lr_data->bukrs AND werks = lr_data->gjahr AND matnr = lr_data->matnr. ENDLOOP. |
Автор: | Удав [ Чт, янв 18 2018, 00:59 ] |
Заголовок сообщения: | Re: UPDATE в цикле |
Заменить Code: AND werks = lr_data->gjahr на Code: AND werks = lr_data->WERKS А если серьезно, при такой постановке задачи можно лишь уменьшить количество проходов цикла за счет удаления повторяющихся записей в mt_data по полям условия и делать COMMIT WORK через N записей.. |
Автор: | art9-3 [ Чт, янв 18 2018, 07:07 ] |
Заголовок сообщения: | Re: UPDATE в цикле |
Да, я понимаю. Понимаю, что можно считать все записи из этой таблицы заранее во внутреннюю таблицу, а потом передать таблицу в UPDATE, но этот вариант по оптимальности тоже не очень. Есть ли более оптимальные решения? Подскажите, пожалуйста. Если кто знает такой вариант. |
Автор: | UKY [ Чт, янв 18 2018, 10:26 ] |
Заголовок сообщения: | Re: UPDATE в цикле |
Если данные mt_data можно вытащить из БД, то можно попробовать поизвращаться таким способом: Code: UPDATE zsd_nrv SET zprpst = '' WHERE zmode IN ('1', '2', '3') AND EXISTS ( SELECT 1 FROM zsd_data WHERE gjahr = zsd_nrv~gjahr AND monat = zsd_nrv~monat AND bukrs = zsd_nrv~bukrs AND werks = zsd_nrv~gjahr AND matnr = zsd_nrv~matnr ). Если данные только во внтуренней таблице, то да: ставят блокировки, считывают нужные данные во внутреннюю таблицу, меняют в ней всё необходимое, а потом пишут: Code: UPDATE zsd_nrv FROM TABLE mt_data. В версионных БД всё равно при изменениях будут записываться новые строки, а старые строки помечаться как удалённые, поэтому всё равно обновляется только одно поле или же целая строка. А вот как себя HANA ведёт в таких случаях, к сожалению, не знаю, но, думаю, что обновление одного поля для неё будет лучше. |
Автор: | Kengur [ Чт, янв 18 2018, 18:15 ] |
Заголовок сообщения: | Re: UPDATE в цикле |
UKY написал(а): В версионных БД всё равно при изменениях будут записываться новые строки, а старые строки помечаться как удалённые, поэтому всё равно обновляется только одно поле или же целая строка. А вот как себя HANA ведёт в таких случаях, к сожалению, не знаю, но, думаю, что обновление одного поля для неё будет лучше. это во всех БД где есть транзакционная изоляция. в хане так и работает. апдейт через таблицу в любом случае быстрее - там используется пакетный интерфейс (а не просто SQL запрос). |
Автор: | Удав [ Пт, янв 19 2018, 01:26 ] |
Заголовок сообщения: | Re: UPDATE в цикле |
art9-3 написал: но этот вариант по оптимальности тоже не очень. Есть ли более оптимальные решения? Вы оптимальность по каким критериям меряете? Попробуйте на практике варианты, которые вам предложили, сравните. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |