我只是想从数据集导入数据到数据库(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
答案 0 :(得分:0)
服务器旨在使用集合。你要求它一次处理一行,每行三次次。停止这样做,事情会变得更好。
首先回到您的VB文档,找一种方法为所有 70,000行一个 INSERT
。如果您可以使用SQL Server的批量复制(bcp)功能,您应该能够在10-20秒内插入整个集。
read-test-update范例可能在这里工作,但它容易出错并迫使服务器比必要的工作更加困难。如果70,000中的一些是新的,其他是更新,请将它们放入临时表中,然后使用MERGE
将其应用于tbl_AltMusteriler
。
其次,uniqueidentifier
不是一个好兆头。看起来tbl_AltMusteriler
用于生成代理键。为什么不是一个简单的整数呢?生成(使用IDENTITY
)会更快,更容易阅读,查询更快,并且通常具有更好的PK属性。 (另外,确保自然键和代理项都被声明为唯一。如果两行具有相同的gsm1
和userid
值,这意味着什么,只有AltMusteriID
不同?)
简而言之,找到一种方法一次插入所有行,这样您与DBMS的交互仅限于一次或最多两次调用。