IGNORE_DUP_KEY = ON
weist SQL Server im Wesentlichen an, nicht duplizierte Zeilen einzufügen, aber alle Duplikate im Hintergrund zu ignorieren. Das Standardverhalten besteht darin, einen Fehler auszulösen und die gesamte Transaktion abzubrechen, wenn sich in einer Spalte Duplikate befinden, die sie nicht zulassen.Warum sollten Sie IGNORE_DUP_KEY NICHT auf ON setzen?
Ich habe mit einer Tonne Daten gearbeitet, die normalerweise mindestens ein Duplikat hat, wenn es nicht sein sollte, also verwende ich gerne UNIQUE
Einschränkungen, wenn ich weiß, dass ein Wert keine Duplikate haben sollte; Aber wenn ich versuche, Daten in großen Mengen zu laden, ist das Letzte, was ich will, dass es zu 90% fertig ist und dann plötzlich in ein Duplikat läuft und das Ganze aus der Fassung bringt (Ja, ich weiß, die offensichtliche Lösung ist, dass es keine Duplikate gibt , aber manchmal habe ich nur eine Tabelle mit Daten überreicht und gesagt, um es so schnell wie möglich zu laden).
Also, was ist der Grund, warum der Standard OFF
zu sein hat, und warum nicht Sie wollen die ganze Zeit sein, so dass alle nicht-dup Einträge erfolgreich sein, während Sie nicht darum kümmern müssen, irgendwelche Duplikate; Wahrscheinlich sind die Duplikate trotzdem irrtümlich drin.
Bezieht sich dies auf die Leistung oder etwas anderes? Das scheint eine großartige Idee zu sein, aber es muss einen Grund geben, warum es nicht das Standardverhalten ist.
Hauptsächlich, gibt es einen guten Grund nicht zu verwenden, dass ich berücksichtigen sollte, oder sollte es für die Bewertung von Fall zu Fall aus sein?
Ein Kommentar, das Setzen der Ignore ist nicht ohne Folgen. Wenn Sie eine Identitätsspalte haben, sehen Sie für jede Einfügung, die aufgrund eines Duplikats ignoriert wurde, Überspringungen in der Identität. –
Wenn diese Option bei nicht geclusterten Indizes aktiviert ist, führt dies zu einer Leistungsbeeinträchtigung [Beibehaltung eindeutiger Indizes mit IGNORE_DUP_KEY] (https://blogs.msdn.microsoft.com/craigfr/2008/01/30/maintaining-unique-indexes-with -ignore_dup_key /) und kann zu schwerwiegenden Bereichssperren bei gleichzeitigem Einfügen von Batches führen [Bereichssperre (RS-U) aufgrund der IGNORE_DUP_KEY-Indexoption] (http://aboutsqlserver.com/tag/locking/). Wenn Sie also viele Zeilen auf einmal einfügen und Duplikate ignorieren möchten, wenden Sie sie nur auf den gruppierten Schlüssel an. – eremmel
@eremmel Sie haben gerade meinen Speck gerettet, danke für diesen Kommentar! Ich habe in den letzten paar Tagen mit meinem Kopf gegen eine Wand gestoßen und versucht herauszufinden, warum ich Range-Locks ohne serialisierbare Isolation bekam, als ich dieses kleine Kitzel in meinem Gehirn über ignore_dup_key bekam, was Perf-Probleme verursachte. Die schnelle Suche führte mich zu diesem Post, du rockst! Ich wünschte nur, dies wäre eine vollständige Antwort, so dass es offensichtlicher war :) –