¿Hay alguna forma de acelerar el recorrido de los objetos de administración de SQL Server de una base de datos existente?
-
03-07-2019 - |
Pregunta
Actualmente estoy usando SMO y C # para atravesar bases de datos para crear un árbol de configuraciones que representan varios aspectos de las dos bases de datos, luego comparar estos árboles para ver dónde y cómo son diferentes.
El problema es que, para 2 bases de datos de tamaño razonable, se necesitan casi 10 minutos para rastrearlas localmente y recopilar información de tabla / columna / procedimiento almacenado que deseo comparar.
¿Hay una mejor interfaz que SMO para acceder a las bases de datos de esta manera? Me gustaría no incluir dependencias adicionales, pero me tomo ese dolor por una mejora de velocidad del 50%. A continuación se muestra un ejemplo de cómo estoy enumerando tablas y columnas.
Microsoft.SqlServer.Management.Smo.Database db = db_in;
foreach (Table t in db.Tables)
{
if (t.IsSystemObject == false)
{
foreach (Column c in t.Columns)
{
}
}
}
Solución
Intente forzar a SMO a leer todos los campos requeridos a la vez, en lugar de consultar sobre el acceso. Consulte este blog para obtener más información
EDITAR: El enlace está muerto pero encontré la página en archive.org. Aquí está el código relevante:
Server server = new Server();
// Force IsSystemObject to be returned by default.
server.SetDefaultInitFields(typeof(StoredProcedure), "IsSystemObject");
StoredProcedureCollection storedProcedures = server.Databases["AdventureWorks"].StoredProcedures;
foreach (StoredProcedure sp in storedProcedures) {
if (!sp.IsSystemObject) {
// We only want user stored procedures
}
}
Otros consejos
Utilice las vistas del sistema en cada base de datos y consulta de forma convencional.
Hay poco que no puedas obtener a través de las consultas de TSQL. Obtener metadatos de esa manera suele ser muy rápido.