Перемещение по нескольким связанным таблицам - PullRequest
0 голосов
/ 25 марта 2019

У меня есть около 10 таблиц, которые все связаны друг с другом.Они заполняются из одного плоского файла и обновляются ежедневно.Некоторые из таблиц содержат необработанные данные, а некоторые содержат анализ, вычисленный на основе необработанных таблиц.Поскольку данные в таблицах заполняются из одного источника и они связаны друг с другом, нам нужен способ передавать их одновременно или как можно ближе.В настоящее время мы строим таблицы в промежуточной схеме, а затем переносим их по одной в оперативную схему.Меня беспокоит то, что произойдет, если что-то произойдет между переносами таблиц, и половина столов будет активна, а другая половина застрянет в стадии подготовки.Тогда данные не будут совпадать.Мы хотим, чтобы все или ни один не был передан.Мне интересно, сталкивался ли кто-нибудь с чем-то похожим на это, и если да, то как это было сделано?

1 Ответ

0 голосов
/ 26 марта 2019

Во-первых, ответ на ваш начальный вопрос; как заставить передачу данных все или ничего.

Это на самом деле довольно просто, так как вы используете хранимую процедуру для передачи данных. Вы можете заключить весь процесс передачи данных в явную транзакцию. Таким образом, если что-то идет на юг в середине процесса, ВСЕ откатывается.

Итак, с небольшим псевдокодом:

BEGIN TRY

  BEGIN TRANSACTION

    INSERT Table1 ...
    SELECT ...
      FROM ...

    INSERT Table2 ...
    SELECT ...
      FROM ...

    ...

    INSERT TableN ...
    SELECT ...
      FROM ...

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

  ROLLBACK TRANSACTION
  --Other fancy error handling --

END CATCH;

Недостатком этого, и это может быть прерыватель сделки, является то, что он будет удерживать блокировку таблицы на всех столах, пока не будет выполнен весь перевод.

Что поднимает второй пункт. Переключение раздела.

Для флеша и заполнения, как это, это может быть отличным решением. ALTER TABLE...SWTCH обычно выполняется в миллисекундах. Вы все еще можете заключить операторы SWITCH в явную транзакцию, но, поскольку все происходит намного быстрее, блокировки не будут длиться почти так же долго.

BEGIN TRY

  BEGIN TRANSACTION

    ALTER TABLE staging.Table1 SWITCH PARTITION 1 TO live.Table1 ...

    ALTER TABLE staging.Table2 SWITCH PARTITION 1 TO live.Table2 ...

    ...

    ALTER TABLE staging.TableN SWITCH PARTITION 1 TO live.TableN ...

    COMMIT TRANSACTION

END TRY
BEGIN CATCH

  ROLLBACK TRANSACTION
  --Other fancy error handling --

END CATCH;

Кендра Литтл написала потрясающий пост в блоге, в котором много, гораздо больше подробностей о том, как сделать это неинвазивным, насколько это возможно, в вашей среде.

Почему вы должны переключать промежуточные таблицы вместо их переименования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...