2012-03-05 69 views
3

私は本当に遅いgridviewを使用しているアプリケーションを持っています。GridviewのDataBind()が遅い

ページにTrace=trueを追加した後、私はGridViewでBindData()を呼び出すときに、時間が費やされた場所を追跡しました。 GridViewLinqDataSourceに接続されています。ここで

は、トレース出力です:LINQデータソースコードのように見える

Trace.Write(" DataBind"); 
gvContact.DataBind(); 

Trace.Write(" PopulateStates"); 
populateStates(contact); 

:ここ

GetContact  0.955485090710761  0.000339 
    DataBind  0.97438854173692   0.018903 
    PopulateStates 6.58986882347249   5.615480 

は、サンプルのasp.netページでは、コードで

<asp:LinqDataSource ContextTypeName="DAL.BALDataContext" TableName="loc_access_contacts" 
    ID="_ldsContact" runat="server" OrderBy="organisation, last_name, first_name"> 
</asp:LinqDataSource> 
<cc1:CustomGridView ID="gvContact" runat="server" DataSourceID="_ldsContact" AutoGenerateColumns="False" Width="100%" 
    DataKeyNames="person_id" ForeColor="#333333" GridLines="None" AllowPaging="False" 
    AllowSorting="True" BorderStyle="None" ShowFooter="false" CaptionAlign="Top" 
    PagerStyle-HorizontalAlign="Left" HeaderStayPolicy="NotStay" SessionKey="Contact.GridView.Columns.SortSettings" 
    SaveKey="ContactManagementSortSettings" OnRowCommand="gvContact_RowCommand" OnSorting="gvContact_Sorting"> 

背後にあります:

public System.Data.Linq.Table<loc_access_contact> loc_access_contacts 
{ 
    get 
    { 
    return this.GetTable<loc_access_contact>(); 
    } 
} 

このプロパティから生成されるSQLは、標準SELECT <all fields> FROM loc_access_contactです。テーブルには、およそ287の連絡先が含まれてい

CREATE TABLE [dbo].[loc_access_contact](
[person_id] [int] IDENTITY(1,1) NOT NULL, 
[organisation] [nvarchar](50) NULL, 
[last_name] [nvarchar](50) NULL, 
[first_name] [nvarchar](50) NULL, 
[is_active] [tinyint] NULL, 
[state_id] [char](2) NULL, 
[postal_code] [nchar](4) NULL, 
[town] [nvarchar](50) NOT NULL, 
[phone_number] [nvarchar](20) NULL, 
[mobile_number] [nvarchar](20) NULL, 
[fax_number] [nvarchar](20) NULL, 
[email_address] [nvarchar](255) NULL, 
[street_name] [nvarchar](255) NULL, 
[house_number] [nvarchar](20) NULL, 
[postal_box] [nvarchar](20) NULL, 
[language] [tinyint] NULL, 
CONSTRAINT [PK_person] PRIMARY KEY CLUSTERED 
(
[person_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

:よう

とテーブルloc_access_contactが見えます。

どのようにDataBindが遅いですか?何が起こっているのかをさらに追跡するにはどうすればよいですか?

+0

おそらく、ソースの一部のプロパティが遅いと評価されますか? – gabba

+0

ソースに関するいくつかの情報を追加しましたが、まだそれほど遅い理由は分かりません。テーブルには現在287のエントリがあります。 – Pierre

答えて

1

SQL Serverを使用している場合は、アプリケーションにトレースを入れてからもう一度実行します。次に、実行された実際のSQLを選択します。それをデータベース上で直接実行して、ボトルネックを見つけることができるかどうかを確認します。

すべてのデータをloc_access_contactsに戻しているように見えます。そのデータは膨大なデータ量になる可能性があります。

もう1つはソートです。あなたは組織、last_name、first_nameでソートしています。私は効率的な並べ替えを支援するために、これらの列に非クラスタ化インデックスを配置するように誘惑されるだろう。この表には分かりやすいクラスタ化インデックス、つまり主キーがあることを確認してください。

もちろん私はあなたがあなたのDBを支配していることを前提にしていますが、私は多くの人がそれを知らないことを知っています。その場合(あるいは正直なところ)、グリッド内でページングを使用します。分かりやすいサーバーサイドページングを使用できる場合(つまり、SkipTake LINQ演算子を使用すると)、バインド効率が大幅に向上します。彼らは単純にはるかに少ないデータになります。

+0

SQLプロファイラを使用して、クエリがデータベース側でどのように実行されるかを確認します。 – PraveenVenu

+0

絶対に申し訳ありません、私はそれに名前をつけませんでした。 SQLプロファイラを使用 –

+0

クエリは正規のSELECT から

です。 DBに現在287のエントリがあります。 – Pierre

関連する問題