プロが教えるわが家の防犯対策術!

開発環境:VB.NET&ASP

いつもお世話になっています。
現在、上記環境でWebアプリの開発を行っていますが
GridView表示に時間がかかり過ぎているため表示を高速化する手段を探しています。
現状、GridViewを表示する際には以下の時間がかかっています。
・270件→約8秒から9秒
・540件→約35秒から36秒

検索しましたが回避策を得ることが出来ませんでしたので有用な手段など
ご存知の方がいらっしゃいましたらご教授いただきたく思います。
よろしくお願い致します。

GridViewは以下の定義となっています。
------------------------------------------------------------
<asp:ButtonField ButtonType="Button" CommandName="InsertCommand" HeaderText="A"
ShowHeader="True" Text="A" />
<asp:ButtonField ButtonType="Button" CommandName="EditCommand" HeaderText="B"
ShowHeader="True" Text="B" />
<asp:ButtonField ButtonType="Button" CommandName="MoveCommand" HeaderText="C"
ShowHeader="True" Text="C" />
<asp:ButtonField ButtonType="Button" CommandName="PasteCommand" HeaderText="D"
ShowHeader="True" Text="D" />
<asp:BoundField DataField="seq" HeaderText="E" SortExpression="E" />
<asp:BoundField DataField="F" HeaderText="F"
SortExpression="F" />
<asp:BoundField DataField="G" HeaderText="G"
SortExpression="G" />
<asp:BoundField DataField="H" HeaderText="H"
SortExpression="H" >
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="I" HeaderText="I"
SortExpression="I" />
<asp:BoundField DataField="J" HeaderText="J"
SortExpression="J" >
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="K" HeaderText="K" SortExpression="K"
ItemStyle-HorizontalAlign="Left" >
<ItemStyle HorizontalAlign="Left" />
</asp:BoundField>
<asp:BoundField DataField="L" HeaderText="L"
SortExpression="L" ItemStyle-HorizontalAlign="Left" >
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="M" HeaderText="M"
SortExpression="M" >
<ItemStyle HorizontalAlign="Left" />
</asp:BoundField>
<asp:BoundField DataField="N" HeaderText="N"
SortExpression="N" ItemStyle-HorizontalAlign="Left" >
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="O" HeaderText="O"
SortExpression="O" ItemStyle-HorizontalAlign="Left" >
<ItemStyle HorizontalAlign="Left" />
</asp:BoundField>
<asp:TemplateField HeaderText="P" SortExpression="P">
<EditItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server"
Checked='<%# Bind("P") %>' />
</EditItemTemplate>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("P") %>'
Enabled="true" />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
------------------------------------------------------------

VB.NETソース
------------------------------------------------------------
Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("connect").ConnectionString

strSql = "SELECT E, F, G, H, I, J, K, L, M, N, O, P FROM TABLE_NAME WHERE X = '" & Ddl.SelectedValue & "' ORDER BY E"
Dim connection As New SqlClient.SqlConnection(cnStr)
Dim adapter As New SqlClient.SqlDataAdapter(strSql, connection)
adapter.Fill(ds)
GridView1.DataSource = ds
GridView1.DataBind()
------------------------------------------------------------

A 回答 (2件)

No.1です。

速度が遅い問題を解決するには、まずどこが遅いのか計測してください。たとえば、

1.SQL Server のデータ取得に時間がかかっている
2.サーバ側の DataBind 処理に時間がかかっている
3.ネットワークの回線速度が遅い
4.結果の HTML サイズが大きすぎる

といったように色々な要因が考えられ、それぞれ解決方法が異なります。仮に大量のデータを扱うことのできるコントロールがあったとしても、ネットワーク速度が遅ければ解決しません。
恐らく3.4.の複合要因ではないでしょうか?

サーバ側で処理開始~終了や要所でのログを出力、ストップウォッチで計測、スタックトレースをとる、HTMLをメモ帳で保存しサイズ確認等、色々調べてみてください。

どうしても大量のデータをクライアントと送受信する必要があるのであれば、Windows アプリや Silverlight 等をクライアントにして、圧縮データをサーバと送受信する、など仕組み自体を変えなければ解決しないかもしれません。
    • good
    • 0
この回答へのお礼

edp3143さま

ご回答ありがとうございます。
当方でも以下の調査を行い解決することが出来ました。

1.全てのボタンをVisible=Falseにして表示を実施
→瞬時にGridViewが表示されることを確認
2.ボタン2つをVisible=False、残りのボタン2つをVisible=Trueにして表示を実施
→4,5秒でGridViewが表示されることを確認
3.全てのButtonTypeをLinkに変更して表示を実施
→瞬時にGridViewが表示されることを確認

上記試行結果よりボタンが原因であると推測しました。
また以下のMSのサイトではバインドコントロール内に
子コントロールを作成するとパフォーマンスが低下する旨の記載もありました。
http://msdn.microsoft.com/ja-jp/library/ms998549 …

このため以下の要因により現象が発生していたと判断しました。
・ボタンの描画に時間がかかっていたこと
・GridViewにボタンコントロールを4つ配置していたこと
・大量のデータであったこと
→そのためButtonTypeをLinkに変更して対応することとしました。

edp3143さまからご教授いただきました解決方法も今後の参考にさせていただきます。
ありがとうございました。

お礼日時:2009/04/10 09:34

GridView にそんな大量データを表示することがそもそもの間違いです。

それだけの件数表示しても本当に見るの?という話です。

普通は Google の検索結果などのようにページング処理を行って、少しずつ表示するようにします。

この回答への補足

edp3143さま
ご回答ありがとうございます。

この一覧はPDFファイルに出力するレイアウトを作成するためのもので
各項目をあわせると基本的に約300件ほどになります。
レイアウト作成のため行の追加、編集、削除が必要となり
ページング処理を行うことができません。
(説明不足でした。申し訳ありません。)

なおGridView は大量のデータを扱うには不向きとのことですが
大量のデータを扱うのに適したコントロールにはどのようなものがあるのでしょうか?
VB.NET&ASPともに始めたばかりのため知識不足で試行錯誤してGridView を使っていました。
よろしければ引き続きご教授をよろしくお願いいたします。

補足日時:2009/04/08 20:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています