Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Benutzerdefinierte In-Memory-Tabelle, nicht im Speicher?

Ich sehe das auch.

Wenn RCSI aktiviert ist, funktionieren Auto-Commit-Transaktionen auf der standardmäßigen Lese-Committed-Ebene einwandfrei, wenn zwei Instanzen des Tabellentyps im Speicher zusammengeführt werden.

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 

Auch das Verbinden von zwei verschiedenen "normalen" speicheroptimierten Tabellen funktioniert ohne Hinweise.

Zusätzlich funktioniert das Verbinden eines leeren speicheroptimierten Tabellentyps mit einer normalen speicheroptimierten Tabelle einwandfrei.

DECLARE @t [dbo].[tType];

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

Aber das Gegenteil ist nicht wahr. Solange die In-Memory-Tabellentypinstanz mindestens eine Zeile enthält, löst das Verbinden mit einer (leeren oder anderen) In-Memory-Tabelle den Fehler aus.

Die Lösung ist einfach und wird in der Fehlermeldung angezeigt. Fügen Sie einfach den Tabellenhinweis WITH (SNAPSHOT) hinzu

DECLARE @t [dbo].[tType]

INSERT INTO @t
VALUES     (1)

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

Oder eine weniger granulare Lösung ist

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

Soweit ich das beurteilen kann, ändert keines davon tatsächlich die Semantik, und die Möglichkeit, den Hinweis unter bestimmten Umständen wegzulassen, ist nur eine Programmiererleichterung.

Ich bin mir nicht sicher, warum diese Mischung aus verschiedenen Speichertabellentypen diese spezielle Fehlermeldung verursacht. Ich nehme an, es ist nur ein Artefakt, ein CTP zu sein, und dass bei RTM entweder die Kombination erlaubt sein wird oder die Fehlermeldung und Dokumentation aktualisiert werden, um sich nicht nur auf plattenbasierte Tabellen zu beziehen.