Почему соединение с оператором OR занимает намного больше времени, чем два запроса на «И»? - PullRequest
0 голосов
/ 16 мая 2019

Мне интересно, почему в 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 секунды соответственно

...