首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

优化更新话语 (100分)

2013-04-22 
优化更新语句 (100分)REPLACE UNIT WITH 035,DESC_CODE with 4821100,low_rate with 0.08,taxprice_1

优化更新语句 (100分)
REPLACE UNIT WITH "035",DESC_CODE with "4821100",low_rate with 0.08,taxprice_1 with value_rmb*0.08,TAXPRICE_3 WITH (VALUE_RMB + TAXPRICE_1) * 0.17,tax_rate with 0.17,REAL_PAY WITH TAXPRICE_1 + TAXPRICE_3,REF_PAY WITH TAXPRICE_1  + TAXPRICE_3  FOR  MAWB_NO  = "IMP20130322T1"  and "光碟"$G_NAME_C


连续执行五条此类语句,如果是连着本地数据库,在38秒内完成。但实际上该数据库是放在局域网内的,现在数据量有四十来万,通过局域网来执行该条语句需要时间两分来钟,如果执行十条这样的语句,那就需时约半小时。现在就想着能否有什么更好的方法,最好在十分钟内。
谢谢。


分数不能代表什么,只是表达我对无私奉献者的一种敬爱。


[解决办法]
insert into 命令中的第三个方法试试
[解决办法]
update是不是能好点!
[解决办法]
用CREATE CURSOR 创建临时表
[解决办法]
生成TXT文件->临时表->修改
[解决办法]
把服务器的数据COPY到本地,替换完成后再COPY到服务器
[解决办法]
根据你的 for 条件,这个操作是完全可优化的
先在 MAWB_NO 字段上创建索引:index on MAWB_NO tag MAWB_NO
再执行 replace,还需要多少时间?速度应该是数量级上的变化

G_NAME_C 字段上可以建索引试试,不过应该是包含操作,效果不会像 MAWB_NO 明显


[解决办法]
你的 Replace 没有指定范围(如:All),只替换当前记录?
把 MAWB_NO 和 G_NAME_C 字段建立索引。
然后
Set Filter To  MAWB_NO  = "IMP20130322T1"  and "光碟"$G_NAME_C
Replace ... all


Replace ... all for MAWB_NO  = "IMP20130322T1"  and "光碟"$G_NAME_C

因为数据及数据量不同,不同方法速度也可能不一样,所以你需要多种方法测试。
[解决办法]
USE \\192.167.0.1\AA
COPY TO TT
对TT进行操作
[解决办法]
最好把表复制到本地再操作,如果在局域网内作这样的操作会慢好几倍的~~
[解决办法]
知道为什么局域网会慢几倍么?因为VFP做这些操作实际上是建一个临时表-然后再从原表里从第一条数据开始读取判断是否需要修改-修改后写入临时表-完成全部数据之后再覆盖原表.


[解决办法]
Index on MAWB_NO TAG MAWB_NO
=SEEK("IMP20130322T1")
SCAN WHILE MAWB_NO="IMP20130322T1" FOR "光碟"$G_NAME_C
   REPLACE UNIT WITH "035",;
   DESC_CODE with "4821100",;
   low_rate with 0.08,;
   taxprice_1 with value_rmb*0.08,;
   TAXPRICE_3 WITH (VALUE_RMB + TAXPRICE_1) * 0.17,;
   tax_rate with 0.17,;
   REAL_PAY WITH TAXPRICE_1 + TAXPRICE_3,;
   REF_PAY WITH TAXPRICE_1  + TAXPRICE_3 
ENDSCAN
[解决办法]
条件【MAWB_NO  = "IMP20130322T1"  and "光碟"$G_NAME_C】中
$不能进行Rushmore优化,想法把这个条件改一下。
前面的条件是可优化的,但要对字段MAWB_NO进行索引
如果两个条件都能Rushmore优化,执行完全能在1秒以内。

热点排行