  | 
				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 文章: 4252 來自: 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 文章: 4252 來自: 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程序未完備所造成的問題。 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |