  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		crux
 
 
  註冊時間: 2003-07-16 文章: 22
 
  第 1 樓
  | 
		
			
				 發表於: 星期五 十二月 19, 2008 7:35 pm    文章主題: SQL SELECT *  INTO CURSOR 與 USE 的效能問題 | 
				     | 
			 
			
				
  | 
			 
			
				為了效能的提昇,想說將開檔方式改成SQL SELECT *  INTO CURSOR的方式。
 
 
雖然程式是在網路環境,但其實使用的是一般的TABLE,而非MS SQL的Table,所以跟使用LOCAL的資料環境類似。
 
 
載入時以SELECT INTO CURSOR的方式讀至暫存檔,顯示時抓取CURSOR的資料欄,只在資料更新時或新增刪除時,才回去存取變更原資料檔,以為會像ORACLE的資料庫,只在產生CURSOR時才讀取,一般瀏覽時僅引用CURSOR的暫存資料,想說這樣不會佔用頻寬,即使掛在網路上不存取時,應該不會開到檔案。
 
 
但是程式幾乎快寫完了,放到SERVER上監看開啟的檔案,才發現即使SELECT *  INTO CURSOR的語法,未使用任何USE TABLE的語法,它仍然還是偷偷地開了TABLE,必須在UNLOAD時,自己寫程式關閉資料檔,這讓我有點騎虎難下了,為何SELECT * INTO CURSOR也會開檔呢?
 
 
跟傳統直接USE的方式,SELECT *  INTO CURSOR是否真能提昇效能?
 
還是說除非使用真正的SQL Table,若屬於LOCAL的TABLE(DBF)根本不需這麼做?! 用傳統USE的模式即可?!
 
 
有高人對此有所鑽研的麼? 期待有人能夠解答.... | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 2 樓
  | 
		
			
				 發表於: 星期五 十二月 19, 2008 9:30 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				看沒有?
 
 
如果你沒有把CURSOR 關掉 (USE),而保持CURSOR 開著,
 
是保持SELECT 的來源,沒錯.
 
這與 VFP 產生這種CURSOR的方式有關.
 
 
實際上,m$ sql 的server 端cursor,
 
我記得好像也是由sql server 開著這個檔案,達成live cursor的情況.
 
當然在vfp上,這就變成你的程式在背景偷偷做的事.
 
 
SELECT * INTO CURSOR 能否提昇效能,
 
也與VFP產生CURSOR的方式有關.
 
是會比SELECT * INTO TABLE 快,
 
但是好像不會比直接USE 快.
 
 
因為vfp 有時是以 filter 方式做一個假的cursor,
 
有時是產生一個dbf 格式的 in-memory table,
 
有時這個in-memory table 也會產生到hdd中,變成一個實體檔案.
 
 
總之,我覺得你好像沒搞清楚 VFP是怎麼產生SELECT - CURSOR 的.
 
卻把其他工具的CURSOR觀念拿來套 _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		crux
 
 
  註冊時間: 2003-07-16 文章: 22
 
  第 3 樓
  | 
		
			
				 發表於: 星期五 十二月 19, 2008 10:11 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				感謝你的解答^^
 
 
有點難解釋,基本上會動這個念頭,是在多人使用環境時,若有人閒置時,處在USE Table的狀態,雖然是Share的模式,但總覺得這樣會佔用頻寬,才想到使用CURSOR的觀念,將資料讀取至CURSOR,以GRID的方式讓使用者點選,即可切換資料錄,而不必一直開著原始資料檔,有點像Oracle只在需要資料時,才擷取必要的的欄位。
 
 
所以問題應該不是開檔的快慢,而是說以CURSOR暫存的觀念來處理檔案,是否對整體的網路效能較佳呢?
 
 
倒是SELECT * INTO CURSOR 的方式竟然在背景偷偷開檔,
 
SELECT * INTO CURSOR cTemp FROM XTable....
 
以上語法,同時也開啟了Xtable,這讓我蠻意外的,變成我想避免一直開著Table的情況,到最後仍然無法避免開著Table不放。 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		richshih
 
 
  註冊時間: 2007-10-11 文章: 153
 
  第 4 樓
  | 
		
			
				 發表於: 星期六 十二月 20, 2008 9:09 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				sele 後是可以USE來源檔的 但當UPDATE CURSOR 時他會再自己打開他
 
個人經驗應多使用 cursorsetprop() 來一次更新 避免時常與主機聯繫 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 5 樓
  | 
		
			
				 發表於: 星期一 十二月 22, 2008 2:32 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				"問題應該不是開檔的快慢,而是說以CURSOR暫存的觀念來處理檔案,是否對整體的網路效能較佳"
 
 
case by case
 
 
不過我覺得應該不會比較好.
 
 
如果是操作 dbf/dbc 的話,
 
實際上一樣會use 檔案,而 select 還會自己偷建index,偷建暫存檔,
 
如果遇到where 條件是會搞成table scan的情況,
 
反而會從檔案頭掃到檔案尾在建立cursor,
 
比直接use還糟.
 
 
之前站上有討論過 odbc 的vfp driver 怎麼作select 命令,
 
情況大概類似.
 
 
可能只有由sql server 抓回來的cursor 情況還好一點.
 
因為傳回的只有完整table的一部份(cursor),
 
如果採用的是 spt 的資料操作模式,
 
就可以真的切斷連線,等需要更新時再接回來.
 
 
資料庫之所以會由 file base 的 1-tier ,
 
演進到 client/server 的 2 -tier,
 
原因之一就在 file base 在網路分享時的傳輸量過大. _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |