最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2008年03月14日 19:03:54   作者:  
1.相關(guān)內(nèi)容: 在SQL Server 2000中,如果數(shù)據(jù)庫(kù)的排序規(guī)則為Chinese_PRC_CI_AS,那么查詢時(shí)是不分大小寫(xiě)的,例如下列這二條SQL語(yǔ)句,查詢的結(jié)果是一樣的。

image 

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

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

2.

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

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

生成的SQL語(yǔ)句是這樣的

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語(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ǔ)句
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語(yǔ)句
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ū)分大小寫(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ì)比。

image

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

 

3.

對(duì)策

在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ū)分大小寫(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)文章

最新評(píng)論

东至县| 沐川县| 三门峡市| 石景山区| 新兴县| 丰都县| 天长市| 正宁县| 淳化县| 邯郸县| 上栗县| 平远县| 托克托县| 原阳县| 肃南| 金寨县| 灵武市| 吉林省| 绥滨县| 奉新县| 遵义县| 牟定县| 隆化县| 仪陇县| 绵竹市| 乌兰浩特市| 汽车| 安国市| 遂昌县| 霍城县| 丹棱县| 和平县| 忻州市| 鞍山市| 柞水县| 昌江| 广平县| 南岸区| 修武县| 千阳县| 镇平县|