본문 바로가기
의학통계/SAS Tip

SAS에서 Index 만드는 3가지 방법

by boogler 2022. 7. 9.
반응형

SAS에서 Index 만드는 3가지 방법

 

SAS에서 조회를 많이하는 Key가 되는 것을 미리 Index로 만들거나 View를 만들면 join과 subset 데이터생성으로 인한 불필요한 디스크 공간을 절약하고 I/O의 감소로 SAS의 성능향상을 가져올 수 있습니다. 

 

- Index 는 데이터가 새롭게 생성되지 않고 실제 sorting되는 것이 아니라서 원래 데이터의 변형은 없습니다.

- 다양한 정렬형태의 index를 2개이상의 변수로 만들어진 composite index와 하나의 변수인 single index가 있습니다.

- Index를 만들었을때 무조건 검색이 빠르다고 할 수 없으며 사용되는 데이터가 15%이하 일때 가장 효과적이라고 알려져 있습니다.

- Where 구문으로 데이터를 조건 검색할때 index는 유용하고 IF 문을 사용할때에는 index는 성능향상에 기여하지 않습니다.

 

이제 SAS에서 3가지 방법으로 Index 만드는 방법을 알아보겠습니다.


Ex. test_data 데이터에서 검사일자(exam)+나이(age)의 index와 생일(birth)로 index를 생성해 보겠습니다.

 

Data Step 이용하여 Index 생성하기

< SAS Code >

 

/* Single Index */   
data test_index1 (index=(birth));
    set test.test_data;                      
run;
proc contents data=test_index1;run;


/* Composite Index */ 
data test_index2 (index=(ExamAge=(Exam Age)));         
    set test.test_data;
run;
proc contents data=test_index2;run;

 

- (index=(ExamAge=(Exam Age)/unique/nomiss)) 를 사용하면 exam+age 조합의 unique한 index를 생성할수 있습니다. 실제 exam+age 조합이 unique하지 않으면 에러가 나고 index는 생성되지 않습니다.

- nomiss는 missing value 에는 index 생성에서 제외됩니다.

 

< SAS Output >

Index 생성

 

Datasets procedure 이용하여 Index 생성하기

 

< SAS Code >

 

proc datasets lib=test nolist;
modify test_data;
         index create ExamAge=(exam age)      /* Composite Index */ 
                               birth;                           /* Single Index */
quit;

 

proc datasets lib=test nolist;
modify test_data;
         index create comp=(exam age) / nomiss unique;
quit;

 

- nomiss는 missing value 에는 index 생성에서 제외됩니다.

- unique는 exam+age 조합의 키가 ID처럼 unique한 index를 생성할때 사용합니다.

 

Proc sql 이용하여 Index 생성하기

 

< SAS Code >

 

/* Single Index */   

proc sql;
    create table test_index4 (index=(birth)) as 
               select * from test.test_data;
quit;
proc contents data=test_index4;run;

 

/* Composite Index */ 

proc sql;
    create table test_index5 (index=(ExamAge=(Exam Age))) as 
select * from test.test_data;
quit;
proc contents data=test_index5;run;

 

- (index=(ExamAge=(Exam Age) / unique / nomiss)) 도 동일하게 사용가능합니다.

 

Index 삭제하기

 

위의 예제에서 만든 test_index5 데이터셋의 ExamAge 라는 이름의 index와 test.test_data 내에 만든 동일한 ExamAge index를 삭제해 보겠습니다.

 

proc sql;
        drop index ExamAge from test_index5;
quit;

 

proc datasets library=test;                             
   modify test_data;                                  
               index delete ExamAge;
 quit; 

 

2022.07.11 - [의학통계/SAS Tip] - SAS의 Data step의 Set문장 이용하여 Match 여부 처리하는 방법

2022.07.12 - [의학통계/SAS Tip] - SAS의 Data step의 Modify문장 이용하여 Match 여부 처리하는 방법

댓글