sql >> Database >  >> RDS >> Sqlserver

Door de gebruiker gedefinieerde tabel in het geheugen, niet in het geheugen?

Ik zie dit ook.

Als RCSI is ingeschakeld, werken automatische vastleggingstransacties op het standaard leescommit-niveau prima wanneer twee instanties van het in-geheugentabeltype worden samengevoegd.

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 

Ook het samenvoegen van twee verschillende "normale" geheugen-geoptimaliseerde tabellen werkt prima zonder enige hints.

Bovendien werkt het samenvoegen van een leeg, voor geheugen geoptimaliseerd tabeltype aan een normale voor geheugen geoptimaliseerde tabel prima.

DECLARE @t [dbo].[tType];

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

Maar het omgekeerde is niet waar. Zolang de instantie van het type tabel in het geheugen ten minste één rij bevat, wordt de fout veroorzaakt door deze samen te voegen met een (lege of andere) tabel in het geheugen.

De oplossing is eenvoudig en wordt aangegeven in de foutmelding. Voeg gewoon de tabelhint toe 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

Of een minder gedetailleerde oplossing is

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

Voor zover ik kan achterhalen, verandert geen van beide de semantiek en de mogelijkheid om de hint in sommige omstandigheden weg te laten is slechts een programmeergemak.

Ik weet niet zeker waarom deze mix van verschillende typen geheugentabel deze specifieke foutmelding veroorzaakt. Ik neem aan dat het slechts een artefact is van het zijn van een CTP en dat bij RTM de combinatie wordt toegestaan ​​of dat de foutmelding en documentatie worden bijgewerkt om niet alleen naar schijfgebaseerde tabellen te verwijzen.



  1. Entity Framework 6 met Npgsql

  2. Node.js kan niet verifiëren bij MySQL 8.0

  3. Kan ik UTILS gebruiken in Oracle?

  4. Onbedoelde bijwerkingen - Slaapsessies die sloten vasthouden