Existe uma maneira de acelerar o SQL Server Management Objects travessia de um banco de dados existente?

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

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

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.

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

Há pouco que você não pode obter através de consultas TSQL. Obtendo metadados dessa forma é geralmente muito rápido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top