Соединение является проблемой.Не делай этого.Просто переберите вашу текущую таблицу, используя некоторый разумный интервал, используя current кластерный индекс.Примерно так:
Declare @idrange int;
Set @idrange = 1;
WHILE @idrange < 10000000
INSERT INTO Destination
SELECT *
FROM Source
WHERE DocumentID between @idrange and @idrange + 999
ORDER BY Source.DocumentID
Set @idrange = @idrange + 1000
End
Обратите внимание, что для лучшей скорости удалите все индексы (включая кластеризованный индекс) из таблицы назначения, затем добавьте индексы после того, как все строки будут вставлены.
РЕДАКТИРОВАТЬ : изменил интервал диапазона, чтобы предотвратить наложение (так как BETWEEN включает в себя конечные точки)
Одно последнее уточнение: общий смысл моего примера сценария заключается в том, что вы просто хотите просмотреть текущие записив некотором разумном порядке, и поместите их все в новый стол партиями.Нет смысла продолжать проверять таблицу назначения каждый раз, так как вы уже должны знать, что вы положили туда, а что еще осталось.В большинстве случаев имеет смысл использовать кластеризованный индекс (если он есть), поскольку это означает, что он может проходить по физическому порядку таблицы без поиска закладок.Если в таблице нет кластера, просто используйте то, что имеет смысл (ваш ПК, вероятно).