从DB读取大量数据的最快方法

时间:2013-02-17 14:22:23

标签: c# ado.net

我有一张包含大约5亿条记录的表格。我正在从表中读取数据并将其存储在字典中。

编辑:我正在将数据加载到字典中,因为这些数据需要与来自索引服务器的另一批数据进行比较。

我的代码如下:

public static void GetDetailsFromDB()
{
    string sqlStr = "SELECT ID, Name ,Age, email ,DOB ,Address ,Affiliation ,Interest ,Homepage FROM Author WITH (NOLOCK) ORDER BY ID";
    SqlCommand cmd = new SqlCommand(sqlStr, _con);
    cmd.CommandTimeout = 0;

    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            //Author Class
            Author author = new Author();

            author.id = Convert.ToInt32(reader["ID"].ToString());
            author.Name = reader["Name"].ToString().Trim();
            author.age = Convert.ToInt32(reader["Age"].ToString());
            author.email = reader["email"].ToString().Trim();
            author.DOB = reader["DOB"].ToString().Trim();
            author.Address = reader["Address"].ToString().Trim();
            author.Affiliation = reader["Affiliation"].ToString().Trim();
            author.Homepage = reader["Homepage"].ToString().Trim();

            string interests = reader["Interest"].ToString().Trim();
            author.interest = interests.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Trim()).ToList();

            if (!AuthorDict.ContainsKey(author.id))
            {
                AuthorDict.Add(author.id, author);
            }

            if (AuthorDict.Count % 1000000 == 0)
            {
                Console.WriteLine("{0}M author loaded.", AuthorDict.Count / 1000000);
            }
        }
    }
}

此过程需要很长时间才能从DB中读取和存储所有5亿条记录。此外,RAM使用率非常高。

这可以优化吗?还能减少运行时间吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

如果我抓住我的鼻子,我可以提出以下优化措施:

  1. 将字段的序号位置存储在局部变量中,并使用这些序数变量引用reader中的字段。

  2. 请勿在阅读器上调用ToString并转换 - 只需以正确的类型输出值。

  3. 只要您拥有ID,就检查AuthorDict中是否存在作者ID。如果你不需要它,甚至不要创建Author实例。

    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        var idOrdinal = reader.GetOrdinal("ID");
        //extract other ordinal positions and store here
    
        while (reader.Read())
        {
            var id = reader.GetInt32(idOrdinal);
    
            if (!AuthorDict.ContainsKey(id))
            {
                Author author = new Author();
                author.id = reader.GetInt32(idOrdinal);
                ...
            }
        }
    }