Массовое копирование из маленькой таблицы в большую в SQL Server 2005 - PullRequest
2 голосов
/ 23 мая 2011

Я новичок в SQL Server и имею следующую дилемму:

У меня есть две таблицы с одинаковой структурой. Назовите это runningTbl и finalTbl.

runningTbl содержит от 600 000 до 1 миллиона строк каждые 15 минут.

После некоторой очистки данных в runningTbl я хочу переместить все записи в finalTbl. finalTbl в настоящее время имеет около 38 миллионов строк.

Вышеописанный процесс необходимо повторять каждые 15-20 минут.

Проблема в том, что перемещение данных из runningTbl в finalTbl иногда занимает более 20 минут.

Первоначально, когда таблицы были небольшими, копирование занимало от 10 секунд до 2 минут.

Теперь это занимает слишком много времени.

Кто-нибудь может помочь с этим? SQL-запрос следовать ..

Спасибо

Ответы [ 3 ]

0 голосов
/ 23 мая 2011

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

0 голосов
/ 23 мая 2011

Для начала: за последние годы я узнал, что MSSQL отлично справляется с оптимизацией всех видов операций, но при этом в значительной степени опирается на статистику по всем задействованным таблицам.Следовательно, я бы предложил запустить «UPDATE STATISTICS processing_logs» и «UPDATE STATISTICS unprocessed_logs» перед запуском реальных вставок;даже на большом столе эти вещи не занимают так много времени.Кроме того, исходя из вышеприведенного запроса, многое зависит от индексов целевой таблицы.Я предполагаю, что целевая таблица имеет свой кластеризованный индекс (или PRIMARY KEY) в (по крайней мере) UnixTime, если нет, вы создадите существенную фрагментацию данных, когда будете вставлять все больше и больше данных между уже существующими записями.Чтобы обойти это, вы можете попытаться дефрагментировать целевую таблицу время от времени (это может быть сделано онлайн, но занимает много времени), но создание кластеризованного индекса (или PK) так, чтобы данные всегда добавлялись в конец таблицы,будь лучшим подходом;ну, по крайней мере, на мой взгляд.

0 голосов
/ 23 мая 2011

Есть ряд вещей, которые вам нужно будет сделать, чтобы получить наиболее эффективный способ копирования данных.Пока вы на правильном пути, но вам предстоит долгий путь.Я бы посоветовал вам сначала взглянуть на ваши индексы.Там могут быть оптимизации, которые могут помочь.Затем убедитесь, что в этой таблице нет триггеров, которые могли бы вызвать замедление.Затем измените уровень ведения журнала (если он является перестановочным).

Здесь есть еще несколько справок (от Microsoft):

http://msdn.microsoft.com/en-us/library/ms190421(v=SQL.90).aspx

В основномВы находитесь на правильном пути, используя BCP.На самом деле это рекомендация Microsoft:

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

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

http://msdn.microsoft.com/en-US/library/ms177445(v=SQL.90).aspx

...