当前位置: 首页 > 面试题库 >

SQL中的LIKE解决方法(性能问题)

隆睿
2023-03-14
问题内容

我一直在阅读,发现使用LIKE会导致查询速度大大降低。

同事推荐我们使用

Select Name
From mytable
a.Name IN (SELECT Name 
           FROM mytable
           WHERE Name LIKE '%' + ISNULL(@Name, N'') + '%' 
           GROUP BY Name)

替代

Select Name
From mytable
a.Name LIKE '%' + ISNULL(@Name, N'') + '%'

现在我不是SQL专家,并且我不太了解这些语句的内部工作原理。这是一个更好的选择,值得在每个like语句中键入一些额外的字符吗?是否有更好(更容易键入)的替代方法?


问题答案:

有几个性能问题需要解决…

如果可能,不要多次访问同一张表

不要将子查询用于无需参考同一表的其他副本即可完成的条件。如果由于使用聚合函数(MAX,MIN等)而需要表副本中的数据,这是可以接受的,尽管分析函数(ROW_NUMBER,RANK等)可能更便于容纳(假设受支持)。

不要比较你不需要的东西

如果您的参数为NULL,则意味着您想要与之比较的列具有任何值,请不要包括过滤条件。像这样的语句:

WHERE a.Name LIKE '%' + ISNULL(@Name, N'') + '%'

…保证优化器必须比较该name列的值(是否使用通配符)。更糟糕的LIKE是,如果对要搜索的列上存在索引,则在评估的左侧使用通配符可确保无法使用索引。

更好的方法是:

IF @Name IS NOT NULL 
BEGIN
   SELECT ...
     FROM ...
    WHERE a.name LIKE '%' + @Name + '%'
END
ELSE 
BEGIN
   SELECT ...
     FROM ...
END

表现良好的SQL就是根据您的需求量身定制的。这就是为什么当您使用两个或多个独立条件进行查询时,应该考虑使用动态SQL的原因。

使用正确的工具

LIKE当您检查文本数据中是否存在字符串时,该运算符在搜索文本时效率不是很高。
全文搜索(FTS)技术旨在解决以下缺点:

IF @Name IS NOT NULL
BEGIN
   SELECT ...
     FROM ...
    WHERE CONTAINS(a.name, @Name) 
END
ELSE
BEGIN
   SELECT ...
     FROM ...
END

始终测试和比较

我同意LittleBobbyTables的观点-
该解决方案最终依赖于查询查询/执行计划中的所有替代方案,因为表设计和数据可能会影响优化器的决策和性能。在SQL
Server中,子树成本最低的服务器效率最高,但是如果不维护表统计信息和索引,它会随着时间的推移而变化。



 类似资料:
  • 大部分软件都可以通过付出相对较小的努力,让他们比刚发布时快上10到100倍。在市场的压力下,选择一个简单而快速的解决问题的方法是比选择其它方法更为明智而有效率的选择。然而,性能是可用性的一部分,而且通常它也需要被更仔细地考虑。 提高一个非常复杂的系统的性能的关键是,充分分析它,来发现其“瓶颈”,或者其资源耗费的地方。优化一个只占用1%执行时间的函数是没有多大意义的。一个简要的原则是,你在做任何事情

  • 本文向大家介绍SQL Server中的Forwarded Record计数器影响IO性能的解决方法,包括了SQL Server中的Forwarded Record计数器影响IO性能的解决方法的使用技巧和注意事项,需要的朋友参考一下 一、简介      最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动。本篇文章分享什么是forwa

  • 问题内容: 我使用rand()命令从数据库中生成随机行而没有任何问题,但我得知随着数据库大小的增加,此rand()会导致服务器负载沉重,因此我正在寻找另一种方法,并尝试通过生成一个随机数使用php rand()函数并将其作为id放入mysql查询中,这非常快,因为mysql知道行ID,但问题是在我的表中所有数字都不可用。例如1,2,5,9,这样的12。 如果php rand()生成数字3,4等,则

  • 本文向大家介绍SQL Server评估期已过问题的解决方法,包括了SQL Server评估期已过问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 但是,当自己打开之前敲的系统时,总是报错,无法进行。经过检查发现,原来是自己的数据库出现了问题,无法连接到数据库了。打开Sql Server2008,总是报这样的错误提示:                      问题出现了,就得解决,于是开始上

  • 本文向大家介绍Nginx中worker connections问题的解决方法,包括了Nginx中worker connections问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 查看日志,有一个[warn]: 3660#0: 20000 worker_connections are more than open file resource limit: 1024 !! 原来安装好ngin

  • 本文向大家介绍虚拟机中ubuntu不能联网问题的解决方法,包括了虚拟机中ubuntu不能联网问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 设置虚拟机不能联网是很痛苦的,这里我就ubuntu的NAT上网问题就个人经验讲一下,其他的桥连接等没有使用就没有经验了。 ubuntu版本:ubuntu-16.04-desktop-amd64.iso 1.查看/设置下NAT的网络 打开VMware W