DB2, indizes, explain, hint

Ich hab auf der Arbeit einen DB2 (der massiv parallele)
server unter AIX/RS2 für ein Konzern Datawarehouse.
Die Tabelle des täglichen Brots hat so
130 Mio Datensätze, es werden aber zunehmend mehr.
Das entscheidende Feld ist die Vertragsnummer char(20).
Die ganzen Gesellschaften des Konzerns schicken die Nummern
der neuen und geänderten Vertäge(so 100000 pro Tag) in verschiedenen Formaten. Ich muss immer gucken ob sie schon da sind, um entweder up-zu-daten oder zu inserten.
Da muss ich immer je nach Gesellschaft verschiedenes SQL machen,
in etwa:

where
taeglichbrot.vetragsnum=substr(vtnr,10,5) || substr(preufziffer,1,3)

oder

taeglichbrot.vetragsnum=substr(vtnr,1,10) || substr(preufziffer,4,5)
usw usw

Dann greift der index nicht und für jeden der reinkommenden
verträge dauert das mehrere Sekunden, gar Minuten
Wenn ich die reinkommenden Verträge eine tempräretabelle lade ,
mit taeglichbrot.vertragsnum=temp.vtnr gleichen datentyps,
dann geht es ruckizucki, aber der DBAdmin, sagt, ich dürfe keine
temp tabellen anlegen, seh ich auch ein. Der Ausdruck wird stets
ab der ersten stelle und vollständig in der taeglichbrottabelle gesucht. Daran liegt’s nicht.

Wie krieg ich DB2 dazu, den auch bei ausdrücken den Index zu greifen, andere RDMS können das, und allgemein, wie funktioniert explain und hint bei DB2, ich hab alles nachgeguckt und auch die Auxiliary Tabellen dafür angelegt, aber ich krieg nichts zum laufen.

Hallo,

ich bin zwar eher auf der Oracle zuhause, aber rein Prinzipiell sehe ich keinen „Fehler“ bei Dir.

Wo Du noch ansetzen könntest wäre:

  1. Tabelle regelmäßig analysieren, damit der Optimizer die richtigen Daten hat.

  2. Einen Index über die Vertragsnummer erstellen. Oder ist das schon dein Primärschlüssel? Ist der Index richtig sortiert? Benutzt Du den richtigen Index-Typ (B-Baum für Bereiche oder Hash für Abfragen auf Gleichheit)?

  3. Wenn Du ein SELECT machst, nimm Bindevariable. Bei Oracle (