Dmi*_*nko 14 sql-server memory-optimized-tables sql-server-2016
请查看以下 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
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 2014 (12.0.4100.1 X64) 上执行UPDATE
时,查询按预期执行,并返回以下有效结果:
source_col | 目标列 --------------- 10 | -1 0 | -1
但是,在 SQL Server 2016 (13.0.4001.0 X64) 上执行时,并非所有行都会更新,而是返回以下内容:
source_col | 目标列 --------------- 10 | -1 0 | 0
这对我来说看起来像一个错误,对你来说是这样吗?
Pau*_*ite 13
是的,这是一个错误,它似乎只影响表变量,具有 bw-tree 索引访问方法和不相关的自联接。
使用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;
Run Code Online (Sandbox Code Playgroud)
请注意,在上述计划中,对要删除的行的搜索比预期更早终止(从扫描中仅读取两行)。对于内存中 OLTP,万圣节保护通常可以正确处理,但上述因素的组合似乎存在特定问题。
此错误已在SQL Server 2016 SP1 CU5和SQL Server 2017 CU1 中修复:
归档时间: |
|
查看次数: |
610 次 |
最近记录: |