一个表中字段太多,数据也很多,怎样提高更新速度? 着急中.(100分)

  • 主题发起人 主题发起人 vivadata1
  • 开始时间 开始时间
V

vivadata1

Unregistered / Unconfirmed
GUEST, unregistred user!
一个表中有60个字段(记为A),数据也很多.
根据其它表中的数据可算出一个表(记为B),其中有约40个字段同A相同,并与A有一字段关联.

现在,经常(因为B变动频繁)要把B中的40个字段更新到A中,80%的数据是没有变的,怎样提高更新速度? (用40个字段关联得出哪些数据没变是不是很笨? 速度也慢的要死).

着急啊!
 
1、可考虑用触发器
2、重新设计
 
首先两个表都应该为关联字段建索引

另外
在a表中记录需要更新的40个字段的哈希值(当前版本号)
在计算bbiao时也计算一下这40个字段的哈希值(最新版本号)
更新时根据关联字段和哈希值决定某记录是否被更新
这样可以减少你更新的总行数从而提高速度
 
最好用存储过程更新数据.速度快,安全
 
触发器 存储过程
 
触发器来更新最好,,,不需要人工干预
 
如果是ORACLE的话,用分区表来视现。另外再加上哈希索引。速度会快很多,另外,少用点排序关键字。
 
楼上说的对. 如果加了索引,更新起来更慢.(估计更新时会触发SQL SERVER本身的触发器,做索引表).

我用的是SQL SERVER, 数据量比较大,更新的速度让人等到要睡觉了.

没法用触发器, 因为表B是算出来的,要算出来的那个原始表本身数据就比较多,并且经常要重算.本来就是在存储过程中更新的.
 
可以把40个字段关联出哪些数据需要更新(然后限制更新范围),但40个同时关联时速度也不看好.(有80%以上的数据不需要当前条件变动下更新)

太多字段了,但这些字段又不能不存在(没法关联).
 
40個字段關聯。。。汗一個,如果真是業務必須如此,也沒有什麽好說了,否則真是要重新設計一下了
其實這個問題太籠統,因為資料多了,慢是自然的了
對於多數數據不變的,我建議表A增加一個時間字段,這個字段增加索引,然後根據時間更新,這樣避免抽取全部資料,我沒有試過效果,建議試試。。。
 
"根据其它表中的数据可算出一个表(记为B),其中有约40个字段同A相同,并与A有一字段关联",从这里可看出,你的B表数据是临时生成的.且有一字段与A关联,也就是说只要产生到B表的数据至少有一个字段是必须更新的,那么为什么还要通过用40个字段来得出哪些数据没变呢,直接采用异表数据更新所有字段就行了阿。
 
建议重新设计,问题可以规避的~存在字段冗余,这不是自找麻烦么?
 
两个表分别使用两个不同的存储过程更新。两个表之间有40个字段关联,是否可以减少一些。
 
表A:主键A,20个表A字段,40个表A,B均包含的字段(其中肯定有主键A)
表B:主键B,40个表A,B均包含的字段(其中肯定有主键A),若干表B字段
表A一条可以记录关联表B一或多条记录。要求表A数据发生变化,如果变化的
字段同意存在于表B,那么希望表B中相应记录的相关字段值也改变,应该是这样吧。
----------------------------------
1:上面很多人提出的,这种情况下为什么要设计冗余字段?冗余字段通常用于
记录数据的历史状态,表B中存的数据是记录生成时表A对应的值,当表A发生改变
时,表B的对应值是不变的。那针对当前情况,表A不用改变,表B中删除除关联的
字段外所有与表A相同的字段,即表B:主键B+主键A+若干表B字段。
创建表A表B的关联结果的视图,所有对原表B读取的操作改为操作视图。
新增,修改(其他表B独有字段)和删除的操作还是在原表B上进行。
----------------------------------
2:如果不想改动已经有的代码,或者原有根本不能修改。那么:
表B去除冗余字段后改名为表C,新建的视图命名为表B。这样原有代码对表B读取
没问题,直接对视图(新的表B)新增,修改和删除是不行,但可以
增加视图(新的表B)的相应触发器,触发器的代码为对表C(原表B)进行
实际的新增,修改和删除操作,视图(新的表B)会自动刷新。这样
冗余字段消除了,表A改变引发的数据更新问题不存在了,原有代码
完全无需改变。
 
多人接受答案了。
 
后退
顶部