Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Trong bộ nhớ do người dùng xác định bảng, không có trong bộ nhớ?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách trừ 30 ngày từ ngày hiện tại bằng SQL Server

  2. Ý nghĩa của khóa ngoại tự tham chiếu là gì?

  3. Cách nhanh nhất để sao chép hàng trong SQL

  4. Sự khác biệt giữa Chỉ mục theo cụm và Chỉ mục duy nhất là gì?

  5. Làm thế nào để xóa dữ liệu lớn của bảng trong SQL mà không có nhật ký?