Sql server linq2db-服务器端批量复制

Sql server linq2db-服务器端批量复制,sql-server,etl,linq2db,Sql Server,Etl,Linq2db,我正在尝试使用linq2db进行数据库端大容量复制,即选择插入/插入。然而,我的代码试图将数据集传送到网络上,考虑到所讨论的数据库的大小,这是不可能的 我的代码如下所示: 使用var db=new MyDb{ var list=db.SourceTable。 其中=>s.年份>2012年。 GroupBys=>new{s.Column1,s.Column2}。 Selectg=>newdestinationtable{ Property1='常量值', 属性2=g.First.Column1,

我正在尝试使用linq2db进行数据库端大容量复制,即选择插入/插入。然而,我的代码试图将数据集传送到网络上,考虑到所讨论的数据库的大小,这是不可能的

我的代码如下所示:

使用var db=new MyDb{ var list=db.SourceTable。 其中=>s.年份>2012年。 GroupBys=>new{s.Column1,s.Column2}。 Selectg=>newdestinationtable{ Property1='常量值', 属性2=g.First.Column1, 属性3=g.First.Column2, 属性4=g.计数=>s.Column3=='Y' }; db.ExecuteTRUNCATE表DESTINATION_表; db.BulkCopynew BulkCopyOptions{ BulkCopyType=BulkCopyType.MultipleRows },名单; } 生成的SQL如下所示:

执行前 -DBNAME SqlServer.2017 截断表目的地_表 数据连接 执行后的查询执行时间:00:00:00.0361209。受影响的记录:-1。 数据连接 执行前 -DBNAME SqlServer.2017 声明@take Int-Int32 设置@take=1 声明@take_1 Int-Int32 设置@take_1=1 声明@take_2 Int-Int32 ... 选择 选择TOP@take [p] [年度] 从…起 [dbo].[SOURCE_TABLE][p] 哪里 [p_16].[YEAR]=[p].[YEAR]或[p_16].[YEAR]为空,[p].[YEAR]为空,并且。。。 ... 来源于表p_16 其中p_16.YEAR>2012 分组 ... 数据连接 这就是bulkcopy超时失败时记录的全部内容,即SqlException执行超时已过期

请注意,将此查询作为INSERT INTO语句直接在数据库中运行不到1秒


PS:对于基于代码的好的ETL工具,谁有什么建议来完成大型DB+1 TB的ETL。考虑到数据库的大小,我需要在数据库中运行一些东西,而不是通过网络传输数据。我试过pyspark、python bonobo、c etlbox,它们都移动了太多的数据。我认为linq2db有潜力,也就是说,基本上就像一个C到SQL的transpiler,但它也在尝试移动数据。

经过一些调查后,我偶然发现。这让我找到了解决办法。上述代码需要更改为:

db.ExecuteTRUNCATE表DESTINATION_表; db.SourceTable。 其中=>s.年份>2012年。 GroupBys=>new{s.Column1,s.Column2}。 Selectg=>newdestinationtable{ Property1='常量值', 属性2=g.First.Column1, 属性3=g.First.Column2, 属性4=g.计数=>s.Column3=='Y' }.Insertdb.DestinationTable,e=>e;
linq2db项目的文档有点不尽如人意,但就功能而言,它看起来像是一个伟大的ETL项目,没有可怕的1000行复制/粘贴sql/ssis脚本。

经过一些调查后,我偶然发现。这让我找到了解决办法。上述代码需要更改为:

db.ExecuteTRUNCATE表DESTINATION_表; db.SourceTable。 其中=>s.年份>2012年。 GroupBys=>new{s.Column1,s.Column2}。 Selectg=>newdestinationtable{ Property1='常量值', 属性2=g.First.Column1, 属性3=g.First.Column2, 属性4=g.计数=>s.Column3=='Y' }.Insertdb.DestinationTable,e=>e;
linq2db项目的文档还有一点不尽如人意,但是就功能而言,它看起来像是一个伟大的ETL项目,没有可怕的1000行复制/粘贴sql/ssis脚本。

我建议重写您的查询,因为group by无法返回第一个元素。Truncate也是库的一部分

var sourceQuery= 从db.SourceTable中的s 其中s.年份>2012年 选择新的 { 来源=s, Count=Sql.Ext.Counts.Column3='Y'?1:null.Over .PartitionBys.Column1,s.Column2.ToValue RN=Sql.Ext.RowNumber.Over .PartitionBys.Column1,s.Column2.OrderByDescs.Year.ToValue }; db.DestinationTable.Truncate; sourceQuery.where=>s.RN==1 .Insertdb.DestinationTable, e=>new DestinationTable { Property1='常量值', Property2=e.Source.Column1, 属性3=e.Source.Column2, 属性4=e.计数 };
我建议重写您的查询,因为GROUPBY无法返回第一个元素。Truncate也是库的一部分

var sourceQuery= 从db.SourceTable中的s 其中s.年份>2012年 选择新的 { 来源=s, Count=Sql.Ext.Counts.Column3='Y'?1:null.Over .PartitionBys.Column1,s.Column2.ToValue RN=Sql.Ext.RowNumber.Over .PartitionBys.Column1,s.Column2.OrderByDescs.Year.ToValue }; db.DestinationTable.Truncate; sourceQuery.where=>s.RN==1 .Insertdb.DestinationTable, e=>new DestinationTable { Property1='常量值', Property2=e.Source.Column1, 属性3=e.Source.Column2, 属性4=e.计数 }; 好的
tch,linq2db对于ETL非常强大。很好,linq2db对于ETL非常强大。