2013-09-06 9 views
0

У нас есть несколько таблиц с более чем 300 000 записями, и для записи необходимо переписать/скопировать записи из одной таблицы в другую. Существует ли более эффективный эффективный способ, чем использование курсоров и копирование каждой записи по одному из одной таблицы в другую, при работе с большими объемами данных?Более эффективный способ копирования больших данных из одного стола в другой

Код:

open SOMETBL 
fetch SOMETBL into @key1,@key2,@key3,@key4 
while(@@fetch_status = 0) 
begin 

    SELECT @key1InMapping = count(*) FROM SOMEOTHERDB.dbo.tblSOMETBLping WHERE fldEServicesKey = @key1 

    SELECT @eServiceTypeKey = fldAServiceTypeKey FROM SOMEOTHERDB.dbo.tblAServiceType WHERE fldAServiceTypeNumber = @key4 

if (@eServiceTypeKey=null or @eServiceTypeKey=0) 
      set @eServiceTypeKey = 50 

    if @key1InMapping>0 
    begin 
    update SOMEOTHERDB.dbo.tblSOMETBLping set [email protected] where fldEServicesKey= @key1 
    -- print 'post='+convert(varchar,@key2) + ' :key1='+convert(varchar,@key1)+ ' :serviceTypeKey='+convert(varchar,@eServiceTypeKey)+' : serviceTypeNum='+convert(varchar,@key4) 
    end 
    fetch SOMETBL into @key1,@key2,@key3,@key4 

end 

close SOMETBL 
+1

Это курсоры, которые занимают это несколько часов. Прямой запрос SQL займет от нескольких секунд до нескольких минут, чтобы скопировать всего 300 000 строк. – HardCode

+0

Передача данных происходит в одной базе данных или вы перемещаете данные между базами данных? –

+0

@Declan_K это происходит в одной базе данных. –

ответ

4

300.000 записей представляет собой небольшой объем данных в терминах базы данных. Но он слишком велик, чтобы использовать курсоры, которые на самом деле не должны использоваться более чем на несколько сотен записей, и, честно говоря, как только вы научитесь писать код на основе набора, он, как правило, короче и занимает меньше времени для записи, чем курсор. Поэтому я бы никогда не использовал курсор в качестве первого выбора, это техника последней инстанции. Вы не должны думать о вставке/обновлении или удалении одной записи за раз в курсоре. Вы используете операции на основе набора. Теперь, имея 300 000 записей, вы можете рассмотреть комбинацию набора и курсора, в которой вы обрабатываете группу рекордов за раз (скажем, 10 000), а не курсор один раз.

За дополнительной информацией о том, как изменить курсор на установочный код, можно узнать здесь. http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

+0

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