【问题标题】:How to do this Transform for millions of Rows如何为数百万行执行此转换
【发布时间】:2009-09-02 02:21:37
【问题描述】:

输入:成对的 From->To 行。

From  To
 1     2
 2     3
 3     4
 6     7

输出:对于每个 From 值,可到达的 To 值对。 例如。 1

Source Reachable
 1      2
 1      3
 1      4

显然,可以将数据吸出到 Graph 结构中并运行 DFS 扫描。

是否有其他方法可以做到这一点,例如:

  1. 使用 SQL/Functional Style 而不是命令式编程?
  2. 足够快,可处理 1000 万行。 (当前 C#/SSIS 中的图形方法在大约 2 小时内运行)

【问题讨论】:

  • 你知道最大深度吗?

标签: c# sql sql-server-2008 ssis


【解决方案1】:

递归地使用 CTE(公用表表达式)听起来是正确的答案。查看here 以了解涉及日期范围的类似情况。

【讨论】:

  • 看起来 rCTE 完成了这项工作,明天将检查真实数据并更新线程
  • CTE 有效吗?这意味着您至少使用的是 SQL Server 2005。 2008 有更好的分层语法...
  • 一个问题 - 由于颜色变化,CTE 卡在 DFS 无法进入的无限循环中。我们能做到吗?
  • 您为什么不将查询发布到另一个问题,看看是否有人可以帮助解决它?
【解决方案2】:

这个怎么样:

第一次运行:制作哈希。

h[1] = 2
h[2] = 3
h[3] = 4
h[6] = 7

第二次运行:对于每个键,查看它是否未处理(我会解释),如果是,则执行更改运行并输出可达性:

h[1] = 2 (unprocessed) --> output "1 2"
  h[2] = 3 (unprocessed) --> output "1 3"
    h[3] = 4 (unprocessed) --> output "1 4"
      h[4] = null

现在我们存储计算(处理)的结果以加速未来的查找(如在动态编程中):

h[1] = 2,3,4,
h[2] = 3,4,
h[3] = 4,

等等。

极端情况:

  1. 没有值用作键。在第二次运行中,我们将对每个键进行两次查找。
  2. 它是一个单链。然后在第二次运行中,在计算 h[1] 之后,rest 只是获取计算值。

不确定实际执行速度,需要测试。

【讨论】:

  • 数据库在这方面总是比第三代语言更快。
【解决方案3】:

DBMS 设计用于处理关系信息/记录集,而不是用于 DFS 之类的分层方法。当涉及到处理分层信息并且您需要性能时,最好通过使用某些第 3 代语言编写的外部代码来完成这项工作。是否可以根据您的特定要求在 SSIS 中使用托管 (CLR) SQL 函数或脚本任务?

【讨论】:

    【解决方案4】:

    你应该结合:

    • 批处理
    • 函数式编程风格
    • 集群(无共享 => Map Reduce)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-12
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多