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

原创 2014年01月23日 14:28:32


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

数据中使用表的,常会遇到两种使用表的方法,就是使用临时表及表量。在实际使用的候,我如何灵活的在存储过程中运用它然它们实现的功能基本上是一的,可如何在一个存储过程中有候去使用临时表而不使用表量,有候去使用表量而不使用临时表呢?

  临时

  临时表与永久表相似,只是它的建是在Tempdb中,它只有在一个数据库连束后或者由SQL命令DROP掉,才会消失,否就会一直存在。临时表在建的候都会SQLServer的系日志,Tempdb中体,是分配在内存中的,它也支持物理的磁,但用在指定的磁里看不到文件。

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

  下面我来看一个临时表的例子:  

CREATE TABLE dbo.#News
  (
  
News_id int NOT NULL,
  
NewsTitle varchar(100),
  
NewsContent varchar(2000),
  
NewsDateTime datetime
  )

  临时表可以建索引,也可以定义统计数据,所以可以用数据定义语(DDL)的声明来阻止临时表添加的限制,束,并参照完整性,如主和外键约束。比如来,我们现在来#News表字段NewsDateTime来添加一个默GetData()当前日期,并且News_id添加一个主,我就可以使用下面的句: 

ALTER TABLE dbo.#News
  ADD
  
CONSTRAINT [DF_NewsDateTime] DEFAULT (GETDATE()) FOR[NewsDateTime],
  
PRIMARY KEY CLUSTERED
  
(
  
[News_id]
  
) ON [PRIMARY]
  GO

IF  EXISTS (SELECT * FROMtempdb..sysobjects  WHERE id =object_id('tempdb..##wzg_test') and type='U')

   begin

                      DROP TABLE[addon_scm].[##wzg_test]

                      select 'droptable ##wzg_test'

   end

else

   begin

                      CREATE TABLE  [addon_scm].[##wzg_test]

                      (

                                  id      int ,

                                  name     varchar(100)  

                      )

                      select 'createtable ##wzg_test'

   end

IF  EXISTS (SELECT * FROMtempdb..sysobjects  WHERE id =object_id('tempdb..##wzg_test') and type='U')

   Begin

  insert into [addon_scm].[##wzg_test] values(1,'wzh')

              select * from [addon_scm].[##wzg_test]

   end  

临时表在建之后可以修改多已定选项,包括:

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

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

  3)可添加或 UNIQUE CHECK 束及DEFAULT ()

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

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

  

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

  如我看看建表量的句:

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

  较临时表及表量都可以通SQL选择、插入、更新及句,它的的不同主要体在以下些:

  1)量是存在内存中的,当用访问量的候,SQLServer是不生日志的,而在临时表中是生日志的;

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

  3)量是不允DEFAULT认值,也不允;

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

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

  我们现在来看一个完整的例子,来看它的用法的异同:

  利用临时  

CREATETABLE dbo.#News
  
(
  
News_id int NOT NULL,
  
NewsTitle varchar(100),
  
NewsContent varchar(2000),
  
NewsDateTime datetime
  
)
  
INSERT INTO dbo.#News (News_id, NewsTitle,NewsContent, NewsDateTime)
  
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
  
SELECT News_id, NewsTitle, NewsContent,NewsDateTime FROM dbo.#News
  DROP TABLE dbo.[#News]

  利用表 

DECLARE@News table
  
(
  
News_id int NOT NULL,
  
NewsTitle varchar(100),
  
NewsContent varchar(2000),
  
NewsDateTime datetime
  
)
  
INSERT INTO @News (News_id, NewsTitle, NewsContent,NewsDateTime)
  
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
  SELECT News_id, NewsTitle, NewsContent,NewsDateTime FROM @News

  我可以看到上面两种情况实现的是一的效果,第一种利用临时表的候,临时表一般被建后,如果在行的候,没有通DROPTable的操作,第二次就不能再被建,而定量也不需要DROPTable的操作,一次行完成后就会消失。

  其选择临时是表量的候,我大多数情况下在使用的候都是可以的,但一般我需要遵循下面个情况,选择对应的方式:

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

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

 

相关文章推荐

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

什么情况下使用表变量?什么情况下使用临时表?表变量:    DECLARE @tb  table(id   int   identity(1,1), name   varchar(100))    I...

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

我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候...

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

我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候...

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

在SQL Server的性能调优中,有一个不可比面的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择。记得在给一家国内首屈一指的海运公司作SQL Se...

SQL Server 表变量与临时表区别

问题 1:为什么在已经有了临时表的情况下还要引入表变量?解答 1:与临时表相比,表变量具有下列优点: • 如 SQL Server 联机丛书“表”(Table) 一文中所述,表变量(如局部变量)具有明...

【转】SQL Server 表变量和临时表的区别

SQL Server 表变量和临时表的区别

SQL Server 表变量和临时表的区别

一、表变量   表变量在SQL Server 2000中首次被引入。表变量的具体定义包括列定义,列名,数据类型和约束。而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHEC...

sql server 表变量和临时表

临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅...

SQL Server中的临时表和表变量

在SQLServer的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择。记得在给一家国内首屈一指的海运公司作SQLServ...

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

[转自]http://zhengweisincere.blog.163.com/blog/static/498446492009625749522/ 在SQL Server的性能调优中,有一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server中临时表与表变量的区别
举报原因:
原因补充:

(最多只允许输入30个字)