Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 4 从实体框架生成的T-SQL的性能_Entity Framework 4 - Fatal编程技术网

Entity framework 4 从实体框架生成的T-SQL的性能

Entity framework 4 从实体框架生成的T-SQL的性能,entity-framework-4,Entity Framework 4,尽管DBA强烈反对,我最近还是在一个项目中使用了实体框架。所以有一天他来到我的办公室,抱怨生成的T-SQL访问了他的数据库 例如,当我想根据id选择产品时,我会这样写: context.Products.FirstOrDefault(p=>p.Id==id); 也就是说 SELECT ... FROM (SELECT TOP 1 ... FROM PRODUCTS WHERE ID=@id) 所以他大声喊道:“你到底为什么要写一个SELECT*FROM(selecttop1)” 所以我

尽管DBA强烈反对,我最近还是在一个项目中使用了实体框架。所以有一天他来到我的办公室,抱怨生成的T-SQL访问了他的数据库

例如,当我想根据id选择产品时,我会这样写:

context.Products.FirstOrDefault(p=>p.Id==id);
也就是说

SELECT ... FROM (SELECT TOP 1 ... FROM PRODUCTS WHERE ID=@id)
所以他大声喊道:“你到底为什么要写一个SELECT*FROM(selecttop1)”

所以我把代码改成了

context.Products.Where(p=>p.Id==id).ToList().FirstOrDefault()
这将产生一个更干净的T-SQL:

SELECT ... FROM PRODUCTS WHERE ID=@id
出现了内部查询和前1个查询。够了,我的问题是:第一个查询真的会给SQLServer带来开销吗?是否比第二种方法更难解析?Id列上有一个聚集索引。我想要一个好的答案,这样我就可以在他(或我)的脸上摩擦它

谢谢,

Themos

您是否尝试过手动运行查询并比较执行计划

这里最大的问题不是SQL的格式不符合DBA的标准(尽管我相当肯定查询引擎会优化额外的select)。第二个查询实际上返回Products表的全部内容,然后在内存中对其进行分析,这显然是一项应由DB而不是应用程序层执行的任务


简而言之,他是个书呆子;保持原样。

你能让他给你发送两个查询的执行计划吗?那会让你看得头晕目眩。然而,我认为作为一名DBA,识别TSQL查询中的瓶颈并帮助开发人员理解如何更高效地编写代码是很重要的。相互摩擦是一场自我斗争,不会真正让任何人受益。使用ORM工具有时会导致生成错误的SQL。然而,糟糕地编写TSQL代码也会产生同样的效果。听起来DBA的方式很有条理,你会反对一种很难改变的个人观点。筛选在数据库中仍然有效,请参阅结果(发布的)SQL。@HansKesting ID上的筛选已转换为SQL。
FirstOrDefault()
在原始查询中被转换为SQL,但在修改后的查询中没有,而是在具体化的结果集上工作。它仍然返回相同的结果,但在内存中处理,而不是由数据库处理。