In-Memory benutzerdefinierte Tabelle, nicht im Speicher?

8

Ich benutze SQL Server 2014 CTP2, mit READ_COMMITTED_SNAPSHOT ON (ich denke, es ist wichtig für die Frage).

Ich habe einen In-Memory-Tabellentyp erstellt (sehr ähnlich dem Beispiel des Technet-Blogs SQL Server 2014 im Speicher OLTP: Speicher-optimierte Tabellenarten und Tabellenvariablen ) und Ich habe mehrere In-Memory-Tabellen.

In der Abfrage selbst habe ich eine Verknüpfung zwischen den regulären In-Memory-Tabellen und dem In-Memory-Tabellentyp, der als Filter fungiert. Wenn ich die Abfrage ausführe, erhalte ich folgende Fehlermeldung: "Eine Abfrage, die auf speicheroptimierte Tabellen zugreift Bei Verwendung der READ COMMITTED-Isolationsstufe kann nicht auf plattenbasierte Tabellen zugegriffen werden, wenn die Datenbankoption READ_COMMITTED_SNAPSHOT auf ON gesetzt ist. Stellen Sie eine unterstützte Isolationsstufe für die speicheroptimierte Tabelle mithilfe eines Tabellenhinweises wie WITH (SNAPSHOT) bereit. "

Ich entferne READ_COMMITTED_SNAPSHOT ON, während ich diese Frage schreibe, aber die Frage bleibt, ob ich einen In-Memory-Datentyp erstellt habe, und dieser spezielle Typ wird "niemals auf die Festplatte übertragen", wie der Blog sagt Warum "sieht" der Server eine "Plattentabelle"?

Um die Dinge zu klären, habe ich versucht, den Join mit nur In-Mem-Tabellen zu machen, und es funktioniert, sobald der Tabellentyp kam, habe ich den Fehler bekommen.

Update : wenn ich READ_COMMITTED_SNAPSHOT entfernt habe (jetzt ist es aus) funktioniert die Abfrage, aber jetzt habe ich Multi-Version / keine Sperre / Geschwindigkeit verloren, ich würde gerne eine andere Lösung hören.

Danke

Zu reproduzierende Schritte.

Erstellen Sie eine Datenbank mit einer speicheroptimierten Dateigruppe

%Vor%

Erstellen Sie einige Objekte

%Vor%

Folgendes funktioniert ohne Fehler

%Vor%

Aber das

%Vor%

Gibt den oben beschriebenen Fehler

  

Nachricht 41359, Ebene 16, Status 0, Prozedur P, Zeile 62 Eine Abfrage, die   greift auf speicheroptimierte Tabellen mit der READ COMMITTED-Isolation zu   level, kann nicht auf datenträgerbasierte Tabellen zugreifen, wenn die Datenbankoption aktiviert ist   READ_COMMITTED_SNAPSHOT ist auf ON gesetzt. Stellen Sie eine unterstützte Isolierung bereit   level für die speicheroptimierte Tabelle mit einem Tabellenhinweis wie WITH   (SNAPSHOT).

    
Avishai.M 02.02.2014, 07:34
quelle

2 Antworten

8

Ich sehe das auch.

Wenn RCSI aktiviert ist, funktionieren automatische Festschreibungstransaktionen auf der schreibgeschützten Standardleseebene einwandfrei, wenn zwei Instanzen des In-Memory-Tabellentyps zusammengefügt werden.

%Vor%

Auch die Verknüpfung von zwei verschiedenen "normalen" speicheroptimierten Tabellen funktioniert problemlos ohne Hinweise.

Das Hinzufügen eines leeren speicheroptimierten Tabellentyps zu einer normalen speicheroptimierten Tabelle funktioniert problemlos.

%Vor%

Aber das Gegenteil ist nicht wahr. Solange die In-Memory-Tabellen-Typ-Instanz mindestens eine Zeile enthält, wird der Fehler durch die Verknüpfung mit einer (leeren oder anderen) Speicher-Tabelle ausgelöst.

  

Eine Abfrage, die mithilfe von READ COMMITTED auf speicheroptimierte Tabellen zugreift   Isolationsstufe, kann nicht auf plattenbasierte Tabellen zugreifen, wenn die Datenbank   Option READ_COMMITTED_SNAPSHOT ist auf ON gesetzt. Stellen Sie eine Unterstützung bereit   Isolationsstufe für die speicheroptimierte Tabelle unter Verwendung eines Tabellenhinweises,   wie WITH (SNAPSHOT).

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

hinzu %Vor%

Oder eine weniger granulare Lösung ist

%Vor%
  

wird die Isolationsstufe für speicheroptimierte Tabellen festlegen    SNAPSHOT (als ob du WITH(SNAPSHOT) Hinweise zu jedem eingefügt hättest   speicheroptimierte Tabelle) Quelle

Soweit ich feststellen kann, ändert keiner von beiden tatsächlich die Semantik, und die Möglichkeit, den Hinweis unter bestimmten Umständen wegzulassen, ist nur eine Programmierfreundlichkeit.

  

Bei Autocommit-Transaktionen ist die Isolationsstufe READ COMMITTED   implizit auf SNAPSHOT für speicheroptimierte Tabellen abgebildet. Deshalb,   Wenn die Einstellung TRANSACTION ISOLATION LEVEL session auf READ COMMITTED festgelegt ist, muss die Isolationsstufe nicht angegeben werden   Ein Tabellenhinweis beim Zugriff auf speicheroptimierte Tabellen. Quelle

     

Die Isolationsstufe READ COMMITTED wird für Speicheroptimierungen unterstützt   Tabellen mit Autocommit-Transaktionen. READ COMMITTED wird nicht unterstützt   mit expliziten oder impliziten Benutzertransaktionen. Isolationsstufe    READ_COMMITTED_SNAPSHOT wird für speicheroptimierte Tabellen mit unterstützt   Autocommit-Transaktionen und nur dann, wenn auf die Abfrage nicht zugegriffen wird   plattenbasierte Tabellen. Quelle

Ich bin mir nicht sicher, warum diese Mischung verschiedener Typen von Speichertabellen diese spezielle Fehlermeldung verursacht. Ich nehme an, es ist nur ein Artefakt, ein CTP zu sein, und bei RTM wird entweder die Kombination erlaubt oder die Fehlermeldung und die Dokumentation werden aktualisiert, um nicht nur auf plattenbasierte Tabellen zu verweisen.

    
Martin Smith 06.02.2014, 00:06
quelle
5

Die Fehlermeldung, die Sie sehen, ist falsch. Wir haben die speicheroptimierte Tabellenvariable behandelt, als ob es sich um eine plattenbasierte Tabelle handelt. Das Problem wurde in SQL Server 2014 RTM CU1 behoben.

Beachten Sie, dass die Datenbankoption READ_COMMITTED_SNAPSHOT nicht für speicheroptimierte Tabellen gilt. Dies gilt nur für festplattenbasierte Tabellen. Speicheroptimierte Tabellen sind immer multi-versioniert.

    
Jos de Bruijn - MSFT 28.05.2014 22:41
quelle