最初のテーブルの文字列が 2 番目のテーブルの長い文字列の一部に含まれているかどうかに基づいて、2 つのテーブルを結合しようとしています。SAS で PROC SQL を使用していますが、SQL クエリの代わりにデータ ステップを使用することもできます。
このコードは小さなデータセットでは問題なく動作しますが、大量の比較を行う必要があるため、すぐに行き詰まります。単純な等値チェックならいいのですが、index()
関数を使わないと大変です。
proc sql noprint;
create table matched as
select A.*, B.*
from search_notes as B,
names as A
where index(B.notes,A.first) or
index(B.notes,A.last)
order by names.name, notes.id;
quit;
run;
B.notes は 2000 文字 (完全に入力されている場合もあります) のテキスト ブロックであり、A の姓または名のいずれかを含む結果を探しています。
A のすべての行と B のすべての行を既に比較する必要があるため、2 つのステップで実行しても速度の利点は得られないと思います (名前と姓の両方をチェックすることはボトルネックではありません)。
実行するとNOTE: The execution of this query involves performing one or more Cartesian product joins that can not be optimized.
、ログに記録されます。A=4000 観測と B=100,000 観測で実行すると、約 1000 の一致を生成するのに 30 分かかります。
これを最適化する方法はありますか?