2013-03-25 3 views
0

Я просто пытаюсь импортировать данные в базу данных (Sql) из набора данных, но это немного медленнее, когда я пытаюсь импортировать 70000 строк. Я что-то делаю неправильно или пропал? Не могли бы вы дать мне несколько советов, как я могу сделать это лучше?Медленная вставка данных на Sql

Вот мой asp.net код:

ArtiDB entity = new ArtiDB(); 
int grid = 50; 

foreach (string item_kisiler in kisiler) 
{ 
    if (item_kisiler == "") 
     continue; 
    if (Tools.isNumber(item_kisiler) == false) 
     continue; 
    else 
    { 
     string gsm1 = item_kisiler; 
     if (gsm1.Length > 10) 
      gsm1 = gsm1.Substring(1, 10); 
     entity.veriaktar(gsm1, gg, grid); 

    }      
} 

Это мой магазин prosedure:

alter proc veriaktar 
( 
@gsm1 nvarchar(50)=null, 
@userid uniqueidentifier, 
@grupid int = 0 
) 
as 
begin 
Declare @AltMusID int 
    if not exists (select * from tbl_AltMusteriler with (updlock, rowlock, holdlock) where [email protected] and [email protected]) 
     begin 
      insert into tbl_AltMusteriler (Gsm1,UserId) 
      values (@gsm1,@userid)   
      Set @AltMusID = scope_identity() 
     end 
    else 
     begin 
     Set @AltMusID = (select AltMusteriID from tbl_AltMusteriler with (updlock, rowlock, holdlock) where [email protected] and [email protected]) 
     end 
     if (@grupid != 0) 
      begin 
      if not exists (select * from tbl_KisiGrup with (updlock, rowlock, holdlock) where [email protected] and [email protected]) 
       begin 
        insert into tbl_KisiGrup values(@grupid,@AltMusID) 
       end 
      end 
     end 

go 
+0

Похоже, вы пытаетесь сделать 70 000 отдельных вставок. Откуда их взяли данные? –

+0

Я просто заполняю набор данных с листа excel, но это не заняло много времени ... – cooolstaff

+0

Единственная «неправильная» вещь, которую я вижу, это попытка вставить столько строк сразу. Как насчет того, чтобы разделить это на куски или использовать фоновое обслуживание? – rcdmk

ответ

0

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

Первые вернуться к своей VB документации и искать способ сделать одинINSERT для всех 70000 строк. Если вы можете использовать функцию Bulk Copy (bcp) SQL Server, вы сможете вставить весь набор за 10-20 секунд.

Здесь может работать парадигма проверки чтения, но она подвержена ошибкам и заставляет сервер работать намного сложнее, чем необходимо. Если некоторые из 70 000 являются новыми, а другие - обновлениями, добавьте их во временную таблицу и используйте MERGE, чтобы применить ее к tbl_AltMusteriler.

Во-вторых, uniqueidentifier не является хорошим знаком. Похоже, что tbl_AltMusteriler используется для генерации суррогатного ключа. Почему бы простое целое не сделать? Было бы быстрее генерировать (с IDENTITY), легче читать, быстрее запрашивать и иметь лучшие свойства ПК вообще. (Кроме того, убедитесь, что и естественный ключ и суррогатной объявлены быть уникальным. Что бы это значило, если две строки имеют одинаковые значения для gsm1 и userid, отличаясь только AltMusteriID?)

Короче говоря, найти способ для вставки всех строк сразу, так что ваше взаимодействие с СУБД ограничено одним или не более чем двумя вызовами.

Смежные вопросы