在Sql上插入缓慢的数据

时间:2013-03-25 22:31:41

标签: asp.net sql entity-framework

我只是想从数据集导入数据到数据库(Sql),但是当我尝试导入70000行时,它有点慢。我做错了什么或丢失了吗? 请给我一些建议,我怎样才能做得更好?

这是我的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);

    }                       
}

这是我的商店解决方案:

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 Gsm1=@gsm1 and UserId=@userid)
        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 Gsm1=@gsm1 and UserId=@userid)
        end
        if (@grupid != 0)
            begin
            if not exists (select * from tbl_KisiGrup with (updlock, rowlock, holdlock) where GrupID=@grupid and AltMusteriID=@AltMusID)
                begin
                    insert into tbl_KisiGrup values(@grupid,@AltMusID)
                end
            end
        end 

go

1 个答案:

答案 0 :(得分:0)

服务器旨在使用集合。你要求它一次处理一行,每行三次次。停止这样做,事情会变得更好。

首先回到您的VB文档,找一种方法为所有 70,000行一个 INSERT。如果您可以使用SQL Server的批量复制(bcp)功能,您应该能够在10-20秒内插入整个集。

read-test-update范例可能在这里工作,但它容易出错并迫使服务器比必要的工作更加困难。如果70,000中的一些是新的,其他是更新,请将它们放入临时表中,然后使用MERGE将其应用于tbl_AltMusteriler

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

简而言之,找到一种方法一次插入所有行,这样您与DBMS的交互仅限于一次或最多两次调用。