2008-12-30 13 views
3

J'utilise actuellement SMO et C# pour parcourir des bases de données afin de créer un arbre de paramètres représentant divers aspects des deux bases de données, puis de comparer ces arbres pour voir où et comment ils sont différents. Le problème est que, pour 2 bases de données de taille raisonnable, il faut près de 10 minutes pour les explorer localement et collecter des informations de procédure table/colonne/stockées que je souhaite comparer.Est-il possible d'accélérer la traversée des objets de gestion SQL Server d'une base de données existante?

Existe-t-il une meilleure interface que SMO pour accéder aux bases de données d'une telle manière? Je ne voudrais pas inclure de dépendances supplémentaires, mais je vais prendre cette douleur pour une amélioration de la vitesse de 50%. Voici un exemple de la façon dont j'é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) 
       { 
       }      
      } 
     } 
+0

Une note, assurez-vous de définir votre application à MTAThread –

Répondre

4

Essayez de forcer SMO à lire tous les champs nécessaires à la fois, au lieu d'interroger sur l'accès. Voir this blog pour plus d'informations


EDIT: Link est mort, mais je l'ai trouvé the page sur archive.org. Voici le code approprié:

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

Cela a été une accélération significative sans nécessiter de changement drastique dans l'approche comme l'option ci-dessus, merci. –

+1

Ce qui prenait 10 minutes s'exécute maintenant en ~ 40secondes –

0

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