首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#从Server 2014检索大量数据的更好方法?

c#从Server 2014检索大量数据的更好方法?
EN

Stack Overflow用户
提问于 2016-06-10 16:14:32
回答 1查看 1.9K关注 0票数 0

上下文:我检索大量数据,以便在ElasticSearch集群中对它们进行索引(它没有-sql格式)。

通过确定需要使用for循环创建多少委托来做到这一点,这取决于当前的分析表与我的bulk_size相比有多少行,并执行它们来执行下面的代码。

我用offset-fetchtb表示当前表,我的当前bulk_size为5000。

我的代码如下所示:

代码语言:javascript
复制
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的内存不断增加(缓存太大),而在后期大容量抓取中,我会得到超时异常等等;它会变慢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-16 18:47:51

解决方案是创建一个只有主键的临时表,并从表和带有联接的临时表之间来回查询。

这比offset-fetch的内存效率高得多,而且速度也更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37752838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档