xml地图|网站地图|网站标签 [设为首页] [加入收藏]
当前位置: www8029com > 澳门新葡8522最新网站 > 正文

存储过程参数传递的影响

时间:2019-10-15 13:27来源:澳门新葡8522最新网站
前言 相当多个人觉着数据库其实很轻便,也没怎么大深远的内幕去钻探,不过真正的一对细节难点决定着您的是或不是是专家。 本文首要叙述一下积存进程参数字传送递的片段小细节

前言

  相当多个人觉着数据库其实很轻便,也没怎么大深远的内幕去钻探,不过真正的一对细节难点决定着您的是或不是是专家。

  本文首要叙述一下积存进程参数字传送递的片段小细节,很三人知情参数嗅探,本例也得以清楚成参数嗅探的威力抓好版

小例子

 1 ---创建测试表
 2 SELECT IDENTITY(INT,1,1) AS RID,
 3 * INTO TB1
 4 FROM sys.all_columns
 5 GO
 6 ---模拟大量数据
 7 INSERT INTO TB1
 8 SELECT *
 9 FROM sys.all_columns
10 GO 100
11  
12  
13  
14 --在 user_type_id列 创建一个索引
15 CREATE NONCLUSTERED INDEX [NonClusteredIndex-20160625-164531] ON [dbo].[TB1]
16 (
17     [user_type_id] ASC
18 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
19 GO
20  
21 --开启IO统计
22 set statistics io on
23  
24 --测试查询执行计划
25 select * from tb1 where user_type_id = 10

图片 1

 

图片 2

图片 3

图片 4

 

注:本例中,语句的实行相应走索引seek key look up

 

测试一

 1 --测试1:使用定义变量,把参数值传递给变量
 2 
 3 create PROCEDURE dbo.USP_GetData
 4 (
 5   @PID INT 
 6 )
 7 AS
 8 BEGIN
 9 DECLARE @ID INT
10 SET @ID= @PID
11 SELECT *
12 FROM TB1
13 WHERE user_type_id = @ID
14 END
15 GO
16 EXEC dbo.USP_GetData @PID=10

 

图片 5

 

图片 6

 结论:如若在蕴藏进程中定义变量,并为变量SET赋值,该变量的值不能为实行安插提供参照他事他说加以考察(即实行安排不思考该变量),将会冒出预估行数和骨子里行数相差过大导致实行布署不优的情事

 

测试二

 1 ---测试2 : 对参数进行运算
 2 create PROCEDURE dbo.USP_GetData2
 3 (
 4   @PID INT
 5 )
 6 AS
 7 BEGIN
 8 SET @PID=@PID-1
 9 SELECT*
10 FROM TB1
11 WHERE user_type_id = @PID
12 END
13 GO
14 EXEC dbo.USP_GetData2 @PID=11

 

 

 图片 7

 

图片 8

敲定:假使在积存进度中使用SET为存储过程参数重新赋值,试行陈设仍接纳推行时传出的值来变化实行布置。

 

测试三

 1 --测试3 :对参数行进拼接
 2 
 3 create PROCEDURE dbo.USP_GetData3
 4 (
 5 @PID INT
 6 )
 7 AS
 8 BEGIN
 9 DECLARE @ID INT
10 set @ID = 2 
11 SET @PID = @ID   @PID
12 SELECT *
13 FROM TB1
14 WHERE user_type_id = @PID
15 END
16 GO
17 EXEC dbo.USP_GetData3 @PID= 8

 

 

 图片 9

 

图片 10

 结论:假如在存储进度中接纳新定义的变量与传播参数拼接重新赋值,执行布署仍使用施行时传出的值来扭转施行计划。

 

测试四

 1 --测试4 : 对变量进行运算 
 2 create PROCEDURE dbo.USP_GetData4
 3 (
 4   @PID INT
 5 )
 6 AS
 7 BEGIN
 8 SELECT *
 9 FROM TB1
10 WHERE user_type_id = @PID  2
11 END
12 GO
13 EXEC dbo.USP_GetData4 @PID=8

 

 图片 11

 

图片 12

  结论:就算盛传参数在传诵后被涂改,但是变化施行铺排时仍使用传入时的值

 

测试五

 1 --测试5 :对变量进行复杂运算 
 2 create PROCEDURE dbo.USP_GetData5
 3 (
 4 @PID INT
 5 )
 6 AS
 7 BEGIN
 8 SELECT *
 9 FROM TB1
10 WHERE user_type_id = @PID  CAST(RAND()*600 AS INT)
11 END
12 GO
13 EXEC dbo.USP_GetData5 @PID=8
14 GO

 

 图片 13

图片 14

 结论:对参数做复杂运算,不可能获取纯粹的值,由此不可能正确地预估行数,也不能够生成合理的实施陈设

 

测试六

 1 --测试6 : 复杂运算使用变量拼接
 2 create PROCEDURE dbo.USP_GetData6
 3 (
 4 @PID INT
 5 )
 6 AS
 7 BEGIN
 8 DECLARE @ID INT
 9 set @ID = CAST(RAND()*600 AS INT)
10 SET @PID = @ID   @PID
11 SELECT *
12 FROM TB1
13 WHERE user_type_id = @PID
14 END
15 GO
16 EXEC dbo.USP_GetData6 @PID=8
17 GO

 

 

 图片 15

 

 

 图片 16

 

敲定:针对测验五方可选拔参数拼接的不二等秘书技,以便正确地预估行数,使用科学的试行安顿

 

 

 总结

  手艺帮助做了相比长的光阴了,遇到了大多浩大埔区,在这里些坑中不停反思,稳步成长!别讲怎样数据库更奇妙,别讲我们海量数据库要求什么样怎么高档的技艺,其实化解难题的入眼只是那么一小点的基础知识。

  注:本例中还应该有另外一种意况正是查询的数据量相当的大,那么本身走全表扫描是最优布置,而由于参数字传送递的标题失实的走了index seek key look up 道理是一致的。

 

--------------博客地址-----------------------------------------------------------------------------

初藳地址: 

如有转发请保留原版的书文地址! 

 

 ----------------------------------------------------------------------------------------------------

注:此小说为原创,接待转发,请在篇章页面显著地方给出此文链接!
若你认为那篇小说还不易请点击下右下角的推荐,特别感激!

 

编辑:澳门新葡8522最新网站 本文来源:存储过程参数传递的影响

关键词: www8029com