告急:海量数据插入
数据是两个表当中的查询结果
动态数据,插入量不确定,估计在200万以内。
插了一个小时了,不见表增长,不见数据库日志变化,但是服务器又是满负荷在跑?
问题点数:10、回复次数:11Top
1 楼FEB15(张郎)回复于 2006-12-01 19:15:41 得分 0
量小时,一切正常
不好意思,唯一的十分,最近提问过猛。Top
2 楼dutguoyi(新鲜鱼排)回复于 2006-12-01 19:17:50 得分 0
可不可以分批。Top
3 楼FEB15(张郎)回复于 2006-12-01 19:18:45 得分 0
不可以
原始语句
Insert Into Sys_MatchPartIDs(InquiryClassID,InquiryCustomerID,InquiryID,StockClassID,StockCustomerID,StockID)
SELECT I.ClassID,I.CustomerID,I.ID,S.ClassID,S.CustomerID,S.ID
FROM Sys_Inquiry AS I,Sys_Stock AS S
Where S.PartNo LIKE I.PartNo+'%' AND (
((SELECT Match FROM Sys_Class_MatchPath WHERE ClassID=I.ClassID AND MatchClassID=S.ClassID)='True') or
((SELECT Match FROM Sys_Class_MatchPath WHERE ClassID=S.ClassID AND MatchClassID=I.ClassID)='True')
)Top
4 楼roy_88(中国风_燃烧你的激情!!!)回复于 2006-12-01 19:20:21 得分 0
楼主的主机配置不高,最好分批
Top
5 楼FEB15(张郎)回复于 2006-12-01 19:25:09 得分 0
表A 表B 两张表的结构相同
表A中某字段与表B中某字段进行 后百分号查询
两个表中的数据都有分类标记,分类设定某些类是不相互匹配的
主要是将匹配数据的几个关键数字ID插入到 表C
现在插了一个小时了,不见数据库动静,日志也不长,就内存长到400MB CPU一直满负荷运行Top
6 楼FEB15(张郎)回复于 2006-12-01 19:26:12 得分 0
这种情况表C是不是不建任何索引最佳?Top
7 楼FEB15(张郎)回复于 2006-12-01 19:31:46 得分 0
实在忍受不了了,终止了查询。
跑去看一条数据都没进去。
但是我直接在表上输入一行记录,发现索引ID已经是三万多,而不是1.
那这说明了什么?但是为什么日志没有增加?Top
8 楼zjcxc(邹建)回复于 2006-12-01 20:18:31 得分 0
事务的问题
你一次性插入海量数据, 数据的插入是比较快的, 但事务的提交是比较慢的
我做过导表的时候, 插入的数据量是2000万左右, 插入数据使用了不到1小时, 提交事务用了差不多4小时.
提交事务的时候, 你是看不到数据变化的, 但服务器的资源是消耗着的, 磁盘的I/O此时应该是最忙碌的Top
9 楼zjcxc(邹建)回复于 2006-12-01 20:20:00 得分 0
终止了查询, 跑去看一条数据都没进去
因为你一次性插入, 是一个事务来处理的(sql自动开启的事务), 所以终止肯定会回滚事务, 则数据自然没有.
而自增ID是不受事务回滚影响的, 所以ID是3万多了Top
10 楼zjcxc(邹建)回复于 2006-12-01 20:22:13 得分 10
像楼主的这种问题, 最佳做法是用BCP
因为你的两个表结构一样, 所以只需要用bcp的queryout方式, 把select的结果导出为文件, 然后用bcp把数据导入到目的表就成了.
bcp几乎不写日志, 所以这种方法可以很快完成你的处理.Top
11 楼FEB15(张郎)回复于 2006-12-01 21:02:04 得分 0
谢谢邹老大
我把查询的那个%暂时摘掉了,10分钟内完成了操作。
没接触过bcp
不知道我用 OpenRowSet写到 Access后再拿回来会怎样,先下班明天上班再搞。
实在不好意思就只有十分,这段时间分都耗在了SQL版。
如果老大没其它指点了我就明天结贴。 没分啊,穷啊!明天还有十分。Top




