พฤติกรรมที่ไม่ถูกต้องของ SQL Server 2016 ด้วยตารางที่ปรับให้เหมาะสมหน่วยความจำ


13

โปรดดูแบบสอบถาม SQL ต่อไปนี้:

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

เมื่อเรียกใช้งานบน SQL Server 2014 (12.0.4100.1 X64) UPDATEในแบบสอบถามจะทำงานตามที่คาดไว้และจะส่งคืนผลลัพธ์ที่ถูกต้องต่อไปนี้:

source_col | target_col
----------------------
10 | -1
0 | -1

อย่างไรก็ตามเมื่อทำการรันบน SQL Server 2016 (13.0.4001.0 X64) ไม่ใช่แถวทั้งหมดที่ได้รับการอัพเดตและจะส่งคืนข้อมูลต่อไปนี้:

source_col | target_col
----------------------
10 | -1
0 | 0

ดูเหมือนว่าเป็นข้อบกพร่องสำหรับฉันมันเป็นเช่นนั้นสำหรับคุณ?


ใช่นี่เป็นข้อผิดพลาด ทดสอบกับ SQL 2017 CTP 2.1 และทำงานในลักษณะเดียวกับ SQL 2016
Dean Savović

คำตอบ:


12

ใช่มันเป็นข้อผิดพลาดซึ่งดูเหมือนว่าจะส่งผลกระทบต่อตัวแปรตารางเท่านั้นด้วยวิธีการเข้าถึงดัชนีต้นไม้ bw และการเข้าร่วมด้วยตนเองที่ไม่เกี่ยวข้อง

ประยุกต์ใช้ซ้ำโดยง่าย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;

แผนผิดพลาด

หมายเหตุในแผนด้านบนการค้นหาแถวที่จะลบสิ้นสุดก่อนหน้านี้กว่าที่คาดไว้ (อ่านได้เพียงสองแถวจากการสแกน) โดยทั่วไปการป้องกันฮาโลวีนนั้นได้รับการจัดการอย่างถูกต้องสำหรับ In-Memory OLTP ดูเหมือนว่าจะมีปัญหาเฉพาะกับการรวมกันของปัจจัยที่กล่าวถึงข้างต้น


ข้อผิดพลาดนี้ได้รับการแก้ไขในSQL Server 2016 SP1 CU5และSQL Server 2017 CU1 :

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.