2014-10-05 98 views
0

我需要加入一個小表與Teradata DBMS中的大表很小。我選擇small.A,B,C,D 4列到宏變量,但問題是可變元將經常超過緩衝區大小。 因此,我搜索下面的代碼(http://support.sas.com/techsup/technote/ts553.html ),即通過塊運行SQL,每105條記錄。現在我有兩個問題: 1.行「文件溫度;」似乎不適合我。錯誤是: 錯誤:沒有足夠的權限訪問/x/sas/config/Lev1/SASApp/temp.dat。 2.該示例只有一列加入,而我有4列A-D加入。 有人可以幫我嗎?我感謝您的幫助!通過宏塊變量運行proc SQL

%let chunk = 105;

proc sql; 
    create view uniq as 
    select unique key 
    from small 
    order by key; 

data _null_; 
    file temp; 
    set uniq end=end; 

if _n_ = 1 then do; 
    put "create table result as" 
    /" select key,data" 
    /" from connection to dbms" 
    /" (select key,data" 
    /" from large where key in(" 
    /key; 
    end; 
else if mod(_n_, &chunk) = 0 
    and not end then do; 
    put "));" //; 

    put "insert into result" 
    /" select key, data" 
    /" from connection to dbms" 
    /"(select key,data" 
    /"from large where key in(" 
    /key; 

    end; 

else if end then do; 
    put key "));" //; 
    end; 
else put key ","; 
run; 

proc sql; 
    connect to <DBMS> as dbms; 
    %inc temp; 

回答

1

我認爲,SAS將尋找當前目錄下一個名爲臨時文件,並嘗試除非您先前執行的文件名的語句告訴它「臨時」實際上是在其他地方文件寫入到這一點。我猜你已經擁有讀權限但不能在當前目錄(即在/ x/sas/config/Lev1/SASApp)中寫入權限。

嘗試運行這一點,你運行你寫的SQL和datastep看到,如果你仍然得到同樣的錯誤之前:

​​

這將告訴SAS寫入到一個名爲temp.sas工作庫內 - 你應該有寫訪問權限。

至於'加入多列' - 你想要做什麼樣的連接?來自小數據集鍵的所有4個變量A-D都是?你需要匹配所有的人嗎?您是否確定Teradata表中所有這些變量都存在索引?

更新:

這將是一個簡單得多這樣做,因爲有多個連接條件的單個查詢 - 我想這是你的測試後已被放棄已經建立的不可接受的水平差的一個選項性能?

如果我理解正確,只有當小表中的所有4個鍵匹配大表時,纔想加入。這應該還是可以的,但我不確定它在Teradata方面的表現如何。

您當前的代碼正在一次處理您的小數據集105記錄,使用沿着where key in (row1value row2value ... row105value)的行的where子句構造select和insert語句。使用這樣的小記錄集使Teradata更有可能使用索引,加快查詢速度。你可能需要獲得4鍵一種方法加盟將構建沿條款的

where (key1 = row1value and key2 = row1value and key3 = row1value and key4 = row1value) 
or (key1 = row2value and key2 = row2value and key3 = row2value and key4 = row2value) 
or ... 
or (key1 = row105value and key2 = row105value and key3 = row105value and key4 = row105value) 

線不過,我不知道在執行此Teradata的時候是否會承擔你的大表的優勢指標因此我建議您謹慎行事,並對Teradata如何使用索引進行一些研究。您可能會發現proc sql _tree和_method選項可用於確定是否使用索引。

對大數據集中不同值的比例最高的鍵進行初始左連接(對於來自小數據集的每次100行)可能更有意義(這將充分利用索引),然後使用where子句查找其他變量的匹配。或者你可以在所有4個條件上進行左連接。使用這些方法中的任何一種,您都可以使用firstobs和obs選項將小數據集劃分爲適當的小塊,而不是寫出大量的where子句。

+0

謝謝!你的文件名聲明效果很好。對於你的問題,連接是內連接。所有4個變量都來自小表,但也存在於TD大表上並且也被索引。我試圖通過將所有4個列放在一起來創建一個列,但它需要所有4個列都是字符。當我加入(A,char30)|| B || C || D時,索引變得無效。將創建易變的表小在TD是一個很好的解決方案?記憶不會最大化嗎?性能可能會好很多?你能提供一些見解嗎? – ddss12 2014-10-06 20:13:10