LINQ to SQL:處理char(1)字段的方式會(huì)引起全表掃描問(wèn)題
如果表中的字段類(lèi)型為 char(1) 時(shí),Linq to SQL生成char (System.Char)的屬性,如下圖
![]() |
![]() |
表定義 | 生成的實(shí)體 |
2.
如果要查詢(xún)LineCode=='A'的記錄,可以這樣定義Linq查詢(xún)語(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è)查詢(xún)的結(jié)果是不一樣的。
Linq 語(yǔ)句 |
|
| ||||||||
生成SQL語(yǔ)句 |
明顯,在Linq to sql是查詢(xún)char(1)類(lèi)型字段是區(qū)分大小寫(xiě)的。
這還會(huì)導(dǎo)致一個(gè)比較嚴(yán)重的問(wèn)題,我們知道在SQL Server中,任何在運(yùn)算符左邊的操作都會(huì)使SQL采用全表掃描。也就是說(shuō),Linq的這個(gè)查詢(xún),會(huì)引起全表掃描,即使[LineCode]列上定義了聚合索引。而如果是where [linecode]='A',則可以使用索引。我們看下這二種情況時(shí)的查詢(xún)執(zhí)行計(jì)劃對(duì)比。
圖中可以看出,Linq to SQL 生成的SQL語(yǔ)句是表掃描,而后者則是索引查找。
3.
對(duì)策
在DBML設(shè)計(jì)器中將LineCode改成string類(lèi)型。
看一下改了之后的查詢(xún)
|
|||||
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)文章
一次SQL查詢(xún)優(yōu)化原理分析(900W+數(shù)據(jù)從17s到300ms)
本文主要介紹了一次SQL查詢(xún)優(yōu)化原理分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06教你恢復(fù)SQLSERVER的master系統(tǒng)庫(kù)的方法
這篇文章主要介紹了恢復(fù)SQLSERVER的master系統(tǒng)庫(kù),本文介紹可能需要恢復(fù)master數(shù)據(jù)庫(kù)的情況以及如何正確完成這些步驟,需要的朋友可以參考下2022-09-09SqlServer2016模糊匹配的三種方式及效率問(wèn)題簡(jiǎn)析
這篇文章主要介紹了SqlServer2016模糊匹配的三種方式及效率問(wèn)題,結(jié)合實(shí)例形式簡(jiǎn)單對(duì)比分析了SQL Server2016使用like語(yǔ)句、PATINDEX及CHATINDEX三種方式進(jìn)行模糊匹配的相關(guān)使用方法及執(zhí)行效率,需要的朋友可以參考下2018-07-07在SQL?Server中使用?Try?Catch?處理異常的示例詳解
這篇文章主要介紹了如何在?SQL?Server?中使用?Try?Catch?處理異常,通過(guò)實(shí)例代碼了解 SQL Server 中的 Try-Catch 實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07SQL入侵恢復(fù)xp_cmdshell方法總結(jié)
恢復(fù)xp_cmdshell SQL Server阻止了對(duì)組件 'xp_cmdshell' 的過(guò)程'sys.xp_cmdshell' 啟用2010-08-08SQL?Server附加數(shù)據(jù)庫(kù)報(bào)錯(cuò):無(wú)法為該請(qǐng)求檢索數(shù)據(jù)錯(cuò)誤解決辦法
在SQL Server中附加數(shù)據(jù)庫(kù)時(shí)可能會(huì)發(fā)生各種錯(cuò)誤,這篇文章主要給大家介紹了關(guān)于SQL?Server附加數(shù)據(jù)庫(kù)報(bào)錯(cuò):無(wú)法為該請(qǐng)求檢索數(shù)據(jù)錯(cuò)誤的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12深入SQL截取字符串(substring與patindex)的詳解
本篇文章是對(duì)SQL截取字符串(substring與patindex的使用)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06