全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2373
推到 Plurk!
推到 Facebook!

請問sql如何寫才能提昇效率

尚未結案
freyasawo
一般會員


發表:5
回覆:6
積分:2
註冊:2008-05-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-29 21:36:00 IP:118.171.xxx.xxx 訂閱
內容有點冗長,希望有人能耐心看完^^|||

我有一段語法,舉例如下
[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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-05 15:11:48 IP:61.219.xxx.xxx 未訂閱
純聊天
看到paradox真是讓人想起好多好多傷心的往事,差點要掉下淚來。
也亂佩服大哥你竟然仍堅持使用這個偉大的東東

另外,大哥你寫的這麼複雜的SQL,小弟真是蠻佩服的。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2008-09-05 15:14:54, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-05 15:21:39 IP:61.219.xxx.xxx 未訂閱
言歸正傳。
小弟有過類似經驗。須先由資料庫撈出一大推東西,再與另外一大推﹝可能也是由
資料庫撈出來的﹞東西,兩者作進一步處理。這中間nXn的結果,當然就是
時間的消耗了。這大概就是吾兄關心的重點。就小弟以往的經驗提供一些看法
與吾兄討論討論,看是否能幫上忙。
如吾兄有興趣,回個文,再續。
------
Kevin
freyasawo
一般會員


發表:5
回覆:6
積分:2
註冊:2008-05-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-06 15:28:12 IP:140.127.xxx.xxx 訂閱
拜託,請告訴我
你需要我跟你說大致上範例的table架構嗎

===================引 用 kevin2004 文 章===================
言歸正傳。
小弟有過類似經驗。須先由資料庫撈出一大推東西,再與另外一大推﹝可能也是由
資料庫撈出來的﹞東西,兩者作進一步處理。這中間nXn的結果,當然就是
時間的消耗了。這大概就是吾兄關心的重點。就小弟以往的經驗提供一些看法
與吾兄討論討論,看是否能幫上忙。
如吾兄有興趣,回個文,再續。
瘋狂火星人
一般會員


發表:1
回覆:29
積分:6
註冊:2005-06-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-07 15:48:24 IP:218.169.xxx.xxx 訂閱
可否提供資料庫的大致結構以及您想得到的結果,大家研究研究???

===================引 用 freyasawo 文 章===================
拜託,請告訴我
你需要我跟你說大致上範例的table架構嗎

===================引 用 kevin2004 文 章===================
言歸正傳。
小弟有過類似經驗。須先由資料庫撈出一大推東西,再與另外一大推﹝可能也是由
資料庫撈出來的﹞東西,兩者作進一步處理。這中間nXn的結果,當然就是
時間的消耗了。這大概就是吾兄關心的重點。就小弟以往的經驗提供一些看法
與吾兄討論討論,看是否能幫上忙。
如吾兄有興趣,回個文,再續。
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-12 10:22:46 IP:61.219.xxx.xxx 未訂閱
好久沒回文了,抱歉。實在是因為幾個跨年度的大案子最近都在辦驗收結案
,如果出了問題,公司會賠慘了,小弟恐怕連飯碗都會丟掉,所以一直
沒回文。
下午再來回文。抱歉了。
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-12 17:06:42 IP:61.219.xxx.xxx 未訂閱
先確定問題,我們現在要討論的是資料nXm處理的問題,我們常需由資料庫中撈出
很多資料,再與另一些資料進行比對或計算。
小弟的解法不是由SQL出發。因為這是很常見的狀況,通常小弟事用個函式來處理。
而且因為是切出來作處理,所以不管你原先是用BDE/Ado/dbX等均可適用。
而且大哥你的Paradox應該也無法處理這麼複雜的SQL,所以我們由SQL討論。
你可以先下命令由資料庫撈出你的基底資料來,丟給某個暫時的AdoQuery的
_RecordSet,這是存在記憶體中的,所以速度很快。不過如果你的資料量很大
,比如說好幾十萬筆,那nXm的結果也是很耗時的,所以非必要的欄位不要
抓來。
再由資料庫抓另一些資料來,放在AdoQuery中,再以AdoQuery作迴圈對TempAdoQuery
作Locate﹝會很快﹞作BatchUpdate批次處理,就可以作中間統計與中間篩選
了。
我是常這樣用。不過最多是幾萬筆,沒有在很大的母本上使用過,你試試看。結果
數字告訴小弟一下。
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-12 17:10:17 IP:61.219.xxx.xxx 未訂閱
用tempAdoQuery._RecordSet的好處是它已在LocalPC-RAM上,沒網路頻寬問題,速度
保證快,且可用我們很熟悉的DB元件而不必用陣列等特殊結構。
------
Kevin
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-10-06 12:08:04 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-04-27 0:05:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!