¿Hay alguna forma de acelerar el recorrido de los objetos de administración de SQL Server de una base de datos existente?

StackOverflow https://stackoverflow.com/questions/401740

  •  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)
                {
                }                    
            }
        }
¿Fue útil?

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.

http: // www .microsoft.com / downloads / details.aspx? familyid = 2EC9E842-40BE-4321-9B56-92FD3860FB32 & amp; displaylang = es

Hay poco que no puedas obtener a través de las consultas de TSQL. Obtener metadatos de esa manera suele ser muy rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top