3

我完全被这个弄糊涂了。我向 SQL Server 2017 表添加了覆盖索引,但我的集成测试失败了。

下面是一些简单的 SQL 来说明问题:

CREATE TABLE MyColumns (ColumnID INT PRIMARY KEY, LookupCodeTypeID INT)

INSERT INTO MyColumns (ColumnID, LookupCodeTypeID) 
VALUES (18, 37)

CREATE TABLE MyCodes (CodeID INT PRIMARY KEY, CodeTypeID INT, Code NVARCHAR(50), IsDeleted BIT)

INSERT INTO MyCodes (CodeID, CodeTypeID, Code, IsDeleted) 
VALUES (1, 12, 'North', 0), (2, 12, 'South', 0), (19, 37, '0', 0),
       (20, 37, '1', 0), (21, 37, '2', 1), (22, 37, '3', 0)

SELECT CAST(Code AS INT) AS CodeIndex
FROM MyCodes
INNER JOIN MyColumns ON LookupCodeTypeID = CodeTypeID
WHERE ColumnID = 18 AND IsDeleted = 0
ORDER BY CodeIndex

-- This index was created for other reasons but the following SQL broke
CREATE NONCLUSTERED INDEX IX1_MyCodes ON MyCodes (CodeTypeID) INCLUDE (Code)

SELECT CAST(Code AS INT) AS CodeIndex
FROM MyCodes
INNER JOIN MyColumns ON LookupCodeTypeID = CodeTypeID
WHERE ColumnID = 18 AND IsDeleted = 0
ORDER BY CodeIndex

创建索引是为了解决其他地方的另一个问题,但失败的测试让我看到了这段代码。

通过尝试创建一个示例来重现问题,我可以看到,对于此代码,添加IsDeleted到覆盖索引可以解决问题,但这不是我所期望的。

由于测试突出了这个问题,我将添加IsDeleted到覆盖索引中。

我的问题是为什么 SQL 中断了,我如何预测还有什么可能会中断,因为只有我们的一些代码具有集成测试?

4

0 回答 0