SQL Servere 通过LIKE 在另一个字符串中查找字符串

我们经常需要在另一个字符串中搜索字符串。对于匹配需要精确的情况,我们可以使用带有通配符的LIKE运算符来指定模式。虽然这满足需求,但在较大的数据集上查询会非常慢

大家好,如果您还对SQL Servere 通过LIKE 在另一个字符串中查找字符串不太了解,没有关系,今天就由本站为大家分享SQL Servere 通过LIKE 在另一个字符串中查找字符串的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

为了说明这个问题,首先我们建立一个简单的数据表作为例子:

创建表dbo.String

StringId INT NOT NULL 主键IDENTITY(1, 1) ,

字符串VARCHAR(20) NOT NULL

);

我们使用大小为5M 行的样本数据集来填充String 表,其中String 列只有20 个字符长,StringID 是整数,不为空(NOT NULL),并且主键(PRIMARY KEY)。

我们用它来测试不同查询的性能比较:

不用索引

要查找String 列中以字符序列“abcd”开头的字符串数,我们使用以下查询:

选择计数(1)

来自dbo.String

WHERE 字符串LIKE ‘abcd%’;

查询将在14 秒内执行。

要查找包含“abcd”序列的所有字符串的计数,查询为:

选择计数(1)

来自dbo.String

WHERE 字符串LIKE ‘%abcd%’;

执行时间也是一样的。因为无论哪种情况,SQL Server 都必须执行全表扫描并检查每个字符串是否匹配。

索引优化

加快查询速度的常用技术是为此字段String 创建索引:

创建非聚集索引ix_nc_test ON dbo.String (String);

构建索引后,使用“abcd%”谓词的查询在1 毫秒内执行。第二个查询不会经过索引,因此无法加速。

因为索引是从第一个字符到最后一个字符排序的,而查找匹配字符串的操作与我们之前看到的操作类似。如果LIKE 谓词是’%abcd’ 并且我们想要搜索以’abcd’ 字符结尾的字符串,我们可以使用另一种优化并在该字段上放置反向索引。

然而,如果查询字符可能出现在我们表中字符串的任何位置,那么正向索引和反向索引似乎都无法帮助我们最初的需求(实际上是模糊查询)。

构建临时表

这是一个常见问题。如果我们对字符串的长度有限制,我们可以牺牲存储空间,通过对字符串进行切割,构造一个临时表,将像’abcdefgh’ 这样的字符串构造出八个子字符,连接起来并存储在临时表中以下方式,包含StringID 和分割小节:

SQL Servere 通过LIKE 在另一个字符串中查找字符串

abcdefgh

BCDF

cdfg

德格

埃夫格

弗格

GH

小时

完成此操作后,我们可以索引该列并使用尾随通配符执行LIKE 搜索。如果我们正在搜索的字符串出现在该字符串中,这将帮助我们找到它。

当然,这意味着对于长度为3 的字符串,我们在新表中获得3 行。随着字符串长度的增加,存储它所需的行数呈指数增长。例如,存储长度为n 的字符串所需的字符总数(和空间)等于算术数列:n + (n-1) + (n-2) + … + 2 + 1,其值为(n*(n+1))/2。对于长度为100 的字符串,这将变为5050 个字符。对于长度为20 的字符串,必须存储的字符数为210。因此此过程将导致需要更多资源来处理查询。

对于较长的字符串,使用此临时表的查询性能可能无法证明这些资源的开销是合理的。考虑到系统整体吞吐量等其他因素,该技术的应用可以仅限于较短的字段,例如电子邮件、用户名、短文章和类似字符串等。

下面我们在一个StringSplit临时表中测试性能,该临时表填充了String表中字段拆分后的数据,其中字符串按照上述拆分方法进行拆分(每个子字符串的StringId相同):

创建表dbo.StringsSplit

StringId INT NOT NULL,

StringSplit VARCHAR(20) NOT NULL

);

5M的原始表处理完后,表中的行数为100M。我们在StringSplit 列上创建聚集索引:

创建聚集索引ix_c_test ON dbo.StringSplit (StringSplit);

构建完成后,我们现在可以通过以下查询来查询它:

选择计数(字符串ID)

来自dbo.String

WHERE 字符串LIKE ‘%abcd%’;

选择计数(不同的字符串ID)

FROM dbo.StringSplit

WHERE StringSplit LIKE ‘abcd%’;

第一个查询在14 秒内完成,就像以前一样。第二次查询花费了大约250 毫秒。正如预期的那样,我们使用查询计划来显示这种差异,我们在第一个查询上看到完整索引扫描(因为我们创建的索引在字符串的开头搜索),在第二个查询上看到聚集索引搜索。

用户评论

SQL Servere 通过LIKE 在另一个字符串中查找字符串
那伤。眞美

我最近也在学习用SQL Server查询数据的时候遇到过这个问题!真没想到可以用 `LIKE` 这个操作符来解决,我之前一直都是用字符串比较的方法,这样好像更复杂一点儿。

    有8位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
苍白的笑〃

LIKE 操作符确实是个好工具,以前没怎么用过,现在看来挺万能的。不过有时候匹配太精准会麻烦,不知道有没有什么方法可以设置模糊查询模式?

    有7位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
她最好i

这个SQL Server的 `LIKE` 操作符功能强大啊!我之前一直在用其他数据库管理系统,发现很多功能都是通用的,学习起来更快更容易。分享这种查询技巧真是太实用了!

    有12位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
淡淡の清香

虽然LIKE操作符挺好使的,但是如果字符串比较长的话,性能上可能会有一些影响吧?有没有什么更快速的方法可以替代呢?

    有11位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
夏日倾情

这篇文章写的真好理解,我以前一直以为LIKE只能用于查找字母,原来还可以用来匹配数字啊!太棒了!我现在就来尝试一下看看效果如何。

    有20位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
敬情

LIKE 操作符的用法确实挺多种多样,还有通配符和模式等等,不过感觉有时候操作有点复杂,需要学习更多相关的知识才能熟练掌握。 希望以后再分享一些更深入的文章!

    有17位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
苏莫晨

这个文章的讲解太棒了!像我这种SQL新手也能很快理解。之前经常遇到字符串查找困难,现在学会了LIKE,效率一定会提高很多!

    有19位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
拥菢过后只剰凄凉

其实,有些数据库系统在实现 `LIKE` 操作的时候,是会使用一些更巧妙的算法进行匹配的,因此有时候性能上还是会有差异。这篇博客可以进一步了解下SQL Server的做法。

    有17位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
冷嘲热讽i

LIKE操作符确实好用,但是需要注意它可能会导致性能问题,特别是当数据集很大时。这时候应该考虑使用其他的查询方法或者优化查询语句来提高效率。

    有15位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
逃避

我尝试了一下 `LIKE` 的用法,感觉还不错,特别是在需要进行模糊匹配的时候比较方便。 而且各种通配符的使用也挺有用的,可以根据实际的需求灵活调整匹配规则。

    有14位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
纯真ブ已不复存在

这个博客太棒了!让我学到了很多关于 SQL Server `LIKE` 操作符的新知识。以前我都是用其他函数来进行字符串匹配,这个方法更加简洁高效,感谢你的分享!

    有7位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
哭着哭着就萌了°

我觉得 `LIKE` 操作符在实际项目中应用还是挺广泛的,特别是在需要检索类似或部分匹配数据的时候非常有用。 但是要注意一些细节问题,例如通配符的使用以及性能优化等。

    有8位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
像从了良

这个博客讲得简单明了,轻松就能理解。 以后遇到字符串查找的需求就用 `LIKE` 操作符了,肯定比以前的方法效率更高!

    有8位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
容纳我ii

LIKE 操作符的功能确实很强大,可以用来匹配多个字符类型的数据。 在实际操作中要注意一些特殊字符的使用方式,需要根据不同情况调整匹配规则。

    有9位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
我要变勇敢℅℅

我对 SQL Server 的 `LIKE` 操作符 还是挺熟悉的, 但是这篇文章让我了解到了一些新的使用方法和坑点。 比如在使用通配符的时候需要注意避免无限循环等问题。

    有7位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
执拗旧人

学习了这种查询方法后,我感觉自己SQL语言水平提高了不少!期待看到更多像这种简洁实用的小技巧分享!

    有12位网友表示赞同!

SQL Servere 通过LIKE 在另一个字符串中查找字符串
裸睡の鱼

这个 SQL Server 的 `LIKE` 操作符确实挺好用的! 我在做数据匹配的时候经常用到它, 以后肯定还会继续学习它的各个用法。

    有12位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/119307.html

(0)
小su's avatar小su
上一篇 2024年9月1日 上午11:53
下一篇 2024年9月1日 上午11:54

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注