使用 LIKE '%ABC%' QUERY 提高 SQL 性能

Dar*_*ron 6 performance sql-server t-sql azure-sql-database query-performance

我知道使用 LIKE '%ABC%' 查询不会使用索引,并且几乎没有什么可以更改查询来改进这一点,但是如何才能更快地执行?在此阶段,我们无法将查询更改为使用全文索引。

一些背景...

我们将 Azure VM(注意:不是 Azure SQL,而是运行在 Windows 2012 上的 SQL Server)中的系统作为第二个位置以提供额外的弹性(离线备份),并使用基本服务器规范“构建”了一个 SQL 服务器。在我们的旧平台上执行 LIKE 查询需要 2 秒,而在这个 Azure 平台上需要 10 秒。

这显然是服务器规范的限制,但是我可以做些什么来改进呢?

我可以在查询运行期间看到 CPU 峰值,因此“更快”的 azure cpu 似乎会有所帮助,但要知道这些数字也可能具有误导性!

所以我的问题是,我需要专注于改进 CPU,还是不止于此?

有问题的数据库在磁盘上只有 300mb,被查询的表有大约 160k 行,所以它无论如何都不大。

请让我知道我是否在这里吠错了树,或者我是否需要先检查其他任何东西?

SQL 服务器是带有 SQL Server 2014 Std 的 Windows 2012 R2,并且是按照 Azure SQL 性能指南(即专用条带驱动器上的数据)构建的。

编辑
根据要求,这是我正在测试的查询:

SELECT Name
FROM Users
WHERE Name like '%ABC%'
Run Code Online (Sandbox Code Playgroud)

就是这样。这里没有什么复杂的,只是从一个小数据库中检索数据!

顺便说一句,此查询需要 10 秒才能运行,而添加子句 'AND Description like '%ABC%' 将时间减少到 6s?

编辑 2

好的,在评论中的反馈之后有更多信息......

我已经关注了这个页面的信息:http : //www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/

我已经运行了显示的查询,这些是显示的结果: 在此处输入图片说明

对我来说,它最初看起来像是磁盘 IO 绑定,但平均等待时间似乎很短?我不是这方面的专家,所以请指教...

Aar*_*and 3

如果没有全文搜索,不,除了预先计算结果或投入更多资源来解决问题之外,没有任何魔法可以使 SQL Server 中的字符串解析速度更快。

如果您有一组反复重复的狭窄搜索模式,则您可以维护满足这些条件的表的更精简的具体化部分(例如,仅包含表示主表中的行的 PK 列的表)匹配'%ABC%'- 您可以通过触发器维护这些)。这将减少所需的读取量,但可能不会对持续时间产生严重影响。

如果人们以不可重复且不可预测的方式输入任意搜索字符串,那么无论如何这都可能无济于事。

对于 160K 行的表来说,10 秒似乎很长。如果您使用的是 V12(并且可以相对隔离地运行此查询),您应该能够确定在该查询期间更改的等待,使用sys.dm_db_wait_stats- it might be that you can't keep 300MB of data in memory and the wait time都是磁盘搅动。在这种情况下,您可能正在共享一台不堪重负的服务器,因此一个考虑因素是升级到提供更好性能的更好层。

您可以考虑的另一个选项是应用程序端缓存(例如 memcached、redis 等),您可以在应用程序内存中保存数据副本,并在其中执行搜索,而不是在 SQL Server 中执行搜索。