Как мне хранить данные в наборе таблиц и удалять источник?
У меня есть большая таблица в MS SQL, из-за которой у меня возникают проблемы при чтении, когда стороннее приложение пишет в нее. Мой план решения этой проблемы - переместить все данные из одной базы данных и периодически удалять данные в исходной базе данных. Проблема возникает, когда в таблице слишком много данных (сотни миллионов строк), но мне нужно иметь возможность прочитать все данные для строк, которые могут превысить миллиард строк. У меня нет возможности изменять исходную базу данных, потому что она является сторонней.
Мне интересно, какие могут быть варианты, чтобы помочь в этом. Можно ли реплицировать таблицу таким образом, чтобы при удалении данных в исходной таблице она не удалялась в целевой таблице?
3 ответа
Существует ряд потенциальных решений этой проблемы. Правильный выбор зависит от вашей среды и ваших требований, которые здесь подробно не рассматриваются.
Исходя из вашей заявленной необходимости запроса всей таблицы строк с многомиллионными (или миллиардами), я ожидаю, что вам нужно будет составить некоторые отчеты из базы данных поставщиков. Вот некоторые потенциальные решения, которые я бы рассмотрел для достижения этой цели:
- READ UNCOMMITTED: выполнить ваши запросы как READ UNCOMMITTED (например, WITH NOLOCK). Это гарантирует, что запросы и действия OLTP не мешают друг другу, хотя ваши результаты могут немного испортиться, если вы запрашиваете самые свежие данные.
- Снимки: создание снимков базы данных для запросов только для чтения. Обновляйте их по регулярному расписанию или перед запуском отчетов (если они специальные). Если отчеты об эффективности являются единственной причиной, по которой вы хотите удалить данные из таблицы, это может быть вашим лучшим решением.
- ETL: Создайте базу данных _Archive на том же сервере, содержащую необходимые таблицы. Заполните их из БД prod ежедневным / еженедельным / ежемесячным заданием архивирования, которое перемещает в него данные из БД prod, а затем удаляет из prod после успешной вставки.
Немного больше информации может помочь нам лучше помочь вам.
- Вставьте триггеры, которые копируют каждую новую запись при создании
- Скрипты запускаются с регулярными интервалами или перед удалением, вставляя неповторяющиеся строки.
Нет причин, по которым таблицы вашего хранилища данных должны даже находиться на одном сервере, а тем более привязаны к действующей базе данных с ограничениями. Удаление не должно повлиять на склад. Просто есть команды, которые добавляют данные.
Стандартным подходом является использование какого-либо сценария ETL для создания копии данных перед удалением.