Jedes
DBMS hat Vor- und Nachteile. Ich komme halt ursprünglich aus der Oracle-Ecke.
Die Zieltabelle hat zwar einen Index, aber das ist kein Problem. Ohne Index würde ich vermutlich Stunden warten. Die Zieltabelle hat etwa 1,3 Mio Datensätze und ist definitiv nicht der Flaschenhals. Das weiß ich deswegen, weil ich alle Aktionen auf dieser Tabelle für die Tests deaktiviert habe.
Auf die Tabelle, die mir die zu prüfenden Datensätze liefert greife ich sequentiell zu. Die Reihenfolge spielt keine Rolle und es ist nur ein lesender Zugriff.
Die Tabelle für den Abgleich lese ich ja inzwischen nur noch einmal ein, damit ich mein neues Verfahren (nenne ich es mal Pseudo-Array-Verfahren) nutzen kann.
Dieses Verfahren hat ja schon etwas gebracht, allerdings bremst mich die Funktion Charindex jetzt erheblich aus, die ich dann doch ein paar mal mehr benötige, als erwartet.
Hier mal der Ausschnitt, der mich ausbremst (ist
SQL-Code, kein Delphi-Code):
Delphi-Quellcode:
while @@FETCH_STATUS = 0
begin
-- Aufbereitung des Namens für die weitere Verarbeitung
set @Str = @Name1
set @Str = ' ' + lower(@Str) + ' ' -- Alles in Kleinbuchstaben
set @Ort = lower(@Ort)
set @WortPos1 = 0
set @WortPos2 = 0
-- Abgleichliste durchlaufen
while @WortPos1 < LEN(@WortList1)
begin
set @Pos = CHARINDEX(@Delimiter, @WortList1, @WortPos1 + 1)
set @Wort1 = Substring(@WortList1, @WortPos1 + 1, @Pos - @WortPos1 - 1)
if CHARINDEX(@Wort1, @Str) > 0
begin
set @Pos = CHARINDEX(@Delimiter, @WortList2, @WortPos2 + 1)
set @Wort2 = Substring(@WortList2, @WortPos2 + 1, @Pos - @WortPos2 - 1)
end
if Len(@Wort1) = 1
begin
if CHARINDEX(@Wort1, @Ort) > 0
begin
set @Pos = CHARINDEX(@Delimiter, @WortList2, @WortPos2 + 1)
set @Wort2 = Substring(@WortList2, @WortPos2 + 1, @Pos - @WortPos2 - 1)
set @Ort = replace(@Ort, @Wort1, @Wort2)
end
end
set @WortPos1 = charindex(@Delimiter, @WortList1, @WortPos1+1)
set @WortPos2 = charindex(@Delimiter, @WortList2, @WortPos2+1)
end
fetch next from crsDeb into @Name1, @Ort
end
Das ist nur C&P und ein bisschen bereinigt. Ich hoffe, es ist lesbar.
Wie man sieht, benötige ich oft charindex. Pro 10.000 Datensätze des Haupt-Cursors, verursacht charindex eine Sekunde Zeit. Ich habe auch schon probiert, es durch ein "Like" zu ersetzen (wo es theoretisch ginge), aber ohne Effekt.
Vielleicht kann man auch einfach nicht mehr rausholen.
Meine Birne raucht, ich mache jetzt erst mal Feierabend.