Sql 在表中的多个列上进行高效的通配符字符串搜索
我需要能够基于跨多个列的通配符字符串搜索返回一些行 我想出了三种方法来实现这一点:Sql 在表中的多个列上进行高效的通配符字符串搜索,sql,sql-server,full-text-search,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 O
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%的情况下肯定会发生这种情况。您应该考虑使用。你的通配符搜索的一个问题是,查询不会是sgabely-因为它在字符串的中间寻找子字符串,所以需要扫描整个索引而不是搜索特定范围的值。根据表中的行数,与传统索引相比,使用SQL Server的全文搜索功能会带来性能优势。首先想到的是表的大小。第二个问题是,必须有一种机制在每次行更新时更新持久化的计算列。我会选择全文搜索,这要快得多。