請問sql如何寫才能提昇效率 |
尚未結案
|
freyasawo
一般會員 發表:5 回覆:6 積分:2 註冊:2008-05-06 發送簡訊給我 |
內容有點冗長,希望有人能耐心看完^^|||
我有一段語法,舉例如下 [code sql] SELECT SUPNO.SUP_NO,SUPNO.NAM,PRDNO01.PRD_NO,PRDNO01.WHR FROM PRDNO LEFT OUTER JOIN SUPNO ON SUPNO.SUP_NO = CUSNO.SUP_NO LEFT OUTER JOIN PRDNO01 ON PRDNO01.PRD_NO = PRDNO.PRD_NO [/code] <查詢出約4,000筆資料> 然後去跑 While 迴圈 他每一筆資料還可以設定去找最近產品的售出日期 [WHERE 的" "為代入的查詢資料] [code sql] SELECT SALNO.DAT FROM SALNO LEFT OUTER JOIN SALNO01 ON SALNO01.SAL_NO = SALNO.SAL_NO LEFT OUTER JOIN SALNO02 ON SALNO02.SAL_NO = SALNO.SAL_NO WHERE ((SALNO01.PRD_NO = "PRDNO01.PRD_NO") AND (SALNO01.WHR = "PRDNO01.WHR")) OR ((SALNO02.PRD_NO = "PRDNO01.PRD_NO") AND (SALNO02.WHR = "PRDNO01.WHR")) ORDER BY SALNO.DAT DESC [/code] 但這個語法查詢時,會有一萬筆的資料 四千筆每次都要去查那一萬筆 造成整個速度上的拖累 要是我不找那最近出售欄位,整個程式跑完7秒多 要是要找那欄位,要跑五分鐘以上 後來我想到另一個寫法如下: [code sql] SELECT SUPNO.SUP_NO,SUPNO.NAM,PRDNO01.PRD_NO,PRDNO01.WHR, (SELECT MAX(A.DAT) FROM SALNO A WHERE A.SAL_NO IN (SELECT B.SAL_NO FROM SALNO01 B WHERE B.PRD_NO = PRDNO01.PRD_NO AND B.WHR = PRDNO01.WHR ) ) AS DAT1, (SELECT MAX(A.DAT) FROM SALNO A WHERE A.SAL_NO IN (SELECT C.SAL_NO FROM SALNO02 C WHERE C.PRD_NO = PRDNO01.PRD_NO AND C.WHR = PRDNO01.WHR ) ) AS DAT2 FROM PRDNO LEFT OUTER JOIN SUPNO ON SUPNO.SUP_NO = CUSNO.SUP_NO LEFT OUTER JOIN PRDNO01 ON PRDNO01.PRD_NO = PRDNO.PRD_NO [/code] 之後在while裡判斷DAT1大還是DAT2大 這樣找出最近售出日期的程式的效率是8秒多 但是他無法應用在PARDOX上 要是要配合PARDOX,我把迴圈外的sql語法DAT1及DAT2欄位抽掉,把語法放進While裡跑 時間上需要1分50多秒 這樣和不查欄位的七秒多差距太大了… 請問還有什麼合適的寫法可以縮短時間,又可以讓PARDOX運作的? 編輯記錄
freyasawo 重新編輯於 2008-08-29 21:40:57, 註解 無‧
|
kevin2004
資深會員 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
|
kevin2004
資深會員 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
|
freyasawo
一般會員 發表:5 回覆:6 積分:2 註冊:2008-05-06 發送簡訊給我 |
|
瘋狂火星人
一般會員 發表:1 回覆:29 積分:6 註冊:2005-06-17 發送簡訊給我 |
可否提供資料庫的大致結構以及您想得到的結果,大家研究研究???
===================引 用 freyasawo 文 章=================== 拜託,請告訴我 你需要我跟你說大致上範例的table架構嗎 ===================引 用 kevin2004 文 章=================== 言歸正傳。 小弟有過類似經驗。須先由資料庫撈出一大推東西,再與另外一大推﹝可能也是由 資料庫撈出來的﹞東西,兩者作進一步處理。這中間nXn的結果,當然就是 時間的消耗了。這大概就是吾兄關心的重點。就小弟以往的經驗提供一些看法 與吾兄討論討論,看是否能幫上忙。 如吾兄有興趣,回個文,再續。 |
kevin2004
資深會員 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
|
kevin2004
資深會員 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
先確定問題,我們現在要討論的是資料nXm處理的問題,我們常需由資料庫中撈出
很多資料,再與另一些資料進行比對或計算。 小弟的解法不是由SQL出發。因為這是很常見的狀況,通常小弟事用個函式來處理。 而且因為是切出來作處理,所以不管你原先是用BDE/Ado/dbX等均可適用。 而且大哥你的Paradox應該也無法處理這麼複雜的SQL,所以我們由SQL討論。 你可以先下命令由資料庫撈出你的基底資料來,丟給某個暫時的AdoQuery的 _RecordSet,這是存在記憶體中的,所以速度很快。不過如果你的資料量很大 ,比如說好幾十萬筆,那nXm的結果也是很耗時的,所以非必要的欄位不要 抓來。 再由資料庫抓另一些資料來,放在AdoQuery中,再以AdoQuery作迴圈對TempAdoQuery 作Locate﹝會很快﹞作BatchUpdate批次處理,就可以作中間統計與中間篩選 了。 我是常這樣用。不過最多是幾萬筆,沒有在很大的母本上使用過,你試試看。結果 數字告訴小弟一下。
------
Kevin |
kevin2004
資深會員 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |