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

