2016-04-11 10 views
1

Ich habe diese proc SQL-Abfrage in meinem aktuellen Code. Leider habe ich es mit über 10 Millionen Datensätzen zu tun, so dass es Stunden dauert. Ich habe versucht, es in einen Datenschritt umzuwandeln und dachte, es würde viel schneller laufen. Ich kann jedoch nicht die gleichen Datenergebnisse erhalten. Wenn jemand mir mit dem Datenschritt helfen kann, würde ich es sehr schätzen. Oder wenn Sie Vorschläge haben, wie ich den proc sql effizienter gestalten kann.Convert Proc Sql existiert Anfrage an Daten Schritt

Hier ist meine proc SQL-Abfrage:

proc sql; 
    create table test as 
    select * 
    from table1 a 
    where exists (select 1 
       from table2 b 
       where b.acct_id = a.acct_id); 
quit; 

Dies ist der Daten Schritt habe ich versucht, es zu konvertieren:

proc sort data=table1; by acct_id; run; 
proc sort data=table2; by acct_id; run; 

data test; 
    merge table1 (in=a) 
     table2 (in=b); 
    by acct_id; 
    if a and b; 
run; 
+0

Hat 'Select * aus Tabelle1, wo acct_id in (wählen Sie acct_id aus Tabelle2)' schneller ausführen? (Diese Abfrage könnte dem Abfrageplaner die Absicht deutlicher machen - hoffentlich die Notwendigkeit der Indexierung/Sortierung/Verbindung ersparend) –

+0

Zumindest in SAS 9.3 ist der proc sql ziemlich schlecht darin, IN/EXIST-Anweisungen zu optimieren. – Jetzler

+0

Ich habe nur einen kleinen Test mit Ihrem Vorschlag gemacht und es schien wesentlich schneller (11 Minuten vs 32 Sekunden). Ich werde jetzt einen vollen Lauf versuchen und sehen, wie es geht. – UncleCross

Antwort

0

Versuchen eine innere in SQL verbinden. Sie müssen jede der Variablen auflisten, die übereinstimmen müssen.

Dies sollte vermeiden, dass innere wählen, die ich vermute, dass Ihre Zeit verbracht wurde.

Wenn das zu langsam ist, dann überlegen Sie, in beiden Tabellen einen Index auf acct_id zu setzen. Das sollte den Beitritt beschleunigen.

+0

Solange Tabelle2 in den Sitzungsspeicher passt, führt dies zu einem Hash-Join, genauso wie die Verwendung einer Datastep-Hash-Tabelle. Sollte die schnellste Lösung sein. – Jetzler

0

Warum Ihr aktueller Datenschritt nicht funktioniert, liegt wahrscheinlich daran, dass Sie in Tabelle 2 doppelte Schlüssel haben (wodurch die Beobachtungen verzerrt werden, wenn ein 1-N- oder N-N-Merge vorliegt). Wenn Sie die Sortierung ändern, um nur die Schlüssel zu behalten und Duplikate zu entfernen, sollte die Zusammenführung die erwarteten Ergebnisse liefern.

proc sort data=table1; by acct_id; run; 
proc sort data=table2 (keep=acct_id) out=wanted_accounts nodupkey; by acct_id; run; 

data test; 
merge table1 (in=a) 
     wanted_accounts (in=b); 
by acct_id; 
if a and b; 
run;