sql >> Databáze >  >> RDS >> Sqlserver

Uživatelsky definovaná tabulka v paměti, není v paměti?

Vidím to také.

Když je povoleno RCSI, pak transakce automatického potvrzení na výchozí úrovni potvrzení pro čtení fungují dobře, když spojíte dvě instance typu tabulky v paměti.

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 

Také spojení dvou různých "normálních" tabulek s optimalizovanou pamětí funguje dobře bez jakýchkoli nápověd.

Navíc spojení prázdného typu tabulky s optimalizovanou pamětí k normální tabulce s optimalizovanou pamětí funguje dobře.

DECLARE @t [dbo].[tType];

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

Ale obráceně to neplatí. Pokud instance typu tabulky v paměti obsahuje alespoň jeden řádek, pak jeho připojení k (prázdné nebo jiné) tabulce v paměti způsobí chybu.

Řešení je jednoduché a je uvedeno v chybové zprávě. Stačí přidat nápovědu k tabulce 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

Nebo méně granulované řešení je

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

Pokud mohu shromáždit, ani jedna z nich ve skutečnosti nemění sémantiku a možnost vynechat nápovědu za určitých okolností je jen pohodlí při programování.

Nejsem si jistý, proč tato kombinace různých typů tabulek paměti způsobuje tuto konkrétní chybovou zprávu. Předpokládám, že je to jen artefakt CTP a že v RTM bude buď kombinace povolena, nebo chybová zpráva a dokumentace budou aktualizovány tak, aby odkazovaly nejen na tabulky založené na disku.



  1. Jak extrahujete číselnou hodnotu z řetězce v dotazu MySQL?

  2. Migrace Rails + Postgres – proč se mi zobrazuje chyba PG::UndefinedFunction:ERROR:funkce gen_random_uuid() neexistuje?

  3. Problémy s řetězením

  4. XPath1 v SQL/XML, count elements vrací prázdné