2010-07-01 10 views
11

In SQL Server (2008), ho un indice FullText su due colonne, chiamiamolo Table1.FirstNames e Table2.LastNames. Dopo profiling alcune query, mi si avvicinò con i seguenti risultati:Perché le query SQL FullText rallentano quando si?

SELECT * 
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey) 
WHERE CONTAINS(FirstNames, 'Bob') OR CONTAINS(LastNames, 'Bob') 

=> 31 197ms

SELECT * 
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey) 
WHERE (FirstNames LIKE '%Bob%') OR CONTAINS(LastNames, 'Bob') 

=> 1941ms

SELECT * 
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey) 
WHERE CONTAINS(FirstNames, 'Bob') OR LastNames LIKE '%Bob%' 

=> 3201ms

SELECT * 
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey) 
WHERE CONTAINS(FirstNames, 'Bob') 

=> 565 ms

SELECT * 
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey) 
WHERE FirstNames LIKE '%Bob%' 

=> 670ms

SELECT * 
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey) 
WHERE CONTAINS(LastNames, 'Bob') 

=> 17ms

SELECT * 
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey) 
WHERE LastNames LIKE '%Bob%' 

=> 3ms

Questo comportamento persiste anche se ricostruisco l'indice full-text.

FullText è in genere molto più veloce di una query LIKE su insiemi di dati di grandi dimensioni in una lingua specifica, ma perché le velocità di query rallentano di un ordine di grandezza quando I O insieme a due clase di FullText?

+0

Come si comporta 'DOVE firstnames Like '% Bob% 'OR Cognome come'% Bob% ''funziona? –

+0

Circa 2 secondi (sto lavorando con lui su questo) – tghw

risposta

0

Darei un'occhiata al piano di esecuzione per ognuno di questi. Immagino che imparerai un po 'da quello.

Here is a decent link che mostra come visualizzare il piano di esecuzione e alcuni suggerimenti su come interpretarlo.

Problemi correlati