Domanda

Sono in esecuzione il seguente comando SAS:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

che sta prendendo più di 8 minuti ... quando si richiede solo pochi secondi per leggere il file. Quale potrebbe essere la causa di una cancellazione di prendere così tanto tempo e che cosa posso fare per farlo andare più veloce?

(non ho accesso a eliminare la tabella, in modo da poter eliminare solo tutte le righe)

Grazie,

Dan

Edit: anche io a quanto pare non può troncare le tabelle

.
È stato utile?

Soluzione

Questa non è SQL regolare. SAS' Proc SQL non supporta la dichiarazione Tronca. Idealmente, si vuole capire cosa sta succedendo con le prestazioni del delete from; ma se quello che si ha realmente bisogno è la funzionalità troncare, si può sempre e solo usare pura SAS e non pasticciare con SQL a tutti.

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

Questo esegue in modo efficace e funziona come un Truncate avrebbe fatto. Mantiene la / struttura della tabella di dati, ma non riesce a popolarlo con i dati (a causa della OBS = opzione).

Altri suggerimenti

Ci sono un sacco di altri tavoli che hanno chiavi esterne a questo tavolo? Se queste tabelle non hanno gli indici nella colonna di chiave esterna (s) allora si potrebbe prendere un po 'per SQL per determinare se o non è sicuro di eliminare le righe, anche se nessuno degli altri tavoli ha in realtà un valore nella chiave esterna colonna (s).

Vorrei anche ricordare che nei comandi generali SQL eseguito più lento in SAS PROC SQL. Recentemente ho fatto un progetto e spostato le dichiarazioni troncare la tabella in una stored procedure per evitare la pena di averli all'interno SAS e gestiti da loro ottimizzare SQL e circostante shell esecuzione. Alla fine questo ha aumentato il rendimento della TABELLA TRUNCATE sostanzialmente.

Potrebbe essere più lenta a causa scritture su disco sono in genere più lento di legge.

Per quanto riguarda un modo intorno ad esso senza perdere / troncamento, bella domanda! :)

Prova ad aggiungere questo alla tua affermazione LIBNAME:

DIRECT_EXE=DELETE 

SAS / ACCESS (R) 9.2 per i database relazionali: Riferimento ,

  

Performance migliora in modo significativo utilizzando DIRECT_EXE =, perché lo SQL DELETE si passa direttamente al DBMS, invece di SAS lettura impostato l'intero risultato e l'eliminazione di una riga alla volta.

È inoltre potrebbe prendere in considerazione l'elegante:

proc sql; create table libname.tablename come libname.tablename; smettere;

I produrrà una nuova tabella con lo stesso nome e la stessa meta dati della tabella precedente ed eliminare quello vecchio nella stessa operazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top