【问题标题】:Run proc SQL by chunk of macro variable通过宏变量块运行 proc SQL
【发布时间】:2014-10-05 01:37:37
【问题描述】:

我需要在 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 要加入。 有人可以帮帮我吗?感谢您的帮助!

%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;

【问题讨论】:

    标签: variables macros sas proc-sql


    【解决方案1】:

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

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

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

    这将告诉 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 子句。

    【讨论】:

    • 谢谢!您的文件名声明效果很好。对于您的问题,联接是内部联接。所有 4 个变量都来自 Small 表,但也存在于 TD 大表上并被索引。我试图通过将所有 4 列放在一起来创建一个要加入的列,但它要求所有 4 列都具有字符。当我加入 put(A,char30)||B||C||D 时,索引变得无效。在 TD 中创建 volatile table Small 会是一个好的解决方案吗?内存不会最大吗?性能可能会好很多?你能提供一些见解吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2018-10-31
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多