为什么添加覆盖索引后SQL失败?

时间:2019-10-17 13:26:45

标签: sql-server indexing covering-index

我对此完全感到困惑。我在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会中断,并且由于只有部分代码具有集成测试,我怎么能预测其他中断?

0 个答案:

没有答案