C#数据导入数据库时太慢

cqyy2006 2011-01-12 10:36:25
每天需要利用C#程序将大量的数据导入到SQL2000数据库的某张表中,并且如果表中已存在相同数据, 就需要替换掉!

我现在用的一个很笨的办法,就是每对数据库插入一条数据前,查询数据库中有没有同样的数据,如果有的就删掉在插入,没有就

直接插入,功能是可以完成,但是速度真的是太慢了,有没有高人知道更效率的办法呢?

注:判断重复是需要多个字段进行判断的!
...全文
514 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
syn07471 2011-01-12
  • 打赏
  • 举报
回复
例子:表tempTable ,判断是否重复记录的字段name
1.插入全部数据
2.删除重复记录
Delete tempTable
Where ID Not In

Select Max(ID) From tempTable Group By Name
)
搞定。
试试这样能提高速度不

yyg_pl 2011-01-12
  • 打赏
  • 举报
回复
建一个临时表
把数据先插入临时表.
在临时表中建立TRIGGER, 如有新数据插入去更新或者替换你要插入那张表的数据
再将临时表数据删除. 这样的你的判断部分就交给数据库去做了.
而你要做的就是往临时表中插入 数据.
cqyy2006 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 guyehanxinlei 的回复:]
不知慢到什么样的程度?

索引肯定是需要建立的.

可以将每天Load过来的数据放到一张表中,然后执行两个语句即可.

Update T
Set A.FieldA=B.FieldA..
From T A INNER JOIN T2 B ON A.ID=B.ID

INSERT INTO T()
SELECT A.* FROM T A LEFT JOIN T2 B ON A.……
[/Quote]

这完全没考虑数据重复的问题额-_-!!
cqyy2006 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 civilman 的回复:]
因为你是用c#操作数据库的,而且是一条一条的操作,所以肯定慢的。
所以应该改为数据库直接批量操作。
先把数据都放到sql2000的一张临时表里,
然后编写一段sql,删除原表中重复的数据。这段sql可能稍微复杂点,但应该能写出批量查询重复记录的语句。
最后把临时表里的数据都导入到原表里。
这样改,起码应该快10倍。
[/Quote]
貌似可以,导入到临时表后,然后两个表联合查询,得出相同的数据,然后一次性删掉所有重复的,在进行导入,不知道会快多少,我先去试试!
guyehanxinlei 2011-01-12
  • 打赏
  • 举报
回复
不知慢到什么样的程度?

索引肯定是需要建立的.

可以将每天Load过来的数据放到一张表中,然后执行两个语句即可.

Update T
Set A.FieldA=B.FieldA..
From T A INNER JOIN T2 B ON A.ID=B.ID

INSERT INTO T()
SELECT A.* FROM T A LEFT JOIN T2 B ON A.ID=B.ID
WHERE A.ID IS NULL
whrspsoft3723 2011-01-12
  • 打赏
  • 举报
回复
还有个办法就是先导和到一个临时表中,然后,用sql把临时表的数据导入到 你的目的表中。
但这种方法对于千万级的数据量,估计快不到哪儿去。甚至还要慢。
syn07471 2011-01-12
  • 打赏
  • 举报
回复
全部插入数据,然后删除重复记录
whrspsoft3723 2011-01-12
  • 打赏
  • 举报
回复
有多慢,每秒能导入30条吗?
建议针对你的判断条件优化一下索引, sqlserver中,能调整的东西实在有点太少了。
civilman 2011-01-12
  • 打赏
  • 举报
回复
因为你是用c#操作数据库的,而且是一条一条的操作,所以肯定慢的。
所以应该改为数据库直接批量操作。
先把数据都放到sql2000的一张临时表里,
然后编写一段sql,删除原表中重复的数据。这段sql可能稍微复杂点,但应该能写出批量查询重复记录的语句。
最后把临时表里的数据都导入到原表里。
这样改,起码应该快10倍。
空怀 2011-01-12
  • 打赏
  • 举报
回复
赞同楼上各位说的 先导到临时表中 将重复的删除 在插入数据
hmingliang 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zldnjack 的回复:]

全部插入数据,然后删除重复记录
[/Quote]
批量插入数据
  /// <summary>
/// 执行批量插入数据
/// </summary>
/// <param name="table"></param>
/// <param name="sourceTableName">数据库源表名</param>
public void ExecuteInsert(DataTable table, string sourceTableName)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(strConn))
{
bulkCopy.DestinationTableName = sourceTableName;
if (table != null && table.Rows.Count != 0)
{
bulkCopy.WriteToServer(table);
}
}
}
zldnjack 2011-01-12
  • 打赏
  • 举报
回复
全部插入数据,然后删除重复记录

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧