2012-02-27 1 views
1

進捗バーを使用して、データの行%がロードされた現在の進行状況を表示します。私はsimiliar questionが頼まれているのを見ましたが、ソリューションはマーキースタイルを使用することを推奨しています。大きなデータセットをクエリする現在の進行状況を示す方法は?

たとえば、大規模なデータテーブルをクエリするSelect文を実行すると、数秒かかる場合があります。 進捗バーがクエリの現在の進行状況を更新します。それは可能でしょうか?

私は私が必要とするいくつかのことがある知っている:

  1. 合計レコードの数が取得されます。 (Select count(1)を先に取得することができます)
  2. 取得したレコードの数を通知するための通知があります。

2.はどのように実装するのか分からない部分です。

私はカップルのクエリに分割すると考えることができますが、これは常に可能ではないかもしれません。

しかし、CursorとSQLの類似点についてはどうですか? SQL Serverにチャンクを照会してデータを返し、繰り返してもらうように依頼します。

for loop{ 
    //query a chunk of records 

    //return 

    //Next 
} 

だから私は、進行状況をcaculateし、単一DataTableにそれらを埋めることができます。

上記の操作は可能ですか?もしそうなら、どうですか?

大規模なデータテーブルの読み込みの進行状況を表示できるASP.NETアプリケーションを見たので、WPFで同じことを実装します。

+0

データアクセスに使用するもの:ORM、Webサービス、ADO.NETなど?バックエンドサーバーとは何ですか? – oleksii

+0

@oleksii Entity Frameworkを使用していますが、これはORMとは異なると思われます。ですから、私はADO.NETを使ってこれをSQL Serverで実装しようと考えています。 –

+0

@KingChan、あなたは進捗バーがORMを使用しない価値があると確信していますか? – svick

答えて

1

まず、クエリを2つに分割することはクエリ時間を2倍にしないことを確実にする必要があります。レコード数を得る前に数秒待っているかもしれませんが、あなたは何も解決していません。

あなた(データベースが同時実行を愛し、非常によく、それを扱う)に並列に両方のクエリを実行することができていますが、将来的には、スケーラビリティの問題になる可能性データベース、上の余分な負担をかけることになります。

チャンクでクエリを実行すると、最初にクエリ全体が完了するのを待つことなく、利用可能になったときにSqlDataReaderによってレコードをフェッチできるようになります。あなたは自分でDataTableに追加する必要があります。

+0

+1私は答えとしてこれを選択します。それは私の質問に一番合っているからです。 –

1

現在のデータセットのカウントをクエリすると、すべての行を繰り返し処理します。それはちょうどそれをフェッチするほど遅いです。あなたは、SQLステートメントでカウントを選択しようとする可能性があります。 例:"SELECT COUNT(ID_COLUMN) FROM TABLE WHERE ..."。それはあなたが実行する必要がある別のSQLステートメントですが、データセットにそれが何であるかを尋ねるほど速くなります。
C#プログレスバーコントロールがあります。最大値を設定するだけで、ループを反復するたびにfunction step()を呼び出すことができます。プログレスバーを一歩前に設定します;) パーセント計算を行う必要はありません。

+0

+1。これは、 "クエリが遅い"ではなく、 "私のmillsionの行には年齢がかかる"問題を解決します。それとは逆に、重いクエリーで2回サーバーにヒットします。人々はそのような最適化のために解雇されます。 – TomTom

+0

私が知る限り、これはSQLデータセットでプログレスバーを使用する最善の方法です。私はもっ​​と良い解決策を学ぶのを楽しみにしています! – gimbar

+0

@gimbar 'select by count by sql statement'とは何を意味するのでしょうか? –

2

テーブル全体をメモリにロードしている場合は、間違っている可能性があります。ユーザーは本当にそのデータをすべて必要としていますか?同時に何人のユーザーがデータベースに問い合わせますか?あなたはユーザーがテーブル全体で作業することを確信していますか?

あなたはページネーションパターン使用することを検討するよりも、これらすべての質問にはいに答えた場合:スキップ + を取ると、あなたは、スキップ/とり/合計値と進捗更新イベントを上昇することができます。

//META CODE 
var dataTable = new List<DataTable>(); //in-memory storage 
int rowCount = [...].Rows.Count(); //this is fast check with database 
int current; 

while (current < rowCount) 
{ 
    var fetchedData = [...].Skip(current).Take(1000).ToList(); 
    dataTable.AddRange(fetchedData); 
    current = dataTable.Rows.Count(); 

    //fire progress update event 
} 
+0

'[..]'とは何ですか? –

+0

これは、EF、SqlDataReaderまたは他の何かを介して実際のデータベースにアクセスする方法です(構文を許してください。これはちょうどアイデアを示すためです)。 – oleksii

+0

+1ありがとうございます。 –

関連する問題