Пакетная вставка SQL Server 2008 - PullRequest
3 голосов
/ 13 февраля 2011

У меня есть словарь около 50 000 слов; у каждого слова есть много синонимов, антонимов и т. д. Я использую Fluent NHibernate и создал для приложения экземпляр MS SQL Server 10 ГБ, и я пытаюсь заполнить его как пакетное обновление:

public class Word
{
     public virtual int Id { get; set; }
     public virtual string Text { get; set; }
     public virtual IList<Word> Synonyms { get; set; }
     public virtual IList<Word> Antonyms { get; set; }
}

public class WordMapping : ClassMap<Word>
{
    public WordMapping()
    {
        Id(x => x.Id).UnsavedValue(0);
        Map(x => x.Text);

        HasMany(x => x.Synonyms).Cascade.AllDeleteOrphan();
        HasMany(x => x.Antonyms).Cascade.AllDeleteOrphan();
    }
}
...

List<Word> words = loadWordsFromFile();

using (IStatelessSession session = session.SessionFactory.OpenStatelessSession())
    using (var transaction = session.BeginTransaction())
        {
            foreach (var word in words)
                   session.Insert(word);
            transaction.Commit();
        }

Я установил размер партии на 1000:

 private static ISessionFactory CreateSessionFactory()
 {
    return Fluently.Configure()
                .Database(MsSqlConfiguration
                         .MsSql2008
                         .ConnectionString(connStr)
                         .AdoNetBatchSize(1000))
                .Mappings(M => M.FluentMappings.AddFromAssemblyOf<WordMapping>())
                .ExposeConfiguration(Cfg => _configuration = Cfg)
                .BuildSessionFactory();
 }

Он работал часами без конца. Это лучший способ заполнить мою базу данных или есть более целесообразный подход при работе с большими наборами данных?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Как и lFoust, я также использую утилиту SQLBulkCopy для довольно больших ELT в некоторых базах данных.

Ниже приведен пример кода SqlBulkCopy, который я написал:

SqlConnection sqlCon = new SqlConnection("ConnectionStringHere");
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlCon);
DataTable dt = new DataTable();

dt.Rows.Add(// add data to the datatable)

using (sqlBulkCopy)
{

.DestinationTableName = "Putnameoftablehere";
.NotifyAfter = dt.Rows.Count/100; //Notify every 1%
.WriteToServer(dt);
.Close();


}
2 голосов
/ 27 февраля 2011

Это может быть немного за пределами слоя доступа к данным NHibernate, который вы используете, но когда мы загружаем большие объемы данных в базу данных моей команды (у нас есть несколько баз данных более 20 ТБ), мы используем SqlBulkCopy ,Это не самая захватывающая технология (с использованием DataTables и т. Д.), Но она работает очень хорошо и быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...