MS-SQL是否支持内存表?

时间:2020-03-05 18:43:15  来源:igfitidea点击:

最近,我开始更改某些应用程序以支持" MS SQL Server"作为备用后端。

我遇到的兼容性问题之一是使用MySQL的CREATE TEMPORARY TABLE创建内存中的表,该表可保存数据以在会话期间进行非常快速的访问,而无需永久存储。

MS SQL中的等效功能是什么?

要求是我必须能够像使用其他任何临时表一样使用临时表,尤其是将其与永久表一起使用。

解决方案

回答

创建表#tmptablename

使用井号/井号前缀

回答

我们可以在SQL Server 2005中声明"表变量",如下所示:

declare @foo table (
    Id int,
    Name varchar(100)
);

然后,我们就像引用变量一样引用它:

select * from @foo f
    join bar b on b.Id = f.Id

无需删除它,当变量超出范围时它就会消失。

回答

我们想要的语法是:

创建表#tablename

前缀将表标识为临时表。

回答

一篇不错的博客文章,但基本上在本地临时表前面加上#eg并在全局临时前面加上#eg

CREATE TABLE #localtemp

回答

我们可以创建表变量(在内存中)以及两种不同类型的临时表:

--visible only to me, in memory (SQL 2000 and above only)
declare @test table (
    Field1 int,
    Field2 nvarchar(50)
);

--visible only to me, stored in tempDB
create table #test (
    Field1 int,
    Field2 nvarchar(50)
)

--visible to everyone, stored in tempDB
create table ##test (
    Field1 int,
    Field2 nvarchar(50)
)

编辑:

根据反馈,我认为这需要澄清一下。

#table和#table将始终位于TempDB中。

@Table变量通常会在内存中,但不能保证是。 SQL根据查询计划进行决策,并在需要时使用TempDB。

回答

@基思

这是一个常见的误解:表变量不一定存储在内存中。实际上,SQL Server决定是将变量保留在内存中还是将其溢出到TempDB。没有可靠的方法(至少在SQL Server 2005中)确保表数据保留在内存中。有关更多详细信息,请点击此处

回答

我了解我们要达到的目标。欢迎来到各种数据库的世界!

SQL Server 2000支持通过以下方式创建的临时表:为表名加上前缀a,使其成为本地可访问的临时表(会话本地),并在表名之前#分别用于全局访问的临时表,例如#MyLocalTable和## MyGlobalTable。

SQL Server 2005及更高版本同时支持临时表(本地,全局)和表变量,请注意SQL 2008中表变量的新功能,并发布两个!临时表和表变量之间的区别不是很大,而在于数据库服务器处理它们的方式。

我不想谈论像7、6之类的SQL Server的旧版本,尽管我已经与他们合作了,但无论如何我都是从这里来的:-)

通常认为表变量始终驻留在内存中,但这是错误的。根据内存使用情况和事务的数据库服务器量,表变量的页面可能会从内存中导出并写入tempdb中,其余处理则在此进行(在tempdb中)。

请注意,tempdb是实例上的数据库,该实例本质上没有永久对象,但它负责处理涉及诸如分类之类的副事务的工作负载以及其他本质上是临时的处理工作。另一方面,表变量(通常具有较小的数据)保留在内存(RAM)中,从而使它们可以更快地访问,因此与临时表相比,使用临时表时,使用临时数据驱动器时,使用tempdb驱动器的磁盘IO更少登录tempdb。

在数据量很大的情况下,不能对表变量建立索引,而可以对临时表(本地表和全局表)建立索引,以加快处理速度。因此,我们知道在通过临时事务更快处理更大数据量的情况下的选择。还值得注意的是,仅表变量上的事务不会被记录并且无法回滚,而在临时表上完成的事务可以被回滚!

总而言之,表变量更适合较小的数据,而临时表更适合临时处理的较大数据。如果还希望使用事务块进行适当的事务控制,则表变量不是回滚事务的选项,因此在这种情况下,最好使用临时表。

最后,临时表将始终增加磁盘IO,因为它们始终使用tempdb,而表变量可能不会增加它,具体取决于内存压力级别。

让我知道是否需要有关如何调整tempdb以获得高于100%的更快性能的提示!