VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

SQL SELECT * INTO CURSOR 與 USE 的效能問題

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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
文章: 4212
來自: 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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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
文章: 4212
來自: 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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作