Hi Rol,
Wie viele _verschiedene_ Werte enthält die Spalte "sp1"?
ich schätze 10000 - 20000
(Wie viele Treffer bekommst Du im Schnitt?)
10-1000
Das ist schon recht viel - der Index projeziert nicht so toll. (Bei
Deiner enormen Datenmenge gibt er allerdings trotzdem den Ausschlag.)
Du hast keinen Einfluß auf die interne Anordnung der Datensätze.
Die Daten bekomme ich in einer Textdatei, dort sind sie nach dieser
Spalte sortiert. Ich lese sie dann in dieser reihenfolge in die DB
ein.
Jeder einzelne INSERT schreibt die Daten einer Zeile "irgendwohin".
Wenn Deine Treffer in der Tat unique sein sollten,
Ich verstehe nicht ganz was du mit unique _hier_ meinst.
Wenn Deine Postleitzahlen jeweils nur genau einen Treffer geliefert
hätten, dann hättest Du einen Primärschlüssel darüber legen können.
In Deinem Fall geht das allerdings nicht.
In Sp1 stehen Postleitzahlen, in Sp3 Straßennamen und in Sp2 einen
Art Staußen-PLZ-ID (die ich brauche) .
Suchen wir z.B. nach der "Dr.-Max-Plack-Straße" in 98765 Musterstadt.
Wenn ich Glück habe, finde ich _ein_ ergebnis bei:
SELECT Sp2 FROM tabele WHERE Sp1='98765' AND
Sp3='Dr.-Max-Plank-Straße'
Ein Index über das Paar (Sp1, Sp3) würde Deiner Datenbank erlauben,
allein schon durch Navigation durch den Indexbaum alle Treffer zu
finden.
Hast Du nur einen Index über Sp1, dann muß die Datenbank zu jedem
Treffer im Indexbaum den entsprechenden Datensatz lokalisieren und
in diesem das Feld Sp3 nachsehen - das ist langsamer. (Dafür kostet
der kombinierte Index über Sp1 und Sp3 wiederum mehr Platz, und seine
Pflege macht die INSERTs langsamer.)
Wenn Du Deine Daten jeweils in einem Rutsch komplett neu einfügst,
dann ist es übrigens besser, zuerst einzufügen und danach den Index
zu bauen als umgekehrt. (Erstens geht es schneller und zweites ist
der Indexbaum weniger fragmentiert.)
Also suche ich, wenn ich kein Ergebnis bekomme nach den einzelen
Straßennamen-Teilen:
[1]SELECT Sp2 FROM tabele WHERE Sp1='98765' AND Sp3 LIKE'%Dr'
[2]SELECT Sp2 FROM tabele WHERE Sp1='98765' AND Sp3 LIKE'%Max'
[3]SELECT Sp2 FROM tabele WHERE Sp1='98765' AND Sp3 LIKE'%Plank'
Hm ... LIKE mit wildcard vorne macht nun allerdings die Nutzung des
Indexbaums kaputt. Denn die Einträge innerhalb des Baums sind präfix-
sortiert ... und wenn Du nicht weißt, wonach Du suchst, kann das RDBMS
die Treffermenge nicht schon innerhalb des Indexbaums berechnet.
In diesem Falle bringt der kombinierte Index nichts.
bei [1] bekomme ich mehere Ergebnisse -> weiter versuchen
Es gibt eine Möglichkeit, Sp3 gegen einen regular expression zu
matchen - das dürfte schneller sein als drei Abfragen nacheinander.
bei [3] kein ergebnis, weil es richtig "Planck" heisen muß und dies
die Ursanche für das nichtfinden beim ersten Versuch war ;-).
Ob Du einen regular expression so formulieren kannst, daß er die
gewünschte Flexibilität hat, weiß ich allerdings nicht.
Viele Grüße
Michael