【问题标题】:Using Recursive with CTE in SQL Query vs. Recursive in C#在 SQL 查询中将递归与 CTE 结合使用与在 C# 中使用递归
【发布时间】:2020-08-10 13:42:15
【问题描述】:

我一直在研究哪种方法可以更好地优化我的系统,无论是在我的存储过程 (SQL) 中使用递归还是在 C# 中使用递归。

我读过两种观点,其中一种解释说在 c# 中使用递归更复杂、更慢,但使用 tail-call optimization 解决了这个问题,但 C# 不支持这一点。

另一方面,我读过一个线程,在他们用 C# 编写的程序中使用它来减少数据库负担。

我想知道在可以存储和检索数千条记录的系统中哪个更好。

【问题讨论】:

  • sql 语言不太适合使用递归。 c# 中的递归不是很复杂。问题是在数据库和 c# 之间传输的数据量以及完成递归所需的查询数。如果您可以查询一次数据库并检索所有数据(数据量不会在 c# 中产生内存问题),那么我建议将数据放入 c# 数据表(使用适配器)。然后在 c# 中进行递归。
  • 谢谢!不过,我一直将数据放在 IEnumerable 而不是 DataTable 中。我想知道哪个更好?
  • 我更喜欢数据表,因为我可以使用适配器在一条指令中完成。要创建 IEnumerable,您需要使用数据读取器和循环。

标签: c# sql recursion optimization


【解决方案1】:

一般来说,最好编写一个单个查询并避免来回访问数据库的开销。

你还没有指定你想要做什么。但我希望递归 CTE 在数据库中而不是在应用程序中工作得更好,原因如下:

  • 您没有多次调用数据库的开销。
  • 可以将中间结果保存为内部数据库格式。
  • 您不必将数据返回到应用程序并将其传递回数据库。

此外,您可能会在 C# 中使用递归来处理某些事情,使用 SQL 构造(例如窗口函数)可能会更好地实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 2010-11-03
    • 2014-08-11
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多