在存储过程中,经常要引用一些表来存储一些中间数据,用完即删。对于这个中间表,用常规表,临时表或者表变量有什么区别呢?

下面我们看一下这三种中间表是否会造成执行计划的重编译。

首先打开sql server profile,监控存储过程。

1.建第一个存储过程,在存储过程中创建常规表TT1

CREATE PROCEDURE TEST1_PRO
AS
BEGIN CREATE TABLE TT1(ID INT IDENTITY,NAME VARCHAR(10))INSERT INTO TT1VALUES ('name1')select * From TT1DROP TABLE TT1
END

下面调用存储过程

--Firsttime
EXEC TEST1_PRO

查看sql server profile的如下截图:

可以看到在存储过程中创建常规表,会造成两次重编译。第一个编译是由于常规表的新建之后的DML操作造成的,第二个重编译是查询新建表导致的执行计划的编译。

下面我们第二次调用该存储过程

--SecondTime
EXEC TEST1_PRO

查看sql server profile的如下截图:

可以看到第二次调用存储过程跟第一次调用存储过程都会造成两次重编译。

2.建第二个存储过程,在存储过程中创建临时表#TT1

CREATE PROCEDURE TEST2_PRO
AS
BEGIN CREATE TABLE #TT1(ID INT IDENTITY,NAME VARCHAR(10))INSERT INTO #TT1VALUES ('name1')select * From #TT1DROP TABLE #TT1
END

调用存储过程

--Firsttime
EXEC TEST2_PRO

查看sql server profile的如下截图:

可以看到第一次调用TEST2_PRO存储过程跟第一次调用TEST1_PRO的时候造成的重编译是一样的,两次重编译。

我们再次调用该存储过程

--SecondTime
EXEC TEST2_PRO

查看sql server profile的如下截图:

可以看到当存储过程再次被执行时,没有发生重编译。临时表只能用于存储过程范围之内,无法在存储过程范围之外使用,因此其架构在多次执行之后并未发生任何改变,从而可以在存储过程后续执行期间重用现有的执行计划。

3.建第三个存储过程,在存储过程中创建表变量@TT1

CREATE PROCEDURE TEST3_PRO
AS
BEGIN
DECLARE @TT1 TABLE(ID INT IDENTITY,NAME VARCHAR(10))INSERT INTO @TT1VALUES ('name1')select * From @TT1END

调用存储过程

--Firsttime
EXEC TEST3_PRO

查看sql server profile的如下截图:

可以看到对于存储过程中创建表变量,第一次调用该存储过程并没有发生重编译。

再次调用存储过程

--SecondTime
EXEC TEST3_PRO

查看sql server profile的如下截图:

再次调用存储过程之后,也没有发生重编译,可以看到当用表变量当存储过程的中间表,不会造成存储过程的重编译。

由于表变量不会写日志,不会造成锁开销,不能在Declare之外创建主键索引等,因此表变量不会造成架构的变化,从而不会造成重编译。该存储过程的执行计划已经在创建存储过程的时候生成了,因此之后执行的存储过程不会造成执行计划的重编译。

综上所述,我认为在存储过程中中间表需要存储少量数据时,创建表变量来存储中间数据是开销最小的。

如果大家有什么问题可以提出来,相互交流,谢谢!

转载于:https://www.cnblogs.com/bobozhu/p/5132687.html

存储过程中引用的常规表,临时表以及表变量是否会导致存储过程的重编译相关推荐

  1. mysql 存储过程声明式游标_Mysql 存储过程中使用游标循环读取临时表

    游标 游标(Cursor)是用于查看或者处理结果集中的数据的一种方法.游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标的使用方式 定义游标:Declare 游标名称 CURSOR ...

  2. mysql临时表的的理解,如何理解存储过程中已存在的mysql临时表?

    它在创建表时具有IF NOT EXISTS( 13.1.17. CREATE TABLE Syntax)选项,在这种情况下可以使用. 例: DELIMITER $$ CREATE PROCEDURE ...

  3. SQL 存储过程中,将串连的字符串当表用。

    select distinct order_no,IDENTITY(int,1,1) as px into #g from gold_purify_detail where order_no in ( ...

  4. php 调用变量方法名,php中引用(变量和函数名前加符号)用法

    本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...

  5. oracle 中的日志在处理,ORACLE在存储过程中记录日志的处理包

    Java开发过程中一般使用LOG4J来将程序的运行日志记录到文件中,在ORACLE存储过程中也需要记录日志,我将工作中自己整理的一个记录日志的包分享出来,其实很简单,希望大家多提意见. 一.表结构 为 ...

  6. execute immediate在存储过程中的使用

    execute immediate 在存储过程中使用较为频繁,其作用是巨大的,下面简单介绍其基本用法 1:在存储过程中,我们知道只能使用DML语句,那么如果要使用DDL语句呢,就得使用execute ...

  7. oracle execute immediate create,execute immediate在oracle存储过程中的使用

    execute immediate 在存储过程中使用较为频繁,其作用是巨大的,下面简单介绍其基本用法 1:在存储过程中,我们知道只能使用DML语句,那么如果要使用DDL语句呢,就得使用execute ...

  8. 以表达式作为参数传入SQL的存储过程中去

    在开发过程中,需要把一句Sql 的expression作为一个参数传入Procedure中去. 在asp.net中,一个Search的动作,把用户所操作的搜索条件写成了一句表达式,现只需要把这句表达式 ...

  9. 导致存储过程重新编译的原因

    存储过程包含一组复杂的SQL语句,使生成存储过程的执行计划的代价有些高.因此通常重用存储过程的执行计划来代替生成新计划是有利的.但是有时候现有的计划可能不适用或者在重用期间可能不能提供最佳的处理策略. ...

最新文章

  1. liunx上mysql源码安装mysql,搞定linux上MySQL编程(一):linux上源码安装MySQL
  2. 彻底澄清:C#方法参数
  3. 机器学习入门学习笔记:(4.2)SVM的核函数和软间隔
  4. 人工智能的策略,如果国家优先发展”梦想成真”?
  5. C#与Javascript变量、函数之间的相互调用2008年11月28日 星期五 05:28 P.M.1.如何在JavaScript访问C#函数?
  6. pycharm下配置jupyter_在 Pycharm 中安装及使用 Jupyter (图文详解)
  7. 读书笔记—《销售铁军》随记3
  8. python学习笔记(12)-python语法要求(缩进、标识符、变量)
  9. 解封装(七):av_read_frame读取帧数据函数分析和产生的空间问题分析,以及AVPacket分析
  10. 20180209-sys模块
  11. evt参数是干啥用的_女朋友问我,Java8 Optional 到底干啥用的?
  12. LeetCode 19. Remove Nth Node From End of List
  13. IPSecNAT穿越实验配置
  14. 在android系统中制作系统签名jks
  15. 那些口碑炸裂的免费远程控制软件!
  16. python七段数码管的绘制 获取系统时间
  17. 计算机数字键盘无法输入数字,电脑数字键打不出数字怎么办?电脑数字键打不出数字的修复方法...
  18. 操作系统OS-Lab2-FAT12文件读取
  19. lpc1768的gpio库函数_LPC1768之GPIO输入和输出配置基础例程
  20. 腾讯云老用户重新注册新账号算新用户吗?

热门文章

  1. php实现图片缩放功能类
  2. ecshop调用指定分类(包含子分类)下所有产品的评论信息
  3. Mac虚拟机安装windows教程--Parallels 5
  4. 艾伟_转载:把事件当作对象进行传递
  5. python update用法_使用dnspython进行 update
  6. comsol线圈不能加电流激励_为什么电压互感器不能短路,电流互感器不得开路?...
  7. 程序开发工具java_15款Java程序员必备的开发工具
  8. latex常见编译错误和细节
  9. pytorch什么要设计ModuleList
  10. 使用神经网络摸你加法器