Comportamento errato di SQL Server 2016 con tabelle ottimizzate per la memoria


13

Dai un'occhiata alla seguente query 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

Quando lo si esegue su SQL Server 2014 (12.0.4100.1 X64), UPDATEnella query viene eseguito come previsto e viene restituito il seguente risultato valido:

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

Tuttavia, quando si esegue su SQL Server 2016 (13.0.4001.0 X64) non tutte le righe vengono aggiornate e viene restituito quanto segue:

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

Questo mi sembra un bug, ti sembra?


Sì, questo è un bug. Testato su SQL 2017 CTP 2.1 e si comporta come su SQL 2016.
Dean Savović,

Risposte:


12

Sì, è un bug, che sembra influenzare solo le variabili di tabella, con un metodo di accesso all'indice bw-tree e un self-join non correlato.

Riproduzione semplificata usando 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;

Piano difettoso

Nota nel piano sopra la ricerca delle righe da eliminare termina prima del previsto (dalla scansione vengono lette solo due righe). La protezione di Halloween è generalmente gestita correttamente per OLTP in memoria, sembra esserci un problema specifico con la combinazione dei fattori sopra menzionati.


Questo errore è stato risolto in CU5 di SQL Server 2016 SP1 e CU1 di SQL Server 2017 :

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.