SELECT * FROM sample
WHERE UPPER(‚Zeichenkette‘) LIKE sample.spalte
Spalte beinhaltet Vergleichswerte mit %-Patterns, z.b.: „%“,
„%text%“ oder „%beispiel“. Durch die %-wildcards am Anfang der
Spalte kann Oracle keinen Index für die Suche verwenden und
führt einen Fulltablescan aus. Bei 1000 und mehr Datensatzen
in der Tabelle sample werden die Antwortzeiten deutlich
länger.
ich vermute mal, dass aufgrund deiner speziellen
where-clausel: „zeichenkette like spalte“ ein index ohnehin
nicht verwendet werden kann. meines wissens nach klappt das
nur bei den „klassischen“ where-clauseln: „spalte like
zeichenkette“.
Im Gegensatz zu einem „… LIKE ‚%…‘“, wo durch den wildcards am Anfang der Zeichenkette prinzipiell jede Spalte in Frage kommt, könnte Oracle beim „… LIKE spalte“ jene Spalten filtern, die entweder mit dem entsprechenden Buchstaben/Präfix beginnen oder am Anfang ein %-Zeichen haben.
Beispiel: Spalte=„abcd“ „bcde“ „a%“ „%“
Beim Vergleich mit einer Zeichenkette „abcd“ könnte Oracle einen Index auf der Spalte verwenden und >= (GE) nach „abcd“ suchen. „bcde“ würde durch den Index ausgeschlossen. Umgekehrt kann bei einer Zeichenkette „xyz“ alles ausgeschlossen werden. In jedem Fall müsste nur beachtet werden, dass „%“ immer in Frage kommt.
Ich habe nur keine Ahnung, wie ich in Erfahrung bringen kann, ob Oracle den Index nutzt. Ich kenne mich mit den Analyse-Optionen zu wenig aus.
grundsätzlich kennt oracle ja sogenannte
fuction-based-indexes. du kannst also einen index so anlegen:
create index tab_i
on tab(upper(spalte)) ;
suchst du nun nach
select *
from tab
wehre upper(spalte) = ‚WERT‘ ;
dann kann oracle diesen index nutzen (was normalerweise ja
nicht klappen würde).
analog müsste also auch so ein index funktionieren:
create index tab_i
on tab(substr(spalte,3)) ;
solche indizes sind zwar etwas langsamer als „normale“
indizes, aber immer noch schneller als ein full-table-scan.
trotzdem vermute ich, dass oracle in deinem fall den index
nicht nutzt.
Leider nicht. Praktisch geht es an dieser Stelle um URLs, d.h. der Wert links von LIKE ist immer eine vollständige URL, wie man sie auch im Webbrowser sieht. Auf der rechten Seiten befinden sich Patterns, die einen URL-Match ausmachen.
links:
http://www.wer-weiss-was.de/cgi-bin/forum
rechts eine Reihe von Patterns:
%wer-weiss-was.de/cgi-bin/%
www.wer-weiss-was.de/%
%.de/secrets/%
Gesucht werden alle matches. Ein function based Index hilft meiner Meinung da nicht weiter …
Markus