AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array in SQL

Ein Thema von Jasocul · begonnen am 26. Jul 2016 · letzter Beitrag vom 28. Jul 2016
 
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.371 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Array in SQL

  Alt 27. Jul 2016, 15:04
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.
Peter

Geändert von Jasocul (27. Jul 2016 um 15:10 Uhr) Grund: CODE-Tags funktionieren nicht
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz