Что является наиболее эффективным способом перемещения данных из одной таблицы SQL в другую - PullRequest
0 голосов
/ 10 марта 2011

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

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

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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 10 марта 2011

Если вы очищаете и повторно заполняете то, что мы часто делаем, это создаем представление с тем же именем, что и у текущих таблиц (так что существующий код не разрывается), и создаем две таблицы с именами tablenameA и tablenameB с одинаковой структурой и всеми данными. Укажите представление на tablenameA. Усечь TableNameB. Падение индексов. Запустите процесс, чтобы заполнить tablenameB и переиндексировать, запустите скрипт, чтобы указать представление на tablenameB. Время простоя для пользователя? Миллисекунды. Затем в следующий раз вы переключите и урежете и заполните TableNameA, а затем вернете представление в TableNameA.

2 голосов
/ 10 марта 2011

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

Вот резюме

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

Следует отметить, что эта функция доступна только в SKU Enterprise и Developer

0 голосов
/ 14 апреля 2011

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

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

0 голосов
/ 15 марта 2011

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

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