Mengapa melakukan penghapusan pada tampilan yang dipartisi menghasilkan Sisipan Indeks Berkelompok?

9

Saya memiliki tampilan yang dipartisi yang memiliki pemicu sisipan di bawah ini (partisi mans buruk). Ketika saya melakukan HAPUS, saya mendapatkan paket permintaan di bawah ini:

delete from factproductprice where pricedate = '20170725'

masukkan deskripsi gambar di sini

Pemicu pada tampilan:

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'

.... dll

Mengunci
sumber

Jawaban:

11

INSTEAD OF pemicu sepenuhnya menggantikan aksi pemicu.

The dimasukkan dan dihapus pseudo-tabel merupakan perubahan yang akan dibuat, memiliki pernyataan memicu benar-benar dieksekusi. Versi baris tidak dapat digunakan untuk pemicu ini karena tidak ada modifikasi yang terjadi, menurut definisi.

SQL Server memodifikasi rencana eksekusi untuk pernyataan DML pemicu ketika INSTEAD OFada pemicu. Alih-alih memodifikasi tabel yang terpengaruh secara langsung, rencana eksekusi menulis informasi tentang perubahan ke meja kerja tersembunyi.

Meja kerja ini berisi semua data yang diperlukan untuk melakukan perubahan asli, jenis modifikasi yang dilakukan di setiap baris (hapus atau sisipkan), serta informasi apa pun yang diperlukan dalam pemicu untuk OUTPUTklausa.

Sisipan dalam rencana eksekusi Anda mewakili penulisan ke meja kerja tersembunyi ini. Ketika Anda menangkap rencana pasca-eksekusi untuk pernyataan tersebut, Anda akan melihat meja kerja tersembunyi ini digunakan sebagai pseudo-tables yang dihapus dan dimasukkan .

Lihat artikel SQLPerformance.com saya, Hal-Hal Menarik Tentang BUKAN PEMULA .

Paul White 9
sumber