Строка за строкой сравнения многих соединяемых таблиц - PullRequest
0 голосов
/ 13 февраля 2020

После миграции схемы мне нужно убедиться, что все значения в таблицах старой схемы были успешно скопированы в правильные таблицы новой схемы. Из-за того, что схемы имеют разную архитектуру (разные таблицы с разными столбцами и разные отношения друг с другом), это занимает вечность.

У меня уже есть этот метод, который должен дать вам основы c обзор задачи:

for rec1 in(
    select r1.id as r_id, r1.year as r_year...
           f1.id as f_id, f1.year as f_year...
           e1.id as e_id, e1.year as e_year...
           a1.id as a_id, a1.year as a_year...
           ...
    from schema1.table_r r1
         join schema1.table_f f1 on...
         join schema1.table_e e1 on...
         join schema1.table_a a1 on...
         ...
    where r1.id = ...
) loop
    if exists (
        select gbt.id, gbt.ident, gbt.foo...
               gkp.bar, gkp.baz...
        from schema2.table_1 gbt
             join schema2.table_2 gkp on ...
        where
             rec1.r_year is not distinct from gbt.ident
             and rec1.f_id is not distinct from gkp.baz
             and rec1.a_year is not distinct from gbt.id
             and...
             ...
    )then //do stuff
    )end if;
)end loop;

Я упустил много столбцов, псевдонимов, объединений и "не отличается от", чтобы упростить обзор сценария.

Хотя этот метод работает Это, пожалуй, лучший пример того, как этого не делать, если иметь в виду производительность.

Как бы вы улучшили производительность для этой задачи? Я думал о создании двух представлений, по одному для каждой схемы, "реконструкции" таблиц, чтобы они были одинаковыми, и хешировании строк для сравнения хешей между двумя представлениями. Это был бы лучший подход?

Спасибо!

...