2014-07-11 75 views
1

我正在使用SQL Server 2012标准,并且我在查询中使用CONTAINS子句时出现了一些问题。SQL Server 2012性能问题使用FULLTEXT

我的查询:

select * 
from 
    calles as c 
INNER JOIN 
    colonias as col ON c.ID_Colonia = col.ID_Colonia 
where 
    CONTAINS(c.Nombre,@Busqueda) OR CONTAINS(col.Nombre,@Busqueda) 

如果我只用一个包含搜索的时间约为200毫秒,但如果我同时使用它是10s左右(这是一个很大的时间)。我尝试一种解决方法去做使用UNION这样的:

select * 
from 
    calles as c 
INNER JOIN 
    colonias as col ON c.ID_Colonia = col.ID_Colonia 
where 
    CONTAINS(c.Nombre,@Busqueda) 

UNION 

select * 
from 
    calles as c 
INNER JOIN 
    colonias as col ON c.ID_Colonia = col.ID_Colonia 
where 
    CONTAINS(col.Nombre,@Busqueda) 

和查询时间为200ms左右一次。但我认为第二个代码很笨拙。我有一些错误吗?

+0

这听起来更像是使用'Or'而不是'Contains'的问题。你看过这两个查询计划吗? – Siyual

回答

0

FULLTEXT SQL Server中的索引是RDBMS引擎外的(有点儿)的服务。

它接受搜索字符串并从表中返回一个键值列表(然后需要与表本身连接以确保它们仍然存在)。

因此,实际上您要在查询中加入两个表格,并将OR条件应用于连接的结果。

当涉及到这样的结构时,SQL Server的优化器并不是特别聪明。

UNION代替OR条件是一种合法且常用的优化技术。