0

Teradata DBMS でテーブル Small をテーブル Large に結合する必要があります。small.A、B、C、D の 4 列をマクロ変数に選択しますが、問題は、変数がしばしばバッファ サイズを超えることです。 そのため、 105 レコードごとにチャンクごとに SQL を実行するコード ( http://support.sas.com/techsup/technote/ts553.html ) をグーグル検索しました。ここで、2 つの問題があります。1. 「file temp;」という行。私のために働いていないようです。エラー: エラー: /x/sas/config/Lev1/SASApp/temp.dat にアクセスするための認証が不十分です。2. この例では結合する列が 1 つしかありませんが、結合する列 AD は 4 つあります。誰か助けてくれませんか?私はあなたの助けに感謝します!

%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

「temp」が実際には別の場所にあるファイルであることを示すファイル名ステートメントを以前に実行していない限り、SASは現在のディレクトリでtempというファイルを探し、それに書き込もうとすると思います。現在のディレクトリ (つまり、/x/sas/config/Lev1/SASApp) への読み取りアクセス権はあるが、書き込みアクセス権はないと思います。

SQL を書き込むデータステップを実行する前にこれを実行してみて、それでも同じエラーが発生するかどうかを確認してください。

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

これにより、作業ライブラリ内の temp.sas というファイルに書き込むよう SAS に指示されます。書き込みアクセス権が必要です。

「複数の列の結合」については、どのような結合をしようとしていますか? 小さなデータセット キーからの 4 つの変数はすべて AD ですか? それらすべてを一致させる必要がありますか?これらすべての変数のインデックスが Teradata テーブルに存在することを確認しましたか?

アップデート:

複数の結合条件を持つ単一のクエリとしてこれを行う方がはるかに簡単です-テストで許容できないほど低いレベルのパフォーマンスが確立された後、これはすでに破棄したオプションだと思いますか?

私の理解が正しければ、小さなテーブルの 4 つのキーすべてが大きなテーブルで一致する場合にのみ参加する必要があります。これはまだ可能ですが、Teradata 側でどれだけうまく機能するかはわかりません。

現在のコードは、小さなデータセット 105 レコードを一度に処理し、行に沿って where 句を使用して select ステートメントと insert ステートメントを作成していますwhere key in (row1value row2value ... row105value)。このような小さなレコード セットを使用すると、Teradata がインデックスを使用する可能性が高くなり、クエリが高速化されます。4 キー結合を取得するために使用できる 1 つのアプローチは、次の行に沿って句を作成することです。

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 に答える