簡體   English   中英

最佳連接順序和附加性能

[英]Best order of joins and append for performance

我在啟動和運行SAS DI作業時遇到巨大的性能問題。 因此,我正在尋找優化工作的聰明方法。

我特別想到的一件事是,我也許應該置換一些連接和附加的順序。 當前,我的工作配置如下:

有幾個結構相似的源表,我首先將日期過濾器應用於(以減少行數)並在兩個字段(例如ab )上進行排序,然后將每個表與具有相同字段的Account表的表連接起來ab (如果可能,我想為它們創建索引,但是不知道如何為SAS DI中的臨時工作表創建索引)。 這些連接中的每一個完成后,我將結果表附加到一個數據集中。

在我看來,我可以先追加, 然后只做一個聯接,但是我不知道哪種方法更快,或者如果答案是取決於我,我不知道它依賴什么(盡管我會猜測組成表的大小)。

那么,先執行多個聯接然后追加,還是先附加一個聯接再進行更好?

編輯

這是一些相關信息的更新(用戶Robert Penridge要求)。

  • 這里的源表數量為7,這些表的大小范圍為1500至520萬。 典型值為10000。 列數為25。這些表都與同一個表連接在一起,該表具有約5000行和8列。
  • 我估計唯一鍵將表划分為大小大致相等的子集; 此處的大小減少應該在8%到30%之間(差異是由於某些源表承載的歷史數據要比其他源表多得多,這又增加了歸為相同數量組的表的百分比)。
  • 我已將列數限制為所需的確切最低數量(21)。
  • 默認情況下,SAS DI將所有臨時數據集創建為視圖,但我沒有更改。
  • 使用GUI元素構造附加和聯接的代碼后,SAS DI會自動生成它們。
  • 最終數據集未排序; 我之所以選這飼料聯接的數據是,部分該鏈接上連接性能(第35頁)中提到,它應該提高性能。
  • 如前所述,我不確定是否可以在SAS DI中的臨時工作表或視圖上放置索引。
  • 我不能說這些字段的寬度是否大於絕對必要的寬度,但是如果是這樣,我懷疑它是否過大。 我猶豫要更改此設置,因為必須在多個表上手動完成此操作,並且當輸入新數據時,它可能需要額外的列寬。

非常感謝

SAS的性能主要是關於減少IO(即對磁盤的讀/寫)。

如果沒有其他詳細信息,很難提供幫助,但是您可以考慮以下一些其他事項:

  • 使用keep語句限制正在處理的列(減少IO)
  • 如果執行聯接的步驟占用大量IO,請考慮使用視圖而不是創建臨時表
  • 如果聯接仍然很耗時,請考慮將其替換為哈希表查找
  • 確保使用proc append將2個數據集附加在一起以減少IO。 將較小的數據集追加到較大的數據集。
  • 考慮不對最終數據集進行排序,而是為數據的使用者在其上放置一個索引。
  • 確保您正在使用某種類型的數據集壓縮,或者確保為所有列設置了適當的列寬(即,在使用8寬度的字段上沒有200的寬度)
  • 在過程中盡早減少行數(您已經在執行此操作,出於完整性考慮,請在此處列出)

調整左聯接和追加的順序可能不會像上述那樣產生太大的變化。

根據您的評論,似乎
1.有7個輸入源表
2.將這7個源表聯接到1個表
3.附加結果

在SAS DI studio中,使用Lookup可以更快地執行上述操作
1.將7個輸入表連接到查找轉換(將其稱為SRC 1-7)2.具有5000條記錄的表是在鍵A和B上執行查找的表(將其稱為LKUP-1)3。從LKUP-1中獲取相關列以傳播到TARGET表中。

這將更快,並且在這種情況下您不必執行JOIN,因為我懷疑您正在執行“多對多”聯接,這會降低SAS DIS的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM