2014-07-11 93 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條件是一種合法且常用的優化技術。