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.

data test;
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)