精华内容
下载资源
问答
  • 存储过程使用临时变量表,使用的好可以提高速度,使用的不好,可能会起到反作用. 然后给了他几个示例让他自己去看,然后针对自己的数据库进行修改. 那么表变量一定是在内存中的吗?不一定. 通常情况下...

         最近,我有一朋友,对我说他的数据库中的很多存储过程,执行都是超时.让我替他看看是什么原因.我一看,原来他的存储过程中用了很多的临时表与变量表.于是我跟他说过犹不及.

    在存储过程中使用临时表或变量表,使用的好可以提高速度,使用的不好,可能会起到反作用. 然后给了他几个示例让他自己去看,然后针对自己的数据库进行修改.

    那么表变量一定是在内存中的吗?不一定.

     

    通常情况下,表变量中的数据比较少的时候,表变量是存在于内存中的。但当表变量保留的数据较多时,内存中容纳不下,那么它必须在磁盘上有一个位置来存储数据。与临时表类似,表变量是在 tempdb 数据库中创建的。如果有足够的内存,则表变量和临时表都在内存(数据缓存)中创建和处理。

     说明:

         1) CPU-- 事件(sql语句)使用的 CPU 时间(毫秒)。

         2)  Reads--由服务器代表事件读取逻辑磁盘的次数。这些读取操作数包含在语句执行期间读取表和缓冲区的次数。

         3) Writes--由服务器代表事件写入物理磁盘的次数。

     

     

     

     

    示例1.变量表

    1) 10000条记录

    declare @t table
    (
    id nvarchar(50),
    supno nvarchar(50),
    eta datetime
    )
    insert  @t

    select top 10000 ID,supno,eta from 表

     

    --cpu :125    reads :13868    writes: 147

    --表 '#286302EC'。扫描计数 0,逻辑读取 10129 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    --表 '表'。扫描计数 1,逻辑读取 955 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    declare @t table
    (
    id nvarchar(50),
    supno nvarchar(50),
    eta datetime
    )
    insert  @t

    select top 1000 ID,supno,eta from 表

     

    --    cpu:46    reads:2101     writes:    17   
    --表 '#44FF419A'。扫描计数 0,逻辑读取 1012 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    --表 '表'。扫描计数 1,逻辑读取 108 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

     

     

    --示例2。临时表:

     

    create table #t
    (
    id nvarchar(50),
    supno nvarchar(50),
    eta datetime
    )
    end
    insert #t
    select top 10000 ID,supno,eta
    from 表

    --cpu :125    reads:13883       writes:148    
    --表 '#t00000000005'。扫描计数 0,逻辑读取 10129 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    --表 '表'。扫描计数 1,逻辑读取 955 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。


    create table #t
    (
    id nvarchar(50),
    supno nvarchar(50),
    eta datetime
    )

    insert #t
    select top 1000 ID,supno,eta
    from 表

    --cpu: 62    reads: 2095        writes: 17

    --表 '#t00000000003'。扫描计数 0,逻辑读取 1012 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    --表 '表'。扫描计数 1,逻辑读取 108 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

     

     

    --示例3。不创建临时表,直接插入到临时表

    select top 10000 ID,supno,eta
    into #t
    from 表

    --cpu:31    reads:1947        writes:83

    --表 '表'。扫描计数 1,逻辑读取 955 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。




    select top 1000 ID,supno,eta
    into #t
    from 表

    --cpu: 0    reads: 997        writes:11

    --表 '表'。扫描计数 1,逻辑读取 108 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    从以上的分析中可以看出,如果使用3)方式,则会少建一个临时表.那么IO中的读写也将减少次数.

    1)与2)都会有先建临时表的动作,并进行相应的IO读取操作.

    从sql语句对服务器的cpu使用上来看,第三种情况cpu使用率也相对较低.

    从物理写入磁盘操作来看,第三种情况的物理写入次数较少.

     

    在什么情况下使用表变量来代替临时表:

    取决于以下三个因素:

                                                                           

    插入到表中的行数。本人认为最好是小于1000行,具体情况具体分析.
    从中保存查询的重新编译的次数。
    查询类型及其对性能的指数和统计信息的依赖性。

    在某些情况下,可将一个具有临时表的存储过程拆分为多个较小的存储过程,以便在较小的单元上进行重新编译。

    个人建议,当记录行小于1000行的情况下,应尽量使用表变量,除非数据量非常大(大于1000行)并且需要重复使用表。在这种情况下,可以在临时表上创建索引以提高查询性能。但是,各种方案可能互不相同。

    Microsoft 建议您做一个测试,来验证表变量对于特定的查询或存储过程是否比临时表更有效。

    转载于:https://www.cnblogs.com/toddzhang/p/3342629.html

    展开全文
  • mysql存储过程变量使用

    千次阅读 2017-06-28 11:18:57
    在mysql存储过程中,声明一个变量可以使用declare vi_num(变量名) int(数据类型) 的方式。 还可以直接使用@变量名的方式,直接使用一个变量。 请看以下存储过程:  drop PROCEDURE if EXISTS pro2;  ...

    在mysql存储过程中,声明一个变量可以使用declare vi_num(变量名) int(数据类型) 的方式。

    还可以直接使用@变量名的方式,直接使用一个变量。

    请看以下存储过程:


     drop PROCEDURE if EXISTS pro2;
     CREATE PROCEDURE pro2()
     BEGIN
    DECLARE d INT;
    set @d=3;
     SELECT MAX(saleno) INTO d from tsalsale;
     SET @dd=0;
     SELECT MAX(saleno) INTO @dd FROM tsalsale;
     set @d=@d+1;
     END;
     call pro2();
    select @dd;
    select @d;


    ------------------------------------其中,表tsalsale中saleno最大值位10000,

    执行两个查询后,结果分别为

    10001,

    4,

    这就说明d和@d是两个不同的变量,d是一个局部变量(在外部执行select d会报错),而@d是一个全局的变量,因此可以执行select @d。

    展开全文
  • 存储过程使用变量存储过程和函数中,可以定义和使用变量。用户可以使用关键字DECLARE来定义变量,然后为变量赋值。这些变量的作用范围是在BEGIN…END程序段中。 1. 定义变量 在MySQL中,可以使用DECLARE...

    在存储过程中使用变量

    在存储过程和函数中,可以定义和使用变量。用户可以使用关键字DECLARE来定义变量,然后为变量赋值。这些变量的作用范围是在BEGIN…END程序段中。

    1. 定义变量

    在MySQL中,可以使用DECLARE关键字来定义变量。定义变量的基本语法如下:

    	DECLARE var_name[,…] type [DEFAULT value]   
    

    其中,关键字DECLARE是用来声明变量的;参数var_name是变量的名称,可以同时定义多个变量;参数type用来指定变量的类型;DEFAULT value子句将变量默认值设置为value,没有使用DEFAULT子句时,默认值为NULL。
    定义变量cid,数据类型为INT型,默认值为10,代码如下:

    DECLARE cid INT DEFAULT 10;    
    

    2. 为变量赋值

    在MySQL中可以使用关键字SET来为变量赋值,SET语句的基本语法如下:

    SET var_name=expr[,var_name=expr]…
    

    其中,关键字SET用来为变量赋值;参数var_name是变量的名称;参数expr是赋值表达式。一个SET语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。
    例如,将变量tmp_id赋值为88,代码如下:

    SET tmp_id = 88;
    

    在MySQL中,还可以使用SELECT…INTO语句为变量赋值。其基本语法如下:

     SELECT col_name[,…] INTO var_name[,…]     
     FROM table_name WHERE condition         
    

    其中,参数col_name表示查询的字段名称;参数var_name是变量的名称;参数table_name指表的名称;参数condition指查询条件。

    【示例11-2】从表employee中查询id为3的记录,将该记录的id值赋给变量tmp_id,代码如下:

    SELECT id INTO tmp_id
    FROM grade WEHRE id=sid;
    
    mysql>  use school;   #选择数据库school                                             
    mysql>  drop  PROCEDURE if exists query_student_class_info;                                                                             
    mysql> DELIMITER $$                                                                                
    mysql> create procedure  query_student_class_info (IN sid int, OUT cname varchar(128), OUT ccount  int)                                   
            BEGIN   
                declare tmp_name varchar(128);
                declare tmp_count int;
                declare tmp_cid  int;
                select class_id into tmp_cid from student where id = sid;         
                select name, count into tmp_name, tmp_count from class where id = tmp_cid;
                set cname = tmp_name, ccount = tmp_count;
             END;    
             $$                                                                           
             DELIMITER ;                                                                 
    mysql>  call query_student_class_info(4, @name, @count);    #调用存储过程  
    mysql>  select @name, @count;
    

    具体操作

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    结语:

    时间: 2020-07-14

    展开全文
  • 1.存储过程基本结构。从is到begin区域为声明变量区域,从bengin到end区域为逻辑代码区域。...使用 带参数的存储过程存储过程参数不用指定取值范围。  注意事项: 1, 存储过程变量” 需要制定带取值

    1.存储过程基本结构。从is到begin区域为声明变量区域,从bengin到end区域为逻辑代码区域。



    创建变量并赋值。创建变量时需要指定取值范围。

    变量名 := 值;

    x number(4,2);

    x := 1;


     

     

    使用 带参数的存储过程。存储过程参数不用指定取值范围。

     注意事项:

    1, 存储过程 “变量” 需要制定带取值范围

    2,存储过程“参数变量” 不需要指定取值范围,in表示传入,out表示输出

    2,  变量带取值范围,后面接分号

    展开全文
  • mysql中函数、存储过程变量使用

    千次阅读 2018-07-30 11:14:51
    所有的输入输出变量 ,或者使用中的变量,在使用前,要么使用set 声明,要么使用 declare 声明,或者在变量名字前面加@符号,表示用户自定义变量,否则,会导致变量未定义错误。 单变量赋值 DECLARE @id int(16); ...
  • PROCEDURE "Test"--创建Test存储过程 is start_time date;--创建了两个变量,开始时间和结束时间 end_time date; begin start_time := sysdate;--执行开始时间,下面Test1()到Test7()全部都是存储过程,这样调用没...
  • 原文: sql server 存储过程的优化.(变量表,临时的简单分析) sql server 存储过程使用变量表,临时的分析(续) ... 最近,我有一朋友,对我说他的数据库中...在存储过程使用临时变量表,使用的好可以提高
  • mysql存储过程 查看变量

    千次阅读 2019-01-03 10:24:49
    临时 CREATE TABLE `debug_tmp` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `remark` varchar(500) DEFAULT NULL,  PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=771 DEFAULT ...存储过程使用...
  • 表变量存储过程中出现了"必须声明表变量"的错误 如果表名要用变量给定,要用exec() , eg:   DECLARE @Order Table(OrderNo varchar(50)),   @sql varchar(8000)    select @sql='Insert
  • plsql存储过程中全局变量使用 201912接到一个需求,写一个存储过程稽核充值卡充值记录。 涉及充值请求稽核 省内充值卡稽核 全国充值卡稽核 充值流水稽核 以上几个稽核每个都分为语句块或单独写了一个存储过程。 最后...
  • 使用 SET 语句或 SELECT INTO 语句将值指定给变量,也可在声明变量时将其指定为缺省值。可对变量指定字面值、表达式、查询结果和专用寄存器值。 可将变量值指定给 SQL 过程参数或 SQL 过程中的其他变量,也可在...
  • sql2008 declare @aa int =100 sql2005中会提示错误 ”不能向局部变量赋予默认值。“ 解决方法: declare @aa int set @aa=100
  • DECLARE @temp TABLE ( ...delete from @t -------清空中的数据 fetch next from cursor_test into @iLaneNo end    close cursor_test  deallocate cursor_test SELECT * FROM @temp
  • 我们接下来就尝试使用存储过程中的变量来保存直接/间接结果。 这些变量存储过程的本地变量,但是我们得注意,变量必须先声明后,才能使用它。而我们如果要在存储过程中声明一个变量,可以使用DECLARE语句,来看下...
  • 这篇博客旨在存储过程的写法,表变量的运用,及如何执行存储过程存储过程 use BookStoreZone Go CREATE PROCEDURE [dbo].[UP_InsertBookCatalog] @StoreID INT, @Priority INT, @BookID1 INT, @BookType...
  • 一.首先变量的声明有3中方式 ...注:存储过程中声明变量必须在begin之前 并且声明字符串时必须指定大小,不然会报错 2.使用%TYPE声明 ①格式:变量名 表名.字段名%TYPE ②含义:该变量的数据类型与指定...
  • 在流程语句的分析中,我们在存储过程使用变量的声明与设置,由于这些变量也只能在存储过程使用,因此也称为局部变量变量的声明可以使用以下语法: DECLARE 变量名[,变量名2...] 数据类型(type) [DEFAULT ...
  • 存储过程的时候,经常需要传入、传出参数,参数名有时会与存储过程中被使用的表名或者字段名重复。 SQLServer存储过程的参数可以在是“@+名”的形式,而MySQL则不可以。 SQLServer和MySQL在存储过程中定义的变量...
  • 定义一个存储过程如下: create proc [dbo].[mytest1] @id int as select 1 as id,'abc' as name ...现在想用SQL语句来调用这个存储过程,并把他返回的放入变量中.可以如下做: declare @table 
  • Oracle存储过程变量赋值的方法

    万次阅读 2016-07-04 15:42:26
    截止到目前我发现有三种方法可以在存储过程中给变量进行赋值: 1、直接法 :=  如:v_flag := 0; 2、select into  如:假设变量名为v_flag,select count(*) into v_flag from students; 3、execute ...
  • Oracle 在安装时一般会集成安装多种工具,其中Sql Plus工具 可用于查看存储过程时的变量值。   我们可以采用dbms_output.put_line() 方法来在相应的存储过程中输出变量,通过执行存储过程查看输出。例如,我们...
  • mysql 变量使用存储过程

    千次阅读 2016-01-28 17:56:10
    使用select定义用户变量的实践 将如下语句改成select的形式:  set @VAR=(select sum(amount) from penalties); 我的修改:  select @VAR:=(select sum(amount) from penalties); 我这样改,虽然是可以的。但是,...
  • 储存过程和储存函数和变量 变量的应用: 变量分类为: 系统变量和自定义变量 系统变量和全局变量还可以细分: 系统变量分类: 全局变量和会话变量 自定义变量分类: 用户变量和局部变量 下面是变量的一些具体...
  • 变量类型 ...过程变量 BEGIN DECLARE a,b,c INT DEFAULT 0; #定义以及定义默认值 SET a = 100; #赋值 : 限于自身过程使用 SELECT a,b,c; END 会话变量 有效范围 : 全部会话内有效(包括子会话) 用cal...
  • 这个问题我从百度第二页才找得到答案,就从别人的答案自己仔细研究懂了,...存储过程只不过是一个带着名称的SQL批处理语句,如果在整个过程中需要变量时就是可以声明,但该变量声明后只能存活在批处理(存储过程)的...
  • 在oracle存储过程中,有许多自己定义的变量,一般是需要赋值的,在这种情况下,一般来说,可以使用 select 列 into 变量 from table ,就是将列赋值给变量
  • 存储过程中会使用到Declare来定义存储过程变量,定义的存储过程变量可以通过Set或者Select等关键字方法来进行赋值操作,使用Set对存储过程变量赋值为直接赋值,使用Select则一般从数据中查找出符合条件的属性...
  • MySQL存储过程变量定义

    千次阅读 2018-10-03 09:27:18
    要在存储过程中声明一个变量,可以使用DECLARE语句 DECLARE variable_name datatype(size) DEFAULT default_value; MySQL允许您使用单个DECLARE语句声明共享相同数据类型的两个或多个变量 DECLARE x, y INT ...
  • mysql存储过程中表名使用变量

    千次阅读 2014-03-27 14:26:17
    今天写一个对数据库做快照的存储过程,用到了动态表名,突然发现MYSQL不支持直接使用变量做表名,GOOGLE了下,采用以下方法: 注意:prepare stmt from 后面的变量必须用@标注的用户变量,否则会报错 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 867,940
精华内容 347,176
关键字:

存储过程表变量使用