如何做这个转换为数百万行

时间:2009-09-02 02:21:37

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

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

From  To
 1     2
 2     3
 3     4
 6     7

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

Source Reachable
 1      2
 1      3
 1      4

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

是否有另一种方法可以这样做:

  1. 使用SQL /功能样式而不是命令式编程?
  2. 足够快1000万行。 (C#/ SSIS中的当前图表方法在~2小时内运行)

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这个怎么样:

首先运行:make hashes。

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]之后,休息只是获取计算值。
  3. 不确定执行的实际速度,需要测试。

答案 2 :(得分:0)

DBMS设计用于处理关系信息/记录集,而非DFS,如hieararchical方法。当涉及到处理hieararchical信息并且您需要性能时,最好通过用第三代语言编写的外部代码来完成工作。是否可以在SSIS中使用manged(CLR)SQL函数或脚本任务来满足您的特定需求?

答案 3 :(得分:0)

你应该结合:

  • 批处理
  • 功能编程风格
  • 群集(无共享=>地图缩减)