SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别

原文链接:https://www.cnblogs.com/zhaowei303/articles/4204805.html

SQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中,然后在针对这个数据进行操作。

  创建“临时表”(逻辑上的临时表,可能不一定是数据库的)的方法有一下几种:

  1.with tempTableName as方法(05之后出现):

  with temptable as 其实并没有建立临时表,只是子查询部分(subquery factoring),定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。

  示例:

复制代码
复制代码
  with Sndas(select * from category where cgtype=2and parentid=@FstCgid),thrdas(select c.* from category cinner join Snd son c.parentid=s.cgidand c.cgtype=3),forthas(select c.* from category cinner join thrd ton c.parentid=t.cgidand c.cgtype=4)
复制代码
复制代码

  注意:上述代码,要是在with Snd前面加一句  “decalare @FstCgid int =1234”,必须以“;”结尾,否则会报错;

  备注:如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。

  

  2.临时表方法

  临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在(临时表一般被创建后,如果在执行的时候,没有通过DROP Table的操作,第二次就不能再被创建)。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。

  临时表分为本地和全局两种,本地临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局临时表的名称都是以“##”为前缀,创建后对任何用户都是可见的,当所有引用该表的用户断开连接时被删除。

  示例: 

复制代码
复制代码
if object_id('tempdb..#tempCategory') is not null drop table #tempCategorycreate table #tempCategory(num int,CGName varchar(50),CGID int,PartnerID int,UpdTime datetime,Operator varchar(50))
复制代码
复制代码

 

  备注:临时表的一些特性:

  1)添加、修改、删除列。例如,列的名称、长度、数据类型、精度、小数位数以及为空性均可进行修改,只是有一些限制而已。

  2)可添加或删除主键和外键约束。

  3)可添加或删除 UNIQUE 和 CHECK 约束及 DEFAULT 定义(对象)。

  4)可使用 IDENTITY 或 ROWGUIDCOL 属性添加或删除标识符列。虽然 ROWGUIDCOL 属性也可添加至现有列或从现有列删除,但是任何时候在表中只能有一列可具有该属性。  

  5)表及表中所选定的列已注册为全文索引。

 

  3.表变量方法

  表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名。表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,一般都是系统的全局变量,像我们常用到的,如@@Error代表错误的号,@@RowCount代表影响的行数。

  示例:

复制代码
复制代码
DECLARE @News Table ( News_id int NOT NULL, NewsTitle varchar(100), NewsContent varchar(2000), NewsDateTime datetime )
复制代码
复制代码

 

 

  上述三种方法的区别:

  临时表和表变量的区别:

  1)表变量是存储在内存中的,当用户在访问表变量的时候,SQL Server是不产生日志的,而在临时表中是产生日志的;

  2)在表变量中,是不允许有非聚集索引的;

  3)表变量是不允许有DEFAULT默认值,也不允许有约束;

  4)临时表上的统计信息是健全而可靠的,但是表变量上的统计信息是不可靠的;

  5)临时表中是有锁的机制,而表变量中就没有锁的机制。

  临时表和表变量的选择:

  1)使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。

  2)一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。

  CTE和WITH AS短语结合使用提高SQL查询性能:

  cet要比表变量效率高得多!

  表变量实际上使用了临时表,从而增加了额外的I/O开销,因此,表变量的方式并不太适合数据量大且频繁查询的情况。

注:存储过程中局部临时表是事务级的如下图:

图片1

 

图片2:

图1的写法 A和B属于两个不同的事务,所以会报错。而图2的写法是一个事务里面则成功执行。

2. 其他写法就是不用拼接SQL语句,直接写就行

    select * into #TempProducts from [dbo].[Sys_Product];

    select * from #TempProducts;

3. 一个#号的临时表是事务级别的,就是说一个临时表只存在于一个事务里面。

转载于:https://www.cnblogs.com/gered/p/8072657.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 三维绘图库_Python第三方库matplotlib(2D绘图库)入门与进阶

Matplotlib一 简介:Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。 Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务…

zbb20170626 myeclipse 2017 ci 构建 spring hibernate struts jar

转载于:https://www.cnblogs.com/super-admin/p/7081209.html

linux处理机调度实验报告,模拟Linux操作系统下处理机调度实验报告

在采用多道系统的设计程序中,往往有若干进程同时处于就绪状态。当就绪状态进程数大于处理机数时,就必须按照某种策略来决定哪些进程优先占用处理机。本实验模拟在单处理机情况下处理机调度处理机调度一、实验目的:1、了解Linux下Emacs编辑器的使用方法,掌…

Java线程:保留的内存分析

本文将为您提供一个教程,使您可以确定活动应用程序Java线程保留Java堆空间的数量和位置。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究,以使您更好地理解分析过程。 我们还将尝试证明过多的垃圾回收或Java堆空间的内存占用问题通常不是由真正…

软件测试白皮书-等价类

设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的"日期检查功能&qu…

深入css布局 (1) — 盒模型 元素分类

深入css布局(1)—— 盒模型 & 元素分类 “ 在css知识体系中,除了css选择器,样式属性等基础知识外,css布局相关的知识才是css比较核心和重要的点。今天我们来深入学习一下css布局相关的知识。” 首先来列下大纲 盒模…

批改网禁止粘贴怎么破_教育部对家长批改作业表态了,明令禁止!你怎么看?...

互联网的发展,的确方便了现代人生活。视频电话、出去买东西你都不用带钱带卡,手机一扫就可以完成支付。很多中小学的家长都会建一个家长群,方便老师和家长的沟通。这个群可以说是家长和学校的桥梁和纽带,家长们为了支持老师的工作…

电子科大专科c语言作业1,电子科大15春《C语言(专科)》在线作业试卷.docx

电子科大 15 春《 C 语言(专科)》在线作业一、单选题(共20 道试题,共100 分。)1.对于 int*p;inta[];pa;的合法运算 ()a;pa;p; 相当于 a;p; 相当于 a[1];若 p 中的地址为 100 则 p; 运算后,则其值为 100-----------------选择: C已知 intb; 则…

MapReduce算法–顺序反转

这篇文章是介绍MapReduce算法的系列文章的另一部分,该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation , Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的MapReduce来计算…

xss防御

http://blog.csdn.net/ghsau/article/details/17027893转载于:https://www.cnblogs.com/jiangjing/p/8076216.html

移动端页面字体在微信被放大,导致排版错乱

在开发微信页面的时候,之前一直没有测出这个问题。直到某天领导的手机出现了排版错位的问题,拿着手机质问我的工作态度。 Google了一下发现原来微信调整了字体大小会放大网页的字体,导致排版混乱。通过设置可以禁止网页字体被放大&#xff1a…

液压支架销轴力学计算分析研究_基于RFID射频精准定位的智能开采研究与应用...

一、项目背景近年来随着智能开采技术的不断发展,装备和新工艺不断更新换代,在智能开采中,对采煤机位置的精准定位是能否实现智能开采的关键,只有准确无误地获取煤机的准确位置,才能实现工作面的智能化开采,进而提高生产…

cf 821E Okabe and El Psy Kongroo(矩阵快速幂)

链接:http://codeforces.com/problemset/problem/821/E 分析:由于有边界而且不同段边界还不同,直接算是不行的。。k是1e18,dp也不行。。用一个16维的向量表示某一列16个位置可能的种类数,到下一列的转移矩阵容易得到&a…

您是否能及时编译?

还记得上次被C开发人员嘲笑的时候吗? Java如此繁琐,以至于他们甚至都不会考虑使用这种语言? 在许多方面,这一概念仍然成立。 但是对于典型的用法(在大型企业的骨干中),Java性能绝对可以与许多竞…

C语言作业二选择结构,C语言第二次作业参考答案选择结构.pdf

1 C 语言第二次作业(选择结构)参考答案语言第二次作业(选择结构)参考答案 1、某年如果能被某年如果能被 4 整除整除,,但不能被但不能被 100 整除整除,,或者能被或者能被 400 整除的整除的 年是闰年。判断从键盘输入的年份是否为闰…

2d物理引擎01

我一直想做一个游戏&#xff0c;但一直感觉自己水平不够 想了想觉得不去做的话就永远做不出来 所以有了这个博文 01 我需要一个东西来显示&#xff0c;很显然h5中canvas是很好的选择 <!DOCTYPE html> <html><head><meta charset"utf-8" />&l…

python结课设计力学方面_我对力学教案的评价

这是来自某教学网站的高一物理力学教案&#xff1a;[高一物理教案1.1.1]第一章 力1&#xff0e;1 力一、教学目标1&#xff0e;知识目标⑴知道力是物体对物体的作用&#xff0c;力不能脱离物体而存在&#xff1b;能正确找出受力物体和施力物体。⑵知道力是有方向的量&#xff…

Liferay Model Hints

这篇文章主要介绍如何通过model hint 来修改liferay builder service生成数据库表中默认字段的长度。 1.什么是Model Hints? 它是对liferay builder service生成的model类的基本提示. 2. 它在什么地方被定义的&#xff1f; portlet-model-hints.xml 3. 文件位置&#xff1f; /…

浏览器书签备份管理

1、火狐浏览器备份导出HTML文件&#xff1a; CtrlJ 书签 - 导入/导出 2、谷歌浏览器&#xff1a; 设置中 导入书签 转载于:https://www.cnblogs.com/AmbiguousMiao/p/8084721.html

选择您的收藏库

这真的是您应该烦恼的吗&#xff1f; java.util.ArrayList和java.util.HashMap从根本上有问题吗&#xff1f; 对于大多数源代码&#xff0c;答案是–不&#xff1b; 这些实现完全可以。 但是&#xff0c;一如既往&#xff0c;细节决定成败。 并存在情况下&#xff0c;当是内置…