SQL Server 2019 可能存在的 bug,有解决办法吗?

问题描述 投票:0回答:1

我们在一台较低环境的服务器上进行了从 SQL Server 2016 到 SQL Server 2019 的就地升级。该服务器上有两个数据库。我们将两个数据库的兼容性级别设置为 150。我们有一个存储过程,用于将数据库 A 中的表 A 与表 B 连接到数据库 B。

INSERT INTO TableA (ColumnA, ColumnB, ColumnC)
    SELECT A.ColumnA, A.ColumnB, B.ColumnB
    FROM TableA A 
    INNER JOIN TableB B ON A.ColumnD = B.ColumnD
    WHERE A.ColumnE = 2

当在 SQL Server 2016 中运行时,它会将唯一的数据列表插入到 TableA 中。自从升级到 SQL Server 2019 以来,它在一次运行中复制了一些行多达 60 次。如果我将兼容性级别降低到 130,它将恢复为唯一列表。

这只在索引被禁用时才会发生。如果我启用索引,则不会发生这种情况,或者如果我使

SELECT
在 MAXDOP 1 下执行。

有什么想法吗?为什么它的工作原理会如此不同?如果我要取出要插入的数据并查看它,如下所示,该查询仅返回一条记录。

SELECT A.ColumnA, A.ColumnB, B.ColumnB
FROM TableA A 
INNER JOIN TableB B ON A.ColumnD = B.ColumnD
WHERE A.ColumnE = 2 
  AND A.ColumnA = 2342342 
  AND B.ColumnB = 9228382

这是一个错误吗?我已经尝试了所有的 CU,看看它是否已被修复,或者是否是其中之一引入的。没有任何效果。

回答我被问到的几个问题。

  1. 是的,这是可重现的,甚至可以在运行 INSERT 之前在新数据库中创建新表并将数据复制到新表。
  2. 我已经完全删除并重新创建了索引。
  3. 我已经完全放弃了所有统计数据并让它们自然重建
  4. 我没有使用NOLOCK
  5. 禁用索引时,进程在 5 分钟内运行;启用索引时,需要 30 分钟。重建索引只需不到一分钟。如果我删除索引并在最后将它们放回去,则索引的构建需要 20 分钟。这就是为什么我们只是禁用它们。过去一直有效,从来没有问题。
  6. 我很乐意发布执行计划,将尽力在周一完成。不幸的是,那天服务器会很忙,我可能无法完成这项工作。我确实粗略地看了一眼130和150的执行计划,它们看起来是一样的,但我没有做彻底的检查。
  7. 这些表上发生的其他进程肯定需要索引,不能只是删除它们。

更新:

我有一个与 Microsoft 合作的案例。

indexing parallel-processing duplicates sql-server-2016 sql-server-2019
1个回答
-1
投票

这方面有什么更新吗? 谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.