Est-il possible d'accélérer la traversée des objets de gestion SQL Server d'une base de données existante?

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

  •  03-07-2019
  •  | 
  •  

Question

J'utilise actuellement SMO et C # pour parcourir des bases de données afin de créer une arborescence de paramètres représentant différents aspects des deux bases de données, puis de comparer ces arborescences pour déterminer en quoi elles diffèrent.

Le problème est que, pour 2 bases de données de taille raisonnable, il faut près de 10 minutes pour les analyser localement et collecter les informations de table / colonne / procédure stockée que je souhaite comparer.

Existe-t-il une meilleure interface que SMO pour accéder aux bases de données de cette manière? J'aimerais ne pas inclure de dépendances supplémentaires, mais je vais supporter cette douleur pour une amélioration de 50% de la vitesse. Vous trouverez ci-dessous un exemple de la façon dont je énumère les tables et les colonnes.

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

                foreach (Column c in t.Columns)
                {
                }                    
            }
        }
Était-ce utile?

La solution

Essayez de forcer SMO à lire tous les champs obligatoires en même temps, au lieu de lancer une requête sur l'accès. Voir ce blog pour plus d'informations

.

EDIT: Link est mort, mais j'ai trouvé la page sur archive.org. Voici le code correspondant:

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

Autres conseils

Utilisez les vues système de chaque base de données et interrogez de manière conventionnelle.

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

Il y a peu de choses que vous ne pouvez pas obtenir via des requêtes TSQL. Obtenir les métadonnées de cette façon est généralement très rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top