`

表变量和临时表的一些相关

    博客分类:
  • sql
 
阅读更多
 

表变量:  

  DECLARE @tb  table(id   int   identity(1,1), name   varchar(100))   

  

  INSERT @tb   

 SELECT id, name  FROM mytable   WHERE name like ‘zhang%’ 

 

临时表: 

  SELECT name, address

  INTO #ta   FROM mytable  

  WHERE name like ‘zhang%’

(if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#ta') and type='U')

   drop table #ta)

 

1 . 为什么要使用表变量

 

表变量是从2000开始引入的,微软认为与本地临时表相比,表变量具有如下优点:

  a.与其他变量的定义一样,表变量具有良好的定义范围,并会被自动清除;
  b.在存储过程中使用表变量会减少存储过程重新编译的发生;
  c.表变量需要更少的锁请求和日志资源;
  d.可以在表变量上使用UDF,UDDT,XML。

2 .表变量的限制

与临时表相比,表变量存在着如下缺点:
  a.在表变量上没有统计信息,查询优化器根据固定的预估值来选择执行计划,在数据很多的情况下,会导致查询优化器选择很差的执行计划;
  b.不能直接在表变量上创建索引,但可以通过创建约束(主键、唯一)来建立索引;
  c.在DECLARE后,不能再对表变量进行更改;
  d.不能对表变量执行INSERT EXEC , SELECT INTO语句(只针对05前的版本);
  e.不能通过EXEC或sp_executesql来执行牵涉到表变量的动态SQL语句,但如果表变量是在动态SQL语句内定义的,则可以。

3 .那什么时候可以使用表变量

要使用表变量应该根据如下规则来判断:
  a.表的行数;
  b.使用表变量能够减少的重新编译次数;
  c.查询的类型和对索引或者统计信息的依赖程度;
  d.需要生用UDF,UDDT,XML的时候。
其实也就说,得从实际出发,根据具体的查询,作出具体的选择。但是,其中很关键的一点,如果表的行数非常多,使用表变量其实是更费资源的。有人提出了这样的建议:对于行数较少的情况下(小于1000行)可以使用表变量;如果行数很多(有几万行),则使用临时表。

因此,在实际的开发中,应通过分别使用临时表或表变量进行对比后,才作出决定。
下面是一个例子,插入临时表和表变量的数据有20多万行,可以看到,使用临时表的时间是使用表变量所花时间的1 / 5 。

表 ' SalesOrderHeader ' 。扫描计数 3 ,逻辑读取 130 次,物理读取 9 次,预读 43 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' #SalesOrderDetail___________________________________________________________________________________________________00000000001F ' 。扫描计数 3 ,逻辑读取 12331 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' Worktable ' 。扫描计数 0 ,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
   CPU 时间 = 2281 毫秒,占用时间 = 19726 毫秒。
select with temporary table : 20140 ms

******************************************************************************** 

表 ' SalesOrderHeader ' 。扫描计数 0 ,逻辑读取 764850 次,物理读取 17 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' #4E88ABD4 ' 。扫描计数 1 ,逻辑读取 12331 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
   CPU 时间 = 4375 毫秒,占用时间 = 107160 毫秒。
select with table variable: 107160 ms

4 .使用表变量的误区

对于表变量,很多人认为,表变量和其他变量一样,只存在内存中,其实这是不正确的,表变量也存在tempdb中。可以通过下面例子进行对比。

CREATE TABLE #TempTable (TT_Col1 INT )

DECLARE @TableVariable TABLE (TV_Col1 INT )

SELECT TOP 2 * 

FROM tempdb.sys.objects

ORDER BY create_date DESC 


name
-- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
#03317E3D
#TempTable__________________________________________________________________________________________________________000000000003


#03317E3D就是刚创建的表变量;

5 .其他

  表变量不受rollback影响,某些情况下会破坏数据的完整性。

CREATE TABLE #TempTable (TT_Col1 INT )
DECLARE @TableVariable TABLE (TV_Col1 INT )
INSERT #TempTable VALUES ( 1 )
INSERT @TableVariable VALUES ( 1 )
BEGIN TRANSACTION 
     INSERT #TempTable VALUES ( 2 )
      INSERT @TableVariable VALUES ( 2 )
ROLLBACK 
SELECT * FROM #TempTable

/* 
TT_Col1
-------
1
*/ 

SELECT * FROM @TableVariable 
-- 返回了两条记录 
/* 
TV_Col1
-------
1
2
*/ 

From:http://www.cnblogs.com/luolongda/archive/2010/12/22/1913405.html

 

拓展:

判断临时表是否存在

Way 1

if(exists(select name from tempdb..sysobjects where name like'%temptab%' and type='U'))
   drop table #temptab

Way 2

if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#tempcitys') and type='U')
   drop table #tempcitys

Way 3

IF OBJECT_ID('tempdb..#') IS NOT NULL
   DROP TABLE #

OBJECT_ID此函数返回数据库对象标识号

 

判断数据库里有没有存在PerPersonData这样一张表

if exists (select * from sysobjects where objectproperty(object_id('PerPersonData'),'istable') = 1)

OBJECTPROPERTY:返回当前数据库中对象的有关信息。1表“真”。同样可以写成OBJECTPROPERTY(id, isUserTable) = 1

if exists (select * from sysobjects where id = object_id(N'PerPersonData') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
drop table 'PerPersonData'

 

判断试图是否存在
if exists (select * from sysobjects where id = object_id(N‘[dbo].[ESTMP]‘)
and OBJECTPROPERTY(id, N‘IsView‘) = 1)
  drop view ESTMP

From:http://blog.csdn.net/leamonjxl/article/details/6603007

分享到:
评论

相关推荐

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

    临时表和表变量在使用上的一些关键差异如下: 1. 日志记录:临时表操作会被记录在日志中,而表变量操作不会。 2. 索引:临时表可以有聚集和非聚集索引,而表变量仅支持聚集索引。 3. 默认值和约束:临时表可以定义...

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

    资源名称:SQLServer中临时表与表变量的区别内容简介: 本文档主要讲述的是SQLServer中临时表与表变量的区别;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看。资源截图: 资源太大,传百度网盘了,...

    SQL Server 表变量和临时表的区别(详细补充篇)

    在SQL Server中,表变量和临时表都是用来存储临时数据的结构,但它们之间存在着显著的差异。本文将详细介绍这两种类型的变量,以便更好地理解和选择在特定场景下的适用性。 一、表变量 表变量是在SQL Server 2000...

    SQLServer中临时表与表变量的区别.docx

    - **约束与默认值**:临时表支持添加各种约束和默认值,表变量则不支持。 - **统计信息**:临时表的统计信息更可靠,有助于查询优化器做出更好的执行计划。 - **锁机制**:临时表支持锁机制,适合需要事务处理的场景...

    sql临时表相关介绍

    临时表分为两种类型:本地临时表和全局临时表。 1. **本地临时表**:本地临时表的名称以单个井字号 (#) 开头,如 `#Tmp`。这些表只在其创建的会话中可见,不会被其他用户或会话访问。当创建本地临时表的会话结束时...

    无法更新临时表的问题

    用户上传的文件“无法更新临时表”可能是包含表单和相关表的数据,为了更具体地解决问题,需要查看这些文件,尤其是涉及临时表操作的代码部分。如果能提供具体的错误消息或代码片段,诊断将更加精确。在VFP社区中,...

    MySQL性能分析之临时表

    - 内存临时表的大小受到`max_heap_table_size`和`tmp_table_size`两个系统变量的限制。当超过这些限制时,内存临时表会被转化为磁盘临时表。 #### 二、磁盘临时表的产生 磁盘临时表通常是因为某些特定条件导致...

    Mysql临时表使用说明

    ### MySQL临时表使用详解 #### 引言 ...然而,正如任何技术一样,临时表的使用也需要结合具体场景,考虑其潜在的限制和风险,才能发挥出最佳效果。在实践中不断探索、测试与优化,是掌握临时表运用的关键。

    SQL SERVER中表变量之妙用.pdf

    相比临时表,表变量的执行效率更高,尤其是在处理普通数据量的情况下。 表变量的基本操作包括定义、插入、删除、修改和查询,类似于操作普通的SQL表。定义表变量的语法如下: ```sql DECLARE @表名 TABLE(字段名1 ...

    SQL SERVER临时表的语法.pdf

    SQL Server的临时表是数据库操作中非常实用的工具,它们用于存储临时数据,尤其是在复杂的查询...在实际应用中,根据数据量、生命周期和可见性需求,明智地选择临时表或表变量,可以显著提高SQL Server应用程序的性能。

    Oracel储存过程用临时表

    临时表是数据库中的特殊表格,它的生命周期只存在于会话(Session)内,一旦会话结束,临时表及其数据都会被自动删除。这使得它们非常适合用于存储过程中的临时数据存储,不会对其他用户或会话产生影响。 创建临时...

    创建和使用临时表.docx

    示例代码展示了如何创建、查询、删除临时表以及使用变量和存储过程来操作临时表。在示例中,声明了变量`@Wokno`和`@Str`,并用`WHILE`循环逐行处理数据。存储过程创建了一个局部临时表`#Tmp`,并在循环中利用动态SQL...

    SQL SERVER临时表的语法.docx

    SQL Server中的临时表是...正确地使用局部和全局临时表,以及根据需求选择表变量,能够优化数据库的性能并提高代码的可维护性。在实际应用中,应根据数据量、使用范围和会话生命周期来决定何时使用哪种类型的临时表。

    MySQL中的两种临时表

    MySQL中的临时表是数据库在处理复杂查询和性能优化时的重要工具。临时表分为两种类型:外部临时表和内部临时表。 外部临时表是通过`CREATE TEMPORARY TABLE`语句创建的,它对当前用户可见,并且仅在当前会话期间...

    一个选查询后插入到一个临时表的oracle函数

    ### 一个选查询后插入到一个临时表的Oracle函数 #### 概述 在Oracle数据库环境中,函数是一种非常有用的数据库对象,它允许开发者封装复杂的逻辑并返回特定的结果。本文将详细解析一个特定的Oracle函数——`NS_...

    浅谈SQL数据库中滥用临时表、排序的解决方案

    2. **使用表变量**:在某些情况下,如果数据量不大,可以使用表变量代替临时表,因为它们不会创建磁盘上的物理对象,对性能影响较小。 3. **合理使用索引**:为临时表添加合适的索引可以显著提高查询速度,但也要...

    sqlserver 循环临时表插入数据到另一张表

    sqlserver 循环临时表插入数据到另一张表 -- 声明变量 DECLARE @SupCode as varchar(100), @ProdCode as varchar(50), @PackLayer as varchar(50), @CodeStatus as varchar(50), @ProductId as varchar(50), @...

Global site tag (gtag.js) - Google Analytics