Sql server 用NHibernate并行插入

Sql server 用NHibernate并行插入,sql-server,nhibernate,parallel-processing,etl,Sql Server,Nhibernate,Parallel Processing,Etl,情景: 需要将大量实体从集成数据库加载到生产数据库。我们使用NHibernate将内容加载到prod DB中,因为所涉及的业务规则已经使用我们的持久实体用C编写。一切正常,我们将有效实体加载到数据库中。RDBMS是SQL Server 2005,可以升级到2008 问题是: 要加载的实体数量将很快疯狂增长,我们非常确信,这将花费比预期更长的时间,无法满足客户的要求 解决方案: 简单地并行运行很容易:将所有实体拆分为bucket并并行导入它们 问题是它们都插入到同一个表中,所有进程都会在表锁中出现

情景:

需要将大量实体从集成数据库加载到生产数据库。我们使用NHibernate将内容加载到prod DB中,因为所涉及的业务规则已经使用我们的持久实体用C编写。一切正常,我们将有效实体加载到数据库中。RDBMS是SQL Server 2005,可以升级到2008

问题是:

要加载的实体数量将很快疯狂增长,我们非常确信,这将花费比预期更长的时间,无法满足客户的要求

解决方案:

简单地并行运行很容易:将所有实体拆分为bucket并并行导入它们

问题是它们都插入到同一个表中,所有进程都会在表锁中出现瓶颈


所以问题是:有没有一种方法可以使这些插入不会锁定表,让其他事务尝试插入到同一个表中?我听说过快照隔离级别,但没有发现有人真正使用它。非常感谢您的指导。

是否可以按说明将每个bucket插入不同的表中,并将它们连接到视图中?客户看不出有什么区别,只是加载时间下降了80%。

是否可以按说明将每个bucket插入不同的表中,并在视图中连接它们?客户看不出有什么区别,只是加载时间减少了80%…

我对NHibernate没有任何经验,但从.NET中,您可以使用SqlBulkCopy或bulk INSERT/BCP并行大容量加载数据。在正在加载的表上应用TABLOCK,这些批量操作将删除表上的批量更新锁,如果您有两个具有批量更新锁的进程,它们将相处得很好。您需要将表上没有聚集索引的数据加载到堆中

这与有多个进程执行INSERT…SELECT相反,例如,它将获取独占的表级锁,从而相互阻塞

我建议-更多的细节和信息在那里。希望这种事情对你来说是可能的


此外,如果可以,请在加载之前从表中删除索引,然后重新创建它们-这将提高加载速度。

我对NHibernate没有任何经验,但从.NET中,您可以使用SqlBulkCopy或bulk INSERT/BCP并行大容量加载数据。在正在加载的表上应用TABLOCK,这些批量操作将删除表上的批量更新锁,如果您有两个具有批量更新锁的进程,它们将相处得很好。您需要将表上没有聚集索引的数据加载到堆中

这与有多个进程执行INSERT…SELECT相反,例如,它将获取独占的表级锁,从而相互阻塞

我建议-更多的细节和信息在那里。希望这种事情对你来说是可能的


另外,如果可以的话,在加载之前从表中删除索引,然后再重新创建它们-这将提高加载速度。

我认为这一章应该可以帮助您完成工作。可以为这种类型的插入定义显式隔离级别。这篇文章建议使用版本控制,但是如果您不需要它,因为您的数据只是插入,而不是更新,那么您可以跳过它。在这种情况下,最后一次提交获胜。

我认为这一章应该帮助您完成任务。可以为这种类型的插入定义显式隔离级别。这篇文章建议使用版本控制,但是如果您不需要它,因为您的数据只是插入,而不是更新,那么您可以跳过它。在这种情况下,最后一次提交获胜。

使用正确的工具做一件事


不要使用NHibernate进行批量插入,请使用普通的ADO.NET命令和批量插入

使用正确的工具做一件事


不要使用NHibernate执行大容量插入,请使用普通ADO.NET命令和大容量插入

该场景很微妙,因为系统在批处理加载期间必须保持在线该场景很微妙,因为系统在批处理期间必须保持在线load@Pedro:此方法不一定意味着您必须复制业务规则。没有什么能阻止您创建域实体、检查验证,然后将验证后的数据填充到DataTable以进行批量插入。@Pedro:这种方法并不一定意味着您必须复制业务规则。没有什么可以阻止您创建域实体、检查验证,然后将验证后的数据填充到数据表以进行批量插入。