如何使用C#更快地将400万条记录从Oracle插入到Elasticsearch表中?我有以下用C#编写的代码,但根据它,将数据从Oracle数据库迁移到Elasticsearch需要4-5天。我以100条为一组插入记录。有没有其他方法可以更快地移动400万条记录(如果可能,可能不到一天)?publicstaticvoidSelection(){for(inti=1;i<4000000;i+=1000){for(intj=i;j<(i+1000);j+=100){OracleCommandcmd=newOracleCommand(BuildQuery(j),oracle_connection);OracleDataReader阅读器=cmd。执行阅读器();列表list=CreateRecordList(reader);插入(列表);}}}privatestaticListCreateRecordList(OracleDataReaderreader){Listl=newList();字符串[]str=新字符串[7];try{while(reader.Read()){for(inti=0;i<7;i++){str[i]=reader[i].ToString();}Recordr=newRecord(str[0],str[1],str[2],str[3],str[4],str[5],str[6]);l.Add(r);}}catch(Exceptioner){stringmsg=er.Message;}返回l;}privatestaticstringBuildQuery(intfrom){intto=from+change-1;StringBuilder构建器=newStringBuilder();(@"选择*来自");builder.AppendLine("(");builder.AppendLine("选择FIELD_1,FIELD_2,FIELD_3,FIELD_4,FIELD_5,FIELD_6,FIELD_7,");builder.Append("row_number()over(orderbyFIELD_1)rn");builder.AppendLine("fromtablename");builder.AppendLine(")");builder.AppendLine(string.Format("wherernbetween{0}and{1}",from,to));builder.AppendLine("orderbyrn");returnbuilder.ToString();}publicstaticvoidinsert(Listl){try{foreach(Recordrinl)client.Index(r,"index","type");}catch(Exceptioner){stringmsg=er.Message;}}ROW_NUMBER()函数会对性能产生负面影响,并且您已经运行了数千次您已经在使用OracleDataReader-它不会一次将所有四百万行拉到您的机器上,它基本上只是将它们流式传输一次或多次。这必须是在几分钟或几小时内完成,而不是几天-我们有几个进程以类似的方式在Sybase和SQL服务器之间移动数百万条记录,并且只需要不到五分钟。也许试一试:OracleCommandcmd=newOracleCommand("SELECT...FROMTableName",oracle_connection);intbatchSize=500;使用(OracleDataReaderreader=cmd.ExecuteReader()){Listl=newList(batchSize);字符串[]str=新字符串[7];intcurrentRow=0;while(reader.Read()){for(inti=0;i这是Commit的样子:publicvoidCommit(IEnumerablerecords){//TODO:使用ES的BULK特性,我不知道确切的语法客户端.IndexMany(records,"index","type");//client.Bulk(b=>b.IndexMany(records))...类似这样的东西}但你不是以100的批次插入最后,你一次插入一个(可能连插入一个的正确代码都没有)foreach(Recordrinl)client.Index(r,"index","type");如果只插入一次一行,所有当你得到下一批时,读girations不做任何事情,你只是引入滞后读取(几乎)总是比写入快while(reader.Read()){client.Index(newRecord(reader.GetSting(0),reader.GetSting(1),reader.GetSting(2),reader.GetSting(3),reader.GetSting(4),reader.GetSting(5),reader.GetSting(6),“索引”,“类型”);}reader.Close();如果要并行读取和写入,可以使用BlockingCollection但使用最大大小读取不要在写入之前走得太远。以上就是C#学习教程:如何使用C#更快的从Oracle向Elasticsearch表中插入400万条记录?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
