我这是超市连锁店,下面有好多收银前台,每天都要下载商品信息等几个大表,经常出现更新失败。
详细:有一个台数据服务器,下面50多台前台每天早上都要一早向服务器更新下载商品信息表,
货位表等共7个大表,由于我们用的是别人开发的软件,它没有很好在软件中新增商品与修改商品价格
等中加入日期时间的字段与更新下载相关连信息表,这样我们只有每个前台向服务器的7个大表全盘下
载下来。
如存储程:
CREATE PROCEDURE SOF_gxzl
AS
delete from spkfk
insert into spkfk (spid,spbh,sptm,spmch,lshj,hyj,shpgg,shpchd,jlgg,beactive,dw,koul,yinhua,zjm)
select spid,spbh,sptm,spmch,lshj,hyj,shpgg,shpchd,jlgg,beactive,dw,koul,yinhua,zjm
from [server2].[sk70].[dbo].spkfk where beactive='是'
delete from hwsp
insert into hwsp ..........等7个表
return
后来由于delete from spkfk 删除几个本地表也要一些时间,而且还会给日志文件增胖上百兆,就改成:
CREATE PROCEDURE SOF_gxzl
AS
if exists (select * from sysobjects where id = object_id(N'[dbo].[spkfk]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[spkfk]
CREATE TABLE [dbo].[spkfk] ( .....重建表以减少时间 ) ON [PRIMARY]
insert into spkfk (spid,spbh,sptm,spmch,lshj,hyj,shpgg,shpchd,jlgg,beactive,dw,koul,yinhua,zjm)
select spid,spbh,sptm,spmch,lshj,hyj,shpgg,shpchd,jlgg,beactive,dw,koul,yinhua,zjm
from [server2].[sk70].[dbo].spkfk where beactive='是'
if exists (......)
drop table [dbo].[hwsp]
insert into hwsp ..........等7个表
return
但是这样还是一样的,在每天早上更新数据有些更新成功,有就更新失败,这种情况并不固定某几台机上。
我是个初学者如果有,希望详细说明下...先谢谢
问题点数:100、回复次数:10Top
1 楼pbsql(风云)回复于 2004-12-01 18:55:25 得分 0
用truncate table删除表中数据快且不会产生日志
truncate table hwsp
insert into hwsp ..........等7个表
...Top
2 楼caral525(猫猫)回复于 2004-12-01 19:00:22 得分 50
建议
利用truncate table hwap来清空hwap表;不会写入日志,速度比delete快得多;
另外,据你上面列的字段看,应该是有唯一字段存在的吧?
如果有的话,可以只将新的内容插入,而不是所有的;Top
3 楼maybo(东东)回复于 2004-12-01 19:52:25 得分 0
我忘了,补充下:在插入数据几个大表都是有唯一字段的,但是每天都会对某些表中的记录的价格,成本修改,与一些字段,唯一字段是不变的。
我也试过用加上日期但是不理想,(因为现在用了别人软件,上了贼船没办办法:那家软件公司前年就倒了,现在本想换掉套软件的,但又烦着要改变许多...同时也有点怕了....)
insert into spkfk(spid,spbh,sptm,spmch...)
select spid,spbh,sptm,spmch... from [server2].[sk70].[dbo].spkfk where beactive='是' and denglrq>=convert(char(10),(getdate()-3),21)
只有前台每天将本地的表删除,全部从服务下载下来,
我想在服务器上生成一些下载用户信息零时表,与在50几个前台同时向服务器读取几个大表(上百万条记录)的同时不要产生一些"脏数据"
---在50几个前台同时向服务器能一一更新数据并能比对本地与服务器的一至。。。Top
4 楼lh1979(rocket)回复于 2004-12-01 20:11:26 得分 0
如果数据是测试数据的话用truncate table tablename没有问题,但是如果里面数据是正常删除的话
不要用这个语句,这个语句是因为不写入日志,速度才快,但是如果后悔的话,写入日志的话,数据还可以复原,但是这种是恢复不了的
考虑速度的话还是优化语句,条件建立索引Top
5 楼lh1979(rocket)回复于 2004-12-01 20:15:15 得分 50
按照现在数据库的默认隔离等级,是不可能产生脏数据的,除非隔离等级改为
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,这样查询的时候就会有脏数据了
Top
6 楼maybo(东东)回复于 2004-12-01 21:44:36 得分 0
有没有在存储过程中copy表记录的快速好方法,也好在比insert into ...select * from ...
快,减少在下载时与服务器之间的连接时间Top
7 楼Ncaidexiaoniao()回复于 2004-12-01 22:08:29 得分 0
用 trancate 删除表的数据比较好Top
8 楼vinsonshen(为了明天)回复于 2004-12-01 22:20:42 得分 0
两机器间表数据传送,用dts或insert into ...select * from ...
另外,你清楚表数据时,用"truncate table 表名"这个速度快很多(当表数据很多时),因为truncate不用记录日志的;而你用delete当数据比较多时,很比较慢,因为其要记录日志的
Top
9 楼vinsonshen(为了明天)回复于 2004-12-01 22:23:30 得分 0
另外,你的表在insert时,不要先建立索引,等把几个表的数据都insert 导回本地了,再另外建立索引,这样也会快很多,这样你可以把建立索引的语句也写成另外一个存储过程,当所有数据都导回本地了,再另外执行该存储过程去对表建立索引Top
10 楼huazf(huazf)回复于 2004-12-02 10:55:00 得分 0
专业提供SQL SERVER 修复,SQL恢复,误删除表,SQL 数据恢复,SQL SERVER 数据库恢复修复,SQL 找回业务。
QQ:386999
TEL:0576-2454863
Top




