編集:これは、以下の回答に従って何が起こっているかを正確に示す、より完全なコードのセットです。
libname output '/data/files/jeff'
%let DateStart = '01Jan2013'd;
%let DateEnd = '01Jun2013'd;
proc sql;
CREATE TABLE output.id AS (
SELECT DISTINCT id
FROM mydb.sale_volume AS sv
WHERE sv.category IN ('a', 'b', 'c') AND
sv.trans_date BETWEEN &DateStart AND &DateEnd
)
CREATE TABLE output.sums AS (
SELECT id, SUM(sales)
FROM mydb.sale_volue AS sv
INNER JOIN output.id AS ids
ON ids.id = sv.id
WHERE sv.trans_date BETWEEN &DateStart AND &DateEnd
GROUP BY id
)
run;
目標は、カテゴリのメンバーシップに基づいて、いくつかの ID についてテーブルを単純にクエリすることです。次に、これらのメンバーのアクティビティをすべてのカテゴリで合計します。
上記のアプローチは、次のものよりもはるかに遅くなります。
- 最初のクエリを実行してサブセットを取得する
- 2 番目のクエリを実行してすべての ID を合計する
- 2 つの結果セットを内部結合する 3 番目のクエリを実行します。
私の理解が正しければ、クロスロードではなく、すべてのコードが完全にパススルーされていることを確認する方が効率的かもしれません。
昨日質問を投稿した後、メンバーは、私の状況により具体的なパフォーマンスに関する別の質問をすることで利益が得られるかもしれないと提案しました.
SAS Enterprise Guide を使用して、いくつかのプログラム/データ クエリを作成しています。「Teradata」に保存されている基本データを変更する権限がありません。
私の基本的な問題は、この環境で効率的な SQL クエリを作成することです。たとえば、ID の小さなサブセットについて大きなテーブル (数千万のレコードを含む) をクエリします。次に、このサブセットを使用して、より大きなテーブルを再度クエリします。
proc sql;
CREATE TABLE subset AS (
SELECT
id
FROM
bigTable
WHERE
someValue = x AND
date BETWEEN a AND b
)
これは数秒で機能し、90k ID を返します。次に、この ID のセットを大きなテーブルに対してクエリしたいのですが、問題が発生します。ID の時間の経過に伴う値を合計したい:
proc sql;
CREATE TABLE subset_data AS (
SELECT
bigTable.id,
SUM(bigTable.value) AS total
FROM
bigTable
INNER JOIN subset
ON subset.id = bigTable.id
WHERE
bigTable.date BETWEEN a AND b
GROUP BY
bigTable.id
)
なんらかの理由で、これには非常に長い時間がかかります。違いは、最初のクエリが「someValue」にフラグを立てることです。2 つ目は、「someValue」の内容に関係なく、すべてのアクティビティを調べます。たとえば、ピザを注文するすべての顧客にフラグを立てることができます。次に、ピザを注文したすべての顧客のすべての購入を調べます。
私は SAS にあまり詳しくないので、これをより効率的に行う方法やスピードアップする方法についてのアドバイスを探しています。ご意見やご提案をお待ちしております。詳細をお知らせできる場合はお知らせください。2 番目のクエリの処理に非常に時間がかかることに驚いたと思います。