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

В настоящее время я использую SMO и C # для обхода баз данных, чтобы создать дерево настроек, представляющих различные аспекты двух баз данных, а затем сравнивать эти деревья, чтобы увидеть, где и как они отличаются.

Проблема в том, что для 2 баз данных разумного размера требуется почти 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)
                {
                }                    
            }
        }

Ответы [ 3 ]

6 голосов
/ 31 декабря 2008

Попробуйте заставить 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
    }
}
2 голосов
/ 31 декабря 2008

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

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

0 голосов
/ 31 декабря 2008

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

...