校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > LINQ to SQL:處理char(1)字段的方式會引起全表掃描問題

LINQ to SQL:處理char(1)字段的方式會引起全表掃描問題

熱門標(biāo)簽:外呼系統(tǒng)改進(jìn) 分享百度地圖標(biāo)注多個位置 湖南電腦外呼系統(tǒng)平臺 廣東防封卡外呼系統(tǒng)原理是什么 電銷機(jī)器人公司 需要哪些牌照 菏澤語音電銷機(jī)器人加盟公司 地圖標(biāo)注牌 長沙智能外呼系統(tǒng) 知名電銷機(jī)器人價(jià)格

image 

如果表中的字段類型為 char(1) 時(shí),Linq to SQL生成char (System.Char)的屬性,如下圖

image image
表定義 生成的實(shí)體

2.

如果要查詢LineCode=='A'的記錄,可以這樣定義Linq查詢語句

var test1 = from p in db.ProductLines
            where p.LineCode =='A'
            select p;

生成的SQL語句是這樣的

SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE UNICODE([t0].[LineCode]) = @p0
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [65]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8

注意到Where語句了嗎?是WHERE UNICODE([t0].[LineCode]) = 65,這里先取LineCode列內(nèi)容的UNICODE再和'A'的UNICODE比較。我們知道'A'和'a'的UNICODE是不同的。UNICODE('A') =65,UNICODE('a')=97,也就是說,我們在Linq to SQL中這二個查詢的結(jié)果是不一樣的。

Linq 語句
var test1 = from p in db.ProductLines
            where p.LineCode =='a'
            select p;
var test1 = from p in db.ProductLines
            where p.LineCode =='A'
            select p;
生成SQL語句
SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE UNICODE([t0].[LineCode]) = @p0
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [97]
SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE UNICODE([t0].[LineCode]) = @p0
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [65]

明顯,在Linq to sql是查詢char(1)類型字段是區(qū)分大小寫的

這還會導(dǎo)致一個比較嚴(yán)重的問題,我們知道在SQL Server中,任何在運(yùn)算符左邊的操作都會使SQL采用全表掃描。也就是說,Linq的這個查詢,會引起全表掃描,即使[LineCode]列上定義了聚合索引。而如果是where [linecode]='A',則可以使用索引。我們看下這二種情況時(shí)的查詢執(zhí)行計(jì)劃對比。

image

圖中可以看出,Linq to SQL 生成的SQL語句是表掃描,而后者則是索引查找。

 

3.

對策

在DBML設(shè)計(jì)器中將LineCode改成string類型。

image

看一下改了之后的查詢

var test1 = from p in db.ProductLines
            where p.LineCode == "a"
            select p;
SELECT [t0].[LineCode], [t0].[LineName], [t0].[JPH], [t0].[QueueCount]
FROM [dbo].[ProductLine] AS [t0]
WHERE [t0].[LineCode] = @p0
-- @p0: Input VarChar (Size = 1; Prec = 0; Scale = 0) [a]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8
Linq sql

改為string后,生成的SQL不再用UNICODE函數(shù)了,就解決了區(qū)分大小寫和引起全表掃描的問題。但又引起一個新的問題,因?yàn)閿?shù)據(jù)庫中存儲的數(shù)據(jù)長度是1,在Insert和Update時(shí)就要注意,LineCode不要輸入過長的內(nèi)容,否則會出錯了。

標(biāo)簽:福建 商洛 泉州 美容院 珠海 天水 呼和浩特 西寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《LINQ to SQL:處理char(1)字段的方式會引起全表掃描問題》,本文關(guān)鍵詞  LINQ,SQL,處理,char,字段,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《LINQ to SQL:處理char(1)字段的方式會引起全表掃描問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于LINQ to SQL:處理char(1)字段的方式會引起全表掃描問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 大姚县| 无极县| 保靖县| 黄石市| 德阳市| 开封市| 龙川县| 永泰县| 当雄县| 黑河市| 芜湖市| 西乌珠穆沁旗| 扎兰屯市| 岳阳市| 盐亭县| 西乌| 安达市| 新和县| 文登市| 琼中| 太原市| 永康市| 弥渡县| 新营市| 原阳县| 年辖:市辖区| 白朗县| 肥东县| 柯坪县| 洪雅县| 海伦市| 敦化市| 清原| 古田县| 临泉县| 嘉义市| 高要市| 白水县| 吴川市| 榆林市| 北宁市|