PDA

View Full Version : SQL index auf view



Seiten : [1] 2

dibe
28-06-18, 11:00
Hallo
wir haben in einer Datei 2 Namen.
Einmal ER, einmal SIE

um bei Fremddaten die richtige Anrede zu bestimmen habe ich eine View auf die Datei gelegt.


create view VORNAMEN as(
select distinct anrede, upper(vna1) as vnam from DATEI where anrede=1
union all
select distinct anrede, upper(vna2) as vnam from DATEI where anrede=2);

nun möchte ich schnell nach einem Namen suchen (SQLRPGLE)


/exec sql
+ set :myanrede = (select min(anrede) from VORNAMEN where upper(:myvorname) = vnam)
/end-exec

Dazu wollte ich einen Index auf VORNAMEN legen.
Das geht aber nicht

Welchen Index muß ich anlegen, es sind ja in der Basis Datei 2 Felder, und das Upper kommt ja auch hinzu.

Danke
Dietlinde Beck

Fuerchau
28-06-18, 12:38
Einen Index auf Views gibt es nicht sondern nur auf Tables.
Du kannst aber einen berechneten Index "upper(Vname)" erstellen.
Wenn die Where-Klausel dann genau mit dieser Berechnung übereinstimmt, wird der Index auch verwendet.
... where upper(: MyVname) = upper(Vname)

"Distinct" führt aber u.U. trotzdem zum Tablescan.

dibe
28-06-18, 13:33
Hallo und danke,
D.H. ich mache das distinct weg
--> geht ein group?


und erzeuge 2 (ZWEI) Indexe je einen auf upper(VNAM1) und einen auf upper(VNAM2)

und hoffe dann das sql BEIDE verwendet?

Oder was bedeutet "berecheten Index"
Dibe

Fuerchau
28-06-18, 14:21
Die View brauchst du nicht.

Create Index MyIndex1 on MyTable (upper(Name))
Create Index MyIndex2 on MyTable (upper(VName))

select min(Anrede) from MyTable where upper(name) = 'FÜRCHAU' or upper(VName) = 'FÜRCHAU'

Ob tatsächlich beide Indizes verwendet werden hängt von vielen Optimierungskriterien ab.
Wichtig ist, dass die Where-Klausel einem Index entsprechen muss. Eine Berechnung in der View wird ignoriert.

Pikachu
28-06-18, 16:20
Wie ist die Datei aufgebaut?
Was steht in vnam1 und vnam2?

Fuerchau
28-06-18, 16:28
Ich nehme mal an "Vornamen";-).

dibe
29-06-18, 07:40
Der Aufbau
Anrede
Nachname
Vnam1
Vnam2
Iban1
Iban2
...

Der Inhalt
1
meier
Hugo
./.
DE12...
./.


2
müller
./.
Heike
./.
DE44 ...

3
Schmitt
hans
inge
DE12...
DE44...


Nun bekomme ich von exten Daten
Mal Hans, mal Inge aber immer ohne die Info Mann/Frau

Das wollte ich mit EINEM Zugriff ermitteln

Dietlinde Beck

Pikachu
29-06-18, 09:21
... und auch mal Dominique (https://de.wikipedia.org/wiki/Dominique)? :-)

dibe
29-06-18, 09:53
selbstverständlich

siehe oben



/exec sql
+ set :myanrede = (select min(anrede) from VORNAMEN where upper(:myvorname) = vnam)
/end-exec

Fuerchau
29-06-18, 10:20
Lege doch einfach mal die Indizes an und prüfe das Ergebnis mit der entsprechenden Abfrage auf die Tabelle. Für MIN(xxx) benötigst du nämlich keinen distinct vorher, also:

select min(anrede) from datei
where upper(: myvorname) = upper(vna1)
or upper(: myvorname) = upper(vna2)

Durch die Prüfung "upper(vna1)" sollte der passende Index1 gewählt werden.
Dies ist der Grund für "berechnete" indizes, dass diese gewählt werden, wenn die Abfrage eine genau identische Where-Klausel aufweist.