2010-06-17 15 views
6

Estoy tratando de entender el rendimiento de una consulta de texto completo de SQL Server 2008 que estoy construyendo.Consulta de texto completo de SQL Server en varias tablas: ¿por qué tan lento?

La siguiente consulta, utilizando un índice de texto completo, devuelve los resultados correctos de inmediato:

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
WHERE 
    FREETEXT(O.Name, 'query') 

es decir, todos los EventOccurrences con la palabra 'consulta' en su nombre. Y la consulta siguiente, que utiliza un índice de texto completo de una tabla diferente, también vuelve inmediatamente:

SELECT 
    V.ID, V.Name 
FROM 
    dbo.Venue V 
WHERE 
    FREETEXT(V.Name, 'query') 

es decir. todas las Sedes con la palabra 'consulta' en su nombre. Pero si trato de unir las tablas y hacer las dos consultas de texto a la vez, 12 segundos para volver:

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
    INNER JOIN dbo.Event E ON O.EventID = E.ID 
    INNER JOIN dbo.Venue V ON E.VenueID = V.ID 
WHERE 
    FREETEXT(E.Name, 'search') 
    OR FREETEXT(V.Name, 'search') 

Aquí es el plan de ejecución: http://uploadpad.com/files/query.PNG

ACTUALIZACIÓN: el plan de texto formulario:

|--Nested Loops(Left Semi Join, OUTER REFERENCES:([E].[ID], [V].[ID])) 
     |--Hash Match(Inner Join, HASH:([E].[ID])=([O].[EventID])) 
     | |--Hash Match(Inner Join, HASH:([V].[ID])=([E].[VenueID])) 
     | | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Venue].[PK_Venue] AS [V])) 
     | | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Event].[PK_Event] AS [E])) 
     | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[EventOccurrence].[PK_EventOccurrence] AS [O])) 
     |--Concatenation 
      |--Table-valued function 
      |--Table-valued function 

de mi lectura, yo no creía que fuera posible incluso hacer una consulta de texto libre a través de varias tablas de esta manera, así que no estoy seguro de que estoy entendiendo esto correctamente.

Tenga en cuenta que si elimino la cláusula WHERE de esta última consulta, a continuación, devuelve todos los resultados en un segundo, por lo que es definitivamente el texto completo que está causando el problema aquí.

¿Alguien puede explicar (i) por qué esto es tan lento y (ii) si esto es incluso compatible/si incluso estoy entendiendo esto correctamente.

Gracias de antemano por su ayuda.

+0

Puede publicar el plan real. No es la imagen? –

+0

OK acaba de agregarlo para usted. –

Respuesta

11

Intente volver a escribir su consulta utilizando FREETEXTTABLE y vea si eso ayuda.

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
    INNER JOIN dbo.Event E ON O.EventID = E.ID 
    INNER JOIN dbo.Venue V ON E.VenueID = V.ID 
    LEFT JOIN FREETEXTTABLE(dbo.Event, Name, 'search') EFT 
     ON E.ID = EFT.[KEY] 
    LEFT JOIN FREETEXTTABLE(dbo.Venue, Name, 'search') VFT 
     ON V.ID = VFT.[KEY] 
WHERE EFT.[KEY] IS NOT NULL OR VFT.[KEY] IS NOT NULL 
1

¿Cómo se compara el plan de ejecución para esto?

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
    WHERE O.EventID IN (
      SELECT 
       E.ID 
      FROM 
       dbo.Event E 
      WHERE 
       FREETEXT(E.Name, 'search') 
      UNION 
      SELECT 
       E.ID 
      FROM 
       dbo.Event E 
       INNER JOIN dbo.Venue V ON E.VenueID = V.ID 
      WHERE 
       FREETEXT(V.Name, 'search') 
       ) 
+0

¡Ah, Académico ahora de todos modos! –

+0

Gracias por esta respuesta ... esta era otra cosa que también estaba intentando, pero parece un tanto desordenada, especialmente porque mi consulta real es mucho más compleja que la versión simplificada que publiqué anteriormente. –

Cuestiones relacionadas