線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1060
推到 Plurk!
推到 Facebook!

MS_SQL中使用Where條件的問題

尚未結案
Leonli
一般會員


發表:23
回覆:21
積分:18
註冊:2004-03-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-07 01:05:14 IP:61.152.xxx.xxx 未訂閱
在使用Where條件的時候會這樣子寫 Where a1 and a2 and a3 其中 a1,a2,a3都代表是某個條件 請問這些條件的排列,誰在前誰在後,對SQL語句的執行效率有沒有什麽影響。 比如說a3的條件可以排除掉資料庫中一半的記錄,如果放在最後會不會比放在最前面效率要低。
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-07 09:41:08 IP:202.62.xxx.xxx 未訂閱
您好﹗    Where各條件的先后順序對SQL查詢的效率會有一定的影響﹐同您所述﹐如果a3的條件已經可以先排除掉資料庫中一半的記錄﹐在觀念上當然放在最前面要比放在最后要更有效率﹒    Select A.*, B.* From 資料表一 A, 資料表二 B Where A.鍵值欄位=B.鍵值欄位 and A.欄位1='Xinsheng' Select A.*, B.* From 資料表一 A, 資料表二 B Where A.欄位1='Xinsheng' and A.鍵值欄位=B.鍵值欄位    從以上的兩句SQL敘述中﹐可以看出查詢的目的是一樣的﹐但前句比后句會更有效率﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
Leonli
一般會員


發表:23
回覆:21
積分:18
註冊:2004-03-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-07 23:50:37 IP:219.144.xxx.xxx 未訂閱
有沒有不同意見的,請發言 發表人 - leonli 於 2005/05/07 23:51:10
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-08 00:50:45 IP:203.69.xxx.xxx 未訂閱
好吧。你要是堅持一定要其他答案。 那我會跟你說。依據各個SQL的語法 parser 方式不同。 也許會有不同。 所以。如果你要很清楚它們的差別。 以下三個方法。 1.好好研讀它的SOURCE CODE。你就可以知道有什麼差別。 2.當你拿不到SOURCE CODE的話。就好好研讀它的文件。它的文件應會有詳細的說明。 3.如果它的文件沒有寫得很詳細。而你又是原版付費的使用者。 歡迎打電話去請求支援。我想。你會得到很正確的結果。 ^____________^
scotthsiao
高階會員


發表:13
回覆:324
積分:147
註冊:2005-02-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-08 01:15:14 IP:210.68.xxx.xxx 未訂閱
cashxin2002 版主的提供的意見一定好的啦 !
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-08 20:21:41 IP:211.20.xxx.xxx 未訂閱
這個問題在每個資料庫的狀況都會有些許不同. 有些資料庫在處理 Client 的 Query 要求時, 會經過一個[查詢最佳化]的處理, 依據索引的設計結構與相關的統計紀錄, 來決定條件的處理順序. 不過也不是每個資料庫的最佳化功能都很強, 請閱讀該資料庫的相關文件, 另外統計資料也要有維護才會得到更好的效率. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-11 14:11:45 IP:210.69.xxx.xxx 未訂閱
這個問題沒有絕對答案 如果 a1 濾掉剩下 3/4, a2 濾掉剩下 2/3, a3 濾掉剩下 1/2 您可以考慮將 a3 放最前面 但是前提是 a1, a2, a3 條件比對的時間相同 如果 a3 條件每比一次花時間是 a1 的 10 倍, 那 a1 放前面會比較好 ********************* 如果您滿意答案,請結案 *********************
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-11 16:02:18 IP:61.218.xxx.xxx 未訂閱
to leonil: 小弟淺見.個人認為,where條件的下法,對於執行效率是一定有影響的,至於那個條件在前或在後會有什麼影響,要看各家資料庫而定.像以Oracle來說,越後面的條件會越先執行(記得沒有錯的話,很久沒碰oracle了),不過原則上來說,儘量把primary key的條件用進去,如果where條件裡沒有用到PK欄位,那麼就自己再對自己join一次,通常速度會有提昇. 當然,最好的方式,是要學會看plan,看看資料庫到底有沒有去使用index還是full scan,這些在面對上百萬筆資料量時,會有很大的幫助的
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-12 00:55:09 IP:61.59.xxx.xxx 未訂閱
以 MSSQL 來說 a1 a2 a3 的位置先後影響並不大, 哪一個條件先處理是經過一連串的公式與參數計算後才決定的. 因為資料是一定會持續的增加的, 今天 A3 條件可以過濾掉 1/2 的資料量, 可是過了一段時間不同的資料輸入, 會演變成 1/5 或 4/5 都有可能. 所以要靠資料庫內建的最佳化分析器配合系統內的統計資料來決定處理的先後. 不然怎麼會有資料庫管理員的需求產生呢? 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
Arlung Miao
初階會員


發表:9
回覆:44
積分:25
註冊:2004-08-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-12 09:20:21 IP:61.235.xxx.xxx 未訂閱
我在公司的一個測試庫上做了測試(MS-SQL 2000 / 6000K記錄),結論是經過SQL Server優化後,他們的Execution Plan 是一致的。所以,我認爲無論欄位放在前面或者後面對速度沒有影響(在MS-SQL中)。 When the statement reaches the server, Microsoft® SQL Server™ 2000 compiles it into an execution plan and then immediately runs the execution plan. 發表人 - Arlung Miao 於 2005/05/12 10:20:59
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-13 09:59:52 IP:211.22.xxx.xxx 未訂閱
引言: 以 MSSQL 來說 a1 a2 a3 的位置先後影響並不大, 哪一個條件先處理是經過一連串的公式與參數計算後才決定的.
要補充一下, 這裡所說的 MSSQL 是指 MSSQL2000 的版本. 該版本有附上一個 SQL Query Analyzer 可以開啟功能表下的 [顯示執行計畫],[顯示用戶端統計資料] 然後執行 SQL Query 後會顯示有趣的內容可以研究. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
系統時間:2024-08-05 22:11:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!