日期:2014-05-18  浏览次数:20461 次

求助:性能优化
表一 商家表
sj表结构:
id,name(名称),num(编号),leibie(类别),rate(费率),fengding(封顶),ticheng(提成),rateDate(费率执行日期),tichengDate(提成执行日期)

表二 交易记录
jiaoyi表结构
id,jiaoyiDate(交易时间),sjnum(商家编号),sjlb(商家类别),money(交易金额),rate(费率),fengding(封顶),ticheng(提成)

业务逻辑:
从格式化的txt文本里读取交易记录信息,并插入到jiaoyi表里。

1、txt文本读取数据
2、读取数据后进行判断,
  <1>、此交易记录的商家是否存在于sj表里 selct * from sj where num='sjnum'  
  <2>、更改费率、提成(如果交易时间 大于 费率执行日期则更改jiaoyi表里 rate为 sj表设定的rate,否则保持不变)
  select * from sj where DATEDIFF (s,rateDate,jiaoyiDate)>0 and num='sjnum'
  <3>、更改提成(如果交易时间 大于 提成执行日期则更改jiaoyi表里 ),为 sj表设定的),,否则保持不变)
  select * from sj where DATEDIFF (s,tichengDate,jiaoyiDate)>0 and num='sjnum'

 说明:交易时间在 费率执行日期、提成执行日期之后的按照商家表里设定的费率、提成 否则不予更改

从txt读取所有数据后,进行循环修改 。每循环一次 都要对 数据库进行三次的查询操作。而txt文本的数据每次都在三千行以上,也就是说,循环修改三千条的数据要进行九千次的读库。时间消耗太长,性能跟不上。

如何提升性能,或是有更好的数据库设计来满足条件。 



------解决方案--------------------
LZ 把一个txt作为一个集合的操作。 
不要一个 num 一次检查。否则循环的效果不会很好。资源消耗较大

建议 :
1、建立一个表导入txt. Tb_txt
2、tb_txt 与sj表连接做判断。(建立好索引)
3、符合判断的继续,不符合的做提示处理

------解决方案--------------------
要修改操作逻辑,不要循环
1、导入到临时表
2、临时表与商家表左连接,修改和计算数据,写入到第二个临时表
3、第二个临时表数据插入到交易记录,必要的话加判断

循环操作转化成集合操作(表操作)是关键,具体业务自己修改,只提供思路
------解决方案--------------------
探讨
引用:

要修改操作逻辑,不要循环
1、导入到临时表
2、临时表与商家表左连接,修改和计算数据,写入到第二个临时表
3、第二个临时表数据插入到交易记录,必要的话加判断

循环操作转化成集合操作(表操作)是关键,具体业务自己修改,只提供思路

要修改操作逻辑,不要循环
不要循环? 导入到临时表里也是需要读取文件流循环一行一行插入数据到临时表里。
临……

------解决方案--------------------
如果txt文件中 数据格式一致的话 用 bulk insert