我需要能够根据跨多个列的通配符字符串搜索返回一些行。
我想出了三种方法来实现这个目标:
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%。
答案 0 :(得分:1)
您应该考虑使用Full Text Search。您的通配符搜索的一个问题是查询不会被搜索 - 因为它在字符串中间查找子字符串,它将需要扫描整个索引而不是寻找特定范围的值。根据表中的行数,您可以看到使用SQL Server的全文搜索功能而不是传统索引的性能优势。