Есть ли какой-либо способ ускорить обход объектов управления SQL Server существующей базы данных?

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

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

Другие советы

Используйте системные представления в каждой базе данных и выполняйте запросы обычным образом.

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

Существует мало того, что вы не можете получить с помощью запросов TSQL.Получение метаданных таким способом обычно происходит очень быстро.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top