Есть ли какой-либо способ ускорить обход объектов управления SQL Server существующей базы данных?
-
03-07-2019 - |
Вопрос
В настоящее время я использую SMO и C # для обхода баз данных, чтобы создать дерево настроек, представляющих различные аспекты двух баз данных, затем сравниваю эти деревья, чтобы увидеть, где и чем они отличаются.
Проблема в том, что для двух баз данных разумного размера требуется почти 10 минут, чтобы просканировать их локально и собрать информацию о таблице / столбце / хранимой процедуре, которую я хочу сравнить.
Есть ли лучший интерфейс, чем SMO, для доступа к базам данных таким образом?Я бы хотел не включать никаких дополнительных зависимостей, но я приму эту боль ради улучшения скорости на 50%.Ниже приведен пример того, как я перечисляю таблицы и столбцы.
Microsoft.SqlServer.Management.Smo.Database db = db_in;
foreach (Table t in db.Tables)
{
if (t.IsSystemObject == false)
{
foreach (Column c in t.Columns)
{
}
}
}
Решение
Попробуйте заставить SMO читать все требуемые поля сразу, вместо того чтобы запрашивать доступ.Видишь этот блог для получения дополнительной информации
Редактировать:Ссылка мертва, но я нашел страница включено archive.org.Вот соответствующий код:
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
}
}
Другие советы
Используйте системные представления в каждой базе данных и выполняйте запросы обычным образом.
Существует мало того, что вы не можете получить с помощью запросов TSQL.Получение метаданных таким способом обычно происходит очень быстро.