Wie tun Sie full-text Suche mehrere Kriterien auf der linken verknüpften Tabellen in SQL Server?

StackOverflow https://stackoverflow.com/questions/35954

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine Abfrage, die ursprünglich wie folgt aussieht:

select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where  c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'       
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')

Auf einer Datenbank mit rund 90.000 Datensätze in dieser Abfrage dauert etwa 7 Sekunden ausgeführt werden (natürlich alle Verknüpfungen und mag, Besteuerung).

Ich habe versucht, einen Weg zu finden, bringen die Ausführungszeit der Abfrage unten mit der Volltextsuche auf Spalten betroffen.Jedoch, ich habe nicht gesehen, ein Beispiel für ein full-text Suche, die drei Tabellen-joins wie diese, besonders, da meine join-Bedingung ist nicht Teil des zu Suchenden Begriff.

Gibt es eine Möglichkeit, dies zu tun in voll-text-Suche?


@David

Ja, es gibt Indizes auf der Ids.

Ich habe versucht, das hinzufügen von Indizes auf die CustomerAddress stuff (Städtename, Postleitzahl, etc.) und es brachte die Abfrage auf 3 Sekunden, aber ich finde immer noch, dass zu langsam für so etwas.

Beachten Sie, dass alle text-Felder (mit Ausnahme des ids) sind nvarchars, und gerade1 ist eine nvarchar-1000, so dass könnte Einfluss auf die Geschwindigkeit, aber immer noch.

War es hilfreich?

Lösung

Führen Sie es durch den query analyzer und sehen Sie, was die Abfrage-plan ist.Meine Vermutung wäre, dass die Doppel-root (ie.%ae%) Suche sind, was Sie tun, tun Sie eine Tabelle Scannen Sie bei der Suche nach den passenden Zeilen.Doppel-root-sucht sind von Natur aus langsam, da Sie nicht verwenden können, jede Art von index, um Ihnen passen in der Regel.

Andere Tipps

HINWEIS:Dies ist nicht wirklich eine Antwort, nur ein Versuch zu klären, was eigentlich die Ursache des performance-problem(s).

Rund 90.000 Datensätze ist wirklich ein ziemlich kleiner Datensatz, und die Abfrage ist relativ einfach, mit nur zwei mitmachen.Haben Sie Indizes auf CustomerAddress."CustomerId" und CustomerAccount."CustomerId"?Das scheint eher zu performance-Problemen, als die where-Bedingung WIE Prädikate.Sind Sie in der Regel suchen, um eine übereinstimmung zu finden, die auf alle Spalten gleichzeitig?

Ich würde echo-David ' s suggestion.Würden Sie wahrscheinlich wollen, zu prüfen, wie das RDBMS ist die Ausführung Ihrer Abfrage (z.B. per table-scans oder über Indizes).

Ein quick check wäre zu Zeit genau der Teil der Abfrage, die die text-Suche.So etwas wie dieses:

SELECT  ca.Line1, ca.CityName, ca.PostalCode
FROM    CustomerAddress as ca
WHERE   ca.CustomerId = <some id number>
AND     (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');

Wenn das eine lange Zeit, dann die LIKEs sind das Problem (entfernen Sie jeweils einen Ausdruck von der ORed Zeile zu sehen, wenn nur eine dieser Spalten, verursacht die Verlangsamung).Wenn es schnell, dann schließt sich verdächtig sind.

Sie schreiben, könnte eine ähnliche Abfrage für die CustomerAccount Tisch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top