设为首页 收藏本站
查看: 1186|回复: 0

[经验分享] SQL Server中的临时表和表变量 Declare @Tablename Table【转】

[复制链接]

尚未签到

发表于 2018-10-18 09:53:17 | 显示全部楼层 |阅读模式
  我们经常使用临时表和表变量,那现在我们就对临时表和表变量进行一下讨论.
  临时表
  临时表存储在TempDB数据库中,所有的使用此SQL Server 实例的用户都共享这个TempDB,因为我们应该确保用来存储TempDB数据库的硬盘有足够的空间,以使之能够自己的增长.最好能够存储在一个拥有独立硬盘控制器上.因为这样不存在和其它的硬盘I/O进行争用.
  我们很多程序员认为临时表非常危险,因为临时表有可能被多个连接所共享.其实在SQL Server中存在两种临时表:局部临时表和全局临时表,局部临时表(Local temp table)以#前缀来标识,并且只能被创建它的连接所使用.全局临时表(Global temp table)以##前缀来进行标识,并且可以和其它连接所共享.
  局部临时表
  局部临时表不能够被其它连接所共享的原因其实是在SQL Server 2000中自动为局部临时表的表名后面加上了一个唯一字符来标识.如:
  CREATE TABLE [#DimCustomer_test]
  (
  [CustomerKey] [int]
  , [FirstName] [nvarchar](50)
  ,[MiddleName] [nvarchar](50)
  ,[LastName] [nvarchar](50)
  )
  现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表#DimCustomer_test已经被加上了后缀:
  USE TempDB
  GO
  SELECT name FROM sysobjects WHERE name LIKE ’%DimCustomer%’
  the Result is:
  name
  #DimCustomer_test___________________________________________________________________________________________________000000000005
  全局临时表
  下面我们来看一下全局临时表:
  CREATE TABLE [##DimCustomer_test]
  (
  [CustomerKey] [int]
  , [FirstName] [nvarchar](50)
  ,[MiddleName] [nvarchar](50)
  ,[LastName] [nvarchar](50)
  )
  现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表##DimCustomer_test没有被加上了后缀:
  USE TempDB
  GO
  SELECT name FROM sysobjects WHERE name LIKE ’%DimCustomer%’
  The Result are:
  #DimCustomer_test___________________________________________________________________________________________________000000000005
  ##DimCustomer_test
  --Drop test temp tables
  DROP TABLE [##DimCustomer_test]
  DROP TABLE [#DimCustomer_test]
  可以看到我们刚才创建的全局临时表名字并没有被加上标识.
  表变量
  表变量和临时表针对我们使用人员来说并没有什么不同,但是在存储方面来说,他们是不同的,表变量存储在内存中.所以在性能上和临时表相比会更好些!
  另一个不同的地方是在表连接中使用表变量时,要为此表变量指定别名.如:
  USE AdventureWorksDW
  GO
  DECLARE @DimCustomer_test TABLE
  (
  [CustomerKey] [int]
  , [FirstName] [nvarchar](50)
  ,[MiddleName] [nvarchar](50)
  ,[LastName] [nvarchar](50)
  )
  ---insert data to @DimCustomer_test
  INSERT @DimCustomer_test
  (
  [CustomerKey]
  , [FirstName]
  ,[MiddleName]
  ,[LastName]
  )
  SELECT
  [CustomerKey]
  , [FirstName]
  ,[MiddleName]
  ,[LastName]
  FROM DimCustomer
  SELECT [@DimCustomer_test].CustomerKey,SUM(FactInternetSales.OrderQuantity)
  FROM @DimCustomer_test INNER JOIN FactInternetSales ON
  @DimCustomer_test.CustomerKey = FactInternetSales.CustomerKey
  Group BY CustomerKey
  Result:
  Server: Msg 137, Level 15, State 2, Line 32
  Must declare the variable ’@DimCustomer_test’.
  如果我们对上面的查询进行更改,对查询使用别名(并且找开IO):
  -----in the follow script,we used the table alias.
  DECLARE @DimCustomer_test TABLE
  (
  [CustomerKey] [int]
  , [FirstName] [nvarchar](50)
  ,[MiddleName] [nvarchar](50)
  ,[LastName] [nvarchar](50)
  )
  INSERT @DimCustomer_test
  (
  [CustomerKey]
  , [FirstName]
  ,[MiddleName]
  ,[LastName]
  )
  SELECT
  [CustomerKey]
  , [FirstName]
  ,[MiddleName]
  ,[LastName]
  FROM DimCustomer
  SELECT t.CustomerKey,f.OrderQuantity
  FROM @DimCustomer_test t INNER JOIN FactInternetSales f ON
  t.CustomerKey = f.CustomerKey
  where t.CustomerKey=13513
  表变量在批处理结束时自动被系统删除,所以你不必要像使用临时表表一样显示的对它进行删除.
  ----------------------------------------
  另外在今天帮同事Tuning SQL 脚本地时候,发现对于大数据量表的查询(10w-100W),用变量的方式比用select 的方式居然执行时间减少了100倍!!似懂非懂,但从来没有想到差别如此大,惊讶ing,记录一笔,研究一下
  M1:
  declare @tempID int

  set @tempID =(select lots_id from qs_notes where>
  select * from ls_Qs_notes where>  ---返回记录998,行执行时间6589
  M2:

  select * from ls_Qs_notes where>  ---返回记录998 ,行执行时间60


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623063-1-1.html 上篇帖子: 用SQL SERVER 2005发送特定背景的HTML电子邮件 下篇帖子: MS SQL Server 2000安装不成功的原因
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表