SqlServer——临时表和表变量

一、临时表概述

SqlServer临时表有两种:局部临时表、全局临时表。

1、临时表的共同特点:

  • 无论会话的数据库上下文如何,临时表都被保存到 tempdb 数据库中;
  • 当临时表数据较少时,页被保存到内存中;内存不足时,才持久化临时表的页;
  • 判断临时表是否存在:if object_id(‘tempdb..#临时表名‘,‘U‘) N) is not null print ‘存在‘;

2、临时表之间的区别

局部临时表:

  临时表名前以#开头,临时表由创建该表的会话所有,为实现不同会话之间同名的临时表相互隔离,SqlServer为表名称添加下划线和唯一的数字后缀以区分不同会话间同名的临时表。即不同会话之间创建的临时表表名虽然我们看到的是一样,但实际上不一样。临时表的可见性与C#、C语言的变量类似,只对调用堆栈中的创建级别和创建级别的内部级别可见,如在存储过程中创建临时表,在存储过程结束后,临时表即被自动销毁。如果临时表在会话的最外层创建临时表,则在会话、批处理和内部级别中的任何地方都有效,直到会话终止时才销毁。 有效期为到创建级别范围内。同一个会话内可以在不同的级别内创建相同名称的局部临时表,但容易在表名解析时导致错误。

全局临时表:

  表名以##开头,可以被所有的会话访问,且任何会话均可以删除全局临时表。全局临时表适用于在多个会话之间共享临时数据而不用担心安全问题,全局临时表的有效期为会话期间而不是创建级别,在创建全局临时表的会话结束后,全局临时表不再向新的会话发放锁,而等现有的会话访问完释放完锁后将销毁全局临时表。

3、创建不属于任何会话的全局临时表

该全局临时表由SqlServer维护一个大于0的引用计数器以确保不会被数据库自动删除。

方法:

在master数据库中创建有 sp_前缀、使用 startup 选项标记的特殊存储过程,

例:

use master;
go
if object_id(‘dbo.sp_test‘) is not null
  drop proc dbo.sp_test
go
create proc dbo.sp_test
as
  create table ##test
  (
    name varchar(36)
  );
go
exec dbo.sp_procoption ‘sp_test‘,‘startup‘,‘true‘;

这样一来,这种临时表的作用就和永久表没有多大区别了。

时间: 2024-10-24 22:03:53

SqlServer——临时表和表变量的相关文章

sqlserver临时表或表变量代替游标

在很多场合,用临时表或表变量也可以替代游标 临时表用在表没有标识列(int)的情况下. 在表有标识列(int)的情况下可以用表变量,当然也可以用临时表. 利用临时表或表变量的原因时,生成一个连续的列 对于临时表是使用 SELECT .... ,IDENTITY(int) NewID INTO #tmp SELECT ... FROM YourTable 对于YourTable含有标识列(比如字段名为ID)时,可以 INSERT @tmpTable SELECT ..., NewID=(SELEC

SQLServer中临时表与表变量的区别分析

在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表 临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在.临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件. 临时表分为本地

临时表VS表变量--因地制宜,合理使用

一直以来大家对临时表与表变量的孰优孰劣争论颇多,一些技术群里的朋友甚至认为表变量几乎一无是处,比如无统计信息,不支持事务等等.但事实并非如此.这里我就临时表与表变量做个对比,对于大多数人不理解或是有歧义的地方进行详细说明. 注:这里只讨论一般临时表,对全局临时表不做阐述. 生命周期 临时表:会话中,proc中,或使用显式drop 表变量:batch中 这里用简单的code说明表变量作用域 DECLARE @t TABLE(i int) ----定义表变量@t SELECT *FROM @t --

InMemory:在内存中创建临时表和表变量

在Disk-Base数据库中,如果系统频繁地创建和更新临时表,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL Server 2016的内存(Memory-Optimized)数据库中,如果考虑使用内存优化结构来存储临时表,表变量,表值参数的数据,那么将完全消除IO操作的负载消耗,发挥大内存的优势,大幅提高数据库的性能. 在SQL Server 2016中,能够直接创建内存优化的表类型,表变量和表值参数的数据只存储在内存中:不能直接在内存中创建临时表,但是,SQ

SQL使用临时表,表变量,公式表表达式

当我们使用嵌套查询时,有时候希望把一个查询到的数据先保存在一个临时表里供其他查询使用,这时候就会考虑使用临时表,表变量,或公式表表达式 1. 公式表表达式, SQL中使用WITH AS提高性能-使用公用表表达式(CTE)简化嵌套SQL  , 1) WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL

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

在存储过程中,经常要引用一些表来存储一些中间数据,用完即删.对于这个中间表,用常规表,临时表或者表变量有什么区别呢? 下面我们看一下这三种中间表是否会造成执行计划的重编译. 首先打开sql server profile,监控存储过程. 1.建第一个存储过程,在存储过程中创建常规表TT1 CREATE PROCEDURE TEST1_PRO AS BEGIN CREATE TABLE TT1( ID INT IDENTITY, NAME VARCHAR(10) ) INSERT INTO TT1

SQL Server中临时表与表变量的区别

2009年02月20日 星期五  19:31 我 们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量.在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们 实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表 临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在.临时表在创建的时候都会产生SQL Ser

SQL Server中的临时表和表变量 Declare @Tablename Table

在SQL Server的性能调优中,有一个不可比面的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择.记得在给一家国内首屈一指的海运公司作SQL Server应用性能评估和调优的时候就看到过大量的临时数据集处理需求,而他们的开发人员就无法确定什么时候用临时表,什么时候用表变量,因此他们就简单的使用了临时表.实际上临时表和表变量都有特定的适用环境.先卖弄一些基础的知识:表变量变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理

关于临时表和表变量的差别1

临时表,表变量,这2个兄弟在平时使用的时候并不会陌生.很多时候我们都借用这2兄弟来进行一下中间结果集的缓存之类的功能.那我就简单说下这2兄弟在查询时候的一些小区别 1.首先我建立了一个表,存放100W的数据 --数据简单,但是每一行都饱满~ CREATE TABLE Tmp (ID INT PRIMARY KEY,Col1 CHAR(8000)) INSERT INTO dbo.Tmp ( ID, Col1 ) SELECT TOP 1000000 ROW_NUMBER() OVER (ORDE