【发布时间】:2020-03-23 19:00:39
【问题描述】:
我见过两种选择:
-
不使用执行语句
libname lib "/dir"; run; proc sql ; CONNECT TO TeraData (Server = 'edw' User =&tduser pass=&tdpass Database = UDW Mode = TeraData); create table lib.datanew as select * from connection to teradata (select a.name,b.age from table1 a left join table2 b on a.pkey=b.pkey); disconnect from teradata; quit; -
使用 execute 在 Teradata 中创建多集易失性表,然后将其带到 SAS 库中
libname lib "/dir"; run; proc sql; CONNECT TO TeraData (Server = 'edw' User =&tduser pass=&tdpass Database = UDW Mode = TeraData); execute( create multiset volatile table datanew as (select a.name,b.age from table1 a left join table2 b on a.pkey=b.pkey) with data primary index (name) on commit preserve rows ) BY TeraData; CREATE TABLE lib.datanew AS (SELECT * FROM CONNECTION TO TeraData (SELECT * FROM datanew)); disconnect from teradata; quit;
我只是想了解一种方法或另一种方法是否可以更快?如果有,为什么?
【问题讨论】:
-
在某些情况下,使用易失性表有助于将更多逻辑“下推”到数据库中,但在此示例中似乎并非如此。我希望第一个会稍微好一点,因为它做的工作少了一点。顺便说一句,第二个示例似乎有一个错字:它命名了易失性表 datanew,但随后尝试从 libnew 中进行选择;两个请求中的名称需要匹配。
-
感谢您的评论。我已经更正了表名拼写错误。
-
与您的 Teradata DBA 确认制作易失性表是否有帮助或有坏处。答案取决于表的定义方式以及 Teradata 如何尝试优化查询。例如,如果这意味着 Teradata 可以更轻松地找出如何避免访问所有数据或防止查询倾斜,从而使一个或多个节点成为性能瓶颈,它可能会节省一步完成的时间。