LINQ to SQL:处理char(1)字段的方式会引起全表扫描问题

2016-02-19 10:54 36 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐LINQ to SQL:处理char(1)字段的方式会引起全表扫描问题,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

image 

如果表中的字段类型为 char(1) 时,Linq to SQL生成char (System.Char)的属性,如下图

image image 表定义生成的实体

2.

如果要查询LineCode=='A'的记录,可以这样定义Linq查询语句

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)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列内容的UNICODE再和'A'的UNICODE比较。我们知道'A'和'a'的UNICODE是不同的。UNICODE('A') =65,UNICODE('a')=97,也就是说,我们在Linq to SQL中这二个查询的结果是不一样的。

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)类型字段是区分大小写的

这还会导致一个比较严重的问题,我们知道在SQL Server中,任何在运算符左边的操作都会使SQL采用全表扫描。也就是说,Linq的这个查询,会引起全表扫描,即使[LineCode]列上定义了聚合索引。而如果是where [linecode]='A',则可以使用索引。我们看下这二种情况时的查询执行计划对比。

image

图中可以看出,Linq to SQL 生成的SQL语句是表扫描,而后者则是索引查找。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

3.

对策

在DBML设计器中将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.8Linqsql

改为string后,生成的SQL不再用UNICODE函数了,就解决了区分大小写和引起全表扫描的问题。但又引起一个新的问题,因为数据库中存储的数据长度是1,在Insert和Update时就要注意,LineCode不要输入过长的内容,否则会出错了。

来源:https://www.tulaoshi.com/n/20160219/1596077.html

延伸阅读
代码如下: select nid,ntitle,nreadtimes,Row_number() over(order by nreadtimes desc) as rownum from article
上火长痘怎么办 上火会引起哪些症状 上火长痘怎么办?上火怎么办?上火的症状有哪些?上火牙龈肿痛怎么办?这些问题是否一直困扰着你,是不是每次上火都感觉很烦恼,怎么样有效的去火呢?下面和图老师小编一起看看哪些原因造成我们上火呢? 下面和图老师小编一起看看上火的原因有哪些?你是不是也是这种原因而上火的呢?一起来...
标签: 生活常识
肾炎会引起低烧吗 肾炎会引起低烧吗 第一方面:由于肾病患者本身就是免疫系统疾病,免疫力低,经常会出现感冒发烧的症状,如病菌长时间侵入人体免疫力就会造成人体抵抗力下降,也会长时间持续发烧感冒。同时也会加重肾病。 第二方面:肾炎本身是不会导致低烧,但是因为肾炎会让患者抵抗力下降,这就导致感染就会发生低烧的情况。严重...
标签: 生活常识
肾虚会引起哪些症状 肾虚会引起哪些症状 第一:脑力方面表现为:记忆力下降记忆力减退,注意力不集中,精力不足,工作效率降低。情志方面表现为:情绪不佳情绪常难以自控,头晕,易怒,烦躁,焦虑,抑郁等。意志方面表现为:缺乏自信信心不足,缺乏自信,工作没热情,生活没激情,没有目标和方向。 第二:性功能方面表现为:性功能降...
背痛的原因有哪些 这些原因会引起背痛 在我们日常的生活中常常有人会喊背痛啊,腰痛啊之类的,那么大家知道背痛的原因有哪些吗,腰酸背痛的原因是什么呢,背痛的原因是哪些呢,下面就让我们一起来了解一下背痛的原因吧。 后背酸痛是什么原因造成的 1、是一种常见的病痛 其实背痛和颈椎痛以及腰痛都是...

经验教程

820

收藏

83
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部