Каков наиболее эффективный способ перемещения данных из одной таблицы sql в другую?

В настоящее время у меня есть задание SSIS, которое запускается для перемещения данных с одной машины sql 20008 на другую. Задание перемещает около 2 миллионов записей примерно из 6 таблиц. Это занимает около 5-10 минут в зависимости от загрузки сервера, и это нормально. Поскольку данные перемещаются во временные таблицы, это не влияет ни на что, кроме нагрузки на сервер.

Но моя проблема возникает, когда я хочу объединить эти данные с соответствующими живыми таблицами. Это может занять около 15 минут, в течение которых таблицы очищаются, а затем заполняются заново. Мне интересно, как наиболее эффективно перемещать эти данные между таблицами.

В настоящее время вот как это происходит:

удалить таблицы
перестроить таблицы с индексами и ограничениями
вставить в выбор, чтобы переместить данные
затем выполнить все необходимые вычисления
выполнить следующую команду, чтобы перестроить все индексы после того, как данные перемещено:

sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?')"

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

Я также только что прочитал о команде слияния, которая может быть лучше, поскольку мне не нужно удалять таблицы и повторно заполнять, что означает, что все данные останутся доступными, но трудно узнать, изменяются ли записи, не просматривая почти все столбцы .

Буду признателен за любую помощь.


person spinon    schedule 10.03.2011    source источник
comment
Сколько из этих двухмиллионных записей вообще не меняются? Другими словами, сколько записей является новыми и сколько обновлено? Можно ли добавить LastUpdated datetime или VerCol rowversion в исходные таблицы?   -  person Damir Sudarevic    schedule 10.03.2011
comment
Сложно сказать. Большинство поступающих данных определенно новые. Но данные поступают из системы продажи билетов и могут измениться в любой момент.   -  person spinon    schedule 10.03.2011


Ответы (4)


При очистке и повторном заполнении мы часто создаем представление с тем же именем, что и текущие таблицы (чтобы не было разрывов существующего кода), и создаем две таблицы с именами tablenameA и tablenameB с той же структурой и всеми данными. Направьте представление на tablenameA. Сократить имя_таблицыB. Сбросить индексы. Запустите процесс для заполнения tablenameB и переиндексации, запустите скрипт, чтобы указать представление на tablenameB. Время простоя для пользователя? Миллисекунды. Затем в следующий раз, когда вы переключитесь и усекете и заполните TableNameA, а затем повторите представление в TableNameA.

person HLGEM    schedule 10.03.2011
comment
+1 Интересная мысль. Мне это нравится. Мне особенно нравится, что мне не нужно возвращаться и обновлять какие-либо хранимые процедуры. Я посмотрю на это наверняка. - person spinon; 10.03.2011

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

Вот сводка

Это больше соответствует вашему вопросу

Я должен отметить, что эта функция доступна только в версиях Enterprise и Developer.

person JasonCoder    schedule 10.03.2011

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

person Sentinel    schedule 15.03.2011

После рассмотрения варианта представления с различными базовыми таблицами я отказался от него, чтобы избежать сложности и путаницы, которые он может внести. Я изучил разделение, но, поскольку у меня нет большого контроля над исходной машиной, это не показалось подходящим решением. Итак, в конце концов я просто решил использовать оператор SQL MERGE и использовать BINARY_CHECKSUM для сравнения строк и определения различий или нет. Хотя у меня нет проблем с блокировкой. Но я открыл еще один вопрос для этого.

Как повысить производительность оператора SQL MERGE

person spinon    schedule 14.04.2011