2010-11-09 9 views
5

Ich verwende SMO, um ein Batch-SQL-Skript auszuführen. In Management Studio wird das Skript in ca. 2 Sekunden ausgeführt. Mit dem folgenden Code dauert es etwa 15 Sekunden.SQL SMO zum Ausführen von Batch-TSQL-Skript

var connectionString = GetConnectionString(); 
// need to use master because the DB in the connection string no longer exists 
// because we dropped it already 
var builder = new SqlConnectionStringBuilder(connectionString) 
{ 
    InitialCatalog = "master" 
}; 

using (var sqlConnection = new SqlConnection(builder.ToString())) 
{ 
    var serverConnection = new ServerConnection(sqlConnection); 
    var server = new Server(serverConnection); 

    // hangs here for about 12 -15 seconds 
    server.ConnectionContext.ExecuteNonQuery(sql); 
} 

Das Skript erstellt eine neue Datenbank und fügt ein paar tausend Zeilen über ein paar Tische. Die resultierende DB-Größe beträgt ca. 5 MB.

Jeder hat irgendwelche Erfahrungen damit oder einen Vorschlag, warum das so langsam mit SMO läuft?

+0

Ich würde sagen, das ist nicht etwas, worüber man sich sorgen muss, 15 Sekunden, um eine Datenbank zu erstellen, scheint vernünftig. Wenn Sie die Abfrage in SSMS ausführen, sind Sie bereits mit dem Server verbunden? Andere Client-Maschine? – MrEdmundo

+0

Gleicher Client-Rechner. Das Öffnen der Verbindung scheint nicht so lange zu dauern, nur der ExecuteNonQuery-Aufruf. Die Sorge ist, dass dieser Schritt Teil der AssemblyInitialize-Methode für unsere Unit-Tests ist, so dass es zusätzliche 15 Sekunden dauert, die Unit-Tests zu starten, ist ein echtes Ärgernis. – Jeff

+0

Jeder? Ich würde diese Skripte gerne für unsere Komponententests verwenden. – Jeff

Antwort

4

SMO macht viele seltsame Dinge im Hintergrund, was ein Preis ist, den Sie für die Fähigkeit bezahlen, Server-/Datenbankobjekte objektorientiert zu behandeln.
Da Sie nicht die OO-Funktionen von SMO verwenden, warum ignorieren Sie nicht einfach SMO und führen das Skript einfach durch normale ADO?

+0

Würde das sicherlich tun, aber bedenken Sie, dass dies ein von SQL Management Studio generiertes Datenskript ist (dh mehrere GO-Anweisungen). Gibt es eine Möglichkeit, das Skript mit normalem ADO auszuführen? – Jeff

+0

Ja, ersetzen Sie einfach alle "GO" durch ";" und du bist gut zu gehen :) –

+3

Ich teile normalerweise die Zeichenfolge mit "GO" und führen Sie jede Teilzeichenfolge als SQL. –

0

Der beste und schnellste Weg zum Hochladen von Datensätzen in eine Datenbank ist über SqlBulkCopy.
Besonders, wenn Ihre Skripte ~ 1000 Datensätze plus sind - dies wird eine deutliche Verbesserung der Geschwindigkeit.
Sie müssen ein wenig arbeiten, um Ihre Daten in ein DataSet zu bekommen, aber dies kann einfach mit den DataSet xml-Funktionen durchgeführt werden.

+0

Ich würde auf jeden Fall Bulk-Kopie verwenden, aber das sind Skripte in Management Studio über die Generate Scripts-Funktionalität generiert. Gibt es eine Möglichkeit, diese Skripte noch mit sperriger Kopie zu verwenden? – Jeff

+0

Leider nicht. SQLBulkCopy benötigt ein Dataset als Eingabe. – blorkfish

Verwandte Themen