Frage

Ich führe den folgenden SAS -Befehl aus:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

Das dauert 8 Minuten ... wenn es nur wenige Sekunden dauert, um diese Datei zu lesen. Was könnte dazu führen, dass ein lösches Löschen so lange dauert und was kann ich tun, um es schneller zu machen?

(Ich habe keinen Zugriff, um die Tabelle zu fallen, damit ich nur alle Zeilen löschen kann.)

Vielen Dank,

Dan

Bearbeiten: Ich kann auch anscheinend auch Tabellen abschneiden.

War es hilfreich?

Lösung

Dies ist kein normaler SQL. SAS 'Proc SQL unterstützt die Kürzelerklärung nicht. Im Idealfall möchten Sie herausfinden, was mit der Leistung der los ist delete from; Aber wenn Sie wirklich die Funktionalität abschneiden, können Sie immer nur reine SAS verwenden und überhaupt nicht mit SQL spielen.

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

Dies führt effektiv aus und funktioniert wie a Truncate möchten. Es verwaltet die Datensatz-/Tabellenstruktur, kann sie jedoch nicht mit Daten bevölkern (aufgrund der OBS = Option).

Andere Tipps

Gibt es viele andere Tische, die ausländische Schlüssel zu diesem Tisch haben? Wenn diese Tabellen keine Indizes für die Spalten der Fremdschlüssel haben Säulen).

Ich würde auch erwähnen, dass im Allgemeinen SQL -Befehle in SAS Proc SQL langsamer laufen. Kürzlich habe ich ein Projekt durchgeführt und die Tischanweisungen in ein gespeichertes Verfahren verschoben, um die Strafe zu vermeiden, sie in SAS zu haben und von ihrem SQL -Optimierer und der umgebenden Ausführungsschale behandelt zu werden. Am Ende erhöhte dies die Leistung der Kürzung erheblich.

Es könnte langsamer sein, da die Scheibe -Schreibvorgänge normalerweise langsamer sind als Lesevorgänge.

Was einen Weg angeht, ohne fallen zu lassen/abzubrechen, gute Frage! :)

Versuchen Sie, dies zu Ihrem hinzuzufügen LIBNAME Aussage:

DIRECT_EXE=DELETE 

Entsprechend SAS/Access (R) 9.2 für relationale Datenbanken: Referenz,

Die Leistung verbessert sich signifikant unter Verwendung von Direct_exe =, da die SQL -Delete -Anweisung direkt an die DBMS übergeben wird, anstatt dass SAS das gesamte Ergebnissatz und das Löschen einer Zeile gleichzeitig lesen.

Sie könnten auch die elegante betrachten:

Proc SQL; erstellen table libname.tablename wie libname.tableName; Verlassen;

Ich werde eine neue Tabelle mit demselben Namen und denselben Meta -Daten Ihrer vorherigen Tabelle erstellen und die alte in derselben Operation löschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top