LINQ to SQL:處理char(1)字段的方式會(huì)引起全表掃描問(wèn)題
如果表中的字段類型為 char(1) 時(shí),Linq to SQL生成char (System.Char)的屬性,如下圖
|
|
| 表定義 | 生成的實(shí)體 |
2.
如果要查詢LineCode=='A'的記錄,可以這樣定義Linq查詢語(yǔ)句
| var test1 = from p in db.ProductLines |
| where p.LineCode =='A' |
| select p; |
生成的SQL語(yǔ)句是這樣的
注意到Where語(yǔ)句了嗎?是WHERE UNICODE([t0].[LineCode]) = 65,這里先取LineCode列內(nèi)容的UNICODE再和'A'的UNICODE比較。我們知道'A'和'a'的UNICODE是不同的。UNICODE('A') =65,UNICODE('a')=97,也就是說(shuō),我們?cè)贚inq to SQL中這二個(gè)查詢的結(jié)果是不一樣的。
| Linq 語(yǔ)句 |
|
| ||||||||
| 生成SQL語(yǔ)句 |
明顯,在Linq to sql是查詢char(1)類型字段是區(qū)分大小寫(xiě)的。
這還會(huì)導(dǎo)致一個(gè)比較嚴(yán)重的問(wèn)題,我們知道在SQL Server中,任何在運(yùn)算符左邊的操作都會(huì)使SQL采用全表掃描。也就是說(shuō),Linq的這個(gè)查詢,會(huì)引起全表掃描,即使[LineCode]列上定義了聚合索引。而如果是where [linecode]='A',則可以使用索引。我們看下這二種情況時(shí)的查詢執(zhí)行計(jì)劃對(duì)比。
圖中可以看出,Linq to SQL 生成的SQL語(yǔ)句是表掃描,而后者則是索引查找。
3.
對(duì)策
在DBML設(shè)計(jì)器中將LineCode改成string類型。
看一下改了之后的查詢
|
|||||
| Linq | sql |
改為string后,生成的SQL不再用UNICODE函數(shù)了,就解決了區(qū)分大小寫(xiě)和引起全表掃描的問(wèn)題。但又引起一個(gè)新的問(wèn)題,因?yàn)閿?shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)長(zhǎng)度是1,在Insert和Update時(shí)就要注意,LineCode不要輸入過(guò)長(zhǎng)的內(nèi)容,否則會(huì)出錯(cuò)了。
相關(guān)文章
SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問(wèn)題解決方法
用一個(gè)函數(shù)來(lái)解決SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問(wèn)題,經(jīng)測(cè)試可用,有類似問(wèn)題的朋友可以參考下2014-09-09
SQL?Server實(shí)現(xiàn)group_concat功能的詳細(xì)實(shí)例
group_concat函數(shù)能將相同的行組合起來(lái),下面這篇文章主要給大家介紹了關(guān)于SQL?Server實(shí)現(xiàn)group_concat功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
SQL Server出現(xiàn)System.OutOfMemoryException異常的解決方法
這篇文章主要介紹了SQL Server出現(xiàn)System.OutOfMemoryException異常的解決方法,同時(shí)提供了微軟官方的解決方案,需要的朋友可以參考下2014-06-06
SQL Server 批量插入數(shù)據(jù)的完美解決方案
這篇文章主要介紹了SQL Server 批量插入數(shù)據(jù)的完美解決方案,需要的朋友可以參考下2020-12-12
使用SQL Server分區(qū)表功能提高數(shù)據(jù)庫(kù)的讀寫(xiě)性能
一般來(lái)說(shuō)一個(gè)系統(tǒng)最先出現(xiàn)瓶頸的點(diǎn)很可能是數(shù)據(jù)庫(kù)。比如我們的生產(chǎn)系統(tǒng)并發(fā)量很高在跑一段時(shí)間后,數(shù)據(jù)庫(kù)中某些表的數(shù)據(jù)量會(huì)越來(lái)越大。海量的數(shù)據(jù)會(huì)嚴(yán)重影響數(shù)據(jù)庫(kù)的讀寫(xiě)性能2023-05-05
SQLServer 附加數(shù)據(jù)庫(kù)后出現(xiàn)只讀或失敗的解決方法
如果你在附加SQL數(shù)據(jù)庫(kù),出現(xiàn)只讀或失敗的情況,來(lái)看下本文的解決方案吧。2010-03-03
SQL Server 數(shù)據(jù)庫(kù)的設(shè)計(jì)詳解
這篇文章主要為大家介紹了SQLServer數(shù)據(jù)庫(kù)的設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01
SQL Server中通過(guò)擴(kuò)展存儲(chǔ)過(guò)程實(shí)現(xiàn)數(shù)據(jù)庫(kù)的遠(yuǎn)程備份與恢復(fù)
SQL Server中通過(guò)擴(kuò)展存儲(chǔ)過(guò)程實(shí)現(xiàn)數(shù)據(jù)庫(kù)的遠(yuǎn)程備份與恢復(fù)實(shí)現(xiàn)方法,需要的朋友可以參考下2012-05-05

