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
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).
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)
Oder eine weniger granulare Lösung ist
%Vor%wird die Isolationsstufe für speicheroptimierte Tabellen festlegen
SNAPSHOT
(als ob duWITH(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 aufSNAPSHOT
für speicheroptimierte Tabellen abgebildet. Deshalb, Wenn die EinstellungTRANSACTION ISOLATION LEVEL
session aufREAD COMMITTED
festgelegt ist, muss die Isolationsstufe nicht angegeben werden Ein Tabellenhinweis beim Zugriff auf speicheroptimierte Tabellen. QuelleDie Isolationsstufe
READ COMMITTED
wird für Speicheroptimierungen unterstützt Tabellen mit Autocommit-Transaktionen.READ COMMITTED
wird nicht unterstützt mit expliziten oder impliziten Benutzertransaktionen. IsolationsstufeREAD_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.
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.
Tags und Links sql-server user-defined-types sql-server-2014 in-memory memory-optimized-tables