0

我只是想从数据集中将数据导入数据库(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
4

1 回答 1

0

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

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

读取-测试-更新范式可能在这里工作,但它很容易出错并迫使服务器比必要的工作更加努力。如果这 70,000 个中的一些是新的而其他是更新的,则将它们批量放入一个临时表并用于MERGE将其应用于tbl_AltMusteriler.

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

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

于 2013-03-26T02:24:20.393 回答