Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Tabella definita dall'utente in memoria, non in memoria?

Vedo anche questo.

Quando RCSI è abilitato, le transazioni di commit automatico al livello di commit di lettura predefinito funzionano correttamente quando si uniscono due istanze del tipo di tabella in 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 

Anche l'unione di due diverse tabelle ottimizzate per la memoria "normali" funziona bene senza alcun suggerimento.

Inoltre, l'unione di un tipo di tabella ottimizzata per la memoria vuota a una normale tabella ottimizzata per la memoria funziona correttamente.

DECLARE @t [dbo].[tType];

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

Ma non è vero il contrario. Finché l'istanza del tipo di tabella in memoria contiene almeno una riga, l'unione a una tabella in memoria (vuota o meno) genera l'errore.

La soluzione è semplice ed è indicata nel messaggio di errore. Basta aggiungere il suggerimento tabella 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

Oppure una soluzione meno granulare è

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

Per quanto ne so, nessuno di questi cambia effettivamente la semantica e la possibilità di omettere il suggerimento in alcune circostanze è solo una comodità di programmazione.

Non sono sicuro del motivo per cui questo mix di diversi tipi di tabelle di memoria causa questo particolare messaggio di errore. Presumo che sia solo un artefatto di essere un CTP e che in RTM o la combinazione sarà consentita o il messaggio di errore e la documentazione verranno aggiornati per fare riferimento non solo alle tabelle basate su disco.