Das Update schlägt aus weitgehend ähnlichen Gründen fehl wie die, die ich in Beantwortung Ihrer vorherigen Frage erläutert habe .
In diesem Fall , weil Sie möglicherweise mehrere Zeilen zu aktualisieren , wo eine Schlüsselspalte eines eindeutigen Index wird * geändert , baut SQL Server einen Plan, der Split enthält, sortieren und Schließen Betreiber Zwischen eindeutigen Schlüssel Verletzungen zu vermeiden (siehe diesen Artikel für weitere Details) .
Der so eingeführte Sortieroperator trifft auf eine Zwischenzeile (einschließlich interner Gemeinkosten) mit einer Breite, die den Grenzwert überschreitet, sodass ein Fehler ausgelöst wird. Das Hinzufügen eines OPTION (ROBUST PLAN)
Hinweises zur Aktualisierungsabfrage zeigt, dass dies unvermeidbar ist:
Meldung 8619, Ebene 16, Status 2, Zeile 681
Der Abfrageprozessor konnte keinen Abfrageplan erstellen, da eine Arbeitstabelle erforderlich ist und die minimale Zeilengröße die maximal zulässige Größe von 8060 Byte überschreitet. Ein typischer Grund, warum eine Arbeitstabelle erforderlich ist, ist eine GROUP BY- oder ORDER BY-Klausel in der Abfrage. Senden Sie Ihre Anfrage erneut ohne den Hinweis ROBUST PLAN.
Die Beziehungen zwischen Quell- und Zieldaten sind mir auf einen kurzen Blick unklar. Wenn Sie jedoch garantieren können , dass jeder Aktualisierungsvorgang höchstens eine Zeile betrifft, können Sie die Notwendigkeit des Aufteilens / Sortierens / Reduzierens vermeiden, indem Sie TOP (1)
der Aktualisierungsanweisung Folgendes hinzufügen :
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
Dies ist jedoch ein kleiner Hack. Im Idealfall sollten die Konstruktion und die Indizes der Update-Anweisung dem Optimierer genügend Informationen liefern, damit er sehen kann, dass höchstens eine Zeile aktualisiert wird. Insbesondere wird empfohlen, Aktualisierungsanweisungen zu schreiben, die deterministisch sind .
Angesichts des merkwürdigen Designs und der mangelnden Klarheit der Frage werde ich nicht einmal versuchen, die Datenbeziehungen oder Abfrage- und Indexänderungen zu entschlüsseln, die erforderlich wären, um dies im Detail zu erreichen.
* Wie Martin Smith in einem Kommentar betonte, wäre dies in dieser speziellen Situation kein Problem, wenn die Tabelle nicht partitioniert wäre. Wenn das Update den Schlüssel in jeder Zeile auf denselben deterministischen Wert setzt, ist Teilen / Sortieren / Reduzieren nicht erforderlich, es sei denn, die Tabelle ist auch auf diesem Schlüssel partitioniert. Eine alternative Lösung für diese Abfrage besteht darin, die Tabelle nicht zur Abtastzeit zu partitionieren .