Hành vi không chính xác của SQL Server 2016 với các bảng được tối ưu hóa bộ nhớ


13

Vui lòng xem truy vấn SQL sau:

CREATE TYPE dbo.IN_MEMORY_TABLE_TYPE AS TABLE
(
  source_col INT NULL,
  target_col INT not NULL
  INDEX ix_InMemoryTable NONCLUSTERED (target_col)
)
WITH (MEMORY_OPTIMIZED = ON)
GO

DECLARE
  @t dbo.IN_MEMORY_TABLE_TYPE

INSERT @t
(
  source_col,
  target_col
)
VALUES
  (10, 0),
  (0, 0)

UPDATE r1
SET
  target_col = -1
FROM @t r1
WHERE EXISTS
      (
        SELECT *
        FROM @t r2
        WHERE r2.source_col > 0
      )

SELECT *
FROM @t

GO
DROP TYPE dbo.IN_MEMORY_TABLE_TYPE

Khi thực hiện nó trên SQL Server 2014 (12.0.4100.1 X64) UPDATE, truy vấn thực hiện như mong đợi và kết quả hợp lệ sau được trả về:

nguồn_col | đích_col
----------------------
10 | -1
0 | -1

Tuy nhiên, khi thực thi trên SQL Server 2016 (13.0.4001.0 X64), không phải tất cả các hàng đều được cập nhật và sau đây được trả về:

nguồn_col | đích_col
----------------------
10 | -1
0 | 0

Điều này có vẻ như là một lỗi với tôi, nó có vẻ như vậy với bạn?


Vâng, đây là một lỗi. Đã thử nghiệm nó trên SQL 2017 CTP 2.1 và nó hoạt động giống như trên SQL 2016.
Dean Savović

Câu trả lời:


12

Vâng, đó là một lỗi, dường như chỉ ảnh hưởng đến các biến của bảng, với phương thức truy cập chỉ mục bw-tree và tự tham gia không tương thích.

Repro đơn giản hóa bằng cách sử dụng DELETE:

CREATE TYPE dbo.IN_MEMORY_TABLE_TYPE AS TABLE
(
    col integer NOT NULL INDEX i NONCLUSTERED (col)
)
WITH (MEMORY_OPTIMIZED = ON);
GO
DECLARE @T AS dbo.IN_MEMORY_TABLE_TYPE;

INSERT @T (col)
VALUES (1), (2), (3), (4), (5);

DELETE T
FROM @T AS T
WHERE EXISTS 
(
    SELECT 1
    FROM @T AS T2
    WHERE T2.col = 1 -- Vary this number 1-5
);

SELECT T.col FROM @T AS T;
GO
DROP TYPE dbo.IN_MEMORY_TABLE_TYPE;

Kế hoạch bị lỗi

Lưu ý trong kế hoạch trên, việc tìm kiếm các hàng để xóa kết thúc sớm hơn dự kiến ​​(chỉ có hai hàng được đọc từ quá trình quét). Bảo vệ Halloween nói chung được xử lý chính xác cho OLTP trong bộ nhớ, dường như có một vấn đề cụ thể với sự kết hợp của các yếu tố được đề cập ở trên.


Lỗi này được sửa trong SQL Server 2016 SP1 CU5SQL Server 2017 CU1 :

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.