Tôi cũng thấy điều này.
Khi RCSI được bật thì các giao dịch cam kết tự động ở mức cam kết đọc mặc định sẽ hoạt động tốt khi kết hợp hai trường hợp của loại bảng trong bộ nhớ với nhau.
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
Ngoài ra, việc kết hợp hai bảng được tối ưu hóa bộ nhớ "bình thường" khác nhau hoạt động tốt mà không có bất kỳ gợi ý nào.
Ngoài ra, việc kết hợp loại bảng được tối ưu hóa bộ nhớ trống vào một bảng được tối ưu hóa bộ nhớ thông thường hoạt động tốt.
DECLARE @t [dbo].[tType];
SELECT *
FROM [dbo].[tTable] t
INNER JOIN @t
ON [@t].C = t.C
Nhưng điều ngược lại là không đúng. Miễn là thể hiện loại bảng trong bộ nhớ chứa ít nhất một hàng thì việc nối nó với một (trống hoặc cách khác) trong bảng bộ nhớ sẽ làm tăng lỗi.
Giải pháp rất đơn giản và được chỉ ra trong thông báo lỗi. Chỉ cần thêm gợi ý bảng 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
Hoặc một giải pháp ít chi tiết hơn là
ALTER DATABASE [MemOptimized]
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON WITH ROLLBACK IMMEDIATE
Theo như tôi có thể thu thập được thì cả hai đều không thực sự thay đổi ngữ nghĩa và khả năng bỏ qua gợi ý trong một số trường hợp chỉ là một sự tiện lợi trong lập trình.
Tôi không chắc tại sao sự kết hợp khác nhau trong các loại bảng bộ nhớ này lại gây ra thông báo lỗi cụ thể này. Tôi cho rằng đó chỉ là một đồ tạo tác của việc trở thành một CTP và tại RTM, sự kết hợp sẽ được cho phép hoặc thông báo lỗi và tài liệu sẽ được cập nhật để không chỉ tham chiếu đến các bảng dựa trên đĩa.