-
2019-06-07 21:36:04
MS SQL Server 执行存储过程比执行相同SQL语句慢的问题,试试两个方法:
1,重启SQL Server 。不知道具体原因,但有时管用。
2,如果上面步骤没有效果,那么可能是Parameter sniffing问题。在过程里面把参数值赋给本地变量,用本地变量执行。create usp_proc1(int @p1)
as
begin
declare @l_p1 int=@p1
select * from t1 where col1=@l_p1
end
更多相关内容 -
SQL Server中存储过程比直接运行SQL语句慢的原因
2012-03-12 10:54:52SQL Server中存储过程比直接运行SQL语句慢的原因 -
Sql Server存储过程执行慢
2019-11-12 14:40:56SQL Server在存储过程执行之前都会制定一个执行计划。在上面的例子中,SQL在编译的时候并不知道@thedate的值是多少,所以它在执行执行计划的时候就要进行大量的猜测。假设传递给@thedate的参数大部分都是非空字符串...在SQL Server中有一个叫做 “Parameter sniffing”的特性。SQL Server在存储过程执行之前都会制定一个执行计划。在上面的例子中,SQL在编译的时候并不知道@thedate的值是多少,所以它在执行执行计划的时候就要进行大量的猜测。假设传递给@thedate的参数大部分都是非空字符串,而FACT表中有40%的thedate字段都是null,那么SQL Server就会选择全表扫描而不是索引扫描来对参数@thedate制定执行计划。全表扫描是在参数为空或为0的时候最好的执行计划。但是全表扫描严重影响了性能。
假设你第一次使用了Exec pro_ImAnalysis_daily @thedate=’20080312’那么SQL Server就会使用20080312这个值作为下次参数@thedate的执行计划的参考值,而不会进行全表扫描了,但是如果使用@thedate=null,则下次执行计划就要根据全表扫描进行了。
有两种方式能够避免出现“Parameter sniffing”问题:
(1)通过使用declare声明的变量来代替参数:使用set @variable=@thedate的方式,将出现@thedate的sql语句全部用@variable来代替。
(2) 将受影响的sql语句隐藏起来,比如:
a) 将受影响的sql语句放到某个子存储过程中,比如我们在@thedate设置成为今天后再调用一个字存储过程将@thedate作为参数传入就可以了。
b) 使用sp_executesql来执行受影响的sql。执行计划不会被执行,除非sp_executesql语句执行完。
c) 使用动态sql(”EXEC(@sql)”来执行受影响的sql。
采用(1)的方法改造例子中的存储过程,如下:
ALTER PROCEDURE [dbo].[pro_ImAnalysis_daily]
@var_thedate VARCHAR(30)
AS
BEGIN
declare @THEDATE VARCHAR(30)
IF @var_thedate IS NULL
BEGIN
SET @var_thedate=CONVERT(VARCHAR(30),GETDATE()-1,112);
END
SET @THEDATE=@var_thedate;
DELETE FROM RPT_IM_USERINFO_DAILY WHERE THEDATE=@THEDATE;
INSERT RPT_IM_USERINFO_DAILY (THEDATE,ALLUSER,NEWUSER)
SELECT AA.THEDATE,ALLUSER,NEWUSER
FROM
( ( SELECT THEDATE,COUNT(DISTINCT USERID) ALLUSER
FROM FACT
WHERE THEDATE=@THEDATE
GROUP BY THEDATE
) AA
LEFT JOIN
(SELECT THEDATE,COUNT(DISTINCT USERID) NEWUSER
FROM FACT T1
WHERE NOT EXISTS(
SELECT 1
FROM FACT T2
WHERE T2.THEDATE<@THEDATE
AND T1.USERID=T2.USERID)
AND T1.THEDATE=@THEDATE
GROUP BY THEDATE
) BB
ON AA.THEDATE=BB.THEDATE);
GO -
sqlserver存储过程执行变慢
2019-12-03 13:32:16项目使用的是sqlserver数据库,每运行一段时间存储过程就会变慢,同一个存储过程,在传入不同参数的情况下,有的情况下执行快,有的执行慢。莫名其妙,一直找不到原因, 后来每次变慢手动编译存储过程, sp_...项目使用的是sqlserver数据库,每运行一段时间存储过程就会变慢,同一个存储过程,在传入不同参数的情况下,有的情况下执行快,有的执行慢。莫名其妙,一直找不到原因,
后来每次变慢手动编译存储过程, sp_recompile 'bill_LoadBillListNewTwo',就变快了
但是过一段时间又变慢了
后来上网搜了,有个Parameter sniffing 参数设置问题。
参考了如下两篇文章,有需要的可以借鉴
https://blog.csdn.net/zengcong2013/article/details/86820657#commentBox
https://yq.aliyun.com/articles/110785
后来发现是因为我在存储过程中使用了遍历循环造成的,
我把遍历结果直接存储到临时表中,就解决了
allroom 是循环遍历的结果,把结果直接存储到临时表#temproomall, 问题解决
改造后存储过程
CREATE PROCEDURE [dbo].[ProcCourtTaiZhangCount] @courtid BIGINT , --小区id @roomid BIGINT, @managerid BIGINT=0 AS BEGIN -- 计算应收 WITH allroom AS ( SELECT aa.ID , aa.ParentID , aa.IsRoom FROM CourtProjects aa WHERE aa.ID = @roomid AND aa.CourtID=@courtid UNION ALL SELECT a.ID , a.ParentID , a.IsRoom FROM CourtProjects AS a , allroom AS b WHERE a.ParentID = b.ID AND a.IsDisabled = 0 AND a.CourtID=@courtid ) SELECT * INTO #temproomall FROM allroom SELECT COUNT(0) FROM dbo.CourtProjects cp LEFT JOIN #temproomall a ON cp.ID=a.ID WHERE cp.IsDisabled=0 AND cp.IsRoom=1 AND cp.CourtID=@courtid AND ( @roomid IS NULL OR @roomid <= 0 OR cp.ID = a.ID ) AND ( @managerid IS NULL OR @managerid <= 0 OR cp.HousekeeperID =@managerid ) DROP TABLE #temproomall end
-
SQLServer 存储过程夸库查询慢的问题
2022-04-15 12:16:35这是今天项目上徐遇到的一个毕竟诡异的问题,问题现象和解决过程如下 ...2、然后在存储过程里面写法如下,也是需要2分钟 declare @no nvarchar(50) select * from 库A.dbo.表1 inner join 库B.dbo.表2 on (x这是今天项目上徐遇到的一个毕竟诡异的问题,问题现象和解决过程如下
1、如下sql 夸库查询需要2分钟
select * from 库A.dbo.表1 inner join 库B.dbo.表2 on (xxxx条件忽略) where 库A.dbo.表1.字段='xxxxxx' --这里是关键注意下
2、然后在存储过程里面写法如下,也是需要2分钟
declare @no nvarchar(50) select * from 库A.dbo.表1 inner join 库B.dbo.表2 on (xxxx条件忽略) where 库A.dbo.表1.字段=@no --注意和1有区别了
但是我把2拷贝出来执行的时候,奇迹的发现只需要2秒
declare @no nvarchar(50) set @no='xxxxx' --这是拷贝出来执行 select * from 库A.dbo.表1 inner join 库B.dbo.表2 on (xxxx条件忽略) where 库A.dbo.表1.字段=@no --注意和1有区别了
3、然后就想到了用存储过程里面exec执行这句代码,成功把2分钟优化到2秒
create table ##temp --定义全局临时表 declare @sql nvarchar(max) --执行sql set @sql=' declare @no nvarchar(50) set @no=''xxxxx'' insert into ##temp --结果插入到临时表 select * from 库A.dbo.表1 inner join 库B.dbo.表2 on (xxxx条件忽略) where 库A.dbo.表1.字段=@no ' exec(@sql) --执行 select * from ##temp drop table ##temp
-
SQL Server 创建存储过程
2021-03-22 15:29:031.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) drop proc pro_name go create proc pro_name @param_name param_type [=default_value] as begin sql语句 ... -
SQL Server 存储过程与实例
2012-08-27 09:04:12存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回... -
SqlServer存储过程详解
2018-10-19 17:25:01看到别人总结的SQL server的存储过程觉得写的很好 ,就拿过来了,希望对大家有帮助。 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) drop proc pro_name go... -
如何解决sql server 存储过程在查询分析器快,但程序调用存储过程执行慢的问题?
2020-10-23 10:39:41已经遇到好几次这个问题了,...这样我程序中执行超时的存储过程,1秒钟就可以执行出来了。 百度下什么是存储过程预编译。 ------------------------------------------------------------------------------------ -
SqlServer 创建存储过程(Create Procedure)注意事项
2021-09-10 11:14:25单循环插入速度最慢是由于INSERT每次都有日志,事务插入大大减少了写入日志次数,批量插入只有一次日志,CTE的基础是CLR,善用速度是最快的。 删除: 2. 数据删除PK 2.1. 循环删除,执行时间为1240毫秒 SET ... -
SqlServer存储过程的创建与使用
2021-03-30 14:09:23存储过程的优点存储过程的缺点存储过程的基本语法存储过程的分类1、系统存储过程1.1、系统存储过程sql示例2、自定义存储过程2.1、创建不带参数存储过程2.2、修改存储过程2.3、带参数存储过程2.4、带通配符参数存储... -
Sql Server中存储过程使用时间长了查询效率变得很慢的分析
2020-01-09 20:33:57而一旦执行存储过程查询,查询时间又成了3秒。 因为对数据库优化器了解不多,所以没想到执行计划的问题。当时的想法是是否是查询语句的原因,打开存储过程发现之前因时间原因查询语句结构写得有点乱,就随手把... -
sql server 提高查询和存储过程运行效率之UPDATE STATISTICS
2021-07-22 15:30:56sql server 提高查询和存储过程运行效率之UPDATE STATISTICS -
使用存储过程非常慢,但是执行SQL很快问题分析
2019-08-20 09:38:49问题一:存储过程放在查询分析器中执行,大概耗时5秒左右即可成功执行,但是在网站中执行却会超时 1. 将该存储过程放到查询分析器中执行,大概耗时5秒左右即可成功执行,但是在网站中执行却会超时; 2.经查阅... -
SQL查询语句执行速度快,存储过程执行慢
2020-12-19 20:52:25今天一个生成10w条数据...会为该存储过程生成一个基于输入参数的执行计划,因此如果第一次输入的参数不具有代表性(例如大部分查询输入的参数都是A值,但第一次执行存储过程时输入的是B值),就有可能比即席查询慢,尽... -
SQL Server--解决存储过程执行快,但程序调用则执行慢的问题
2018-06-27 15:45:23这两天遇到一个问题令人比较郁闷,一个大概120行左右的存储过程在SQL Server2012的查询分析器里面执行,速度非常理想,1秒不到,即可筛选抓取到大概500条数据记录。但在C#程序代码里调用,就提示连接超时。把... -
Sql Server中存储过程执行很快,但程序调用时执行非常慢的问题(连接超时)
2018-04-09 14:35:001、在查询分析器上执行:execsp_recompile@objname='存储过程名称' 解析:由于存储过程是预编译的, 在第一次执行的时候, 会生成执行计划, 以后执行的时候, 会使用这个执行计划(除非存储过程侯或者显示指定重新... -
SQLServer存储过程的执行计划
2019-06-22 14:51:09如果执行存储过程时成功通过解析阶段,则 Microsoft SQL Server 查询优化器将分析存储过程中的 Transact-SQL 语句并创建一个执行计划。执行计划描述执行存储过程的最快方法,所依据的信息包括: 1.表中的数据量。 2.... -
SQLServer存储过程举例简介
2017-11-09 20:47:24SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的... -
sqlserver 存储过程的使用
2019-12-29 22:12:58SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。... -
SQLServer 复杂存储过程并发优化(案例)
2016-07-18 12:32:06一个存储过程,1500行代码,内部有一个查询,关联使用了200多张表(其中有重复的表),并发线程执行,耗时15秒左右,结果返回一般几行记录。这个存储过程是系统中最耗时、最消耗性能的。今天突然想着得优化一下了! ... -
SqlServer存储过程详解(转)
2019-06-24 11:16:221.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) drop proc pro_name go create proc pro_name @param_name param_type [=default_value] as begin sql... -
java调用sqlserver存储过程问题
2017-02-22 07:48:31java调用sqlserver存储过程问题,通过JAVA调用sqlserver存储过程 大概代码如下: proc = srcConnection.prepareCall("{call getTaskByTaskId(?,?,?,?,?)}"); ...(省略) proc.execute(); System.out.println("执行... -
jdbc sqlserver update语句 执行速度慢
2019-09-18 08:48:05在java中执行update语句,更新一个有150万条记录的表,速度特别慢,约2条sql语句/s。 分析 影响通过jdbc执行update语句的因素主要有如下几种: 网络IO(对应解决方案1) 执行update语句(对应解决方案2) 速度过慢... -
sqlserver2000 事件探查器profiler
2019-10-09 16:42:19用于SQL server2000自带的探查器不能用的 替换一下就行了 监视 SQL Server 实例的性能。 调试 Transact-SQL 语句和存储过程。...例如,可以创建您自己的应用程序,以便使用 SQL 事件探查器存储过程监视 SQL Server。 -
SQL Server 优化存储过程的七种方法.doc
2011-07-31 20:03:46SQL Server 优化存储过程的七种方法 -
SQL存储过程初探第1/2页
2021-01-02 02:20:40数据量少的时候没什么感觉,挺快的,可等到数据量大的时候,上W条记录查询,尤其是不分页都显示在一页里的时候情况就出现了,速度很慢,要10几秒才有反应,所以想到了要用SQL的存储过程来简化代码和加快程序的执行速度!... -
理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程
2016-11-15 10:38:44本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列 接上文:理解性能的奥秘——应用程序中慢,SSMS中快(1)——简介 本文介绍SQL Server如何编译存储过程并使用计划缓存。如果你的应用程序完全没有用到...