[英]SQL Server 2008 Batch Insert
我有一個約50,000字的字典; 每個單詞都有很多同義詞,反義詞等。我正在使用Fluent NHibernate,我為應用程序創建了一個10gb MS SQL Server實例,我試圖將其填充為批量更新:
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();
}
它已經運行了幾個小時,看不到盡頭。 這是填充數據庫的最佳方式,還是在處理大型數據集時有更方便的方法?
這可能有點在你正在使用的NHibernate數據訪問層之外,但是當我們將大量數據加載到我的團隊的數據庫中時(我們有幾個20+ TB數據庫),我們使用SqlBulkCopy 。 它並不是最令人興奮的技術(使用DataTables等),但它的工作非常好而且速度很快。
像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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.