3

尽管我的 DBA 强烈反对,但我最近将实体框架用于一个项目。所以有一天他来到我的办公室抱怨生成的 T-SQL 到达他的数据库。

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

context.Products.FirstOrDefault(p=>p.Id==id);

这转化为

SELECT ... FROM (SELECT TOP 1 ... FROM PRODUCTS WHERE ID=@id)

所以他在喊,“你到底为什么要写一个 SELECT * FROM (SELECT TOP 1)”

所以我将代码更改为

context.Products.Where(p=>p.Id==id).ToList().FirstOrDefault()

这会产生一个更干净的 T-SQL:

SELECT ... FROM PRODUCTS WHERE ID=@id

内部查询和 TOP 1 消失了。够啰嗦了,我的问题是:第一个查询真的会给 SQL Server 带来开销吗?比第二种方法更难解析吗?Id 列上有一个聚集索引。我想要一个好的答案,这样我就可以把它擦在他(或我的)脸上

谢谢,
提莫

4

1 回答 1

0

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

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

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

于 2012-06-13T11:10:23.113 回答