2016-04-04 89 views
0

我正在解決的問題有許多簡單的解決方案,但我需要的是找到減少過程所需的時間和內存的方法。查找多個表中的主鍵

另一方面,我有一張桌子上有幾百個ID和另外40個月份的桌子上的數字。 每個表格都有50萬到100萬個記錄,每個記錄都有唯一的ID。每張桌子都有很少的變量,但我只需要其中的10-20個。

我需要查找表來查找最新的表,當基表發生特定的id並獲取我需要的變量值時。 最新的月份表每天都在計算中,因此前幾個月的許多id可能會再次出現,所以我不能只創建索引字典(last.id和變量)一次。此外,我無法負擔每天都基於所有表創建新字典。

Visual description

我想出了一些想法,但我需要你的幫助,以找到最高效的理念:

  1. 連接具有需要,升序排列ID和月變量的所有月度表,選擇最後.id使用數據步驟。使用連接或合併基表。 問題:設置所有表需要太多的內存。 或者我用循環中的proc append。不幸的是時間和記憶效率都不高。

  2. 內部連接與所有表分開循環: 內存不足,但非常耗時。

  3. 基於除最新版本之外的所有月份創建詞典並每天更新它。 問題:大字典表。

現在我正在尋找聰明的概念如何解決這類問題。也許哈希對象..但如何?

如果您對此案例給我一些反饋,我將不勝感激。

謝謝!

回答

0

如果有人要編寫一些代碼來根據您的規格生成一些虛擬數據,他們可能會爲您的問題提供更具體的答案。但是沒有樣本數據,很難知道沒有反覆試驗的最佳方法。

相反,我已經把我的一些舊的答案解釋爲一個更全面的列表,你可以檢查。

下面是提高性能(大致的性能改善,情況因人而異順序)的一些方法:

  1. 指數在每個表中的字段,你將在where子句中要加入或使用。並非所有字段都是索引的理想候選者,因此請在索引編制之前就如何確定此問題做一點研究。

  2. 在過程中儘可能減少行數(即使用where子句來擺脫任何你不關心的事情)。

  3. 如果連接仍然很耗時,可考慮用散列表查找替換它們。

  4. 壓縮。當你建立數據集時,如果你還沒有使用compress = yes選項,這將縮小磁盤上表的大小,導致磁盤I/O(查詢的最慢部分)減少。

  5. 如果這些步驟是IO密集型,請考慮使用視圖而不是創建臨時表。

  6. 確保您使用proc append將數據集追加到一起以減少IO(聽起來就像是你,只是爲了完整性而添加這個)。將較小的數據集附加到較大的數據集。或者使用視圖來「附加」它們而不會重複開銷。

  7. 通過使用keep語句(減少IO)來限制正在處理的列。

  8. 檢查列長度 - 確保你不使用的$ 255字段長度來存儲的東西,只需要$ 20等的長度......

  9. 使用SAS SPDE(可擴展性能數據引擎) 。它允許您將SAS數據集分成多個文件,並可選擇將其分散到不同的磁盤中。一旦你的SAS數據集達到了一定的大小,你可以看到性能的提高。我通常傾向於在數據集增長> 10G時使用SPD libnames。無需額外的SAS模塊 - 這是作爲Base SAS的一部分啓用的。