在数据操作过程中,经常会用到临时表,如果是在存储过程中,可以使用性能更高的内存表来解决
DECLARE @T TABLE(C1 INT,C2 INT)
内存表可以理解为是一个内存变量,只在内存中定义,性能更好,但如果数据量过大则不适合使用,因为会占用过多的服务器操作系统内存资源。
而在客户端,临时表则更容易使用,可以处理较大的数据量,因为临时表是物理存在的,创建于SQLSERVER的tempdb数据库中,性能上比内存表要差一些,因为对临时表的操作要占用磁盘IO。
临时表的表示方式有两种:#表名(本地临时表),或##表名(全局临时表)。本地临时表只对于创建者是可见,当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。
为了提高性能,我们会在临时表上增加主键约束
CREATE TABLE #T(
C1 INT NOT NULL,
C2 INT,
constraint PK_#T primary key (C1)
)
结果如下

可以发现临时表的表名由系统增加了后缀,而主键名称则是用户显式指定的名称。这种方式适合创建全局临时表,但用于本地临时表时会产生并发性错误,因为该命令显式的指定了CONSTRAINT名称,而在SQLSERVER中所有的对象名称都必须是唯一的,所以当A进程创建了该临时表,对象PK_#T就已经存在了,此时B进程再使用该命令创建临时表时,就会提示:数据库中已存在名为‘PK_#T’的对象。
要解决这个问题可以换种CREATE语法来创建临时表
CREATE TABLE #T(
C1 INT NOT NULL PRIMARY KEY,
C2 INT NOT NULL,
C3 VARCHAR(10) NULL
)
如果要创建多字段联合主键,可以使用下面的方法
CREATE TABLE #T(
C1 INT NOT NULL PRIMARY KEY,
C2 INT NOT NULL,
C3 VARCHAR(10) NULL
)
go
ALTER TABLE #t ADD PRIMARY KEY (C1,C2)
go
这种方式创建的临时表结果如下

可以看出表和主键在系统中的名称都由SQLSERVER添加了后缀,以保证多进程之间不会发生重复。
本文详细解析了SQL Server中临时表与内存表的使用场景与区别,包括性能对比、创建方法及主键约束的应用技巧。了解如何根据数据量选择合适的表类型,掌握避免并发错误的创建语法。
260

被折叠的 条评论
为什么被折叠?



