Pergunta

O que é o mais eficiente maneira de deixar cair uma tabela em SAS?

Eu tenho um programa que circula e deixa um grande número de mesas, e gostaria de saber se existe uma diferença de desempenho entre PROC SQL; e conjuntos de dados PROC; para deixar cair uma única tabela de cada vez ..

Ou se não há outra maneira talvez ???

Foi útil?

Solução

Se é razoável terceirizar para o sistema operacional, que pode ser mais rápido. Caso contrário, as minhas observações não científicas parecem sugerir que a tabela queda na proc sql é mais rápido. Isso surpreendeu-me como eu esperava proc datasets para ser mais rápido.

No código abaixo, eu crio 4000 conjuntos de dados fictício, em seguida, tentar excluí-los todos com diferentes métodos. A primeira é com SQL e no meu sistema levou cerca de 11 segundos para apagar os arquivos.

O próximo dois tanto proc datasets uso. O primeiro cria uma instrução de exclusão para cada conjunto de dados e, em seguida, apaga. A segunda simplesmente emite um comando cobertor matar a tudo de exclusão no diretório de trabalho. (Eu esperava que esta técnica seja o mais rápido). Ambos os conjuntos de dados proc rotinas reportados cerca de 20 segundos para apagar todos os arquivos de 4000.

%macro create;
proc printto log='null';run;
%do i=1 %to 4000;
data temp&i;
x=1;
y="dummy";
output;run;
%end;
proc printto;run;
%mend;

%macro delsql;
proc sql;
%do i=1 %to 4000;
drop table temp&i;
%end;
quit;
%mend;

%macro deldata1;
proc datasets library=work nolist;
   %do i=1 %to 4000;
   delete temp&i.;
   %end;
run;quit;
%mend;

%macro deldata2;
proc datasets library=work kill;
run;quit;
%mend;

option fullstimer;
%create;
%delsql;

%create;
%deldata1;

%create;
%deldata2;

Outras dicas

Eu tentei mexer com a abordagem OS-exclusão.

Apagar com o X-comando não pode ser recomendada. Levou sempre !

Então eu tentei com o comando do sistema em um datastep:

%macro delos;
data _null_;
do i=1 to 9;
delcmd="rm -f "!!trim(left(pathname("WORK","L")))!!"/temp"!!trim(left(put(i,4.)))!!"*.sas7*";
rc=system(delcmd);
end;
run;
%mend;

Como você pode ver, eu tive que dividir minhas exclusões em 9 comandos de exclusão separadas. A razão é que eu estou usando wildcards, "*", eo sistema operacional subjacente (AIX) expande-los para uma lista, que então se torna grande demais para ele para lidar com ...

O programa basicamente constrói um comando de exclusão para cada um dos nove grupos de arquivos "temp [1-9] *. Sas7 *" e emite o comando.

Usando a criar a função macro de cmjohns responder para criar 4000 tabelas de dados, eu posso excluir aqueles em apenas 5 segundos usando esta abordagem.

Assim, um sistema operacional direta de exclusão é a maneira mais rápida de massa-delete, como eu esperava.

Estamos discutindo tabelas ou conjuntos de dados?

Tabelas implica tabelas de banco de dados. Para se livrar deles de uma forma rápida, utilizando proc SQL pass-through instalação seria o mais rápido. Especificamente, se você pode se conectar ao banco de dados uma vez e soltar todas as tabelas, então desligue.

Se estamos discutindo conjuntos de dados em SAS, eu diria que tanto sql proc e conjuntos de dados proc são extremamente semelhantes. Do ponto de vista de aplicação, ambos passam pelo mesmo dedução para criar um comando do sistema que exclui um arquivo. Todos os testes que tenho visto do SAS grupos ou apresentações de usuários sempre sugeriu que o uso de um método sobre o outro é marginal e com base em muitas variáveis.

Se é imperativo que você tem a maneira absoluta mais rápido para soltar os conjuntos de dados / tabelas, você pode simplesmente ter de testá-lo. Cada instalação e configuração do SAS é diferente o suficiente para testes mandado.

Em termos de que é mais rápido, excluindo dados extremamente grandes, eu seria capaz de apostar que há pouca diferença entre eles. Quando a manipulação de dados SAS permanentes, no entanto, eu gosto de usar DATASETS PROC em vez de PROC SQL, simplesmente porque eu me sinto melhor manipulação de conjuntos de dados permanentes, utilizando o método SAS-concebido, e não a implementação SQL

solução simples para tabelas temporárias que são nomeados semelhante:

Se todas as suas tabelas começar com o mesmo prefixo, por exemplo p1_table1 e p1_table2, em seguida, o seguinte código irá apagar qualquer tabela com que começa com p1

proc datasets; delete p1: ; run;

proc exclusão é outra, embora em situação irregular, solução ..

http://www.sascommunity.org/wiki/PROC_Delete

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top