Копировать данные из одной таблицы в другую с помощью курсоров - PullRequest
0 голосов
/ 24 ноября 2011

У меня действительно большая таблица (около 13 миллионов строк) с именем Book. Я хочу установить первичный ключ в столбце таблицы Book, но так как это очень большая таблица, происходит сбой сервера во время обновления. Недостаточно памяти. Поэтому я создал таблицу BookTemp, установил все первичные ключи в этой пустой таблице и затем хочу вставить данные из таблицы Book в таблицу BookTemp. Но если я делаю это сразу, память снова заканчивается. Поэтому я решил использовать курсоры, чтобы каждый раз вставлять 10000 строк, а затем стирать ОЗУ, но я действительно новичок в курсорах, поэтому в этой точке мне нужна ваша помощь.

Я использую SQL Server 2008 R2

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

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

Или вы можете просто изменить это:

DECLARE @counter AS INT = 0;
DECLARE @batch_size AS INT = 10000;
WHILE (@counter < (SELECT MAX(id) FROM temp_table))
BEGIN
  INSERT INTO the_table
  SELECT * FROM temp_table
  WHERE id BETWEEN @counter AND (@counter + @batch_size - 1);

  SET @counter = @counter + @batch_size;
END
0 голосов
/ 24 ноября 2011

При выполнении следующих трех команд освобождается память для SQL Server путем очистки его кеша.

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE 

Однако, он может быть использован в текущей операции, поэтому, пожалуйста, смотрите ударный запрос после вставкикаждые 10000 память очищается выполнением вышеуказанной команды DBCC.

DECLARE @counter INT = 1
DECLARE cur_Data_Transfer CURSOR FOR  -- Cursor declared
SELECT column1, column2  -- select desired columns
FROM Book 

OPEN cur_Data_Transfer  --Opening Cursor
FETCH NEXT FROM cur_Data_Transfer INTO @column1, @column2  --Put values to variable

WHILE @@FETCH_STATUS = 0  -- Faching is success
BEGIN  
       INSERT INTO BookTemp (column1, column2) -- Inserting to temptable
            VALUES(@column1, @column2)
       IF @counter = 10000
       BEGIN    
        DBCC FREESYSTEMCACHE -- Clear System Cache
        DBCC FREEPROCCACHE   -- Clear Proc Cache
        SET @counter = 0     -- Restarting counter
       END
       FETCH NEXT FROM cur_Data_Transfer INTO @column1, @column2
       SET @counter = @counter + 1
END  
CLOSE cur_Data_Transfer  -- Closing cursor
DEALLOCATE cur_Data_Transfer -- De-allocating 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...