Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Table définie par l'utilisateur en mémoire, pas en mémoire ?

Je vois ça aussi.

Lorsque RCSI est activé, les transactions de validation automatique au niveau de lecture validé par défaut fonctionnent correctement lors de la réunion de deux instances du type de table en mémoire.

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 

Joindre également deux tables optimisées en mémoire "normales" différentes fonctionne bien sans aucun indice.

De plus, joindre un type de table optimisée en mémoire vide à une table optimisée en mémoire normale fonctionne correctement.

DECLARE @t [dbo].[tType];

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

Mais l'inverse n'est pas vrai. Tant que l'instance de type de table en mémoire contient au moins une ligne, la joindre à une table en mémoire (vide ou autre) génère l'erreur.

La solution est simple et est indiquée dans le message d'erreur. Ajoutez simplement l'indicateur de tableau 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 une solution moins granulaire est

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

Pour autant que je sache, aucun de ces éléments ne modifie réellement la sémantique et la possibilité d'omettre l'indice dans certaines circonstances n'est qu'une commodité de programmation.

Je ne sais pas pourquoi ce mélange de différents types de tables en mémoire provoque ce message d'erreur particulier. Je suppose que c'est juste un artefact d'être un CTP et que chez RTM, soit la combinaison sera autorisée, soit le message d'erreur et la documentation seront mis à jour pour ne pas se référer uniquement aux tables sur disque.