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

sql 用'like'时速度慢

尚未結案
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-20 13:18:44 IP:218.72.xxx.xxx 未訂閱
各位大大: 小弟在用sql server做"select * from xx"时,如果加上"where xxx like '___x_'时,会速度很慢,但只要不用like功能就速度很快,请问是何原因,有否好的方法? Thank you very much!
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-20 14:02:58 IP:211.76.xxx.xxx 未訂閱
您好: 原因參考http://archives.postgresql.org/pgsql-sql/2000-03/msg00077.php ~~應無所住而生其心~~
cashxin2002
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-20 14:08:37 IP:63.84.xxx.xxx 未訂閱
您好﹗    印象中Like子句對SQL查詢并不會引起太大的降低效率的影響﹐而是Like子句后的條件式﹐在使用諸如%和*等萬元字符時對查詢的效率方面就會比較突出的降低﹒ 參考看看﹗ P.S 已幫您刪除另一篇同主題發問﹒ ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2004/01/20 14:10:51
------
忻晟
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-20 14:30:25 IP:210.65.xxx.xxx 未訂閱
Hi: 假設針對 table1 的 field1 有設定一個 Index select * from table1 where field1 like 'xxx%' --> 會啟動此 Index 並做 Range Scan select * from table1 where field1 like '%xxx%' --> 不會啟動此 Index,table1 做 Full Scan,且會逐筆比對 field 是否符合 '%xxx%' select * from table1 --> table1 做 Full Scan 而若 table1 無對 field1 設定 Index select * from table1 where field1 like 'xxx%' select * from table1 where field1 like '%xxx%' select * from table1 皆會對 Table1 做 Full Scan,只是差在是否還須去作比對 PS:以上為以 Oracle 觀點來看,SQL Server 應該相去不遠,若有錯誤,尚請不吝指教 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-20 15:15:21 IP:211.76.xxx.xxx 未訂閱
用 like '%xxx%' 時候 我想有沒有index都是一樣發揮不了加速的作用 不過ORACLE在LIKE的表現 比MS-SQL好很多 而MS-SQL有一個全文檢索的功能 我開啟之後 也看不出速度上的差異 不知有沒有會員對MS-SQL的全文檢索功能有研究的 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-29 09:58:16 IP:61.226.xxx.xxx 未訂閱
你是用ClientDataSet嗎?若不是的話,我建議你改用它 (ADOConnection-->ADOQuery-->DataSetProvider-->ClientDataSet) 然後ClientDataSet有Filter和Filtered的property ClientDataSet1.Filter:='Edit1.text like ' '''' ª% ''''; //不知寫的對不對,自己測試;其他的DataSet如TQuery,TADOQuery 不能用 like 喔,自己看Help ClientDataSet1.filtered:=true; 如此篩選都是在Client端的話,是使用記憶體,速度快上萬倍,你不妨試試看 切記一點,程式要寫的好,絕對不要在Sql Command上動腦筋,Sql越簡單越好 (如select ..from ... where ..order... ),所有的查詢,篩選都一定要在Client端執行,如此程式才能執行的順暢喔!
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-29 11:48:46 IP:61.226.xxx.xxx 未訂閱
對不起,我要做一點修正,ClientDataSet用like好像不行必需用其他的方法 Example ClientDataSet1.Filter:='Field1 =' '''' '12*' ''''; //用* 代替like才可,這樣 TQuery ,TADOQuery 應該也可以用 ClientDataSet1.Filtered:=true; ClientDataSet1.Filtered:=false; 再次的建議,改用ClientDataSet會比較好
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-29 14:41:49 IP:218.72.xxx.xxx 未訂閱
引言: 對不起,我要做一點修正,ClientDataSet用like好像不行必需用其他的方法 Example ClientDataSet1.Filter:='Field1 =' '''' '12*' ''''; //用* 代替like才可,這樣 TQuery ,TADOQuery 應該也可以用 ClientDataSet1.Filtered:=true; ClientDataSet1.Filtered:=false; 再次的建議,改用ClientDataSet會比較好
johnny2212前辈: 感谢您的回应,可能我没说清楚,我用“LIKE”速度慢,主要是指直接在sql server上操作时的现象,不是指在delphi上操作,因此您的方法不知是否可行?Thank you very much! 谢谢!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-29 15:10:08 IP:210.65.xxx.xxx 未訂閱
Hi:    luowy651,我想你誤解了 johnny2212 大大的意思    johnny2212 大大的意思應該是說,既然不用 like 功能就速度很快,那就在 SQL Server 上操作時避免使用該語法,亦即使用 select * from xx 的語法就可以了,然後在前端的 ClientDataSet 中,以 Filter 條件式來過濾顯示出來的資料    johnny2212 大大,不知這麼說是否正確 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
orson
中階會員


發表:5
回覆:135
積分:58
註冊:2002-07-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-30 15:41:46 IP:211.74.xxx.xxx 未訂閱
引言: 用 like '%xxx%' 時候 我想有沒有index都是一樣發揮不了加速的作用 不過ORACLE在LIKE的表現 比MS-SQL好很多 而MS-SQL有一個全文檢索的功能 我開啟之後 也看不出速度上的差異 不知有沒有會員對MS-SQL的全文檢索功能有研究的 ~~~Delphi K.Top討論區站長~~~
敢問站長 有把語法改成 where freetext(field, 'xxx') 小弟以前玩的結果是 快很多 小弟測試的資料是將近百萬筆的人名 Orson
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-30 22:59:54 IP:61.226.xxx.xxx 未訂閱
FishMan,你說的沒錯,既然問題在Client端解決,你何必一定要去操資料庫呢 ?使用like ,group, StoreProcedure,Olap,都會造成資料庫極大的負擔,應盡量避免,使用Client/Serverc或Multi-Tier的道理就在這裡, 你若去使用各Sql語法去兜資料庫,當然不必寫複雜的程式,但是若使用愈多,效率會愈差(這是一定的,否則要Programmer作什麼),程式設計者不可不慎
系統時間:2024-06-16 17:14:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!