0

我需要在 Teradata DBMS 中将小表与大表连接起来。我将 small.A、B、C、D 4 列选择为宏变量,但问题是变量经常会超过缓冲区大小。所以,我用谷歌搜索了下面的代码(http://support.sas.com/techsup/technote/ts553.html ),即每 105 条记录按块运行 SQL。现在我有两个问题: 1. "file temp;" 行 似乎不适合我。错误是:错误:访问/x/sas/config/Lev1/SASApp/temp.dat 的权限不足。2.该示例只有一列要加入,而我有 4 列 AD 要加入。有人可以帮帮我吗?我感谢您的帮助!

%let 块=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;
4

1 回答 1

1

我认为 SAS 会在当前目录中查找名为 temp 的文件并尝试写入该文件,除非您之前执行过文件名语句,告诉它“temp”实际上是其他地方的文件。我猜您在当前目录(即在/x/sas/config/Lev1/SASApp 中)有读权限但没有写权限。

在运行编写 SQL 的 datastep 之前尝试运行它,看看是否仍然出现相同的错误:

filename temp "%sysfunc(pathname(work))/temp.sas";

这将告诉 SAS 写入工作库中名为 temp.sas 的文件 - 您应该在那里具有写入权限。

至于“加入多个列” - 你想做什么类型的加入?您的所有 4 个变量都是来自小型数据集键的 AD 吗?你需要匹配所有这些吗?您是否确保 Teradata 表中存在所有这些变量的索引?

更新:

将其作为具有多个连接条件的单个查询执行此操作会简单得多 - 我认为这是一个选项,在您的测试建立了无法接受的低性能水平之后您已经放弃了这个选项?

如果我理解正确,您只想在小表中的所有 4 个键在大表中匹配时才加入。这应该仍然是可能的,但我不确定它在 Teradata 方面的表现如何。

您当前的代码一次处理您的小型数据集 105 条记录,使用 where 子句构建 select 和 insert 语句where key in (row1value row2value ... row105value)。使用这样的小型记录集使 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 子句。

于 2014-10-05T09:08:56.160 回答