【问题标题】:Linq count of subtable slow compared to SQL与 SQL 相比,子表的 Linq 计数慢
【发布时间】:2014-10-06 11:40:36
【问题描述】:

我正在尝试选择一个表并计算子表中所有分配的行,但似乎存在性能问题?

当我对我们的 Oracle 数据库运行这个 Linq 查询时,它永远不会停止:

From a In TABLE1
Select New  With {
.ID = a.ID,
.COUNT = (From c In TABLE2 Where c.ID2 = a.ID).Count
}

当我查看 LINQPad 中的 SQL 时,它使用 COALESCE 和 CASE 转换如下:

SELECT t0.ID, (
SELECT COUNT(*)
FROM TABLE2 t1
WHERE COALESCE(CASE WHEN ((t1.ID2 = t0.ID)) THEN 1 ELSE 0 END, 0) <> 0
) c0
FROM TABLE1 t0

当我对数据库运行自己的查询时,只需要大约 5 秒。

SELECT t0.ID, (
SELECT COUNT(*)
FROM TABLE2 t1
WHERE t1.ID2 = t0.ID
)
FROM TABLE1 t0

有没有办法在糟糕的翻译中摆脱 COALESCE 和 CASE 或在其他地方获得一些性能?

【问题讨论】:

  • 你尝试使用 GROUP JOIN 吗?
  • 你能给我举个例子吗?

标签: sql oracle linq entity-framework count


【解决方案1】:

您是否尝试使用 GROUP JOIN?

From a In TABLE1
Join c In TABLE2 on c.ID2 Equals a.ID into g
Select New  With {
.ID = a.ID,
.COUNT = g.Count
}

这是生成的 SQL:

SELECT [t0].[ID] AS [ID], (
    SELECT COUNT(*)
    FROM [TABLE2] AS [t1]
    WHERE [t0].[ID] = ([t1].[ID2])
    ) AS [Count]
FROM [TABLE1] AS [t0]

【讨论】:

  • 非常感谢它现在是同一个查询,它应该需要同样的时间,但如果我在 LINQPad 中执行它需要 30 秒,而通过 SQLPlus 或 Toad 只需 5 秒?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2015-01-27
  • 2012-10-20
  • 1970-01-01
  • 2021-08-13
  • 2020-11-19
相关资源
最近更新 更多