Мне интересно, почему в SAS я выполняю либо - 1 соединение с оператором «ИЛИ», либо - 2 соединение с «И» и захват обоих случаев
значительно снижает скорость?Я хочу узнать больше о теории кодирования, объединений, производительности и т. Д.
Я пытался посмотреть в Интернете, но не смог активировать ключевые слова, необходимые для того, чтобы найти именно то, что я ищу.Я подготовил пример кейса
/*Take the baseball dataset and add a random number to each set*/
%MACRO test_or_join;
%DO i = 1 %TO 200;
DATA baseball_&i.;
SET sashelp.baseball;
rand = ranuni(&i.) * 493;
iteration_1 = &i.;
iteration_2 = &i.;
RUN;
%END;
DATA baseball_merge_1;
SET %DO i = 1 %TO 100;
baseball_&i.
%END;
;
RUN;
DATA baseball_merge_2;
SET %DO i = 101 %TO 200;
baseball_&i.
%END;
;
IF MOD(_N_,13) = 0 THEN ITERATION_1 = .;
RUN;
PROC DATASETS
LIB=WORK;
DELETE
baseball_1 - baseball_2000;
RUN;
%MEND;
%test_or_join;
PROC SQL;
CREATE TABLE join_with_or AS
SELECT
a.*
, b.*
FROM
baseball_merge_1 A
LEFT JOIN
baseball_merge_2 B ON b.team = a.team AND
(b.iteration_1 = a.iteration_1 OR
b.iteration_2 = a.iteration_2);
QUIT;
PROC SQL;
CREATE TABLE join_with_1 AS
SELECT
a.*
, b.*
FROM
baseball_merge_1 A
LEFT JOIN
baseball_merge_2 B ON b.team = a.team AND
b.iteration_1 = a.iteration_1;
QUIT;
PROC SQL;
CREATE TABLE join_with_2 AS
SELECT
a.*
, b.*
FROM
baseball_merge_1 A
LEFT JOIN
baseball_merge_2 B ON b.team = a.team AND
b.iteration_2 = a.iteration_2;
QUIT;
Первое объединение с использованием «ИЛИ» занимает 44,16 секунды. Для двух объединений с использованием только «И» требуется 0,47 и 0,44 секунды соответственно