
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
10.11.2016, 22:06
|
|||
|---|---|---|---|
Просьба проверить, правильно ли я проверяю MERGE |
|||
|
#18+
Есть историческая таблица data (data_id, item_id, attr_id, value, date_beg, date_end). Есть такой запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Запрос возвращает подготовленные данные, которыми нужно обновить часть записей в таблице data. Запрос на обновление будет примерно таким: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Этот запрос должен добавить в таблицу data недостающие записи, "закрыть" существующие неактуальные записи и обновить существующие актуальные записи. Но прежде чем его запускать, я хочу проверить область его действия (преобразовав MERGE в SELECT): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Таблица data весьма важная и я очень опасаюсь поменять в ней что-нибудь лишнее. Правильно ли я составил проверочный запрос? То есть MERGE обновит только те строки, которые я вижу в проверочном SELECT, или может затронуть что-нибудь еще? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.11.2016, 08:58
|
|||
|---|---|---|---|
Просьба проверить, правильно ли я проверяю MERGE |
|||
|
#18+
Alibek B.Таблица data весьма важная и я очень опасаюсь поменять в ней что-нибудь лишнее. Правильно ли я составил проверочный запрос?А кому ты будешь предъявлять претензию, если после наших "советов" тебя уволят за неподобающее отношение квалификация/ответственность? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.11.2016, 10:09
|
|||
|---|---|---|---|
Просьба проверить, правильно ли я проверяю MERGE |
|||
|
#18+
Alibek B., Сделай копию таблицы и выполни над ней свой merge, проанализируй результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.11.2016, 12:29
|
|||
|---|---|---|---|
Просьба проверить, правильно ли я проверяю MERGE |
|||
|
#18+
Спрошу по другому. merge into dst using src эквивалентно (по области применения) select from src left join dst ? XMLerСделай копию таблицы и выполни над ней свой merge, проанализируй результаты. Да, спасибо за совет. Вчера вечером я уже сам сообразил, обновляются только нужные записи (сравнивал исходную таблицу и копию по всем полям). Правда не могу исключить того, что что-то все же упустил и на другом наборе данных это может вылезти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.11.2016, 16:51
|
|||
|---|---|---|---|
|
|||
Просьба проверить, правильно ли я проверяю MERGE |
|||
|
#18+
Alibek B., Хороший стиль - это исключить какую-либо логику в кляузах matched/not matched. То есть внедряемый набор данных должен в точности быть получен в using. Имея его, можешь проверять сколько угодно. Можно пойти дальше и в using приджойнить к итоговой таблице. Так ты получишь точный snapshot таблицы после merge. Потом в саму таблицу можно смерджить по roiwd. Но при таком подходе будет один избыточный джойн (с итоговой таблицей). Merge обновит только те строки для которых rowid в using будет is not null. А, да, в Oracle есть конструкция rollback если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.11.2016, 17:52
|
|||
|---|---|---|---|
Просьба проверить, правильно ли я проверяю MERGE |
|||
|
#18+
dbms_photoshopМожно пойти дальше и в using приджойнить к итоговой таблице. Я именно так и делаю, по условию соединения on (rs.data_id = data.data_id) это видно (data.data_id это PK). Но что-то лишнее обновить было бы крайне не желательно. И rollback не поможет, потому что это может вылезти только через месяц. Поэтому мне и нужен визуальный контроль, чтобы глазами просмотреть строки, которые попадут под обновление. Если запрос типа from src left join dst полностью соответствует логике работы merge, то этого достаточно. Главное чтобы у merge не было каких-нибудь особенностей, из-за которых область действия может оказаться шире. В matched/not matched совсем без логики обойтись не получается, есть вычисляемое поле CALC_ACTUAL, которое дает некоторую нелинейность (использование функции nvl2). С этим не будет проблем? Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.11.2016, 18:04
|
|||
|---|---|---|---|
|
|||
Просьба проверить, правильно ли я проверяю MERGE |
|||
|
#18+
Alibek B., Еще раз. Всегда. Абсолютно всегда, если в using есть соединение с итоговой таблицей , то можно получить в точности итоговый набор избежав какой-либо логики вне using. Соединение в merge указывать по rowid . Если rowid в using null, то строка будет вставлена, иначе - обновлена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=52&mobile=1&tid=1887039]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 259ms |
| total: | 369ms |

| 0 / 0 |
