Writing Efficient Queries in SAS Using Proc sql with Teradata

后端 未结 5 524
[愿得一人]
[愿得一人] 2021-02-06 11:58

EDIT: Here is a more complete set of code that shows exactly what\'s going on per the answer below.

libname output \'/data/files/jeff\'
%let DateStart = \'01Jan         


        
5条回答
  •  南笙
    南笙 (楼主)
    2021-02-06 12:26

    The most critical thing to understand when using SAS to access data in Teradata (or any other external database for that matter) is that the SAS software prepares SQL and submits it to the database. The idea is to try and relieve you (the user) from all the database specific details. SAS does this using a concept called "implict pass-through", which just means that SAS does the translation from SAS code into DBMS code. Among the many things that occur is data type conversion: SAS only has two (and only two) data types, numeric and character.

    SAS deals with translating things for you but it can be confusing. For example, I've seen "lazy" database tables defined with VARCHAR(400) columns having values that never exceed some smaller length (like column for a person's name). In the data base this isn't much of a problem, but since SAS does not have a VARCHAR data type, it creates a variable 400 characters wide for each row. Even with data set compression, this can really make the resulting SAS dataset unnecessarily large.

    The alternative way is to use "explicit pass-through", where you write native queries using the actual syntax of the DBMS in question. These queries execute entirely on the DBMS and return results back to SAS (which still does the data type conversion for you. For example, here is a "pass-through" query that performs a join to two tables and creates a SAS dataset as a result:

    proc sql;
       connect to teradata (user=userid password=password mode=teradata);
       create table mydata as
       select * from connection to teradata (
          select a.customer_id
               , a.customer_name
               , b.last_payment_date
               , b.last_payment_amt
          from base.customers a
          join base.invoices b
          on a.customer_id=b.customer_id
          where b.bill_month = date '2013-07-01'
            and b.paid_flag = 'N'
          );
    quit;
    

    Notice that everything inside the pair of parentheses is native Teradata SQL and that the join operation itself is running inside the database.

    The example code you have shown in your question is NOT a complete, working example of a SAS/Teradata program. To better assist, you need to show the real program, including any library references. For example, suppose your real program looks like this:

    proc sql;
       CREATE TABLE subset_data AS
       SELECT bigTable.id,
              SUM(bigTable.value) AS total
       FROM   TDATA.bigTable bigTable
       JOIN   TDATA.subset subset
       ON     subset.id = bigTable.id
       WHERE  bigTable.date BETWEEN a AND b
       GROUP BY bigTable.id
       ;
    

    That would indicate a previously assigned LIBNAME statement through which SAS was connecting to Teradata. The syntax of that WHERE clause would be very relevant to if SAS is even able to pass the complete query to Teradata. (You example doesn't show what "a" and "b" refer to. It is very possible that the only way SAS can perform the join is to drag both tables back into a local work session and perform the join on your SAS server.

    One thing I can strongly suggest is that you try to convince your Teradata administrators to allow you to create "driver" tables in some utility database. The idea is that you would create a relatively small table inside Teradata containing the ID's you want to extract, then use that table to perform explicit joins. I'm sure you would need a bit more formal database training to do that (like how to define a proper index and how to "collect statistics"), but with that knowledge and ability, your work will just fly.

    I could go on and on but I'll stop here. I use SAS with Teradata extensively every day against what I'm told is one of the largest Teradata environments on the planet. I enjoy programming in both.

提交回复
热议问题