2009-09-02 30 views
0

输入:从 - >行对。如何做到这一点数百万行的变换

From To 
1  2 
2  3 
3  4 
6  7 

输出:对于每个来自Value的可达To值。 E.g. for 1

Source Reachable 
1  2 
1  3 
1  4 

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

有没有一种替代的方式来做到这一点,使得:

  1. 使用SQL /功能性风格,而不是命令式编程的?
  2. 对于1000万行足够快。 (C#/ SSIS中的当前图形方法运行约2小时)
+0

你想把它当作HTML? – ChaosPandion 2009-09-02 02:23:48

+0

你使用什么数据库? – 2009-09-02 02:44:47

+0

@ChaosPandion no as sql rows – 2009-09-02 04:37:15

回答

2

使用CTE(公用表表达式)以递归方式听起来像正确的答案。对于涉及日期范围的类似情况,请看here

+0

看起来像rCTE做的工作,明天会检查实际数据并更新线程 – 2009-09-02 03:20:24

+0

CTE的工作?这意味着您至少使用SQL Server 2005。 2008有更好的层次结构语法... – 2009-09-02 03:57:21

+0

一个问题 - 由于颜色变化,CTE陷入了DFS不会进入的无限循环。我们可以实现这一目标吗? – 2009-09-02 04:39:18

1

这个怎么样:

第一次运行:make哈希。

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]之后,休息只是提取计算值。

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

+0

数据库总是会比第三代语言更快。 – 2009-09-02 03:58:28

+0

就性能而言,SCAN是昂贵的业务。 – Faiz 2009-09-08 07:50:37

0

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

0

您应该结合:

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