Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Tabela zdefiniowana przez użytkownika w pamięci, a nie w pamięci?

Ja też to widzę.

Gdy RCSI jest włączony, transakcje automatycznego zatwierdzania na domyślnym poziomie odczytu z zatwierdzeniem działają dobrze, gdy łączysz ze sobą dwie instancje typu tabeli w pamięci.

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 

Również łączenie dwóch różnych "normalnych" tabel zoptymalizowanych pod kątem pamięci działa dobrze bez żadnych wskazówek.

Dodatkowo dołączenie pustego typu tabeli zoptymalizowanej pod kątem pamięci do normalnej tabeli zoptymalizowanej pod kątem pamięci działa dobrze.

DECLARE @t [dbo].[tType];

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

Ale nie jest odwrotnie. Dopóki instancja typu tabeli w pamięci zawiera co najmniej jeden wiersz, dołączenie go do (pustej lub innej) tabeli w pamięci powoduje wystąpienie błędu.

Rozwiązanie jest proste i wskazane w komunikacie o błędzie. Po prostu dodaj wskazówkę do tabeli 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

Lub mniej ziarniste rozwiązanie to

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

O ile wiem, żadna z tych rzeczy nie zmienia semantyki, a możliwość pominięcia podpowiedzi w niektórych okolicznościach jest tylko wygodą programowania.

Nie jestem pewien, dlaczego ta mieszanka różnych typów tabel pamięci powoduje ten konkretny komunikat o błędzie. Zakładam, że jest to tylko artefakt bycia CTP i że w RTM albo kombinacja będzie dozwolona, ​​albo komunikat o błędzie i dokumentacja zostaną zaktualizowane, aby odnosiły się nie tylko do tabel opartych na dyskach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL dla łańcucha rodzic-dziecko

  2. Potrzebujesz pomocy w dynamicznym zapytaniu z klauzulą ​​IN

  3. konwertuj funkcję ms-access last() na serwer sql 2008

  4. Zapytanie SQL do wyszukiwania schematu wszystkich tabel

  5. Tworzenie grup kolejnych dni spełniających zadane kryteria