优化更新语句 (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秒以内。