5

大量のデータ (20000 レコードの SQL クエリ) があり、データグリッドにその量のデータを入力するには 10 分ほどかかります。これが私のグリッドビュー定義です。

<asp:GridView ID="g" runat="server" Height="113px" Width="817px" 
BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" 
CellPadding="3" GridLines="Vertical" AllowPaging="True" Font-Size="Small" 
     PageSize="30">
    <AlternatingRowStyle BackColor="#DCDCDC" />
    <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
    <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
    <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
    <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
    <SortedAscendingCellStyle BackColor="#F1F1F1" />
    <SortedAscendingHeaderStyle BackColor="#0000A9" />
    <SortedDescendingCellStyle BackColor="#CAC9C9" />
    <SortedDescendingHeaderStyle BackColor="#000065" />
    <PagerStyle cssClass="gridpager" HorizontalAlign="Left" />  

</asp:GridView>

ご覧のとおり、AllowPaging プロパティを true に設定しました。

これは私がデータをバインドする方法です:

DataSet dts = new DataSet();
OracleDataAdapter oad = new OracleDataAdapter(query, co.conn);

cmd.CommandText = query;
cmd.CommandType = CommandType.Text;

cmd.CommandText = query;
cmd.CommandType = CommandType.Text;
OracleDataReader reader = cmd.ExecuteReader();

oad.Fill(dts);


g.DataSource = dts.Tables[0];
g.DataBind();

どうすればパフォーマンスを向上させることができますか?

データセット (oad.Fill(dts);) を埋めると、完了するまでに 10 分かかります。一度に20000件のレコードを設定したからでしょうか?ユーザーがグリッドビューを改ページしたときに、最初の 30 レコードのみを表示してデータを呼び出す方法はありますか? パフォーマンスを向上させる別の方法はありますか?

4

3 に答える 3

7

私の理解が正しければ、サーバーページングを追加します

単にAllowPaging="True"グリッドに追加する場合、デフォルトではGridView、サーバーからデータをページングする方法がわかりません。ページングは​​、結果全体がデータベースからフェッチされた後にメモリ内で実行され、これはバインドされるたびに発生しますGridView

サーバーページング(サーバーでページングし、クライアントに少量のレコードのみを送信する)を追加したいと思います。これを行うには、いくつかのASP.Netデータソースコントロールを利用できます。

データベースへの接続を手動で行っているため、クエリにページングコードを手動で追加し、そのコードをコントロールにマップする必要があります

(データベースとしてOracleを使用しているので)あなたを助けることができる唯一のデータソースコントロールは

  • SqlDataSource。残念ながら、すぐに使用できるサーバーページングは​​サポートされていないため、微調整する必要があります。
  • ObjectDataSource。コントロールと簡単に統合してGridViewページングを提供できますが、サーバーにデータをページ分割するには、クエリにコードを手動で追加するか、プロシージャを保存する必要があります。
  • EntityDatasource。EntityFrameworkを使用するときにデータベースに接続するために使用されます

たとえば、EFまたはNHibernateを使用する場合、コードは次のようになります。

g.DataSource = myContext.MyTable.Skip(pageIndex * pageSize).Take(pageSize);
g.DataBind();

を使用した例ObjectDatasource

ASPX

    <asp:ObjectDataSource runat="server" ID="ods" TypeName="MyObject" EnablePaging="True"
        SelectMethod="FindPaging"
        MaximumRowsParameterName="pageSize"
        SortParameterName="sortColumn"
        StartRowIndexParameterName="startIndex"
        SelectCountMethod="FindPagingCount" onselected="ods_Selected"
    >
        <SelectParameters>
            <asp:Parameter Name="sortColumn" Type="String" />
            <asp:Parameter Name="startIndex" Type="Int32" />
            <asp:Parameter Name="pageSize" Type="Int32" />
        </SelectParameters>
    </asp:ObjectDataSource>

            <asp:GridView ID="grid" runat="server" AllowPaging="True" AllowSorting="True" PageSize="10"
                DataSourceID="ods" AutoGenerateColumns="true">
            </asp:GridView>

データコンポーネント

[System.ComponentModel.DataObject]
public class MyObject
{
    [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
    public IEnumerable<employee> FindPaging(int startIndex, int pageSize, string sortColumn)
    {
        // place here your code to access your database and use the parameters to paginate your results in the server
    }

    [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
    public int FindPagingCount(int startIndex, int pageSize, string sortColumn)
    {
        var c = new DataClassesDataContext();

        return c.employees.Count();
    }
}
于 2012-07-18T14:39:32.917 に答える
2

簡単な解決策は、上位30行を取得し、次のセットを取得するときに、id>@lastidで上位30を実行して次の30行を取得することです。

そうすれば、30行しか要求できず、データベースからレコードセット全体を取得する必要はありません。

于 2012-07-18T14:40:04.850 に答える
2

ページングとは、一度に 'pagesize' アイテムのみを表示することを意味しますが、これらのいくつかのアイテムを表示する前に、データベースからすべてのデータを取得する必要があります。これは、クエリが実行するように指示しているためです。

「pagesize」項目のみを取得するようにクエリを変更する必要がありますOnPageIndexChanging。次に、次の「pagesize」項目についてデータベースを再クエリできるように、イベント ハンドラーをイベントに追加する必要があります。(または、設定したページングオプションに基づいて、以前のものなど。イベント引数には、ユーザーが要求したページインデックスが含まれます。)

「gridview paging」などの Web 検索を行うと、コード例を見つけることができますが、使用しているデータベースや取得方法などによってかなり異なります。

Oracle のページング:

https://stackoverflow.com/a/241643/351383

于 2012-07-18T14:40:26.657 に答える