Esiste un modo per accelerare l'attraversamento degli oggetti di gestione di SQL Server di un database esistente?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Attualmente sto usando SMO e C # per attraversare database per creare un albero di impostazioni che rappresentano vari aspetti dei due database, quindi confrontando questi alberi per vedere dove e come sono diversi.

Il problema è che, per 2 database di dimensioni ragionevoli, ci vogliono quasi 10 minuti per scansionarli localmente e raccogliere informazioni sulla tabella / colonna / procedura memorizzata che desidero confrontare.

Esiste un'interfaccia migliore di SMO per accedere ai database in questo modo? Vorrei non includere dipendenze aggiuntive, ma mi prenderò la pena per un miglioramento della velocità del 50%. Di seguito è riportato un esempio di come sto enumerando tabelle e colonne.

        Microsoft.SqlServer.Management.Smo.Database db = db_in;
        foreach (Table t in db.Tables)
        {
            if (t.IsSystemObject == false)
            {

                foreach (Column c in t.Columns)
                {
                }                    
            }
        }
È stato utile?

Soluzione

Prova a forzare SMO a leggere contemporaneamente tutti i campi richiesti, invece di eseguire query sull'accesso. Vedi questo blog per maggiori informazioni


EDIT: il link è morto ma ho trovato la pagina su archive.org. Ecco il codice pertinente:

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

Altri suggerimenti

Utilizzare le viste di sistema in ciascun database e interrogare in modo convenzionale.

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

C'è poco che non puoi ottenere tramite le query TSQL. Ottenere metadati in questo modo è solitamente molto veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top