2014-10-05 84 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