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

サーバーは、セットで動作するように設計されています。一度に 1 つの行を処理し、各行を3回処理する必要があります。それをやめれば、事態は好転します。

最初に VB ドキュメントに戻り、 70,000 行すべてに対して1 つ INSERTを行う方法を探します。SQL Server の一括コピー (bcp) 機能を使用できる場合は、10 ~ 20 秒でセット全体を挿入できるはずです。

ここでは read-test-update パラダイムが機能する可能性がありますが、エラーが発生しやすく、サーバーに必要以上の負荷をかけることになります。70,000 の一部が新規で、その他が更新された場合、それらを一時テーブルにまとめて、 を使用MERGEして に適用しますtbl_AltMusteriler

第二にuniqueidentifier、良い兆候ではありません。tbl_AltMusteriler代理キーの生成に使用されているようです。単純な整数でうまくいかないのはなぜですか? ( を使用して) 生成するのが速くIDENTITY、読みやすく、クエリが速く、一般的に PK プロパティが優れています。(また、自然キーとサロゲートの両方が一意であると宣言されていることを確認してください。2 つの行の と の値が同じgsm1userid、 だけが異なる場合はどうなりAltMusteriIDますか?)

つまり、一度にすべての行を挿入する方法を見つけて、DBMS との対話を 1 回または多くても 2 回の呼び出しに制限します。

于 2013-03-26T02:24:20.393 に答える