Servir SQL La búsqueda de texto completo con Containstable es muy lenta cuando se usa en JOIN!
Estoy usando la búsqueda de texto completo de sql 2008 y estoy teniendo serios problemas con el rendimiento dependiendo de cómo uso Contains o ContainsTable.
Aquí hay una muestra: (la tabla uno tiene aproximadamente 5000 registros y hay un índice cubierto en la tabla 1 que tiene todos los campos en la cláusula where. Traté de simplificar las declaraciones, así que perdóneme si hay problemas de sintaxis).
Escenario 1:
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select top 1 * from containstable(table1,*, 'something') as t2
where t2.[key]=t1.id)
resultados: 10 segundos (muy lento)
Escenario 2:
select * from table1 as t1
join containstable(table1,*, 'something') as t2 on t2.[key] = t1.id
where t1.field1=90
and t1.field2='something'
resultados: 10 segundos (muy lento)
Escenario 3:
Declare @tbl Table(id uniqueidentifier primary key)
insert into @tbl select {key] from containstable(table1,*, 'something')
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select id from @tbl as tbl where id=req1.id)
resultados: fracción de segundo (súper rápido)
En pocas palabras, parece que si uso Containstable en cualquier tipo de combinación o si la condición de la cláusula de una instrucción select que también tiene otras condiciones, el rendimiento es realmente malo. Además, si observa el generador de perfiles, el número de lecturas de la base de datos aumentará. Pero si primero hago la búsqueda de texto completo y pongo los resultados en una variable de tabla y uso esa variable, todo va súper rápido. El número de lecturas también es mucho menor. Parece en escenarios "malos", de alguna manera se atasca en un bucle que hace que lea muchas veces desde la base de datos, pero por supuesto no entiendo por qué.
Ahora la pregunta es, en primer lugar, ¿por qué sucede eso? y la pregunta dos es ¿qué tan escalables son las variables de tabla? ¿Qué pasa si da como resultado 10s de miles de registros? ¿seguirá siendo rápido?
¿Algunas ideas? Gracias