Pergunta

Recentemente, comecei a alterar alguns de nossos aplicativos para oferecer suporte MS SQL Server como um back-end alternativo.

Um dos problemas de compatibilidade que encontrei é o uso do CREATE TEMPORARY TABLE do MySQL para criar tabelas na memória que armazenam dados para acesso muito rápido durante uma sessão, sem necessidade de armazenamento permanente.

Qual é o equivalente no MS SQL?

Um requisito é que eu possa usar a tabela temporária como qualquer outra, especialmente JOIN isso com os permanentes.

Foi útil?

Solução

@Keith

Este é um equívoco comum:Variáveis ​​de tabela NÃO são necessariamente armazenadas na memória.Na verdade, o SQL Server decide se deve manter a variável na memória ou despejá-la no TempDB.Não existe uma maneira confiável (pelo menos no SQL Server 2005) de garantir que os dados da tabela sejam mantidos na memória.Para informações mais detalhadas veja aqui

Outras dicas

Você pode criar variáveis ​​de tabela (na memória) e dois tipos diferentes de tabela temporária:

--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)
)

Editar:

Após o feedback, acho que isso precisa de um pequeno esclarecimento.

#table e ##table sempre estará em TempDB.

@Table as variáveis ​​normalmente estarão na memória, mas não é garantido que estejam.O SQL decide com base no plano de consulta e usa TempDB se necessário.

Você pode declarar uma "variável de tabela" no SQL Server 2005, assim:

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

Você então se refere a ele como uma variável:

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

Não há necessidade de abandoná-lo - ele desaparece quando a variável sai do escopo.

É possível com o MS SQL Server 2014.

Ver: http://msdn.microsoft.com/en-us/library/dn133079.aspx

Aqui está um exemplo de código de geração SQL (do MSDN):

-- create a database with a memory-optimized filegroup and a container.
CREATE DATABASE imoltp 
GO

ALTER DATABASE imoltp ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA 
ALTER DATABASE imoltp ADD FILE (name='imoltp_mod1', filename='c:\data\imoltp_mod1') TO FILEGROUP imoltp_mod 
ALTER DATABASE imoltp SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
GO

USE imoltp
GO


-- create a durable (data will be persisted) memory-optimized table
-- two of the columns are indexed
CREATE TABLE dbo.ShoppingCart ( 
  ShoppingCartId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
  UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), 
  CreatedDate DATETIME2 NOT NULL, 
  TotalPrice MONEY
  ) WITH (MEMORY_OPTIMIZED=ON) 
GO

 -- create a non-durable table. Data will not be persisted, data loss if the server turns off unexpectedly
CREATE TABLE dbo.UserSession ( 
  SessionId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=400000), 
  UserId int NOT NULL, 
  CreatedDate DATETIME2 NOT NULL,
  ShoppingCartId INT,
  INDEX ix_UserId NONCLUSTERED HASH (UserId) WITH (BUCKET_COUNT=400000) 
  ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) 
GO

Um bem postagem do blog aqui mas basicamente prefixe tabelas temporárias locais com # e temperatura global com ## - por exemplo

CREATE TABLE #localtemp

Eu entendo o que você está tentando alcançar.Bem-vindo ao mundo dos diversos bancos de dados!

O SQL Server 2000 oferece suporte a tabelas temporárias criadas prefixando um # ao nome da tabela, tornando-a uma tabela temporária acessível localmente (local para a sessão) e precedendo ## ao nome da tabela, para tabelas temporárias acessíveis globalmente, por exemplo, #MyLocalTable e ##MyGlobalTable respectivamente.

O SQL Server 2005 e superior suportam tabelas temporárias (locais, globais) e variáveis ​​de tabela - fique atento às novas funcionalidades em variáveis ​​de tabela no SQL 2008 e na versão dois!A diferença entre tabelas temporárias e variáveis ​​de tabela não é tão grande, mas está na forma como o servidor de banco de dados as trata.

Eu não gostaria de falar sobre versões mais antigas do SQL Server como 7, 6, embora tenha trabalhado com eles e seja de onde vim de qualquer maneira :-)

É comum pensar que variáveis ​​de tabela sempre residem na memória, mas isso está errado.Dependendo do uso da memória e do volume de transações do servidor de banco de dados, as páginas de uma variável de tabela podem ser exportadas da memória e gravadas em tempdb e o restante do processamento ocorre lá (em tempdb).

Observe que tempdb é um banco de dados em uma instância sem objetos permanentes por natureza, mas é responsável por lidar com cargas de trabalho que envolvem transações paralelas, como classificação e outros trabalhos de processamento de natureza temporária.Por outro lado, variáveis ​​de tabela (geralmente com dados menores) são mantidas na memória (RAM), tornando seu acesso mais rápido e, portanto, menos IO de disco em termos de uso da unidade tempdb ao usar variáveis ​​de tabela com dados menores em comparação com tabelas temporárias que sempre faça login em tempdb.

Variáveis ​​de tabela não podem ser indexadas enquanto tabelas temporárias (locais e globais) podem ser indexadas para processamento mais rápido caso a quantidade de dados seja grande.Assim você sabe qual é a sua escolha no caso de processamento mais rápido com maiores volumes de dados por meio de transações temporárias.Também vale a pena notar que as transações apenas nas variáveis ​​da tabela não são registradas e não podem ser revertidas, enquanto aquelas feitas em tabelas temporárias podem ser revertidas!

Em resumo, as variáveis ​​de tabela são melhores para dados menores, enquanto as tabelas temporárias são melhores para dados maiores sendo processados ​​temporariamente.Se você também deseja um controle de transação adequado usando blocos de transação, variáveis ​​de tabela não são uma opção para reverter transações, então é melhor usar tabelas temporárias neste caso.

Por último, as tabelas temporárias sempre aumentarão o IO do disco, pois sempre usam tempdb, enquanto as variáveis ​​da tabela podem não aumentá-lo, dependendo dos níveis de estresse da memória.

Deixe-me saber se você quiser dicas sobre como ajustar seu tempdb para obter um desempenho muito mais rápido e ultrapassar 100%!

A sintaxe que você deseja é:

criar tabela #tablename

O prefixo # identifica a tabela como uma tabela temporária.

CRIAR TABELA #tmptablename

Use o prefixo de hash/sinal de cerquilha

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top