Gibt es trotzdem, SQL Server Management Objects Traversal einer vorhandenen Datenbank zu beschleunigen?
-
03-07-2019 - |
Frage
Ich bin derzeit mit SMO und C # Datenbanken zu durchqueren einen Baum von Einstellungen erstellen verschiedene Aspekte der beiden Datenbanken darstellen, dann diese Bäume zu vergleichen, um zu sehen, wo und wie sie anders sind.
Das Problem ist, für zwei recht große Datenbank, ist es fast 10 Minuten dauert sie lokal zu kriechen und sammeln Tabelle / Spalte / Stored Procedure Informationen Ich möchte vergleichen.
Gibt es eine bessere Schnittstelle dann SMO für den Zugriff auf Datenbanken in einer solchen Art und Weise? Ich möchte keine zusätzlichen Abhängigkeiten enthalten, aber ich werde diesen Schmerz für eine 50% ige Verbesserung der Geschwindigkeit nehmen. Unten ist ein Beispiel dafür, wie ich Tabellen und Spalten bin aufzählt.
Microsoft.SqlServer.Management.Smo.Database db = db_in;
foreach (Table t in db.Tables)
{
if (t.IsSystemObject == false)
{
foreach (Column c in t.Columns)
{
}
}
}
Lösung
Versuchen Sie SMO zu zwingen, alle erforderlichen Felder auf einmal zu lesen, anstatt über den Zugang von Abfragen. Siehe diesen Blog für weitere Informationen
EDIT: Link ist tot, aber ich finde die Seite auf archive.org. Hier ist der relevante Code:
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
}
}
Andere Tipps
die Systemansichten in jeder Datenbank verwenden und Abfrage konventionell.
Es gibt wenig, dass Sie nicht über T-SQL-Abfragen bekommen. Erste Metadaten, die Art und Weise in der Regel sehr schnell ist.