Было бы интересно узнать, какую версию SQL Server вы используете, потому что в SQL Server 2005 и 2008 план запроса показывает, что все удаления в кластеризованном индексе завершены до выполнения проверок ссылочной целостности. Проверка ограничений является отложенным!
Удаленные значения groupId записываются в Eager Spool после оператора delete. Затем оператор последовательности в корне плана воспроизводит вторую ветвь, которая считывает все строки из буфера и проверяет другие строки, которые ссылаются на удаленные строки, используя полусоединение. Последней операцией в плане является Assert, которая выдаст ошибку, если ссылочная целостность была нарушена.
Сценарий воспроизведения, используя данные, показанные в статье MPTT, на которую ссылается оригинальный вопрос:
USE tempdb
;
IF OBJECT_ID(N'dbo.Test', N'U')
IS NOT NULL
DROP TABLE dbo.Test
;
CREATE TABLE dbo.Test
(
groupId UNIQUEIDENTIFIER NOT NULL PRIMARY KEY NONCLUSTERED,
parentId UNIQUEIDENTIFIER REFERENCES dbo.Test(groupId) NULL,
name NVARCHAR(50) NOT NULL,
lft INTEGER NOT NULL,
rgt INTEGER NOT NULL,
)
;
CREATE NONCLUSTERED INDEX nc1 ON dbo.Test (parentId)
;
INSERT dbo.Test (groupId, parentId, name, lft, rgt)
VALUES ({guid '00000000-0000-0000-0000-000000000000'}, NULL, N'Food', 1, 18),
({guid '99163693-B535-47A1-9F5B-E5F235CEB8E2'}, {guid '00000000-0000-0000-0000-000000000000'}, N'Fruit', 2, 11),
({guid '6A3FFED1-0230-4909-A7D4-DD9CBA674A1D'}, {guid '99163693-B535-47A1-9F5B-E5F235CEB8E2'}, N'Red', 3, 6),
({guid '2E7A25D8-8555-4FEC-A0D3-8B8E60501F6A'}, {guid '6A3FFED1-0230-4909-A7D4-DD9CBA674A1D'}, N'Cherry', 4, 5),
({guid '20613684-1081-4A42-AEAE-F21250D56703'}, {guid '99163693-B535-47A1-9F5B-E5F235CEB8E2'}, N'Yellow', 7, 10),
({guid 'B6D5A4AB-1A10-4069-842D-AAE09E73B3CD'}, {guid '20613684-1081-4A42-AEAE-F21250D56703'}, N'Banana', 8, 9),
({guid '174FF0C3-BAE0-4023-8819-EC89E080834C'}, {guid '00000000-0000-0000-0000-000000000000'}, N'Meat', 12, 17),
({guid '3CA5356E-343B-461C-8602-B9ECAEA1304D'}, {guid '174FF0C3-BAE0-4023-8819-EC89E080834C'}, N'Beef', 13, 14),
({guid '79664130-ACDF-48CE-A33D-7473153819E8'}, {guid '174FF0C3-BAE0-4023-8819-EC89E080834C'}, N'Pork', 15, 16)
;
DELETE dbo.Test
WHERE groupId > {guid '00000000-0000-0000-0000-000000000000'}
;