none
SQL Abfrage mit Like RRS feed

  • Frage

  • Hallo,

    wir sind gerade am testen einer neuer Datenstruktur. Wir verwenden den MS SQL Server 2008R2 mit mehr als ausreichender HW.

    Hier meine SQL Abfrage:

    SELECT TOP 500 tbl_LIEFERANT.Firma, tbl_ERSATZTEILE.idnr, tbl_ERSATZTEILE.ArtNr, tbl_ERSATZTEILE.Bezeichnung, tbl_ERSATZTEILE.Hersteller, tbl_ERSATZTEILE.Beschreibung
     FROM tbl_ERSATZTEILE WITH (INDEX(IX_tbl_Matchcode)) INNER JOIN tbl_LIEFERANT ON tbl_ERSATZTEILE.KDNR = tbl_LIEFERANT.KDNR
     WHERE tbl_ERSATZTEILE.Matchcode LIKE '%stahlfelge%' AND tbl_ERSATZTEILE.Matchcode LIKE '%golf%' AND tbl_ERSATZTEILE.Matchcode LIKE '%2%'

    Angezeigt werden soll: Das gesuchte Ersatzteil und der Lieferant. In der Tabelle ERSATZTEILE stehen nur die Ersatzteile und die KundenNummer des weitern ist in der Tabelle ein Feld "Matchcode" wo alle relevaten Suchbegriffe für das jeweilige Teil drin stehen, das Feld ist vom Typ VarChar(350).

    Die Tabelle Ersatzteile hat jetzt schon knapp 1 Million Datensätze und monatlich werden es mehr.

    Jetzt zu meinen Problem: die Suche dauert mir zu lange 2-3 Sekunden, je nach dem wieviel Einzelwörter der Such String enthält. Später sollen auch alle unsere angemeldeten Kunden drauf zugreifen können, da will ich gar nicht erst wissen wie lange es dann dauert.

    Kennt hier jemand einen besseren Lösungsvorschlag, wenn ich das ähnliche Prinzip bei einigen Preisportalen sehe, da dauert die Suche auch nur einen Bruchteil. Oder haben wir etwa auf den falschen Server gesetzt?

    Vielen Dank für Eure Bemühungen im vorraus.

    Sonntag, 7. August 2011 10:06

Antworten

  • Hallo Bert,

    vordergründig ist scheint die Suche über eine Spalte besser. Nur wird das Ergebnis schnell unscharf.
    Wir als Menschen können eine "Golf" einem Marke zuordnen, dem LIKE ist es aber egal
    ob es sich um ein Auto oder um den Sport oder ein "Golfhemd" handelt.

    Bing/Google und Co und Shops wie Amazon im Suchfeld arbeiten mit einer Technik,
    die der Volltextsuche entspricht.

    Wobei weitere Dinge wie ein Thesaurus verwendet werden, um die Treffer zu verbessern.
    Und für die Reihenfolge (das TOP) kommen eine Vielzahl weiterer Kriterien zum Einsatz,
    Stichwort SEO (da sieht man bei Google auch Thesaurus und Ranking im Einsatz).

    Ob der Einsatz von Kategorien sinnvoll ist (auch aus Sicht des Anwenders), hängt stark von der Oberfläche ab.
    Ein Redesign der Datenstruktur bzw. der darauf basierenden Abfagen
    sollte optimalerweise unter Berücksichtigung der Oberfläche stattfinden.

    So bietet Amazon im linken Bereich  Verfeinerungsmöglichkeiten innerhalb der Kategorien an,
    z. B. für Felgen (wobei das für Amazon mit Sicherheit kein Hauptbetätigungsfeld ist).
    Andere Dinge wie Typenschlüssel können relativ genau zu geordnet werden, mindestens je Hersteller.

    Und wenn der Kunde bereits bekannt ist, so kann man anhand dessen vorherigen Aktivitäten
    weitere Rückschlüsse ziehen (Amazon z. B. Vorschlagsliste).

    Für den Anfang solltet ihr mal einen Volltextindex erstellen
    und die Trefferquoten dort mit den heutigen Suchen vergleichen.

    Gruß Elmar

    Sonntag, 7. August 2011 12:42
    Beantworter

Alle Antworten

  • Hallo Bertram,

    LIKE Abfragen mit % am Anfang bedeuten, dass die gesamte Tabelle bzw. der Index durchsucht werden muss.
    Was die Abfrage naturgemäß langsamer macht. Hier noch verschärft durch die potentielle Länge der Spalte.

    Eine Alternative wäre eine Volltext-Indizierung von Suchfeldern wie hier Matchcode
    und das Verwenden von CONTAINS. Beachte dass die Ergebnisse nicht direkt mit LIKE vergleichbar sind.

    Da ihr aber eine neue Datenstruktur testet, so solltet ihr aber überlegen,
    ob der Matchcode nicht durch eine Kategorisierung erweitert werden kann,
    womit die Daten besser gegliedert werden können.

    So wäre ein Kategorie für Felgen bzw. Stahlfelgen - evtl. mehrstufig gegliedert.
    Und wenn ich Golf als Automarke interpretiere, wäre dort entsprechendes möglich.
    Ähnliches tut auch Amazon oder andere Händler.

    Gruß Elmar

    • Als Antwort vorgeschlagen Falk Krahl Montag, 8. August 2011 12:11
    Sonntag, 7. August 2011 10:31
    Beantworter
  • Hallo Elmar,

    vielen Dank für deine schnelle Antwort.

    Wir haben noch die Spalte Kategorie (zB: Felgen, Motoren, Blechteile etc.) deweiteren haben wir noch eine Unter-Rubrik (zB: Alufelge, Stahlfelge, Notrad...)

    Das Feld "Matchcode" wird beim BULK import aus die Felder "Kategorie", "Rubrik", "HstNr", "Hersteller", "Ersatteilbezeichnung" zusammengesetzt, deswegen auch die 350 Zeichenlänge. Ich denke das ist besser als in alle 5 Fleder gleichzeit mit 3x Like zusuchen.

    Aber wie kann ich wissen wo nach der Kunde sucht? Automarken könnte man ja noch eingrenzen, wenn  aber zb. nur eine Typennummer und ein anderes Synonym eingegeben wird, dann muss ich ja mit Like suchen.  Aber die anderen müssen doch auch mit Like suchen?

    Gruß Bert


    Sonntag, 7. August 2011 10:45
  • Hallo Bert,

    vordergründig ist scheint die Suche über eine Spalte besser. Nur wird das Ergebnis schnell unscharf.
    Wir als Menschen können eine "Golf" einem Marke zuordnen, dem LIKE ist es aber egal
    ob es sich um ein Auto oder um den Sport oder ein "Golfhemd" handelt.

    Bing/Google und Co und Shops wie Amazon im Suchfeld arbeiten mit einer Technik,
    die der Volltextsuche entspricht.

    Wobei weitere Dinge wie ein Thesaurus verwendet werden, um die Treffer zu verbessern.
    Und für die Reihenfolge (das TOP) kommen eine Vielzahl weiterer Kriterien zum Einsatz,
    Stichwort SEO (da sieht man bei Google auch Thesaurus und Ranking im Einsatz).

    Ob der Einsatz von Kategorien sinnvoll ist (auch aus Sicht des Anwenders), hängt stark von der Oberfläche ab.
    Ein Redesign der Datenstruktur bzw. der darauf basierenden Abfagen
    sollte optimalerweise unter Berücksichtigung der Oberfläche stattfinden.

    So bietet Amazon im linken Bereich  Verfeinerungsmöglichkeiten innerhalb der Kategorien an,
    z. B. für Felgen (wobei das für Amazon mit Sicherheit kein Hauptbetätigungsfeld ist).
    Andere Dinge wie Typenschlüssel können relativ genau zu geordnet werden, mindestens je Hersteller.

    Und wenn der Kunde bereits bekannt ist, so kann man anhand dessen vorherigen Aktivitäten
    weitere Rückschlüsse ziehen (Amazon z. B. Vorschlagsliste).

    Für den Anfang solltet ihr mal einen Volltextindex erstellen
    und die Trefferquoten dort mit den heutigen Suchen vergleichen.

    Gruß Elmar

    Sonntag, 7. August 2011 12:42
    Beantworter