Assert プラン表示操作

Assert 操作は、状態の検証を行います。たとえば、参照整合性の検証や、スカラ サブクエリによって 1 行返されることの確認を行います。入力行ごとに、Assert 操作によって実行プランの Argument 列の式が評価されます。この式が NULL であると評価されると、行は Assert 操作を通過して、クエリの実行が継続されます。式が NULL 以外の値に評価されると、相応のエラーが発生します。

Assert 操作は物理操作です。

Assert 操作アイコングラフィカルな実行プランのアイコン

A. CHECK 制約の検証

次の例では、Employee テーブルの指定された従業員 ID の Gender 列の値を更新します。このテーブルには、列で許容される値を "F" および "M" に制限する CHECK 制約があります。クエリ実行プランの出力は、クエリ オプティマイザでは UPDATE ステートメントで指定された値を CHECK 制約に対して検証するために Assert 操作が使用されていて、制約の条件を満たしていない場合はエラーが発生することを示しています。

USE AdventureWorks;
GO
SET NOCOUNT ON;
GO
SET SHOWPLAN_ALL ON;
GO
UPDATE HumanResources.Employee
SET Gender = 'X' WHERE EmployeeID = 1;
GO
SET SHOWPLAN_ALL OFF;
GO

Assert 操作の実行プラン出力は次のようになります。

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN upper([AdventureWorks].[HumanResources].[Employee].[Gender])<>N'F' AND 
upper([AdventureWorks].[HumanResources].[Employee].[Gender])<>N'M' THEN 
    (0) ELSE NULL END)

B. FOREIGN KEY 制約の検証

次の例では、Person.Contact テーブルの行を削除します。この場合、このテーブルの ContactID 列を参照する外部キーを持つテーブルが 6 個存在します。クエリ実行プランの出力は、クエリ オプティマイザではこれらの各制約に対して DELETE ステートメントを検証するために Assert 操作が使用されることを示しています。

USE AdventureWorks;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Contact WHERE ContactID = 1209;
GO
SET SHOWPLAN_ALL OFF;
GO

Assert 操作の実行プラン出力は次のようになります。

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN NOT [Expr1030] IS NULL THEN (0) ELSE CASE WHEN NOT 
[Expr1031] IS NULL THEN (1) ELSE CASE WHEN NOT [Expr1032] IS NULL THEN 
(2) ELSE CASE WHEN NOT [Expr1033] IS NULL THEN (3) ELSE CASE WHEN NOT 
[Expr1034] IS NULL THEN (4) ELSE CASE WHEN NOT [Expr1035] IS NULL THEN (5) ELSE NULL END END END END END END)

C. スカラ サブクエリの検証

次の例では、クエリの WHERE 句でサブクエリを使用します。この例では、Assert 操作によって必ずエラーが生成されるように、複数行を返すクエリを意図的に使用しています。クエリ実行プランの出力は、クエリ オプティマイザでは SELECT ステートメントで指定されたサブクエリが 1 行のみを返すように、Assert 操作が使用されることを示しています。

USE AdventureWorks;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
SELECT EmployeeID 
FROM HumanResources.Employee
WHERE ContactID = (SELECT ContactID FROM Person.Contact);
GO
SET SHOWPLAN_ALL OFF;
GO
-- Run the query again to display the error message raised by the 
-- Assert Operator.
SELECT EmployeeID 
FROM HumanResources.Employee
WHERE ContactID = (SELECT ContactID FROM Person.Contact);
GO

Assert 操作の実行プラン出力は次のようになります。

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN [Expr1007]>(1) THEN (0) ELSE NULL END)