Pergunta

Estou executando o seguinte comando SAS:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

O que leva mais de 8 minutos ... quando leva apenas alguns segundos para ler esse arquivo. O que poderia ser causado por uma exclusão para demorar tanto e o que posso fazer para fazê -lo ir mais rápido?

(Eu não tenho acesso para soltar a mesa, então só posso excluir todas as linhas)

Obrigado,

Dan

EDIT: Aparentemente, também não posso truncar tabelas.

Foi útil?

Solução

Este não é SQL regular. O SAS do SAS SQL não suporta a instrução truncada. Idealmente, você quer descobrir o que está acontecendo com o desempenho do delete from; Mas se o que você realmente precisa é a funcionalidade truncada, você sempre pode usar o SAS puro e não mexer com o SQL.

data Server003.CustomerList;
set Server003.CustomerList (obs=0);
run;

Isso efetivamente executa e opera como um Truncate gostaria. Ele mantém a estrutura do conjunto de dados/tabela, mas não o preenchia com dados (devido à opção obs =).

Outras dicas

Existem muitas outras mesas que têm chaves estrangeiras para esta tabela? Se essas tabelas não tiverem índices nas colunas (s) de chave estrangeira, pode demorar um pouco para o SQL determinar se é seguro excluir ou não as linhas, mesmo que nenhuma das outras tabelas tenha um valor na chave estrangeira coluna (s).

Eu também mencionaria que, em geral, os comandos SQL são mais lentos no SAS Proc SQL. Recentemente, fiz um projeto e mudei as declarações da tabela truncada para um procedimento armazenado para evitar a penalidade de tê -las dentro do SAS e ser tratado pelo seu otimizador SQL e porcelagem de execução circundante. No final, isso aumentou substancialmente o desempenho da tabela truncada.

Pode ser mais lento porque as gravações de disco são normalmente mais lentas que as leituras.

Quanto a uma maneira de contornar isso sem desistir/truncrar, boa pergunta! :)

Tente adicionar isso ao seu LIBNAME declaração:

DIRECT_EXE=DELETE 

De acordo com SAS/Access (R) 9.2 para bancos de dados relacionais: Referência,

O desempenho melhora significativamente usando o Direct_EXE =, porque a instrução SQL Exclui é passada diretamente para o DBMS, em vez de o SAS ler todo o conjunto de resultados e excluir uma linha por vez.

Você também pode considerar o elegante:

Proc Sql; crie tabela libname.tablename como libname.tablename; Sair;

Vou produzir uma nova tabela com o mesmo nome e os mesmos dados da sua tabela anterior e excluir a antiga na mesma operação.

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