2014-12-09 3 views
0

많은 중복 행이있는 테이블이 있습니다.왜 proc 정렬이 삽입 선택보다 빠릅니다.

인덱스 또는 기본 키가없는 10 백만 줄 및 단일 열이있는 테이블 A가 있다고 가정 해 보겠습니다.

나는 이것을 먼저했다. 나는 다른 테이블 B를 만들고 이렇게했습니다.

INSERT INTO B (col1) SELECT DISTINCT (col1) FROM A; 

문제는 성능이 느립니다. 그런 다음이 명령을 발견했습니다.

proc sort data=A out=B noduprecs; 
by col1; 
run; 

단 2 초가 걸렸습니다.

proc sort 다음으로 insert select을 사용하는 것이 더 빠른 이유는 무엇입니까?

proc sort가 작동하고 궁극적으로 색인없이 많은 행을 처리 할 수 ​​있습니까?

설명에 대해 인터넷에서 아무것도 찾을 수 없습니다.

TIA

+0

DISTINCT를 실행하면 속도가 느려집니다. – jarlh

+0

감사합니다. @Jardh. SAS 측에서 더 많은 답변을 찾고 있다고 가정 해 봅시다. –

답변

0

당신은 SORT와 INSERT와 비교

proc sort data=A(keep=col1) out=B nodupkey; 
by col1; 
run; 

시도로 더 빨리 될 수 :

proc sql; 
create table B as select distinct col1 from A; 
quit; 

경험은 단순히 PROC 정렬 정렬보다 빠른 가르쳐/PROC SQL 구현에서 뚜렷합니다. 모든 상황에 대해 항상 그런 것은 아니지만 공식 성명서가 아닙니다.

A와 B 테이블은 SAS BASE libname입니까?

INSERT 버전의 문제점은 대상이 미리 정의 되었기 때문에 새 테이블을 만들 때 값이 더 적게 대상 필드에 맞게 값이 삽입되는지 여부가 확실 할 수 있습니다.

+0

안녕하세요 @vasja, 예 모두'A'와'B'는 libname을 기반으로합니다. –

+0

'data = A (keep = col1)'이해야 할 일은 무엇입니까? –

+0

다른 필드가 없으므로 실제로 소스 테이블에서 필드 col1 만 읽습니다. – vasja

1

SAS 설정에 대해 더 알고 싶습니다. 분명히 당신과 같은 결과를 보지 못했습니다. 이것은 내가 테스트하는 데 사용되는 코드입니다 :

테스트 코드

0과 1000 사이의 임의의 정수와 테스트 데이터, 불에 행을 만듭니다

data x; 
    do cnt=1 to 10000000; 
    x = floor(rand("Uniform") * 1000); 
    output; 
    end; 
    drop cnt; 
run; 

IT 및 유지를 정렬 시도 proc sort를 사용하는 고유 값. 여러 번 실행하여 평균 시간을 얻으십시오.

proc sort data=x out=test1 nodupkey; 
    by x; 
run; 

proc SQL 메소드를 사용해보십시오. 평균 시간을 얻으려면 여러 번 실행하십시오.

proc sql noprint; 
    create table test2 as 
    select distinct x 
    from x 
    order by 1 
    ; 
quit; 

'삽입 방법'방법을 사용해보십시오.여러 번 실행

proc sql noprint; 
    create table b like x; 
    insert into b (x) select distinct (x) from x; 
quit; 

내 컴퓨터, SAS9.4, 윈도우 64 비트에

결과, proc 디렉토리 정렬은 평균적으로 약 4 초를 가져다가 SQL 종류는 약 5 초 걸렸습니다. 그래서 네, proc sort는이 데이터 세트에 대해 좀 더 빠르게 실행되었습니다. 정렬 할 행, 열, 필드 유형 및 키의 카디널리티를 변경하면 이러한 결과가 모두 변경 될 수 있습니다.

insert into 문은 3.2 초가 가장 빠릅니다. SAS 데이터 세트에 귀하의 테이블을 쓰고 있습니까? 또는 다른 데이터베이스에 있습니까? 이것은 결과에 가장 큰 영향을 주며 실행할 단계를 선택할 때 결정적인 요인이되어야합니다.

+0

좋은 답변입니다. @ 로버트. 감사. –

+0

libname은 서버 클러스터를 기반으로합니다. –

+0

Ok - 클러스터가 스레드를 어떻게 나누고 위 예제의 작업을 할당하는지 잘 모르겠습니다. 내가 제안 할 수있는 것은 여러 가지 방법을 시도하고 환경에 가장 적합한 것을 선택하는 것입니다. –

관련 문제