2015-09-08 4 views
0

Я изучаю инструкцию sas proc sql. Я заметил, что, хотя результат один и тот же для следующих двух методов, реальное время и cpu различны. Интересно, почему существует разница.PROC SQL INNER JOIN QUERY

data data1; 
    input name1 $ choice $; 
    datalines; 
John A 
Mary B 
Peter C 
; 
run; 

data data2; 
    input name2 $ choice2 $; 
    datalines; 
John B 
Mary C 
Peter B 
run; 

Метод 1:

proc sql; 
    select a.*, b.* 
    from data1 as a, data2 as b 
    where a.name1= data2.name2 
    ; 
quit; 

Способ 2:

proc sql; 
    select a.* , b.* 
    from data1 as a inner join data2 as b 
     on a.name1 = b.name2 
    ; 
quit; 

enter image description here

+0

Если вы не указали тип соединения, вы используете естественное соединение, а предложение where применяется к результатам. Если вы укажете внутреннее соединение с ON, результаты будут отфильтрованы в процессе соединения. Я уверен, что кто-то еще объяснит это лучше, поэтому я не буду публиковать это как ответ – Reeza

+0

Кроме того, IMO вы всегда должны явно указывать свой тип соединения. – Reeza

+0

Немного больше информации о порядке обработки SQL в SAS. http://blogs.sas.com/content/sastraining/2013/02/04/a-database-professionals-best-friend-2/ – Reeza

ответ

0

Игнорирование необъясненную HTML файл и любые случайные флуктуации в CPU и исполнения времени ради обсуждение, короткий ответ может заключаться в том, что SAS обрабатывает различные объединения по-разному по-разному. Возможно, это не имеет большого значения для файлов размером с примеры здесь, но это стоит знать.

Более длинный ответ заключается в том, что это может зависеть в некоторой степени от точной версии SAS, которую вы используете. В SAS 9.4 с вашим примером наборами данных, план запроса я вижу генерироваться одинаков для обоего объединений, если оставить proc sql свои собственные устройства:

52   /* Method 1: */ 
53   
54   proc sql _method; 
55    select a.*, b.* 
56    from data1 as a, data2 as b 
57    where a.name1= data2.name2 
58    ; 

NOTE: SQL execution methods chosen are: 

     sqxslct 
      sqxjhsh 
       sqxsrc(WORK.DATA1(alias = A)) 
       sqxsrc(WORK.DATA2(alias = B)) 
59   quit; 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   0.01 seconds 
     user cpu time  0.01 seconds 
     system cpu time  0.00 seconds 
     memory    5469.21k 
     OS Memory   32668.00k 
     Timestamp   09/08/2015 06:43:09 PM 
     Step Count      457 Switch Count 50 
     Page Faults      0 
     Page Reclaims      87 
     Page Swaps      0 
     Voluntary Context Switches  156 
     Involuntary Context Switches  14 
     Block Input Operations   0 
     Block Output Operations   16 


60   /* Method 2: */ 
61   
62   proc sql _method; 
63    select a.* , b.* 
64    from data1 as a inner join data2 as b 
65     on a.name1 = b.name2 
66    ; 

NOTE: SQL execution methods chosen are: 

     sqxslct 
      sqxjhsh 
       sqxsrc(WORK.DATA1(alias = A)) 
       sqxsrc(WORK.DATA2(alias = B)) 
67   quit; 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   0.01 seconds 
     user cpu time  0.01 seconds 
     system cpu time  0.00 seconds 
     memory    5467.81k 
     OS Memory   32924.00k 
     Timestamp   09/08/2015 06:43:09 PM 
     Step Count      458 Switch Count 50 
     Page Faults      0 
     Page Reclaims      26 
     Page Swaps      0 
     Voluntary Context Switches  167 
     Involuntary Context Switches  11 
     Block Input Operations   0 
     Block Output Operations   8 

Вы также можете подтвердить это с помощью _tree варианта, который производит более подробный вариант плана запроса. См. here для получения дополнительной информации о выходе параметров _method и _tree.

Некоторые различия между ними возникают, если вы будете направлять планировщик запросов в отношении использования различных алгоритмов присоединиться, однако:

52   /* Method 1: */ 
53   
54   proc sql _method magic=101; 
55    select a.*, b.* 
56    from data1 as a, data2 as b 
57    where a.name1= data2.name2 
58    ; 
NOTE: PROC SQL planner chooses sequential loop join. 

NOTE: SQL execution methods chosen are: 

     sqxslct 
      sqxjsl 
       sqxsrc(WORK.DATA1(alias = A)) 
       sqxsrc(WORK.DATA2(alias = B)) 
59   quit; 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   0.01 seconds 
     user cpu time  0.01 seconds 
     system cpu time  0.01 seconds 
     memory    5468.53k 
     OS Memory   32668.00k 
     Timestamp   09/08/2015 06:41:54 PM 
     Step Count      451 Switch Count 52 
     Page Faults      0 
     Page Reclaims      101 
     Page Swaps      0 
     Voluntary Context Switches  182 
     Involuntary Context Switches  14 
     Block Input Operations   0 
     Block Output Operations   8 


60   /* Method 2: */ 
61   
62   proc sql _method magic=102; 
63    select a.* , b.* 
64    from data1 as a inner join data2 as b 
65     on a.name1 = b.name2 
66    ; 
NOTE: PROC SQL planner chooses merge join. 

NOTE: SQL execution methods chosen are: 

     sqxslct 
      sqxjm 
       sqxsort 
        sqxsrc(WORK.DATA1(alias = A)) 
       sqxsort 
        sqxsrc(WORK.DATA2(alias = B)) 
67   quit; 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   0.01 seconds 
     user cpu time  0.01 seconds 
     system cpu time  0.00 seconds 
     memory    5467.12k 
     OS Memory   32924.00k 
     Timestamp   09/08/2015 06:41:54 PM 
     Step Count      452 Switch Count 60 
     Page Faults      0 
     Page Reclaims      69 
     Page Swaps      0 
     Voluntary Context Switches  197 
     Involuntary Context Switches  13 
     Block Input Operations   0 
     Block Output Operations   16 

Для получения более подробной информации об опции magic= см here. Я не рекомендую использовать его в какой-либо производственной среде, но иногда это может быть полезно для такого рода вещей.

Учитывая крошечные различия в времени процессора для файлов, это небольшое даже при принуждении SAS к использованию разных методов слияния, я очень подозреваю, что причиной этого является другой фактор; вероятно, файл html тайны.