Index-Nutzung verbieten
Hallo,
neulich hatte ich ein Problem, dass ich mit einer eher unbekannten SAS-Option lösen konnte.
Ein Programm lief zum Monats-Wechsel in 3 Ausprägungen zwischen 1,75 und 2 Stunden. Das war deutlich zu lange, denn dadurch war die Nacht zu kurz für alle Jobs.
Die Analyse des LOGs ergab: Die Daten-Selektion aus der Beleg-Datenbank war die entscheidende Stelle, dort wurden 99,99% der Gesamt-Laufzeit verbraucht.
Aus den ersten Blick sah alles aus wie immer, die where-Bedingung war plausibel und vernünftig und schränkte die Daten-Menge (auf ca. 75.000 observations) deutlich ein.
Aus den zweiten Blick sprang mir die Zeile
INFO: Index G_KEY selected for WHERE clause optimization
ins Blickfeld. Der besagte Index ist ein Kundennummer-Index, das Data Set enthält Auftrags-Positionen zu allen Kunden der letzten x Jahre, im Prinzip zeitlich sortiert, aber ohne SortedBy=.
Der Index hatte hier absolut nichts zu suchen, die where-Bedingung war im wesentlichen eine zeiliche und wertmäßige.
Aber es wurde in der where-Bedingung auch genau eine Kundennr (mit ca. 6.000 observations) ausgeschlossen:
WHERE ... and (kundnum not = '0000002211') ...;
Das war der Grund warum der SAS-Optimizer dachte, dass die Index-Verwendung nützlich wäre!
Jetzt war die Frage: Wie kann man dem SAS verbieten im DATA-Step den (bzw. einen) Index zu verwenden?
Dunkel konnte ich mich erinnern, bei irgendeinem Release-Wechsel etwas gelesen zu haben bzgl. Index-Nutzung erzwingen bzw. Index-Nutzung verbieten, bloß wo und wie sollte man das im Code angeben?
Die Recherche auf der www-Seite von SAS Technical Support ergab relativ schnell einen Treffer: Paper 3 der SUGI 28 Indexing and Compressing SAS® Data Sets
Dort fand ich die Data Set Option IDXWHERE=NO.
set dm3_G.a_kopo_G(
idxwhere=NO /* <<<<< hier wird die Index-Nutzung verboten */
keep=auftdat vkorg vtweg auftnum auftpos kundnum prli_ak netwr_AP
);
where ("20090101"<=:auftdat<=:"20100731")
AND prli_ak IN: ("GK", "JH", "CE", "KK", "CO", "GL", "GM", "GS")
AND prli_ak NOT IN: ("GK22")
AND kundnum NE "0000002211"
and netwr_AP > 0
;
run;
Die Laufzeit reduzierte sich dadurch von real time 2:06:53.98 (also von ca. 2 Stunden) auf real time 37.57 seconds (also auf unter 1 Minute) !!!
Der Vollständigkeit halber: Die Index-Nutzung erzwingt man mit der Data Set Option IDXNAME=index.
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
- Anmelden oder Registrieren um Kommentare zu schreiben
