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

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

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

【 tulaoshi.com - 编程语言 】

image 

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

image image 表定义生成的实体

2.

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

(本文来源于图老师网站,更多请访问http://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

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

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

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不要输入过长的内容,否则会出错了。

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

延伸阅读
乙肝病毒的父婴传播 国内外有关研究指出:乙肝病毒也可父婴传播。研究发现,患有乙肝的男性,其精子中可检出乙肝病毒DNA,该病毒存于精子头部细胞浆中,精子进入卵细胞,尽管其母亲无肝炎,但这种受精卵在形成胚胎过程中,乙肝病毒也在不断增殖,使这种子代成为乙肝患者或病毒携带者,这种乙肝病毒的传播方式称为父婴(www.tulaoshi.com)传播。...
背痛是怎么回事 这样原因会引起背痛的 在我们日常生活中想必不少人都会有背痛的情况吧,背痛的时候整个人都没有了精神状态了,那么大家知道背痛是怎么回事吗,腰酸背痛怎么办呢,腰酸背痛要如何处理呢,下面就让我们一起来了解一下吧。 没想到的姿势也是腰痛的病因 对于背痛,我们在日常中什么样的姿势以及什...
气血两亏 会引起气血亏的因素 在我们博大精深的中医理论中,有着对于气血的一套论述,对于气血两亏也有着比较完整的理论,那么大家知道气血两亏怎么调理比较好呢,气血两亏怎么补呢,下面就让我们一起来了解一下吧。 病因 这些病因引起血虚的机理,分述如下 (1)脾胃虚弱 有哪些东西能够帮助我...
背痛的原因有哪些 这些原因会引起背痛 在我们日常的生活中常常有人会喊背痛啊,腰痛啊之类的,那么大家知道背痛的原因有哪些吗,腰酸背痛的原因是什么呢,背痛的原因是哪些呢,下面就让我们一起来了解一下背痛的原因吧。 后背酸痛是什么原因造成的 1、是一种常见的病痛 其实背痛和颈椎痛以及腰痛都是...
上火长痘怎么办 上火会引起哪些症状 上火长痘怎么办?上火怎么办?上火的症状有哪些?上火牙龈肿痛怎么办?这些问题是否一直困扰着你,是不是每次上火都感觉很烦恼,怎么样有效的去火呢?下面和图老师小编一起看看哪些原因造成我们上火呢? 下面和图老师小编一起看看上火的原因有哪些?你是不是也是这种原因而上火的呢?一起来...

经验教程

856

收藏

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