Ich habe den folgenden Code in C# geschrieben, aber nach dem würde ich 4-5 Tage brauchen, um die Daten von der Oracle-Datenbank nach Elasticsearch zu migrieren. Ich füge die Datensätze in 100er-Schritten ein. Gibt es eine andere Möglichkeit, die Migration der 4 Millionen Datensätze schneller durchzuführen (wahrscheinlich in weniger als einem Tag, wenn möglich)?Wie fügen Sie 4 Millionen Datensätze von Oracle zur Elasticsearch-Tabelle schneller mit C# ein?
public static void Selection()
{
for(int i = 1; i < 4000000; i += 1000)
{
for(int j = i; j < (i+1000); j += 100)
{
OracleCommand cmd = new OracleCommand(BuildQuery(j),
oracle_connection);
OracleDataReader reader = cmd.ExecuteReader();
List<Record> list=CreateRecordList(reader);
insert(list);
}
}
}
private static List<Record> CreateRecordList(OracleDataReader reader)
{
List<Record> l = new List<Record>();
string[] str = new string[7];
try
{
while (reader.Read())
{
for (int i = 0; i < 7; i++)
{
str[i] = reader[i].ToString();
}
Record r = new Record(str[0], str[1], str[2], str[3],
str[4], str[5], str[6]);
l.Add(r);
}
}
catch (Exception er)
{
string msg = er.Message;
}
return l;
}
private static string BuildQuery(int from)
{
int to = from + change - 1;
StringBuilder builder = new StringBuilder();
builder.AppendLine(@"select * from");
builder.AppendLine("(");
builder.AppendLine("select FIELD_1, FIELD_2,
FIELD_3, FIELD_4, FIELD_5, FIELD_6,
FIELD_7, ");
builder.Append(" row_number() over(order by FIELD_1)
rn");
builder.AppendLine(" from tablename");
builder.AppendLine(")");
builder.AppendLine(string.Format("where rn between {0} and {1}",
from, to));
builder.AppendLine("order by rn");
return builder.ToString();
}
public static void insert(List<Record> l)
{
try
{
foreach(Record r in l)
client.Index<Record>(r, "index", "type");
}
catch (Exception er)
{
string msg = er.Message;
}
}
Ersetzen 'client.Index' mit 'client.IndexMany (..)' und versuchen Sie herauszufinden, optimale Chunk-Größe für Bulk einfügen https://www.elastic.co/guide/en/elasticsearch/guide/current/bulk.html#_how_big_is_too_big – Rob
* würde es Nimm mich 4-5 Tage * .. hast du ran und sehen, ob es wirklich 4/5 Tage dauert, 4M Reihen zu migrieren? – Rahul
Die 'ROW_NUMBER()' Funktion wird sich negativ auf die Leistung auswirken, und Sie führen es tausende Male aus. Sie verwenden bereits einen 'OracleDataReader' - er wird nicht alle vier Millionen Zeilen gleichzeitig auf Ihren Rechner laden, sondern im Prinzip einen oder mehrere gleichzeitig streamen. Sie sollten stattdessen eine einzige Abfrage haben, und während Sie Ihre 'Record' Objekte erstellen, alle 100 oder 500 oder 1000 (zB behalten Sie einen' count', der jede Schleife inkrementiert), committen Sie sie (zB bei 'count% 500 == 0'). Dies muss in Minuten oder Stunden machbar sein, nicht in Tagen. –