Назад | Перейти на главную страницу

Как создать хранилище данных для набора таблиц и удалить источник?

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

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

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

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

  • READ UNCOMMITTED: выполняйте запросы как READ UNCOMMITTED (например, WITH NOLOCK). Это гарантирует, что запросы и операции OLTP не будут мешать друг другу, хотя ваши результаты могут быть немного грязными, если вы запрашиваете данные с точностью до секунды.
  • Снимки: создание снимков базы данных для запросов только для чтения. Обновляйте их по расписанию или перед запуском отчетов (если они нерегулярные). Если производительность отчетов - единственная причина, по которой вы хотите удалить данные из таблицы, это может быть вашим лучшим решением.
  • ETL: создайте базу данных _Archive на том же сервере, содержащую необходимые таблицы. Заполните их из prod DB с ежедневным / еженедельным / ежемесячным заданием архивирования, которое перемещает в него данные из prod DB, а затем удаляет их из prod после успешной вставки.

Немного дополнительной информации может помочь нам лучше помочь вам.

Стандартный подход - использовать какой-либо сценарий ETL для создания копии данных перед удалением.

  • Вставьте триггеры, которые копируют каждую новую запись при создании
  • Скрипты выполняются через регулярные промежутки времени или перед удалением, которые вставляют неповторяющиеся строки.

Нет причин, по которым ваши таблицы хранилища данных должны находиться на одном сервере, а тем более привязаны к действующей базе данных с ограничениями. Удаление не должно повлиять на склад. Просто имейте команды, которые добавляют данные.