如何优化在 SQL Server 中搜索子字符串的列?

Col*_*nee 4 sql-server-2008 sql-server optimization query-performance

我有一个非常基本的表:

CREATE TABLE [obj_local] (
    [obj_id]     INT             NOT NULL,
    [value]      NVARCHAR (1000) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

这个表存储了很多数据,我需要在value列中搜索一个字符序列:

SELECT [obj_id] FROM [obj_local] WHERE [value] LIKE '%{substring}%'
Run Code Online (Sandbox Code Playgroud)

这是非常缓慢的。我的理解是,由于两边的通配符,索引对我没有帮助,全文索引也对我没有帮助,因为我不是在搜索标记(单词)。

我可以做些什么来优化此搜索?

Rob*_*ley 5

如果您知道确切的字符串,那么使用二进制排序规则进行搜索会有所帮助。

WHERE [value] LIKE '%{substring}%' COLLATE Latin1_General_BIN
Run Code Online (Sandbox Code Playgroud)

,因为它不必进行大小写转换等。这可以使它快几倍,但不是闪电般的快。

另一种选择是考虑炸毁您的表并对其进行索引 - 在数字表和您的表之间使用 john 上的索引视图,利用 substring 函数。

例如,如果您有一个至少包含 1000 个数字的表格,您可以为每个字符排成一行。是的,它会占用空间,但它会让您很快找到其中的每个“H”。

问题是 - 它仍然不是你所需要的,因为会有很多“H”。更好的可能是抓住三个字母的组合。因此,如果您要查找“Hotel”,您就会知道“Hot”、“ote”或“tel”必须在三字母组合表中。您可以创建一个内联表值函数来处理此问题。自然地,当您搜索“Hot”时,该 obj_id 的下一个块必须类似于 'el%',依此类推,此外您应该检查您的主表是否仍然成功满足主谓词。

这是一个想法......如果你能忍受像这样解决它的复杂性。