0

asp:GridView コンポーネントにデータを表示する .aspx 画面があります。ページの読み込み時に最大約 30,000 件のレコードが返される可能性があります。データベースから 13000 レコードを取得するのに約 30 秒かかります。これは遅いですか、それとも速いですか? データベースからレコードを取得するためにストアド プロシージャを使用しています。次に、実行に 2 分以上かかる foreach ループがありますか? そのため、ページの読み込みに aapr 4 分かかります。

私は asp.net の初心者です。ページの読み込みの遅延を改善するために私を助けてもらえますか?

ここにループ構造があります..何らかの方法で最適化できますか?

List auditList = retrievedatafromdatabase();// このメソッドはデータベースからレコードを返します

               foreach (Entity obj in auditList)
                {

                    obj.CultSpecificRevisedData = "NULL";
                    obj.CultSpecificPublishedData = "NULL";

                    if (obj.RevisedData != null && obj.RevisedData != "NULL")
                        obj.CultSpecificRevisedData = ConvertToProfileSpecificFormat(Convert.ToDecimal(obj.RevisedData), DecimalSeparator);
                    if (obj.PublishedData != null && obj.PublishedData != "NULL")
                        obj.CultSpecificPublishedData = ConvertToProfileSpecificFormat(Convert.ToDecimal(obj.PublishedData), DecimalSeparator);

                    var yearPart = obj.CalendarYear;
                    var monthPart = string.Empty;
                    var frequencyName = GetEnglishFrequencyBame(frequencyTypeMasId);
                    if (frequencyName == FrequencyType.Monthly)
                    {
                        monthPart = new DateTime(obj.CalendarYear, GetMonthNumber(obj.Month), 1).ToString("MMM");
                        obj.CultSpecificPeriod = monthPart + "-" + yearPart.ToString();
                    }
                    if (frequencyName == FrequencyType.Quarterly)
                    {
                      UserMessage = obj.QuarterName;
                        obj.CultSpecificPeriod = UserMessage + "-" + yearPart.ToString();
                    }
                    else if (frequencyName == FrequencyType.BiAnnually)
                    {
                        UserMessage = obj.SemesterName;
                        obj.CultSpecificPeriod = UserMessage + "-" + yearPart.ToString();
                    }
                    else
                    {
                        obj.CultSpecificPeriod = yearPart.ToString();
                    }


                }
4

2 に答える 2

2

ページングは​​最初のオプションです。

しかし、次のことを考慮する必要があります: 本当に 30K レコードが必要ですか? ユーザーは通常、最初の 10\20 レコードを調べません。最初の 100\1000 のみを返し、結果セットを科学的に制限する優れた検索およびフィルター機能を提供してみてください。

私は同じ問題を抱えていましたが、ユーザーはそれほど多くの結果を必要とせず、これらの結果から必要なものを見つける良い方法を必要としていることがわかりました.

もちろん、ページングと一緒に組み込むこともできます。

ページングが解決策に合わない場合 (何らかの理由で) 言われたことに同意しない場合は、コードを投稿してください。パフォーマンスの最適化を支援します。時には非常に難しい作業であることを覚えておいてください。

于 2013-01-31T03:51:53.853 に答える
0

30K レコードは実際には必要ないというコメントを繰り返します。調査によると、人間は約 2000 を超えるリスト アイテムを実際に視覚的に処理することはできず、これを超えるリスト アイテムを表示すると、ユーザーに誤った、または不完全なデータの感覚を与えるよう促すことで、効果的に嘘をつくことになります。

ただし、これをやり続ける場合は、手動で設定されたレコードを反復処理し、Response.Write() を使用して各行の html を手動で作成し、ブラウザーに送信してから、カウンターを使用して呼び出します。 Response.Flush() 時々。結果セット全体をRAMにロードするのではなく、データレイヤーがデータベースからのデータのストリーミングもサポートしている場合(つまり、データリーダーを介して)のボーナスポイント。

于 2013-01-31T04:40:32.590 に答える