パーティションビューで削除を実行すると、クラスター化インデックスが挿入されるのはなぜですか?


9

以下の挿入トリガーがあるパーティションビューがあります(貧弱なパーティション)。DELETEを実行すると、以下のクエリプランが表示されます。

delete from factproductprice where pricedate = '20170725'

ここに画像の説明を入力してください

ビューのトリガー:

ALTER TRIGGER [dbo].[factProductPriceDelete] ON [dbo].[FactProductPrice]
INSTEAD OF DELETE AS
BEGIN
  IF @@ROWCOUNT = 0 RETURN;

  DECLARE @PriceDate DATE
  SELECT @PriceDate = CAST(PriceDate AS DATE) FROM DELETED
  IF @PriceDate BETWEEN '20140101' AND '20141231'
  BEGIN
    DELETE FROM dbo.FactProductPrice2014
    WHERE ProductId IN (SELECT ProductId FROM DELETED) AND SalesPriceSchemeId IN (SELECT SalesPriceSchemeId FROM DELETED) AND PriceDate IN (SELECT PriceDate FROM DELETED) 
  END
  IF @PriceDate BETWEEN '20150101' AND '20151231'
  BEGIN
    DELETE FROM dbo.FactProductPrice2015
    WHERE ProductId IN (SELECT ProductId FROM DELETED) AND SalesPriceSchemeId IN (SELECT SalesPriceSchemeId FROM DELETED) AND PriceDate IN (SELECT PriceDate FROM DELETED) 
  END
  IF @PriceDate BETWEEN '20160101' AND '20161231'

....など

回答:


11

INSTEAD OF トリガーはトリガーアクションを完全に置き換えます。

挿入および削除された疑似テーブルはなされていたであろう変化を表す、実際に実行トリガ文を持っていました。定義上、まだ変更が行われていないため、これらのトリガーに行バージョン管理を使用することはできません。

SQL Serverは、INSTEAD OFトリガーが存在する場合、トリガーするDMLステートメントの実行プランを変更します。影響を受けるテーブルを直接変更するのではなく、実行プランは変更に関する情報を非表示のワークテーブルに書き込みます。

この作業テーブルには、元の変更を実行するために必要なすべてのデータ、各行に対して実行する変更のタイプ(削除または挿入)、およびOUTPUT句のトリガーで必要なすべての情報が含まれています。

実行プランへの挿入は、この非表示の作業テーブルへの書き込みを表します。ステートメントの実行後プランをキャプチャすると、この非表示のワークテーブルが削除および挿入された疑似テーブルとして使用されていることがわかります。

SQLPerformance.comの記事「INSTEAD OFトリガーに関する興味深いこと」を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.