高效的通配符字符串搜索表中的多个列

时间:2016-10-07 17:22:24

标签: sql sql-server full-text-search

我需要能够根据跨多个列的通配符字符串搜索返回一些行。

我想出了三种方法来实现这个目标:

DECLARE @searchString VARCHAR(max) = '%Foo%';
-- Approach 1
SELECT  * FROM AddressFile
WHERE (ClientRef LIKE @searchString
       OR HouseNumber LIKE @searchString
       OR Street LIKE @searchString
       OR Area LIKE @searchString
       OR Town LIKE @searchString
       OR PostCode LIKE @searchString)

-- Approach 2
SELECT  * FROM AddressFile
WHERE (
  (CONCAT(ClientRef, HouseNumber, Street,  Area, Town, PostCode)) LIKE @searchString
)

-- Approach 3
SELECT * FROM AddressFile
WHERE(
  AddressFile.AddressAggregate LIKE @searchString
  -- AddressAggregate = PersistedComputed : CONCAT(ClientRef, HouseNumber, Street,  Area, Town, PostCode)
)

方法3提供了更好的性能,方法1和2大致相当,1取得优势。

有更好(更快)的方法吗?

方法3有问题吗? 通常,用于计算AddressAggregate的列在初始插入后不会改变,但它肯定会在一小部分情况下发生~5-10%。

1 个答案:

答案 0 :(得分:1)

您应该考虑使用Full Text Search。您的通配符搜索的一个问题是查询不会被搜索 - 因为它在字符串中间查找子字符串,它将需要扫描整个索引而不是寻找特定范围的值。根据表中的行数,您可以看到使用SQL Server的全文搜索功能而不是传统索引的性能优势。