Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Tabela definida pelo usuário na memória, não na memória?


Eu vejo isso também.

Quando o RCSI está habilitado, as transações de confirmação automática no nível de confirmação de leitura padrão funcionam bem ao unir duas instâncias do tipo de tabela na memória.
DECLARE @t1 [dbo].[tType]
DECLARE @t2 [dbo].[tType]

INSERT INTO @t1 VALUES (1);

INSERT INTO @t2 VALUES (1);

SELECT *
FROM   @t1
       JOIN @t2
         ON [@t1].C = [@t2].C 

Também juntar duas tabelas diferentes com otimização de memória "normal" funciona bem sem nenhuma dica.

Além disso, unir um tipo de tabela com otimização de memória vazia a uma tabela com otimização de memória normal funciona bem.
DECLARE @t [dbo].[tType];

SELECT *
FROM   [dbo].[tTable] t
        INNER JOIN @t
            ON [@t].C = t.C 

Mas o inverso não é verdadeiro. Contanto que a instância do tipo de tabela na memória contenha pelo menos uma linha, juntá-la a uma (vazia ou não) na tabela de memória gera o erro.

A solução é simples e é indicada na mensagem de erro. Basta adicionar a dica de tabela WITH (SNAPSHOT)
DECLARE @t [dbo].[tType]

INSERT INTO @t
VALUES     (1)

SELECT *
FROM   [dbo].[tTable] t WITH(SNAPSHOT)
       INNER JOIN @t
         ON [@t].C = t.C

Ou uma solução menos granular é
ALTER DATABASE [MemOptimized] 
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON WITH ROLLBACK IMMEDIATE 

Tanto quanto eu posso reunir, nenhum deles realmente altera a semântica e a capacidade de omitir a dica em algumas circunstâncias é apenas uma conveniência de programação.

Não sei por que essa mistura de diferentes tipos de tabela de memória causa essa mensagem de erro específica. Presumo que seja apenas um artefato de ser um CTP e que no RTM a combinação será permitida ou a mensagem de erro e a documentação serão atualizadas para se referir não apenas às tabelas baseadas em disco.