在 LINQ 中表现出色 SQL
Having performance in LINQ to SQL
在 LINQ to SQL 中将 where
放在 group by
之后,就像 T-SQL 中的 having
一样工作。我希望 LINQ 在结果中生成 having
语句。但是当我查看输出语句时,我没有看到任何 having
语句。是否有任何方法或技巧可以强制 LINQ 使用 having
并获得更好的性能?
LINQ 查询:
var result = from item in db.Words
group item by item.UserID into gp
where gp.Average(g => g.DownVotes) == 0
select gp.Key;
result.ToList();
SQL 输出:
-- Region Parameters
DECLARE @p0 Float = 0
-- EndRegion
SELECT [t1].[UserID]
FROM (
SELECT AVG([t0].[DownVotes]) AS [value], [t0].[UserID]
FROM [Words] AS [t0]
GROUP BY [t0].[UserID]
) AS [t1]
WHERE [t1].[value] = @p0
我认为此查询的性能低于 having
这些查询在功能上是相同的,所发生的只是 LINQ 使用子查询来提供查询的内层。
考虑到在正常的组查询中,您需要 HAVING 作为分组后的第二个 WHERE 子句,但在子查询版本中,WHERE 无论如何在组之后运行。
正如 MarcinJuraszek 所说,对两个查询进行基准测试以获得更快的答案,否则就相信 T-SQL 引擎无论如何都会优化子查询版本。
在 LINQ to SQL 中将 where
放在 group by
之后,就像 T-SQL 中的 having
一样工作。我希望 LINQ 在结果中生成 having
语句。但是当我查看输出语句时,我没有看到任何 having
语句。是否有任何方法或技巧可以强制 LINQ 使用 having
并获得更好的性能?
LINQ 查询:
var result = from item in db.Words
group item by item.UserID into gp
where gp.Average(g => g.DownVotes) == 0
select gp.Key;
result.ToList();
SQL 输出:
-- Region Parameters
DECLARE @p0 Float = 0
-- EndRegion
SELECT [t1].[UserID]
FROM (
SELECT AVG([t0].[DownVotes]) AS [value], [t0].[UserID]
FROM [Words] AS [t0]
GROUP BY [t0].[UserID]
) AS [t1]
WHERE [t1].[value] = @p0
我认为此查询的性能低于 having
这些查询在功能上是相同的,所发生的只是 LINQ 使用子查询来提供查询的内层。
考虑到在正常的组查询中,您需要 HAVING 作为分组后的第二个 WHERE 子句,但在子查询版本中,WHERE 无论如何在组之后运行。
正如 MarcinJuraszek 所说,对两个查询进行基准测试以获得更快的答案,否则就相信 T-SQL 引擎无论如何都会优化子查询版本。