Existe uma maneira de acelerar o SQL Server Management Objects travessia de um banco de dados existente?
-
03-07-2019 - |
Pergunta
Atualmente estou usando o SMO e C # para bancos de dados transversais para criar uma árvore de configurações representando vários aspectos dos dois bancos de dados, em seguida, comparando essas árvores para ver onde e como eles são diferentes.
O problema é, por 2 banco de dados de tamanho razoável, que leva quase 10 minutos para rastreá-los localmente e mesa / coluna / informações procedimento armazenado coleta gostaria de comparar.
Existe uma interface melhor do que o SMO para acessar bancos de dados em tais moda um? Gostaria de não incluir quaisquer dependências adicionais, mas eu vou ter que a dor para uma melhoria de velocidade de 50%. Abaixo está um exemplo de como eu estou enumerando tabelas e colunas.
Microsoft.SqlServer.Management.Smo.Database db = db_in;
foreach (Table t in db.Tables)
{
if (t.IsSystemObject == false)
{
foreach (Column c in t.Columns)
{
}
}
}
Solução
Tente forçar SMO para ler todos os campos necessários de uma só vez, em vez de consultar sobre o acesso. Consulte neste blog para mais informações
EDIT: Link é morto, mas eu achei página em archive.org. Aqui está o 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
}
}
Outras dicas
Use as exibições do sistema em cada banco de dados e consulta convencionalmente.
Há pouco que você não pode obter através de consultas TSQL. Obtendo metadados dessa forma é geralmente muito rápido.