2009-09-02 31 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)