簡體   English   中英

在SQL Server中如何在左聯接表上全文搜索多個條件?

[英]How do you full-text search multiple criteria on left-joined tables in SQL Server?

我有一個最初看起來像這樣的查詢:

select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where  c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'       
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')

在具有90,000條記錄的數據庫上,此查詢需要大約7秒鍾的時間來執行(顯然,所有聯接和喜歡都在費勁)。

我一直在嘗試找到一種方法,通過對相關列進行全文搜索來縮短查詢執行時間。 但是,我還沒有看到這樣的具有三個表聯接的全文本搜索示例,特別是因為我的聯接條件不是搜索項的一部分。

有沒有辦法在全文搜索中做到這一點?


@大衛

是的,在Ids上有索引。

我嘗試在CustomerAddress內容(CityName,PostalCode等)上添加索引,這將查詢降低到3秒,但是對於這樣的事情,我仍然覺得太慢了。

請注意,所有文本字段(ids除外)均為nvarchars,而Line1為nvarchar 1000,因此可能會影響速度,但仍會影響速度。

注意:這並不是真正的答案,僅是試圖弄清楚實際上可能導致性能問題的原因。

90,000條記錄實際上是一個很小的數據集,並且只有兩個聯接,查詢相對簡單。 您在CustomerAddress.CustomerId和CustomerAccount.CustomerId上有索引嗎? 與LIKE判斷的條件相比,這似乎更可能導致性能問題。 您是否通常會同時搜索所有這些列的匹配項?

我會贊同戴維的建議。 您可能想要檢查RDBMS如何執行查詢(例如,通過表掃描或使用索引)。

一種快速檢查是僅計時與文本搜索有關的查詢部分。 像這樣:

SELECT  ca.Line1, ca.CityName, ca.PostalCode
FROM    CustomerAddress as ca
WHERE   ca.CustomerId = <some id number>
AND     (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');

如果這需要花費很長時間,則可能是LIKE的(每次從OR ed行中刪除一個表達式,以查看是否只有這些列之一引起了速度下降)。 如果很快,則懷疑是聯接。

您也可以為CustomerAccount表編寫類似的查詢。

通過查詢分析器運行它,然后查看查詢計划是什么。 我的猜測是,雙根(即%ae%)搜索導致它在尋找匹配的行時確​​實進行了表掃描。 雙根搜索本質上是緩慢的,因為通常不能使用任何類型的索引來匹配它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM