2013-03-25 109 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个单独的插入。数据集从哪里得到它们? – 2013-03-25 22:38:42

+0

我只是从excel工作表填充数据集,但它并没有花费太多时间... – cooolstaff 2013-03-25 22:44:17

+0

我看到的唯一的“错误”是你试图一次插入这么多行。怎么样把它分成块或使用后台服务? – rcdmk 2013-03-25 22:49:42

回答

0

服务器设计有集工作。您要求它一次处理一行,并且每行三个次。不要这样做,事情会变得更好。

首先回到你的VB文档并寻找一个方式做一个INSERT所有 70000行。如果您可以使用SQL Server的批量复制(bcp)功能,则应该能够在10-20秒内插入整个集合。

read-test-update范例可能在这里工作,但它很容易出错,并且强制服务器工作比需要更加困难。如果70,000个中有一些是新的,而其他的是更新的,则将它们装入临时表并使用MERGE将其应用于tbl_AltMusteriler

二,uniqueidentifier不是一个好兆头。它看起来像tbl_AltMusteriler用于生成代理键。为什么不是一个简单的整数呢?生成(使用IDENTITY)会更快,更易于阅读,查询速度更快,并且通常具有更好的PK属性。 (另外,确保无论是自然键和代理声明是唯一的。会是什么意思,如果两行具有相同的值gsm1userid,只有AltMusteriID不同?)

总之,找到一种方法一次插入所有行,以便您与DBMS的交互限制为一次或最多两次调用。