1

テーブルをサブセット化し、それを に要約しているとしproc sqlます。このコードでは、where ... in句とサブクエリを使用してサブセット化を行います。where ... inSQL エンジンの中には、句の引数の数に制限を設定するものがあることを知っています。SASにはこれに制限がありますか? この質問は、次のようなプログラムに適用されます。

proc sql;
    create table want as
    select
        ID,
        sum(var1) as var1,
        sum(var2) as var2,
        sum(var3) as var3
    from largetable
    where ID in (select ID from longlist)
    group by ID;
quit;

longlist10,000 個の ID を返すとどうなるでしょうか? 1000万でどう?

4

2 に答える 2

4

longlistジョーが言ったように、テーブル内の妥当な数の行にはおそらく問題はないはずです。ただし、これは読み取り可能ですが、結合の方がパフォーマンスが向上する場合があります

左結合を実行するのではなく、記述どおりにクエリを実行することを強く好みますか?

proc sql;
    create table want as
    select
        b.ID,
        sum(b.var1) as var1,
        sum(b.var2) as var2,
        sum(b.var3) as var3
    from longlist a left join largetable b
     on a.ID = b.ID
     group by b.ID;
quit;

長いリストをテキストとして入力する方法について少し詳しく説明します。SAS で 1 つのステートメントの長さに制限があることは認識していませんが、バージョンや使用方法に応じて、コードの個々の行の長さにさまざまな制限があります。提出しています。長いステートメントを複数の行に分割して、それぞれが最大許容長に近づく可能性があると思います。

于 2015-01-23T22:33:26.483 に答える
4

これに関する明示的な制限は認識していません。SAS の SQL パーサーは、テーブルに明示的にコーディングされていない場合、これらを頻繁に JOIN に変換するようです。つまり、いくつかの制限がありますが、特に小さなものではありません。

SQL ステートメントの合計の長さには制限があると思います。そのため、非常に長いリストをテキストに含めようとすると問題が発生する可能性がありますが、上記の例では 10,000,000 で問題はありません。 ID。ロングリスト テーブルの 250,000,000 ID でテストしたところ、SAS は問題ありませんでした。

data largetable;
  do id=1 to 1e8;
    if mod(id,7)=0 then output;
  end;
run;

data ids;
  do id = 1 to 1e9;
    if mod(id,4)=0 then output;
  end;
run;

proc sql _method;
    create table want as
    select
        ID
    from largetable
    where ID in (select ID from IDs)
    group by ID;
quit;

興味深いことに、_method を追加すると、これが結合としてではなく、サブクエリとして実行されることが示されます。少なくともこの場合、その理由はわかりません。私が言われたことはすべて、これを暗黙的に結合に変換する必要があると言っています。

于 2015-01-23T22:33:57.923 に答える