首页 > 其他分享 >表变量和临时表

表变量和临时表

时间:2023-04-30 10:33:23浏览次数:30  
标签:变量 临时 -- int 内存 表和表


在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意:

A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。

B、如果需要多次用到一个大表的同一部分数据,考虑用临时表和表变量暂存这部分数据。

C、如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据。

D、其他情况下,应该控制临时表和表变量的使用。

E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现,

(1)主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。

(2)执行时间段与预计执行时间(多长)

F、关于临时表产生使用SELECT INTO和CREATE TABLE + INSERT INTO的选择,一般情况下,

SELECT INTO会比CREATE TABLE + INSERT INTO的方法快很多,

但是SELECT INTO会锁定TEMPDB的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程,

所以我的建议是,在并发系统中,尽量使用CREATE TABLE + INSERT INTO,而大数据量的单个语句使用中,使用SELECT INTO。



表变量存储在内存中,而临时表存储在tempdb中,会涉及到物理IO读写,那么我们是否可以由此得出结论,使用表变量要比使用临时表效率高呢?相信有一部分人会和我有同样的想法,使用表变量的效率高,真是如此吗?先从一次优化存储过程的经历说起。

     存储过程涉及到两个表,一个是用户今日积分表@tableUserScore(数据源来自用户积分详情表中的今日数据),一个是用户积分统计表UserScoreSum,该存储过程逻辑就是统计@tableUserScore中用户不同原因的积分值,生成到表UserScoreSum中。数据量不算很大,@tableUserScore中大概40万条,但这个存储过程执行时间却有些惊人,通常都在1个小时之上。优化的最终结果是将表变量@tabeUserScore换成了临时表#tableUserScore,并在userid和reason上添加了联合索引,优化的效果是执行时间控制在了40S左右。临时表和表变量效率相差百倍,这次优化经历让我对临时表和表变量有了重新认识,也有了一连串的疑问,它们是如何存储的,效率如何,如何选用?

表变量和临时表_数据

表变量和临时表_数据

表结构

表变量和临时表_执行时间_03

declare @tableUserScore table (
userid int , -- 用户编号 
name varchar ( 10 ), -- 用户姓名 
reason varchar ( 32 ), -- 积分原因 
score int -- 积分值 
)

create table UserScoreSum(
userid int , -- 用户编号 
name varchar ( 10 ), -- 用户姓名 
createTime datetime , -- 时间 
reason1Score int , -- 原因1积分值 
reason2Score int , -- 原因2积分值 
reason3Score int , -- 原因3积分值 
reason4Score int , -- 原因4积分值 
)


    以下是个人翻阅资料后的理解,总结出来希望能给和我有同样认识的人提个醒,起到抛砖引玉的作用,也希望大家对理解错误之处提出指正。

   临时表

   

   

   

   

   

    表变量存放在内存中,正是因为这一点所有用户访问表变量的时候SQL Server是不需要生成日志。同时变量是不需要考虑其他会话访问的问题,因此也不需要锁机制,对于非常繁忙的系统来说,避免锁的使用可以减少一部分系统负载。[表变量存放在内存是有一定限制的,如果表变量数据量超过阈值,会把内存耗尽,然后使用TempDB的空间,这样主要还是使用硬盘空间,但同时把内存基本耗尽,增加了内存调入调出的机会,反而降低速度]

   

   临时表 vs. 表变量

   

    2.性能:不能一概而论,表变量存储数据有个性能临界点,在这个临界点之内,表变量比临时表快,表变量是存储在内存中的。

    3.索引:表变量不支持索引和统计数据,但可以有主键;临时表则可以支持索引和统计数据。

   我们对于较小的临时计算用数据集考虑使用表变量。如果数据集比较大,如果在代码中用于临时计算,同时这种临时使用永远都是简单的全数据集扫描而不需要考虑什么优化,比如说没有分组或分组很少的聚合(比如说COUNT、SUM、AVERAGE、MAX等),也可以考虑使用表变量。使用表变量另外一个考虑因素是应用环境的内存压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。一般对于大的数据集我们最好使用临时表,同时创建索引。

标签:变量,临时,--,int,内存,表和表
From: https://blog.51cto.com/u_548275/6237733

相关文章

  • matlab出现函数或变量'fun1'无法识别出错fmincon(line 562)
    函数或变量'fun1'无法识别出错fmincon(line562)原因有两个1.函数名要与函数文件名相同如这里我的函数名是fun1,那么这个文件也要命名为fun12.路径出现了问题通常情况下matlab运行的时候是在C盘对应的bin目录下,但是我保存的这些代码文件并不是再C盘而是在D盘所以我们要进行手......
  • matlab读取文件中时间格式变量并将x轴以时间格式显示
    clcclearcloseall%读取数据文件[num,txt,raw]=xlsread('data.xlsx');%将第一列读进来作为时间dateStrings=raw(2:end,1);%将第一列设置为时间数字格式x_raw=datenum(dateStrings);x=x_raw(:,:);%绘制图像figureholdon%设置图片位置大小set(gcf,'Posit......
  • C#中的隐形坑之泛型基类中的静态变量
    ​切记:泛型基类中定义的静态变量,在各子类中是不会共享数据的。一般在进程内共享数据可选择定义全局const变量或static变量。本文的主角就是static变量。例如我们要定义一个可以跨方法使用的事务时,会想到在基类中定义一个静态变量:[ThreadStatic]publicstaticIDbTransaction......
  • pop 出栈,sorted临时排序,容器类型的数据,zip函数
    divmod(a,b)返回一对商和余数,结果和(a//b,a%b)一致 字典是Python中唯一的映射类型。 Python的源文件以"py"为扩展名,有python.exe解释运行,可在控制台下运行。"pyw"是图形开发用户接口(GUI)文件的扩展名,作为桌面应用程序,这种文件用于开发图形界面的,由pythonw.exe解释......
  • c++中如何强制访问类的保护(protected)/私有(private)性质的成员函数和成员变量
    在使用第三方代码库时,有时候需要访问某个类的函数或者变量,但该对象是保护或者私有的,导致无法正常访问。其实,通过一个简单的友元friend类或函数,可以轻松突破编译器的限制。下面是代码实例。假设第三方库有person类,定义如下。classPerson{private:intage=18;}那么如果强......
  • CMakeLists---自定义变量-add_definitions()函数
    转载:https://blog.csdn.net/qq_35699473/article/details/115837708引言其实这个函数在安装一些库的时候,它的CMakeLists里面就有这样的函数。典型的就是opencv了。opencv安装时候有一些指令也是针对这个函数的,比如安装命令(随便搜索的):cmake ../opencv-3.4.1-DWITH_GTK_2......
  • jmeter之 随机变量 组件
    随机变量界面详解添加随机变量组件的操作:选中“线程组”右键—>添加—>配置元件—>随机变量。随机变量界面如下:随机变量组件的详细说明:名称:随机变量组件的自定义名称,见名知意最好。注释:即添加一些备注信息,对该随机变量组件的简短说明,以便后期回顾时查看。变量名称(Varia......
  • 变量名尽量不要和关键字相同,否则容易出歧义
    变量名尽量不要和关键字相同,否则容易出歧义 >>>xm['zhang3','li4','wang5','zhao6']>>>''.join(str(e)foreinxm)Traceback(mostrecentcalllast):File"<pyshell#183>",line1,in......
  • Python3多进程共享变量实现方法
    今天同事反映一个问题让帮忙看一下:多进程共用一个变量,在一个进程中修改后,在另外的进程中并没有产生修改。 一、错误的实现方式最初以为是没添加global声明导致修改未生效,但实际操作发现global方式在多进程中也只能读不能写。错误示例代码如下:importmultiprocessing#声......
  • jquery:临时禁止鼠标滚动 How to disable scrolling temporarily?
    1.代码://left:37,up:38,right:39,down:40,//spacebar:32,pageup:33,pagedown:34,end:35,home:36varkeys={37:1,38:1,39:1,40:1};functionpreventDefault(e){e=e||window.event;if(e.preventDefault)e.preventDefault()......