0
上下文:我检索大量数据以在ElasticSearch集群中对其进行索引(它具有no-sql格式)。c#更好的方式来从SQL Server 2014中检索大量数据?
我这样做是通过确定有多少代表需要使用for循环创建,具体取决于当前分析表与我的bulk_size
相比有多少行,并执行它们以执行下面的代码。我使用offset-fetch
。 tb
表示当前的表,我目前bulk_size
是5000
我的代码如下所示:
using (SqlConnection db = new SqlConnection(tb.Conn))
{
int offset = i * BULK_SIZE;
int nextRows = BULK_SIZE;
string queryParams = string.Format(" ORDER BY {0} OFFSET {1} ROWS FETCH NEXT {2} ROWS ONLY", tb.FirstPK(), offset, nextRows);
string dataQuery = string.Format("SELECT * FROM dbo.{0} {1}", tb.TableName, queryParams);
try
{
db.Open();
object[,] bulk = new object[BULK_SIZE, 2];//[data[], id]
int n = 0;
object[] values;
using (SqlDataReader reader = new SqlCommand(dataQuery, db).ExecuteReader())
{
while (reader.Read())
{
string docId = string.Empty;
foreach (string pk in tb.PKeys)
{
docId += reader[pk].ToString() + '_';
}
docId = docId.Substring(0, docId.Length - 1);//delete last '_'
values = new object[reader.FieldCount];
reader.GetValues(values);
bulk[n, 0] = values;
bulk[n, 1] = docId;
n++;
}
reader.Close();
}
db.Close();
if (IsMemoryAvailable())//Waits for other delegates to finish
{
DataUpload(bulk, tb, mapper);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); Console.ReadLine();
//throw e;
}
}
有没有更好的方式来做到这一点?
我得到然后批量,插入到一个数组并处理在另一个任务批量。
问题是SQL Server的内存不断增大(缓存变得太大),并且在后期大容量获取中,我得到超时异常等;它会变慢。
我会建议改变你的'SELECT * FROM'选择你需要的实际列..如果你需要2列然后不使用select *也改变这个查询是一个存储过程 – MethodMan
什么是在那里有Task.Run?恕我直言,它只是浪费一个额外的线程,因为调用线程仍然被Wait()阻塞。另外,如果那里的代码会抛出异常,你将会得到AggregateException而没有任何有意义的消息。 –
@KasparsOzols你是对的;我在“Task.WaitAll”调用中封装任务时遇到了问题,但以后忘记更改它。 –