4

テーブル (SQL Server 2012、BI インスタンス) から何百万ものレコードをストリーミング方式 (SQL Server Management Studio のように) で読み取るための最良の戦略は何ですか?

さらに処理するために、これらのレコードをローカル (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上記のように使用して、レコードを 1 つずつ読み取り、大きなキャッシュに保存します。

ただし、大規模なデータベース テーブル (データベース) 用の非常に一般的なキャッシュ メカニズムが既に存在することに注意してください。適切なインデックス構成により、データベースはおそらくキャッシュよりも優れたパフォーマンスを発揮します。

于 2012-10-24T09:36:41.560 に答える
-1

Entity Framework を使用し、および を使用して選択をページ付けしてTakeSkipバッファで行をフェッチすることができます。GC.GetTotalMemoryこのような大規模なデータセットのメモリ内キャッシュが必要な場合は、空きメモリが残っているかどうかをテストするために使用することをお勧めします。

于 2012-10-24T08:41:07.383 に答える