SqlServer 函数Declare通过传变量查询超慢解决办法

SqlServer 函数Declare通过传变量查询超慢解决办法from参考:1,Declare传参查询速度慢,直接放入参数执行sql却快,求大牛给原因2,OPTION(RECOMPILE)提高带参数执行SQL语句的索引效率 遇到的问题:通过参数执行sql函数查询速度超慢示例示例代码:class=”lang:tsqldecode:true”>declare@prefixnvarchar(10)=’095-0021-‘;…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

from

参考:

1,Declare传参查询速度慢,直接放入参数执行sql却快,求大牛给原因

2,OPTION(RECOMPILE)提高带参数执行SQL语句的索引效率

 

遇到的问题:通过参数执行sql函数查询速度超慢

示例示例代码:

class="lang:tsql decode:true">declare @prefix nvarchar(10) = '095-0021-' ;
declare @serialLength int  = 4  ;
declare @remainedLength int = 1;

--1,直接传值,速度很快 
select * from  [dbo].[f_getPartSerialNo]('095-0021-',4,1)
--2,传变量,速度超慢
select * from  [dbo].[f_getPartSerialNo]( @prefix , @serialLength  , @remainedLength  )
--3,使用OPTION(RECOMPILE)解决2速度慢问题。执行速度同1
select  * from dbo.[f_getPartSerialNo]( @prefix , @serialLength  , @remainedLength  ) OPTION(RECOMPILE)

--:f_getPartSerialNo
CREATE FUNCTION [dbo].[f_getPartSerialNo]
(	
	-- Add the parameters for the function here
	@prefix varchar(40),
	@serialLength int, 
	@remainedLength int
)
RETURNS TABLE 
AS
RETURN 
(
	SELECT MIN(LX_IMA01) AS LX_IMA01
	FROM (
		SELECT PART_POOL.LX_IMA01, PART.LX_IMA01 AS IMA001
		FROM (
			SELECT @prefix + NUM AS LX_IMA01
			FROM NUMPOOL
			WHERE SerialLength = @serialLength
		) PART_POOL
		LEFT JOIN (
			SELECT lx_ima01
			FROM innovator.PART
			WHERE PART.LX_IMA01 LIKE @prefix+'%'
				AND IS_CURRENT = '1'
		) Part
		ON PART_POOL.LX_IMA01 = SUBSTRING(PART.LX_IMA01, 1, LEN(PART.LX_IMA01) - @remainedLength)
) X
WHERE IMA001 IS NULL
)
GO

3种查询执行计划:

1,传值:链接

2,传参

在这里插入图片描述

3,使用OPTION(RECOMPILE),执行计划与传值一致。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171401.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 孙鑫java视频教程笔记[通俗易懂]

    孙鑫java视频教程笔记[通俗易懂](3)为了防止类或函数被覆盖,可以用final声明。private和static默认为final(6)接口中的数据成员默认为publicstaticfinal。(7)java不允许类的多继承,允许类的单继承和接口的多继承。(9)内部类通过this机制可以随意访问外部类的成员。(10)java.lang包被隐形自动导入,不需要import。(12)string是唯一被重载的对

    2022年5月17日
    50
  • eclipse开发webservice实例及问题解决「建议收藏」

    eclipse开发webservice实例及问题解决「建议收藏」1.开发环境及准备工作系统:windows7 jdk:1.8eclipse:4.6.3(一般版本通用的)下载ApacheAxis2:http://mirror.bit.edu.cn/apache/axis/axis2/java/core/1.7.6/axis2-1.7.6-bin.zip 解压缩得到的目录,目录内的文件结构如下:*****配置tomcat服务器

    2022年7月21日
    15
  • Java main方法

    Java main方法publicstaticvoidmain(String[]args){}或者 publicstaticvoidmain(Stringargs[]){}main方法是我们学习Java语言学习的第一个方法,也是每个java使用者最熟悉的方法,每个Java应用程序都必须有且仅有一个main方法。在eclipse里可以使用输入main,在按住Alt+/的方式快速创建main方法

    2022年6月1日
    30
  • java初中级面试题集锦

    java初中级面试题集锦目录基础&与&&区别使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?静态变量和实例变量的区别?是否可以从一个static方法内部发出对非static方法的调用?”==”和equals方法究竟有什么区别?int和Integer的区别什么是foreach循环,它可以循环那些数据类型重载与重写区别?…

    2022年6月18日
    29
  • QPS从0到4000请求每秒,谈达达后台架构演化之路[通俗易懂]

    QPS从0到4000请求每秒,谈达达后台架构演化之路

    2022年3月7日
    50
  • cglib动态代理实现原理_jdk cglib 动态代理 区别

    cglib动态代理实现原理_jdk cglib 动态代理 区别cglib动态代理详解我们都知道jdk的动态代理内部调用切面无效的问题,而cglib则不会出现这种情况,这是为什么?cglib就一定不会出现内部调用切面无效的问题吗?cglib针对每一个类只创建了一个代理类吗?为什么cglib的效率要比jdk的动态代理低呢?首先我们看一下通常我们是如何使用cglib增强一个类的publicclassMain{staticclassTest{publicvoidtest(){System.out.pr

    2022年10月21日
    2

发表回复

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

关注全栈程序员社区公众号