2010-11-09 18 views
5

Estoy usando SMO para ejecutar un script SQL por lotes. En Management Studio, la secuencia de comandos se ejecuta en aproximadamente 2 segundos. Con el siguiente código, tarda unos 15 segundos.SQL SMO para ejecutar el script TSQL por lotes

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

El script crea una nueva base de datos e inserta unos pocos miles de filas en unas pocas tablas. El tamaño de base de datos resultante es de aproximadamente 5 MB.

¿Alguien tiene alguna experiencia con esto o tiene una sugerencia sobre por qué esto podría estar funcionando tan lentamente con SMO?

+0

Yo diría que esto no es algo de lo que preocuparse, 15 segundos para crear una base de datos parece razonable. Además, cuando ejecutas la consulta en SSMS, ¿ya estás conectado al servidor? ¿Diferente máquina cliente? – MrEdmundo

+0

Mismo equipo cliente. La apertura de la conexión no parece llevar tanto tiempo, solo la llamada ExecuteNonQuery. La preocupación es que este paso es parte del método AssemblyInitialize para nuestras pruebas unitarias, por lo que tener que tomar 15 segundos adicionales solo para iniciar las pruebas unitarias es una verdadera molestia. – Jeff

+0

¿Alguien? Realmente me gustaría usar estos guiones para nuestras pruebas unitarias. – Jeff

Respuesta

4

SMO tiene un montón de cosas raras .. en el fondo, que es un precio que paga por la capacidad de tratar los objetos del servidor/base de datos de una manera orientada a objetos.
Dado que no está utilizando las capacidades de OO de SMO, ¿por qué no simplemente ignora SMO por completo y simplemente ejecuta el script a través de ADO normal?

+0

Sin duda lo haría, pero tenga en cuenta que se trata de un script de datos generado por SQL Management Studio (es decir, varias instrucciones GO). ¿Hay alguna manera de ejecutar el script con ADO normal? – Jeff

+0

Sí, simplemente reemplace todo "IR" con ";" y está listo para ir :) –

+3

Normalmente divido la cadena usando "IR" y ejecuto cada subcadena como sql. –

0

La mejor y más rápida forma de cargar registros en una base de datos es a través de SqlBulkCopy.
Particularmente cuando sus scripts tienen ~ 1000 registros más, esto mejorará significativamente la velocidad.
Tendrá que trabajar un poco para obtener sus datos en un DataSet, pero esto se puede hacer fácilmente utilizando las funciones DataSet xml.

+0

Definitivamente utilizaría la copia masiva, pero estos son scripts generados en Management Studio a través de la funcionalidad Generar scripts. ¿Hay alguna manera de que todavía pueda usar estos scripts con una copia voluminosa? – Jeff

+0

Desafortunadamente no. SQLBulkCopy requiere un conjunto de datos como entrada. – blorkfish

Cuestiones relacionadas