If you have a large dataset that is expensive to rewrite, you may want to find ways to rewrite (and re-index) infrequently, say every 10th update, or every month for a dataset that is updated daily. If so, then I'd consider the proc sql ... delete option or the data ...modify...remove option, because they don't rewrite the dataset, they just mark observations (not variables) to be deleted. Then just occasionally use the data ... where approach to physically delete the removed observations.
However, when using proc sql ... delete or data ...modify...remove, remember that the dataset attribute NOBS is not updated. In the example below, NOBS=699 in both the DATA _NULL_ step preceding the modify and the one following modify, but NLOBS (number of logical obs) goes from 699 to 487. This is confirmed by the trailing PROC MEANS reporting only 487 observations (and nmiss=0):
data have;
set sashelp.stocks;
run;
data _null_;
set have nobs=nrecs ;
dsid=open('have');
nlobs=attrn(dsid,'NLOBS');
rc=close(dsid);
put nrecs= nlobs= rc=;
stop;
run;
data have;
modify have;
where high<60;
remove;
run;
data _null_;
set have nobs=nrecs ;
dsid=open('have');
nlobs=attrn(dsid,'NLOBS');
rc=close(dsid);
put nrecs= nlobs=;
stop;
run;
proc means data=have n nmiss;
var high;
run;
Unfortunately the SET statement does not have an NLOBS= option, just the NOBS option. That's why you see the open, attrn, and close functions in the DATA _NULL_ steps.
... View more