SQL SMO для выполнения пакетного скрипта TSQL - PullRequest
5 голосов
/ 09 ноября 2010

Я использую SMO для выполнения пакетного сценария SQL. В Management Studio скрипт выполняется примерно за 2 секунды. С помощью следующего кода это займет около 15 секунд.

var connectionString = GetConnectionString();
// need to use master because the DB in the connection string no longer exists  
// because we dropped it already
var builder = new SqlConnectionStringBuilder(connectionString) 
{ 
    InitialCatalog = "master" 
};

using (var sqlConnection = new SqlConnection(builder.ToString()))
{
    var serverConnection = new ServerConnection(sqlConnection);
    var server = new Server(serverConnection);

    // hangs here for about 12 -15 seconds
    server.ConnectionContext.ExecuteNonQuery(sql);  
}

Сценарий создает новую базу данных и вставляет несколько тысяч строк в несколько таблиц. Полученный размер БД составляет около 5 МБ.

Кто-нибудь имеет какой-либо опыт с этим или есть предложение, почему это может работать так медленно с SMO?

Ответы [ 2 ]

4 голосов
/ 28 ноября 2010

SMO делает много странных вещей в фоновом режиме. Это цена, которую вы платите за возможность обрабатывать объекты сервера / базы данных объектно-ориентированным способом.
Поскольку вы не используете возможности OO в SMOпочему вы просто не игнорируете SMO полностью и не запускаете скрипт через обычный ADO?

0 голосов
/ 12 ноября 2010

Лучший и самый быстрый способ загрузки записей в базу данных - через SqlBulkCopy.
Особенно, когда ваши сценарии имеют ~ 1000 записей плюс - это значительно улучшит скорость.
Вам потребуется немного поработать, чтобы перенести данные в DataSet, но это легко сделать с помощью функций DataSet xml.

...