2014-10-21 2 views
1

데이터 집합에서 최신 30 일 레코드를 삭제하려고합니다. 그렇다면 그렇게 할 수있는 몇 가지 방법이 있습니다.SQL Server에서 SAS 데이터 집합의 특정 행을 효율적으로 삭제하는 방법

proc sql; 
delete from server.data 
where Date >= today() - 30; 
quit; 

또는

data server.data; 
set server.data(where= (Date>= today() - 30)); 
run; 

어느 방법이 더 좋다? 아니면 더 빠른 절차?

+0

는'delete' 나에게 거의 동시에 비용 새 테이블을 만들려면 – Lovnlust

답변

2

첫 번째 방법은 빠릅니다.

그러나이 방법을 사용하면 삭제 된 관측이 제 위치에 유지됩니다 (삭제 된 것으로 표시됨). 이로 인해 테이블의 NOBS 및 NLOBS 속성간에 차이가 발생합니다. 그래서 공간이 고려 사항이라면, 두 번째 접근법을 추천 할 것입니다 (동일한 방식으로 매크로 변수 상수를 사용). 그러면 해당 레코드가없는 테이블이 다시 작성됩니다. ..

EDIT를 재 구축 과정에서 파괴 될 것입니다 어떤 인덱스 및 제약 조건을 다시 기억 나는 이전에 아래가 더 빨리 될 것이라고 제안했다, 그러나이 사건으로을 을하지 밝혀졌다 - 참조 조의 스레드의 주석.

proc sql; 
delete from server.data 
where Date >= %eval(%sysfunc(today()) - 30); 
+0

원본 테이블의 레코드는 10M 이상입니다. 그래서 나는 전체 테이블을 다시 만들고 싶지 않습니다. 정말 시간을 보내고 있습니다. – Lovnlust

+0

원본 테이블이 SAS 데이터 세트입니까? 데이터베이스에 연결하는 경우 SQL을 통한 전달 (Pass Through SQL)을 사용해보십시오. libname 엔진이 적절하게 해결해야하지만 더 빠를 수도 있습니다. –

+2

@RawFocus 인수가 흥미롭지 만 현재 실제로는 올바르지 않습니다.) 대 % sysfunc (오늘())는 다릅니다. SAS 컴파일러 (및 이와 유사한 SQL 컴파일러가 데이터베이스에 전달 될 때 libname SQL을 사용하는 경우도 있음)는 today()가 상수라는 사실을 인식 할만큼 충분히 똑똑합니다. 테스트를 실행하십시오. 나는 방금 1e8 행 (~ 100MM)을 사용하여 절반을 삭제하고 두 개를 동일하게 실행했습니다. – Joe

1

나는 RawFocus에 동의하지만이 문서를 살펴볼 수도 있습니까? 여러 메트릭과 특정 환경에서 효율성에있어 두 가지 sas 단계를 비교하는 데 사용할 수있는 매크로를 설정합니다. 예를 들어, RawFocus가 지적했듯이 드라이브를 고려할 경우 I/O 성능을 향상시키는 기술이 필요할 수 있으며이 매크로를 사용하면이를 비교할 수 있습니다. 나 자신을 해달라고 부탁 할 때 나는 가장 빠른/가장 효율적인 것이 어떤 방법이 모든 시간의 버전을 사용하고 있습니다 :

http://www.lexjansen.com/nesug/nesug10/ma/ma09.pdf

감사합니다, 바실리

관련 문제