【发布时间】:2018-01-12 14:37:58
【问题描述】:
-- create table
CREATE TABLE dbo.Tests
(
Id BIGINT NOT NULL IDENTITY,
String NVARCHAR(100),
StringReversed AS REVERSE(String),
CONSTRAINT PK_Tests PRIMARY KEY (Id),
)
CREATE NONCLUSTERED INDEX IX1 ON dbo.Tests(String)
CREATE NONCLUSTERED INDEX IX2 ON dbo.Tests(StringReversed)
-- populate table with 100k random strings (for testing)
DECLARE @I INT = 100000
WHILE @I > 0
BEGIN
INSERT INTO Tests(String)
SELECT CONVERT(varchar(36), NEWID())
SET @I = @I - 1
END
-- how do i do a LIKE '%STRING%' search which uses the index?
SELECT String, StringReversed FROM Tests WHERE String LIKE '%0A7EB%'
SELECT String, StringReversed FROM Tests
WHERE String LIKE '0A7EB%' OR StringReversed LIKE 'BE7A0%'
你能帮我解决这个问题吗?我正在尝试实现一个全文搜索替代方案,以便能够执行 LIKE '%STRING%' WHERE 子句。
我不太确定这是否可能实现?让我们假设全文搜索是不可能的,我需要使用索引。
这是一个刺激问题,我们需要在字符串列中执行 LIKE '%search%'。我刚刚在这里读到:SQL Server: Index columns used in like? 我们可以做反向吗?
希望你能帮助我,非常感谢。
【问题讨论】:
-
简单地说,你不能。当您有前导通配符时,您创建了一个 nonSARGable 谓词。想想看……你必须查看每一行才能知道它是否包含你要查找的字符串。
-
你可以试试
where CONTAINS(String, '0A7EB')只是出于好奇` -
@voljko89: contains 仅适用于全文索引。
-
我看不到你认为有什么问题的问题?但是正如@SeanLange 所说,
LIKE '%search%'不会使用索引,但这并不会阻止您使用它。如果您需要提高性能,请切换到Full Text Search
标签: sql sql-server full-text-search sql-like