sql >> Base de Datos >  >> RDS >> Sqlserver

Tabla definida por el usuario en memoria, ¿no en la memoria?

Veo esto también.

Cuando RCSI está habilitado, las transacciones de compromiso automático en el nivel de compromiso de lectura predeterminado funcionan bien cuando se unen dos instancias del tipo de tabla en memoria.

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 

También unir dos tablas optimizadas para memoria "normales" diferentes funciona bien sin ninguna sugerencia.

Además, unir un tipo de tabla vacía optimizada para memoria a una tabla normal optimizada para memoria funciona bien.

DECLARE @t [dbo].[tType];

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

Pero lo contrario no es cierto. Siempre que la instancia del tipo de tabla en memoria contenga al menos una fila, unirla a una tabla en memoria (vacía o no) genera el error.

La solución es simple y se indica en el mensaje de error. Simplemente agregue la sugerencia de tabla 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

O una solución menos granular es

ALTER DATABASE [MemOptimized] 
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON WITH ROLLBACK IMMEDIATE 

Por lo que puedo deducir, ninguno de estos cambia realmente la semántica y la capacidad de omitir la pista en algunas circunstancias es solo una conveniencia de programación.

No estoy seguro de por qué esta combinación de diferentes tipos de tablas de memoria provoca este mensaje de error en particular. Supongo que es solo un artefacto de ser un CTP y que en RTM se permitirá la combinación o se actualizará el mensaje de error y la documentación para hacer referencia no solo a las tablas basadas en disco.