Come si esegue la ricerca full-text con più criteri su tabelle unite a sinistra in SQL Server?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Ho una query che originariamente assomiglia a questa:

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%')

Su un database con 90.000 record, questa query richiede circa 7 secondi per essere eseguita (ovviamente tutti i join e i Mi piace sono gravosi).

Ho cercato di trovare un modo per ridurre il tempo di esecuzione della query con la ricerca full-text sulle colonne interessate.Tuttavia, non ho visto un esempio di ricerca full-text con tre join di tabella come questo, soprattutto perché la mia condizione di join non fa parte del termine di ricerca.

C'è un modo per farlo nella ricerca full-text?


@Davide

Sì, ci sono indici sugli ID.

Ho provato ad aggiungere indici su CustomerAddress (CityName, PostalCode, ecc.) E ho ridotto la query a 3 secondi, ma lo trovo ancora troppo lento per qualcosa di simile.

Tieni presente che tutti i campi di testo (ad eccezione degli ID) sono nvarchar e Line1 è un nvarchar 1000, quindi ciò potrebbe influire sulla velocità, ma comunque.

È stato utile?

Soluzione

Eseguilo tramite l'analizzatore di query e vedi qual è il piano di query.La mia ipotesi sarebbe che la doppia radice (es.Le ricerche %ae%) stanno causando l'esecuzione di una scansione della tabella quando si cercano le righe corrispondenti.Le ricerche con doppia radice sono intrinsecamente lente, poiché di solito non è possibile utilizzare alcun tipo di indice per abbinarle.

Altri suggerimenti

NOTA:Questa non è realmente una risposta, solo un tentativo di chiarire cosa potrebbe effettivamente causare i problemi di prestazioni.

90.000 record rappresentano in realtà un set di dati piuttosto piccolo e la query è relativamente semplice con solo due join.Hai indici su CustomerAddress.CustomerId e CustomerAccount.CustomerId?Sembra che ciò causi più probabilmente problemi di prestazioni rispetto ai predicati della condizione where LIKE.In genere stai cercando una corrispondenza su tutte quelle colonne contemporaneamente?

Vorrei fare eco al suggerimento di David.Probabilmente vorrai esaminare come l'RDBMS sta eseguendo la tua query (ad esempio, tramite scansioni di tabelle o utilizzando indici).

Un controllo rapido potrebbe essere quello di cronometrare solo la parte della query che coinvolge la ricerca testuale.Qualcosa come questo:

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%');

Se ciò richiede molto tempo, allora il LIKEs sono il problema (rimuovi un'espressione alla volta dal file ORed per vedere se è solo una di quelle colonne a causare il rallentamento).Se è veloce, le unioni sono sospette.

Potresti scrivere una query simile anche per la tabella CustomerAccount.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top