SSDT Schema Compare funktioniert nicht, während ein BULK INSERT ausgeführt wird

11

Ich arbeite an einem großen ETL- und DW-Projekt, bei dem wir TFS / Quellcodeverwaltung zusammen mit SSIS und SSDT verwenden.

Heute habe ich herausgefunden, dass während ein SSIS-Paket ein BULK INSERT in eine Datenbanktabelle ausführt, es nicht möglich ist, einen SSDT-Schema-Vergleich mit dieser Datenbank durchzuführen. Dies ist bedauerlich, da einige unserer Pakete ziemlich lange dauern. Wir möchten die Schema-Vergleichsfunktion verwenden, um Änderungen an der Datenbankstruktur zu erkennen und diese in unserem SSDT-Projekt zur Versionskontrolle der Datenbank zu speichern.

Bei näherer Betrachtung stellte ich fest, dass die Schema Compare-Funktion in SSDT ein SQL-Skript ausführt, das die OBJECTPROPERTY()Systemfunktion für die Tabellen in der Datenbank aufruft . Insbesondere in meinem Fall OBJECTPROPERTY(<object_id>, N'IsEncrypted')scheinen alle Aufrufe von blockiert zu sein, wenn <object_id>auf eine Tabelle verwiesen wird, die gerade als Masseneinfügung ausgeführt wird.

In Visual Studio tritt beim SSDT-Schema-Vergleich nach einer Weile einfach eine Zeitüberschreitung auf und es wird behauptet, dass keine Unterschiede festgestellt wurden.

Gibt es eine Problemumgehung für dieses Problem in SSDT oder sollte ich möglicherweise versuchen, einen MS Connect-Fehlerbericht einzureichen?

Gibt es alternativ, da das BULK INSERT aus einem SSIS-Paket stammt, möglicherweise eine Möglichkeit, diese Einfügung vorzunehmen, ohne OBJECTPROPERTY-calls auf dem Tisch zu sperren ? Bearbeiten: In SSIS OLE DB-Zielen können wir das Häkchen aus "Tabelle sperren" entfernen, das genau das tut, was es sagt. Dies kann jedoch in einigen Situationen die Leistung beeinträchtigen. Ich bin viel mehr an einer Lösung interessiert, mit der der SSDT-Schema-Vergleich seine Aufgabe erfüllen kann, selbst wenn einige Objekte gesperrt sind.

Dan
quelle
Sehen Sie sich das Steuern des Sperrverhaltens für den Massenimport an. Möglicherweise ist die Tabellensperre beim Massenladen aktiviert. Überprüfen Sie auch, ob Ihr BULK INSERT nicht TABLOCK
stuartd
Wenn Sie Tabellensperren verwenden, wird die Last möglicherweise schneller gefunden, wenn Sie sie trotzdem deaktivieren ( technet.microsoft.com/en-us/library/ms177445.aspx ) - unabhängig von der Ursache, aus der ich eine Verbindung herstellen würde, da eine Zeitüberschreitung auftreten sollte Zumindest scheitern, anstatt nur zu sagen, dass es keine Änderungen gibt
Ed Elliott
Vielen Dank für die Antworten, stuartd und Ed Elliot. Es stellt sich heraus, dass wir die Tabelle aus Leistungsgründen tatsächlich sperren möchten. Meiner Meinung nach sollte SSDT in der Lage sein, damit umzugehen, da wir nur die Datenbank vergleichen und keine Änderungen an Objekten in der Datenbank vornehmen möchten. Ich werde einen Verbindungsbeitrag erstellen, um dies zu beheben.
Dan
3
Interna sind nicht meine Stärke, aber so wie ich es verstehe, haben Sie ein Schloss auf dem Tisch. Unabhängig davon, welche Sperre für die Masseneinfügung verwendet wird, ist sie nicht mit den Sperren kompatibel, die zur Überprüfung des Schemas erforderlich sind. Relevante Lesung BOL Schema Sperre
billinkc
Könnten Sie vielleicht besser erklären, warum der Schemavergleich parallel zu einer Ladeoperation ausgeführt werden muss? Möglicherweise besteht eine Alternative darin, ein Referenzmodell der Datenbank zu haben. Keine Daten, nur Schema. Führen Sie Ihre Vergleiche damit durch und stellen Sie dann sicher, dass niemand die tatsächliche Datenbank ändert, in der diese Massenoperationen ausgeführt werden, ohne zuvor das Referenzmodell zu aktualisieren.
Billinkc

Antworten:

19

Der OBJECTPROPERTYAufruf erfordert eine Schemasperrung (Sch-S), die nur mit einer Schemodifikationssperre (Sch-M) nicht kompatibel ist .

Das BULK INSERTwird unter bestimmten Umständen eine Sch-M-Sperre nehmen. Diese sind im Abschnitt "Sperren und Protokollieren von Tabellen während des Massenimports" der Richtlinien zur Optimierung des Massenimports in Online-Büchern aufgeführt:

Massenimport-Sperre

Wenn die Zieltabelle geclustert ist, finden Sie möglicherweise Hilfen beim Aktivieren des Ablaufverfolgungsflags 610 . Bitte lesen Sie die gesamte Serie dieser Beiträge und den Leistungsleitfaden zum Laden von Daten und testen Sie gründlich, ob Sie sich für diesen Weg entscheiden.

Ich habe keine Ahnung, warum SSDT die IsEncryptedEigenschaft auf Tabellen überprüft . Ich kann mir kein Szenario vorstellen, in dem das Sinn macht, aber das ist eine Frage für die SSDT-Leute.

Paul White 9
quelle
3
Dies war eine sehr umfassende und zufriedenstellende Antwort. Vielen Dank.
Dan