WHERE 查询加变量后特别慢

weixin_44817805 2019-03-22 03:46:55
where条件查询,一个把变量拼到字符串里很快,普通查询非常慢,
是什么原因?
除了拼串解决这个问题,还有什么方式么?
麻烦了。


附代码:


--快
DECLARE @fcategory varchar(500) -- 搜索内容分类
DECLARE @cateName varchar(500) -- 搜索内容
declare @sqlStatment varchar(max)
declare @sortBy varchar(4000)

set @fcategory = '姓名'
set @cateName = '路遥'


set @sortBy = N' order by t1.FNumber DESC'

set @sqlStatment = N'Select
t1.id
from t_Custom t1

where
(
('''+@fcategory+'''=''客户名称'' and t1.fname like ''%'+@cateName+'%'')
or ('''+@fcategory+'''=''姓名'' and (select count(0) from t_contact t2 where t2.fcustid=t1.id and t2.fname like ''%'+@cateName+'%'')>0)
)

'
exec (@sqlStatment+@sortBy)

--------------------------
--慢
DECLARE @FCategory VARCHAR(100),@CateName VARCHAR(100)

SET @FCategory ='姓名'
SET @CateName ='路遥'


SELECT
T1.ID
FROM t_Custom T1
WHERE
(
(@FCategory = '客户名称' AND T1.FName LIKE '%'+@CateName+'%')
OR
(@FCategory = '姓名' AND (SELECT COUNT(0) FROM t_Contact K WHERE K.FCustID=T1.ID AND K.FName LIKE '%'+@CateName+'%')>0)
)
ORDER BY T1.FNumber DESC







...全文
507 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2019-03-23
  • 打赏
  • 举报
回复 1
楼主的两个查询都加了排序的。

试下在最后加上 OPTION(RECOMPILE):
--慢
DECLARE @FCategory VARCHAR(100),@CateName VARCHAR(100)

SET @FCategory ='姓名'
SET @CateName ='路遥'


SELECT
T1.ID
FROM t_Custom T1
WHERE
(
(@FCategory = '客户名称' AND T1.FName LIKE '%'+@CateName+'%')
OR
(@FCategory = '姓名' AND (SELECT COUNT(0) FROM t_Contact K WHERE K.FCustID=T1.ID AND K.FName LIKE '%'+@CateName+'%')>0)
)
ORDER BY T1.FNumber DESC OPTION(RECOMPILE)
Hello World, 2019-03-23
  • 打赏
  • 举报
回复
变量的数据类型和字段的数据类型设置成一样的试试
weixin_44817805 2019-03-23
  • 打赏
  • 举报
回复
引用 4 楼 Hello World, 的回复:
楼主的两个查询都加了排序的。
试下在最后加上 OPTION(RECOMPILE):


试了,还是不行,谢谢
weixin_44817805 2019-03-23
  • 打赏
  • 举报
回复
引用 6 楼 qq_39722241 的回复:
100000


weixin_44817805 2019-03-23
  • 打赏
  • 举报
回复
引用 2 楼 墙头上乘凉 的回复:
查询计划执行一下看看哪一块消耗的资源多,本来用like的话就会影响性能的。


LIKE 是最耗资源的,但是两个代码都有LIKE,ORDER BY
吉普赛的歌 2019-03-22
  • 打赏
  • 举报
回复
#1 说的很正确, 第二段只是因为加多了 order by 才会慢。 两段没多大区别, 都是模糊查询, 都是表扫描。 唯一可以优化的地方是 count 应该改为 exists:
DECLARE @FCategory VARCHAR(100),@CateName VARCHAR(100)
 
SET @FCategory ='姓名'
SET @CateName ='路遥'

IF @FCategory = '客户名称'
BEGIN
	SELECT T1.ID
	FROM   t_Custom T1 
	WHERE  T1.FName LIKE '%'+@CateName+'%'
	ORDER BY T1.FNumber DESC
END
ELSE IF @FCategory = '姓名'
BEGIN
	SELECT T1.ID
	FROM   t_Custom T1 
	WHERE  EXISTS(SELECT 1 FROM t_Contact K WHERE K.FCustID=T1.ID AND K.FName LIKE '%'+@CateName+'%')
	ORDER BY T1.FNumber DESC
END
墙头上乘凉 2019-03-22
  • 打赏
  • 举报
回复
查询计划执行一下看看哪一块消耗的资源多,本来用like的话就会影响性能的。
墙头上乘凉 2019-03-22
  • 打赏
  • 举报
回复
你这不是因为拼接不拼接的问题吧,是因为第二段代码里有Order by 才会变慢的吧

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧