4

以流方式(如 SQL Server Management Studio 所做的)从表(在 SQL Server 2012,BI 实例中)读取数百万条记录的最佳策略是什么?

我需要在本地缓存这些记录(C# 控制台应用程序)以进行进一步处理。

更新- 与 SqlDataReader 一起使用的示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Threading;


namespace ReadMillionsOfRows
{
    class Program
    {
        static ManualResetEvent done = new ManualResetEvent(false);


        static void Main(string[] args)
        {

          Process();
          done.WaitOne();
        }

        public static async Task Process()
        {
            string connString = @"Server=;Database=;User Id=;Password=;Asynchronous Processing=True";
            string sql = "Select * from tab_abc";

            using (SqlConnection conn = new SqlConnection(connString))
            {
                await conn.OpenAsync();
                using (SqlCommand comm = new SqlCommand(sql))
                {
                    comm.Connection = conn;
                    comm.CommandType = CommandType.Text;

                    using (SqlDataReader reader = await comm.ExecuteReaderAsync())
                    {
                        while (await reader.ReadAsync())
                        {
                            //process it here
                        }
                    }
                }
            }

            done.Set();
        }

    }
}
4

3 回答 3

7

使用 SqlDataReader 它只向前且快速。它只会在读取范围内保存对记录的引用。

于 2012-10-24T08:32:30.480 回答
3

这取决于您的缓存是什么样的。如果您要将所有内容存储在内存中,并且 DataSet 适合用作缓存,则只需将所有内容都读取到 DataSet 中。

如果没有,请SqlDataReader按照上面的建议使用,将记录一一读取,将它们存储在您的大缓存中。

但是请注意,对于大型数据库表 - 您的数据库,已经有一种非常流行的缓存机制。使用正确的索引配置,数据库可能会胜过您的缓存。

于 2012-10-24T09:36:41.560 回答
-1

您可以使用 Entity Framework 并使用Take和对选择进行分页,Skip以通过缓冲区获取行。如果您需要对如此大的数据集进行内存缓存,我建议您使用GC.GetTotalMemory它来测试是否还有可用内存。

于 2012-10-24T08:41:07.383 回答