Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在表中的多个列上进行高效的通配符字符串搜索_Sql_Sql Server_Full Text Search - Fatal编程技术网

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的全文搜索功能会带来性能优势。

首先想到的是表的大小。第二个问题是,必须有一种机制在每次行更新时更新持久化的计算列。我会选择全文搜索,这要快得多。