T-SQL中是否有LIKE语句的替代语句?

T-SQL中是否有LIKE语句的替代语句?,sql,sql-server,tsql,contains,sql-like,Sql,Sql Server,Tsql,Contains,Sql Like,我有一个场景需要执行以下操作: SELECT * FROM [dbo].[MyTable] WHERE [Url] LIKE '%<some url>%'; 选择* 从…起 [dbo].[MyTable] 哪里 [Url]类似于“%”; 我必须在Url的开头和结尾('%%')使用两个(通配符),因为用户应该能够搜索完整的Url,即使他键入了部分文本。例如,如果url为且用户类型为“goo”,则url必须出现在搜索结果中LIKE操作员导致性能问题我需要一个替代方法,这样我就可以去掉

我有一个场景需要执行以下操作:

SELECT *
FROM
[dbo].[MyTable]
WHERE
[Url] LIKE '%<some url>%';
选择*
从…起
[dbo].[MyTable]
哪里
[Url]类似于“%”;

我必须在Url的开头和结尾(
'%%'
)使用两个(通配符),因为用户应该能够搜索完整的Url,即使他键入了部分文本。例如,如果url为且用户类型为“goo”,则url必须出现在搜索结果中
LIKE
操作员导致性能问题我需要一个替代方法,这样我就可以去掉这个语句和通配符。换句话说,我不想在这个场景中使用LIKE语句。我尝试使用T-SQL
CONTAINS
,但它不能解决我的问题。除了可以执行模式匹配并快速向我提供结果之外,还有其他选择吗?

使用%启动like将导致扫描。不能绕过去。它必须评估每一个价值

如果为列编制索引,则它应该是索引(而不是表)扫描

您没有不会导致扫描的替代方案。
Charindex和patindex是备选方案,但仍将进行扫描,而不会解决性能问题

你能把这些部件分成一张单独的表格吗?
www
谷歌
co

然后像“goo%”一样搜索?
这将使用一个索引,因为它不是以%开头的

更好的是,你可以在“谷歌”上搜索,并获得索引搜索

您希望该字符串在该表中是唯一的,并且在Int PK上有一个单独的连接,因此它不会返回多个www


“可疑全文包含”没有更快,因为全文将URL保留为一个单词

如前所述,您的查询无法进一步优化,也无法绕过
这样的
进行搜索。提高性能的唯一方法是减少
SELECT
,如果不需要所有列,则只返回所需的列,并在
URL
上创建包含这些列的索引。与
类似的
将无法使用索引进行搜索,但减少扫描的数据大小会有所帮助。如果您有支持压缩的SQL Server版本,这也会有所帮助

例如,如果您真的只需要列A,请编写

SELECT A FROM [dbo].[MyTable] WHERE [Url] LIKE '%<some url>%';
如果主键中已包含,则不需要包含。

您可以创建索引

首先创建目录:

CREATE FULLTEXT CATALOG ft AS DEFAULT;
现在假设您的表名为
MyTable
,则该列为
TextColumn
,其上有一个唯一的索引,名为
UX\u MyTable\u TextColumn

CREATE FULLTEXT INDEX ON [dbo].[MyTable](TextColumn) 
    KEY INDEX UX_MyTable_TextColumn
现在,您可以使用CONTAINS搜索表:

SELECT *
FROM MyTable
WHERE CONTAINS(TextColumn, 'searchterm')

据我所知,除了像
包含(全文搜索功能)这样性能更好的
之外,别无选择。
您可以做的是通过优化查询来提高性能。
要做到这一点,您需要了解您的用户&他们将如何使用您的系统。
我怀疑大多数人都会从地址的开头输入URL(即没有协议),因此您可以这样做:

declare @searchTerm nvarchar(128) = 'goo'
set @searchTerm = coalesce(replace(@searchTerm ,'''',''''''),'')
select @searchTerm

SELECT *
FROM [dbo].[MyTable]
WHERE [Url] LIKE 'http://' + @searchTerm + '%'
or [Url] LIKE 'https://' + @searchTerm + '%'
or [Url] LIKE 'http://www.' + @searchTerm + '%'
or [Url] LIKE 'https://www.' + @searchTerm + '%'
or [Url] LIKE '%' + @searchTerm + '%'
option (fast 1); --get back the first result asap; 
这就给了你一些优化;i、 e.如果url为,则可以使用url列上的索引,因为它位于字符串的开头。 末端的
选项(fast 1)
块,以确保看到这一好处;由于像%searchTerm%
这样的最后一个
URL无法使用索引,我们宁愿尽快返回响应,也不愿等待缓慢的部分完成。

想一想其他常见的使用模式和方法。

您的查询非常简单,我认为没有理由这么慢。dbms将读取记录中的记录并比较字符串。通常它甚至可以在并行线程中执行此操作

你认为你的陈述如此缓慢的原因是什么?你的桌子上有几十亿条记录吗?你的记录包含这么多数据吗

最好的选择不是关心查询,而是关心数据库和系统。其他人已经建议在url列上建立一个索引,因此可以扫描索引而不是扫描表。是否错误地设置了最大并行度?你的桌子碎了吗?你的硬件合适吗?这些是这里要考虑的事情。


但是:
charindex('oogl',url)>0
url类似于“%oogl%”
,但它们在内部的工作方式有所不同。对一些人来说,相似的表达速度更快,而对另一些人来说,则是CHARINDEX方法。也许这取决于查询、处理器数量、操作系统等等。这可能值得一试。

它以什么方式导致性能问题?我已经简化了这个问题。请不要删除此帖子。良好的索引是您所需要的。如果您在该列上没有正确的索引,则不同的运算符将不会对您有帮助。@sharpcloud-索引实际上不会有多大帮助,因为它有一个前导通配符,但仍需要扫描它。索引所能做的最好的事情是减少被扫描数据的宽度。全文索引可能会有所帮助。这如何回答“T-SQL中的LIKE语句是否有替代方案?”@MartinSmith,但没有替代方案可以纠正性能问题。因此,如果这是您的答案,请将其放在答案中。目前,这根本无法回答OP的原始问题,该问题要求替代LIKE,而不是LIKE的解释。@不,如果索引的前导%将导致索引扫描,这仍然比表扫描快。实际结果显然取决于他的具体情况,但不是真的。或者:仅当大多数数据过时且未使用时。否则,我们将降低RAM速度,并将表和索引保留在内存中,而不是仅保留表。我刚刚尝试了这个,但它不起作用。搜索“goo”不会产生“
http://www.google.com
”。搜索“谷歌”确实如此,而且
declare @searchTerm nvarchar(128) = 'goo'
set @searchTerm = coalesce(replace(@searchTerm ,'''',''''''),'')
select @searchTerm

SELECT *
FROM [dbo].[MyTable]
WHERE [Url] LIKE 'http://' + @searchTerm + '%'
or [Url] LIKE 'https://' + @searchTerm + '%'
or [Url] LIKE 'http://www.' + @searchTerm + '%'
or [Url] LIKE 'https://www.' + @searchTerm + '%'
or [Url] LIKE '%' + @searchTerm + '%'
option (fast 1); --get back the first result asap;