 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
xjliaos
註冊時間: 2007-11-20 文章: 87 來自: guan dong
第 1 樓
|
發表於: 星期三 九月 01, 2010 3:38 pm 文章主題: 內部網,多個用戶同時寫入資料表,速度很慢,請指點 |
|
|
代碼如下:
SELE 4
GO TOP
DO WHILE NOT EOF()
MODEL_1 = MODEL_NO
WEEK_DATE_1 = WEEK_DATE
SELE 1
LOCA FOR MODEL_NO=MODEL_1
IF FOUND()
REPL;
WEEK_DATE WITH WEEK_DATE_1,;
ENDIF
SELE 4
SKIP
ENDDO
MESSAGEBOX("資料保存成功! ",64,"完成...")
************************************************
以上代碼在運行過程中,多個用戶同時保存速度很慢(2千條記錄),應該怎么修改!! |
|
回頂端 |
|
 |
saint
註冊時間: 2003-07-14 文章: 211
第 2 樓
|
發表於: 星期三 九月 01, 2010 5:30 pm 文章主題: |
|
|
試一下 update sql staement
UPDATE SELE1_ALIAS_NAME SET WEEK_DATE = WEEK_DATE_1
WHERE MODEL_NO=MODEL_1 |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 3 樓
|
發表於: 星期三 九月 01, 2010 5:32 pm 文章主題: |
|
|
select 4 和 select 1
有沒有開索引檔?
若有的話,2千條記錄,應該在1秒內能完成才對 |
|
回頂端 |
|
 |
andywilliams
註冊時間: 2004-10-23 文章: 111
第 4 樓
|
發表於: 星期三 九月 01, 2010 11:43 pm 文章主題: |
|
|
開索引檔+Seek 替代 Locate |
|
回頂端 |
|
 |
saint
註冊時間: 2003-07-14 文章: 211
第 5 樓
|
發表於: 星期四 九月 02, 2010 11:22 am 文章主題: |
|
|
嗯~可以用SEEK 來它是一個好主意
但是,我覺得應該在這一個時刻起,把XBASE 的語法給忘了,而直接改用 SQL STATEMENT 來代替
因為在其它工具中沒有這樣的指令,都是要用SQL 來完成。
而且你用久了..你不覺得SQL 很直觀嗎? 那麼多的指令只是為了要做一個更新動作,何不直接下一道UPDATE 就讓它完成呢?
saint 在 星期四 九月 02, 2010 5:07 pm 作了第 1 次修改 |
|
回頂端 |
|
 |
xjliaos
註冊時間: 2007-11-20 文章: 87 來自: guan dong
第 6 樓
|
發表於: 星期四 九月 02, 2010 4:11 pm 文章主題: |
|
|
ckp6250 寫到: | select 4 和 select 1
有沒有開索引檔?
若有的話,2千條記錄,應該在1秒內能完成才對 |
沒有做索引,現在問題是一個用戶用速度很快,多個用戶同時保存才慢. |
|
回頂端 |
|
 |
xjliaos
註冊時間: 2007-11-20 文章: 87 來自: guan dong
第 7 樓
|
發表於: 星期四 九月 02, 2010 4:15 pm 文章主題: |
|
|
saint 寫到: | 嗯~可以用SEEK 來它是一個好主意
但是,我覺得應該在這一個時刻起,把XBASE 的語法給忘了,而支接改用 SQL STATEMENT 來代替
因為在其它工具中沒有這樣的指令,都是要用SQL 來完成。
而且你用久了..你不覺得SQL 很直觀嗎? 那麼多的指令只是為了要做一個更新動動,何不直接下一道UPDATE 就讓它完成呢? |
你提醒了我,非常感謝您的建議! |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 8 樓
|
發表於: 星期四 九月 02, 2010 5:53 pm 文章主題: |
|
|
基本上 locate 也可以由 rushmore 得到一點好處,
不過,四樓比較對,改用index seek比較好.
如果是對一個index的欄位 與要搜尋的欄位不一樣的檔案做update時,
vfp 對自動建立一個臨時的index,
當然這樣會比純locate要快,
但因為多了建立臨時index的時間,
所以比index seek要慢一點.
結論:
用update 還是比較簡單,可讀性比較高,
多出來的時間,就用金錢+raid+多到爆炸的記憶體+n核心cpu+光纖網路來彌補就可以了. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
richshih
註冊時間: 2007-10-11 文章: 153
第 9 樓
|
發表於: 星期五 九月 03, 2010 1:22 pm 文章主題: |
|
|
syntech 先進 以你的觀點 1)或 2) 較快
1)
use dbf
indexseek()
replace
2)
update |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 10 樓
|
發表於: 星期五 九月 03, 2010 3:00 pm 文章主題: |
|
|
也許你要問,
多慢的機器可以看出差別.
或者是要處理多少資料下可以看出差別.
VFP 是一個看起來像compiler方式執行,但是骨子裡卻是 Interpreter 方式執行的工具,
不像 delphi,c++ 是純粹必須以compiler編譯過才能執行.
所以問題就變成 update sql 會不會比傳統xbase 語法組合處理要好,
我的想法 update-sql 的處理較好,
因為傳統的xbase 命令,每個命令是獨立的,
並沒有一定是
代碼: |
use dbf
indexseek()
replace
|
可能中間還有一大堆有的沒的的命令,
導致每個命令還是必須完整跑一次直譯的流程,
無法做到所謂"最佳化",
而SQL 命令就可以處理成最佳化的情況,
但是這裡面還是有一個陷阱,
可不可以寫一個XBASE 命令組合,而執行效率是比SQL命令為佳的,
我認為也是辦得到的,
只能寫程式的人有沒有能力了解VFP是怎麼做每個命令的翻譯,
另外的陷阱是,
如果你寫出很差的SQL 命令,也會比傳統的XBASE命令執行效率要差,
例如:
代碼: |
select table1
scan
update table2 set f1 = n where table2.f2=table1.f2
endscan
|
其中,UPDATE命令必須每次都翻譯,當然就效率爛到極點.
(這種寫法在剛剛由XBASE轉成SQL思維處理時很常見. 我小時候也是. )
就像是理論上,利用Assembly language 可以寫出比COMPILER 更最佳化的執行檔,
但也同時可以寫出更糟的執行檔一樣.
這就是修為的問題了.而不是工具本身語法的優劣. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 11 樓
|
發表於: 星期五 九月 03, 2010 9:42 pm 文章主題: |
|
|
mysql 有這種語法,效率最高,可惜 VFP 好像沒有
UPDATE items,month SET items.price=month.price WHERE items.id=month.id
直接利用一個檔去更新另一個檔,帥! |
|
回頂端 |
|
 |
fschern
註冊時間: 2003-10-12 文章: 34
第 12 樓
|
發表於: 星期日 九月 05, 2010 10:23 am 文章主題: |
|
|
從樓主提供的程式範例中看不出所採用的記錄鎖定策略
也沒有看到有做記錄LOCK及UNLOCK的程序。
注意看看是否因為多人同時回寫同一筆記錄時,LOCK/UNLOCK程序未完備所造成的問題。 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|