作者MacPerson (Gary)
看板C_Sharp
標題Re: [問題] SQL怎麼寫才會快呢?
時間Sat Aug 24 23:41:44 2013
※ 引述《bernachom (Terry)》之銘言:
: 最近和朋友聊到這個問題
: 討論的不是SQL的語法,是說,在C#裡,怎麼去讀這個字串會比較快呢?
: 例如說:
: 這樣子寫 : string dbconnection = "SELECT A FROM B WHERE C ='0'";
: 然後也可以這樣子寫 :
: string AA="SELECT A ", BB="FROM B ",CC="WHERE C='0' ";
: string dbconnection =AA+BB+CC;
: 這樣子寫法之類的
: 但是好像用類似第二種方式,拆開再合併執行會快一些?
: (我們合併是用這個AppendFormat)
: 雖然不太懂原因,但是好像快一些
: 想詢問的是,SQL都是拆開再合併,這樣子的寫法會比較快嗎?
: 有沒有在執行上比較有效率的方式呢,因為希望能讓SQL再快一些
: 謝謝教導了
就我所理解來討論這個問題:
1. 字串的操作最好以stringbuilder來作處理,你可能要先去google一下,stringbilder
的用處及優點在哪?以及字串的操作如果不用stringbuilder會有哪些壞處及好處?
2. SQL的執行快慢並不在於程式裡執行字串的操作,你應該要加強的是sql語法的優化,
如果你目前正在tunning sql查詢,給你個建議 再去google 『sql 執行計畫』,你可
以得知你的SQL查詢的執行成本,來去作語法優化的動作
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.246.72.136
1F:推 jimmy701010:以上兩點都正確 08/24 23:48
2F:→ bernachom:請教一下,如果是靜態字串的話,那把字串拆開相加,還會 08/25 00:04
3F:→ bernachom:比不拆開來得快嗎? 08/25 00:04
4F:→ bernachom:就像是我第一個和第二個SQL寫得這個樣子~ 08/25 00:04
5F:→ bernachom:第一個都不拆的話,照理說不是應該比不拆開來的快嗎? 08/25 00:05
首先,這個問題你google stringbuilder就會有答案。
再來,我想程式執行的快慢,在SQL Statement並不會因為你將字串怎麼拆怎麼接會有
明顯差異,因為一切都跟『記憶體』有關。
以前受饋於版上眾位熱心人士.... 我將解答PO在下面好了
動態字串操作時,會產生很多不必要的記憶體,如下:
string a = "SELECT *"
a = a + " FROM TEST"
記憶體實際上 為了這個操作 NEW了2~3個參考 所以才會推薦你動態字串都用string
builder
再來你這邊屬於靜態字串操作,但是字串如何操作,與SQL的運作無關,畢竟字串組
一組後會送到SERVER作編譯動作,重點是在SQL語法方面。
如果您指的是系統的效率的話,我想字串會這樣拆主要是為了維護方便,至於效能..
我想人體是不會查覺得出來。
※ 編輯: MacPerson 來自: 111.246.72.136 (08/25 00:13)
※ 編輯: MacPerson 來自: 111.246.72.136 (08/25 00:29)
※ 編輯: MacPerson 來自: 111.246.72.136 (08/25 00:30)
6F:→ bernachom:最後四行,點出我的問題了,我正在想說,為什麼我看大家 08/25 00:35
7F:→ bernachom:都拆開,原因應該是維護方便 08/25 00:36
8F:→ bernachom:謝謝您的熱心幫忙 :) 08/25 00:36
9F:→ Litfal:單指.net用SQL的話,不要再自己串查詢字串了..EF、Linq都好 08/26 16:25
10F:→ Litfal:真要用ADO.NET的話,用Parameter也好..... 08/26 16:26
11F:→ a926:組SQL字串 太容易有Injection攻擊了 可以考慮L大的方式 08/27 11:15
12F:→ bernachom:謝謝指導:) 這幾個月才開始學而已,感謝幫忙(筆記) 08/27 20:32