临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。
临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。
例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该 表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。
临时表
临时表存储在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
表变量在批处理结束时自动被系统删除,所以你不必要像使用临时表表一样显示的对它进行删除.
表变量主要开销系统的内存,而临时表则使用tempdb。对于小数据量的中间数据存储,可以使用表变量,而当需要临时保存的数据量很庞大时,建议使用临时表。具体使用表变量还是临时表,可以根据系统的运行状况来调整。
====================================================
例如,如果创建名为 employees 的表,则任何人只要在数据库中有使用该表的安全权限就可以使用该表,除非它已删除。如果创建名为 #employees 的本地临时表,只有您能对该表执行操作且在断开连接时该表删除。如果创建名为 ##employees 的全局临时表,数据表中的任何用户均可对该表执行操作。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果该表在您创建后有其他用户使 用,则 SQL Server在所有用户断开连接后删除该表。
=====================================================
非索引视图只是一个定义, 不存储数据, 查询的时候才从基础表拿数据
索引视图会存储数据
索引视图和临时表的数据都存储在硬盘
其中索引视图的数据存储在视图所在的数据库文件中
临时表的数据存储在tempdb这个数据库文件中
本文来自博商网(wwwBS.NET):http://wwwbs.net/blog/articleview.aspx?user=admin&artid=11633
相关推荐
在SQL Server中,表变量和临时表都是用来存储数据的临时结构,但它们在使用上存在显著的区别。本文将详细探讨这两个概念。 首先,我们来看看表变量。表变量是在SQL Server 2000中引入的新特性,它允许在批处理语句...
本篇文章将重点探讨如何通过创建临时表来遍历并更新数据,以避免使用游标带来的性能损耗和复杂性。 首先,游标虽然直观,但其缺点在于代码繁琐,需要声明、打开、使用、关闭和释放游标,这不仅增加了编程工作量,...
### SQLServer基础篇知识点梳理 ...以上是对“SQLServer基础篇”文章中提到的主要知识点的详细梳理。从SQL Server的基本概念、发展历程到具体的表管理、T-SQL操作、数据库对象等各个方面进行了全面的介绍。
这篇文章主要介绍了如何利用SQL Server的内置函数和存储过程来实现这一目标。 首先,SQL Server提供了两种主要的方法来处理XML数据:`OPENXML`和`OPENROWSET`。`OPENXML`是一个返回行集的函数,允许你对XML数据执行...
在本篇中,我们将深入探讨临时表的概念、类型以及在SQL Server 2005中的使用方法。 首先,临时表分为两种类型:局部临时表(Local Temporary Tables)和全局临时表(Global Temporary Tables)。局部临时表以单个井...
此外,还可以使用临时表和表变量在存储过程中暂存数据,提高处理效率。在优化方面,合理使用存储过程可以减少网络流量,但过度依赖存储过程也可能导致性能问题,因此需要根据实际情况权衡。 对于触发器,要特别注意...
本篇文章将详细介绍如何利用SQL Server自定义函数实现字符串拆分并转化为表格形式的功能。 #### 核心知识点 1. **自定义函数(User Defined Function, UDF)**: - 在SQL Server中,可以通过创建自定义函数来执行...
这表明文章旨在介绍一个用于检测SQL Server环境中发生的死锁现象的自定义存储过程。 #### 标签解读 标签“SQL死锁”进一步强调了本文将专注于SQL Server中的死锁问题。 #### 存储过程代码详解 下面我们将详细...
这篇论文集包含了一系列关于SQL语句查询优化的专业文献,对于数据库管理员、开发者以及对数据库性能优化感兴趣的学生来说,都是宝贵的资源。 1. **基础概念**: - **SQL查询**:SQL(Structured Query Language)...
本篇文章将深入探讨T-SQL查询在SQL Server 2005中的应用,以"sqlserver2005 技术内幕:T-SQL查询第一章"为引,带你走进T-SQL的世界。 ### 1. T-SQL基础 T-SQL是SQL的扩展,它是SQL Server的标准查询语言,包含了...
本篇文章将深入探讨SQL Server中的存储过程及其高级应用。 首先,存储过程可以接受输入参数,这些参数允许我们根据不同的值来动态执行不同的SQL操作。例如,我们可以创建一个名为`usp_GetEmployeeDetails`的存储...
这种方法在SQL Server 2005及更高版本中被引入,性能通常较好,因为它避免了对整个结果集的排序和临时表的创建。 2. **游标方法**: 游标是另一种实现分页的方式,通过遍历数据并逐行处理来获取特定范围的行。然而...
总的来说,对于SQL Server的批量插入和更新,应尽量避免游标,优先考虑使用T-SQL的集合理论功能,如批处理、表变量或临时表,以及内置的聚合函数。这些方法能显著提高性能,尤其是在处理大量数据时。在设计数据库...
本篇文章将深入探讨SQL Server中的全局变量以及它们在Transact-SQL中的应用。 1. **@@DATEFIRST**: 这个变量表示一周的第一天,其默认值通常是7,代表星期日。可以使用SET DATEFIRST语句更改此设置,以适应不同的...
- 临时表和表变量可以提高存储过程的执行效率,但需要注意资源占用。 **8. 注意子查询的用法** - 合理使用子查询可以简化存储过程的逻辑,但过多使用会降低性能。 **9. 常用写法** - **9.1 XML解析**:使用XQuery...
然后,你可以插入一个临时表并执行`ipconfig`: ``` create table #temp(ipline varchar(200)) insert #temp exec master..xp_cmdshell'ipconfig' ``` 接着,从结果中筛选出IPv4地址并提取IP: ``` declare ...
- SQL Server 示例展示了创建存储过程,声明游标,将数据复制到临时表,进行条件判断和数据清理的过程。 - Oracle 的例子则展示了如何在一个事务中处理数据,通过 SQL%NOTFOUND 来决定是否执行删除操作。 7. 连接...
SQL Server 提供了多种实现分页的方法,包括使用临时表、变量、子查询等技术。其中,利用存储过程进行分阅处理是一种较为高效且灵活的方式。 本篇将详细介绍一个基于 SQL Server 的分页存储过程,通过分析其结构与...
为了实现这一目标,作者采用了一种特定的系统结构,其中包括Datalog规则分析器、查询优化器以及变量、记录集和临时表的定义等组件。这些组件协同工作,形成了一条从逻辑规则输入到SQL语句生成的处理流程。分析器负责...