淺談ORM
只接觸過EF和SqlSugar,正在做的項(xiàng)目用到的就是國產(chǎn)的SqlSugar,個人感覺寫法還可以?,F(xiàn)在的開發(fā)基本上很少還有寫原生sql的了,因?yàn)镺RM框架不僅能提高開發(fā)效率,而且還能支持各種數(shù)據(jù)庫,避免了原生sql在更換數(shù)據(jù)庫時的尷尬。但是說白了ORM框架最終也是將object轉(zhuǎn)換成sql語句,不過感覺他應(yīng)該不會給你優(yōu)化sql吧。當(dāng)遇到一些復(fù)雜查詢的時候,比如多個表關(guān)聯(lián)、各種子查詢混在一起的時候,框架就顯得有點(diǎn)乏力,感覺很死板。
在程序方面,就拿C#來說吧,當(dāng)查詢少量數(shù)據(jù)時,ORM框架肯定是沒問題,方便高效。如果操作的數(shù)據(jù)量過大,那肯定會有一些弊端,相對于ADO來說還是顯得比較死板,沒有原生sql靈活,能夠適應(yīng)各種復(fù)雜多變的場景。在查詢時要合理利用內(nèi)存,該緩存的緩存,不要把所有的數(shù)據(jù)讀到內(nèi)存再做業(yè)務(wù)處理,而應(yīng)該是動態(tài)的邊讀邊處理。
總而言之,言而總之,這是我在項(xiàng)目中使用ORM框架時的一點(diǎn)理解。不過現(xiàn)在做的項(xiàng)目一般不可能在去拼寫sql了,但是我還是覺得還是應(yīng)該了解一些sql方面的優(yōu)化。
一、表設(shè)計(jì)
1、在設(shè)計(jì)字段類型時,如果某個字段只包含數(shù)字,盡量就設(shè)計(jì)為數(shù)值類型,不要設(shè)計(jì)成字符類型,否則會影響查詢和連接的性能。
2、盡量使用varchar或nvarchar代替char和nchar,因?yàn)関archar和nvarchar類型長,存儲空間小,可以節(jié)省存儲空間,而且對于查詢來說,在一個存儲空間相對較小的字段內(nèi)搜索效率要高一些。
3、在數(shù)據(jù)量不是很大,使用觸發(fā)器或自定義函數(shù)時,最好是使用表變量,如果是數(shù)據(jù)量較大可以使用臨時表。因?yàn)榕R時表是利用了硬盤,而表變量是占用了內(nèi)存,因此小數(shù)據(jù)量當(dāng)然是內(nèi)存中的表變量更快。而且在存儲過程中,使用表變量與使用臨時表相比,減少了存儲過程的重新編譯量;如果使用到了臨時表,在存儲過程的最后務(wù)必將所有的臨時表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統(tǒng)表的較長時間鎖定。
二、索引
1、在查詢時,為了避免全表掃描,應(yīng)該首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
2、不是所有的索引都是有用的,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時,查詢可能不會去利用索引,也就提高不了查詢效率。
3、索引并不是越多越好,索引在提高查詢效率的同時也降低了插入(insert)和更新(update)的效率,所以在建索引時要慎重考慮,不要放在經(jīng)常更新的字段上,一張表的索引最好不要超過6個。
三、SQL語句查詢
1、在程序中最好是不要使用select * from t;select count() from t,用具體的字段名代替“”,這樣可以減少數(shù)據(jù)負(fù)擔(dān)。如果是多表關(guān)聯(lián)查詢,不同的表存在相同名稱的字段,也會造成混淆。但如果是在后臺數(shù)據(jù)庫做臨時查詢,特別是對表字段不熟悉的時候,用select * 就比較方便了。
2、用exists和not exists代替in和not in,因?yàn)閕n 是把外表和內(nèi)表作hash 連接,而exists是對外表作loop循環(huán),每次loop循環(huán)再對內(nèi)表進(jìn)行查詢,而且IN不對NULL進(jìn)行處理,exists會對NULL值進(jìn)行處理。
3、查詢時,在where字句中使用!=、<>、or、in、not in、like以及對字段進(jìn)行表達(dá)式操作或函數(shù)操作時,都是進(jìn)行全表掃描,雖然有些時候沒辦法避免,但是能換其他方式的,最好不要做全表掃描。
4、不要在 where 子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無法正確使用索引。
5、后臺盡量不要向前臺返回大數(shù)據(jù)量,如果數(shù)據(jù)量過大,更應(yīng)該注意sql優(yōu)化,不要返回一些不需要的列,或者也該考慮考慮需求是否合理了。而且盡量避免大事務(wù)操作,提高系統(tǒng)的并發(fā)能力。
尾聲
大家都是搞后端業(yè)務(wù)的,雖然業(yè)務(wù)不盡相同。但對數(shù)據(jù)庫的使用來說,都是CURD(雖然有些絕對,哈哈)。更好的理解數(shù)據(jù)庫,不光對個人技術(shù)有幫助,長遠(yuǎn)來說對業(yè)務(wù)對發(fā)展都有提升~
1.《orm框架 從ORM框架,聊一聊數(shù)據(jù)庫的設(shè)計(jì)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《orm框架 從ORM框架,聊一聊數(shù)據(jù)庫的設(shè)計(jì)》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/486475.html