2010-11-09 16 views
5

Sto utilizzando SMO per eseguire uno script SQL batch. In Management Studio, lo script viene eseguito in circa 2 secondi. Con il seguente codice, ci vogliono circa 15 secondi.SQL SMO per eseguire lo script TSQL batch

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); 
} 

Lo script crea un nuovo database e inserisce poche migliaia di righe su poche tabelle. La dimensione del DB risultante è di circa 5 MB.

Chiunque ha qualche esperienza con questo o ha un suggerimento sul motivo per cui questo potrebbe funzionare così lentamente con SMO?

+0

Direi che non è qualcosa di cui preoccuparsi, 15 secondi per creare un database sembra ragionevole. Inoltre quando esegui la query in SSMS sei già connesso al server? Macchina client diversa? – MrEdmundo

+0

Stessa macchina client. L'apertura della connessione non sembra richiedere molto tempo, solo la chiamata ExecuteNonQuery. La preoccupazione è che questo passaggio faccia parte del metodo AssemblyInitialize per i nostri Test unità, quindi avere 15 secondi in più solo per avviare i test unitari è una vera seccatura. – Jeff

+0

Chiunque? Mi piacerebbe davvero usare questi script per i nostri test unitari. – Jeff

risposta

4

SMO fa un sacco di cose .. strane in background, che è un prezzo che si paga per la capacità di trattare gli oggetti server/database in modo orientato agli oggetti.
Dal momento che non si utilizzano i capabilities di OO di SMO, perché non si ignora completamente SMO e si esegue semplicemente lo script tramite ADO normale?

+0

Lo farebbe sicuramente, ma tieni presente che si tratta di uno script di dati generato da SQL Management Studio (ad esempio più istruzioni GO). C'è un modo per eseguire lo script con ADO normale? – Jeff

+0

Sì, è sufficiente sostituire tutti "GO" con ";" e sei a posto :) –

+3

Normalmente divido la stringa usando "GO" ed eseguo ogni sottostringa come sql. –

0

Il modo migliore e più veloce per caricare i record in un database è tramite SqlBulkCopy.
In particolare quando i tuoi script sono ~ 1000 record più - questo comporterà un significativo miglioramento della velocità.
È necessario eseguire un piccolo lavoro per trasferire i dati in un DataSet, ma ciò può essere fatto facilmente utilizzando le funzioni xml di DataSet.

+0

Utilizzerò sicuramente la copia bulk, ma questi sono script generati in Management Studio tramite la funzionalità Genera script. C'è un modo in cui posso ancora usare questi script con una copia ingombrante? – Jeff

+0

Purtroppo no. SQLBulkCopy richiede un set di dati come input. – blorkfish

Problemi correlati