我有这个查询,我想将Entity Framework几乎1:1转换为SQL:

SELECT GroupId, ItemId, count(*) as total
  FROM [TESTDB].[dbo].[TestTable]
  WHERE GroupId = '64025'
  GROUP BY GroupId, ItemId
  ORDER BY GroupId, total DESC


此SQL查询应基于同一ItemId的编号(针对该组)进行排序。

我现在有这个:

from x in dataContext.TestTable.AsNoTracking()
where x.GroupId = 64025
group x by new {x.GroupId, x.ItemId}
into g
orderby g.Key.GroupId, g.Count() descending
select new {g.Key.GroupId, g.Key.ItemId, Count = g.Count()};


但这会生成以下SQL代码:

SELECT
  [GroupBy1].[K1] AS [GroupId],
  [GroupBy1].[K2] AS [ItemId],
  [GroupBy1].[A2] AS [C1]
FROM ( SELECT
         [Extent1].[GroupId] AS [K1],
         [Extent1].[ItemId] AS [K2],
         COUNT(1) AS [A1],
         COUNT(1) AS [A2]
       FROM [dbo].[TestTable] AS [Extent1]
       WHERE 64025 = [Extent1].[GroupId]
       GROUP BY [Extent1].[GroupId], [Extent1].[ItemId]
     )  AS [GroupBy1]
ORDER BY [GroupBy1].[K1] ASC, [GroupBy1].[A1] DESC


这也可以,但是比我创建的SQL慢2倍。

我已经摆弄了linq代码一段时间了,但是我没有设法创建类似于查询的内容。

执行计划(仅最后两项,前两项相同):

FIRST:   |--Stream Aggregate(GROUP BY:([Extent1].[ItemId]) DEFINE:([Expr1006]=Count(*), [Extent1].[GroupId]=ANY([TESTDB].[dbo].[TestTable].[GroupId] as [Extent1].[GroupId])))
           |--Index Seek(OBJECT:([TESTDB].[dbo].[TestTable].[IX_Group]), SEEK:([TESTDB].[dbo].[TestTable].[GroupId]=(64034)) ORDERED FORWARD)

SECOND:  |--Stream Aggregate(GROUP BY:([TESTDB].[dbo].[TestTable].[ItemId]) DEFINE:([Expr1007]=Count(*), [TESTDB].[dbo].[TestTable].[GroupId]=ANY([TESTDB].[dbo].[TestTable].[GroupId])))
           |--Index Seek(OBJECT:([TESTDB].[dbo].[TestTable].[IX_Group] AS [Extent1]), SEEK:([Extent1].[GroupId]=(64034)) ORDERED FORWARD)

最佳答案

Entity Framework生成的查询和您的手工查询在语义上是相同的,并将提供相同的计划。

在查询优化过程中内联了派生表的定义,因此唯一的区别可能是在解析和编译过程中有极少量的额外开销。

您发布的SHOWPLAN_TEXT片段是相同的计划。唯一的区别是别名。看起来您的表定义是类似的。

CREATE TABLE [dbo].[TestTable]
(
[GroupId] INT,
[ItemId] INT
)

CREATE NONCLUSTERED INDEX IX_Group ON  [dbo].[TestTable] ([GroupId], [ItemId])


而且您正在获得这样的计划



在所有意图和目的上,计划都是相同的。您的性能测试方法可能存在缺陷。也许您的第一个查询将页面带入缓存,然后使第二个查询受益。

10-07 19:30
查看更多