Неправильна поведінка 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.
Дін Савович,

Відповіді:


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;

Несправний план

Зверніть увагу на вищезазначений план, пошук рядків для видалення закінчується раніше, ніж очікувалося (зі сканування читаються лише два рядки). Захист на Хеллоуїн, як правило, належним чином використовується для OLTP In-Memory OLET. Здається, існує певна проблема із поєднанням факторів, згаданих вище.


Ця помилка виправлена в SQL Server 2016 SP1 CU5 та SQL Server 2017 CU1 :

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.