Pembaruan gagal karena alasan yang hampir sama dengan yang saya jelaskan sebagai jawaban atas pertanyaan Anda sebelumnya .
Dalam hal ini, karena Anda berpotensi memperbarui beberapa baris di mana kolom kunci dari indeks yang unik adalah berubah * , SQL Server membangun rencana yang mencakup Split, Sort, dan operator Ciutkan untuk menghindari menengah pelanggaran kunci unik (lihat artikel ini untuk rincian) .
Operator Urut yang diperkenalkan kemudian menemukan baris perantara (termasuk overhead internal) dengan lebar yang melebihi batas, sehingga kesalahan muncul. Menambahkan OPTION (ROBUST PLAN)
petunjuk ke permintaan pembaruan menunjukkan ini tidak dapat dihindari:
Msg 8619, Level 16, State 2, Line 681
Proses permintaan tidak dapat membuat rencana permintaan karena meja kerja diperlukan, dan ukuran baris minimumnya melebihi batas maksimum yang diijinkan 8060 byte. Alasan khas mengapa diperlukan meja kerja adalah klausa GROUP BY atau ORDER BY dalam kueri. Kirim ulang permintaan Anda tanpa petunjuk ROBUST PLAN.
Hubungan data sumber / target tidak jelas bagi saya dari pandangan singkat, tetapi jika Anda dapat menjamin bahwa setiap operasi pembaruan akan memengaruhi paling banyak satu baris, Anda dapat menghindari kebutuhan Split / Sortir / Perkecil dengan menambahkan TOP (1)
pernyataan pembaruan:
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
Ini sedikit peretasan. Idealnya, konstruksi dan indeks pernyataan pembaruan harus memberikan informasi yang cukup kepada pengoptimal sehingga dapat melihat bahwa paling banyak satu baris akan diperbarui. Secara khusus, ini adalah praktik terbaik untuk menulis pernyataan pembaruan yang bersifat deterministik .
Mengingat desain yang aneh dan kurangnya kejelasan dalam pertanyaan, saya bahkan tidak mencoba untuk menguraikan hubungan data, atau perubahan permintaan & indeks yang akan diperlukan untuk mencapai ini secara detail.
* Sebagaimana Martin Smith tunjukkan dalam komentar, ini tidak akan menjadi masalah dalam situasi khusus ini jika tabel tidak dipartisi. Di mana pembaruan menetapkan kunci ke nilai deterministik yang sama di setiap baris, Split / Sortir / Perkecil tidak diperlukan, kecuali tabel juga dipartisi pada kunci itu. Jadi, solusi alternatif untuk kueri ini adalah tidak mempartisi tabel pada sampletime .