2012-03-05 4 views
3

У меня есть приложение, использующее gridview, которое очень медленно.DataBind() on Gridview slow

После добавления Trace=true для этой страницы я отслеживал, где время тратится: при вызове BindData() в GridView. GridView подключен к LinqDataSource.

Вот результат трассировки:

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"> 

в код:

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

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

Код LINQ Источник данных выглядит :

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.

И стол loc_access_contact выглядит следующим образом:

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] 

В таблице содержится около 287 контактов.

Почему DataBind работает так медленно? Как я могу отслеживать дальше, что происходит?

+0

Возможно, какое-то свойство в источнике оценивается медленно? – gabba

+0

Я добавил некоторую информацию об источнике, но я до сих пор не понимаю, почему это так медленно? В таблице в настоящее время имеется 287 записей. – Pierre

ответ

1

Если вы используете SQL Server - я бы поместил трассировку в приложение и снова запустил. Затем я бы выбрал фактический SQL, который был запущен. Запустите это непосредственно в базе данных, а затем посмотрите, можете ли вы определить узкие места.

Кажется, что вы возвращаете все данные в loc_access_contacts, так что это может быть объем данных.

Возможно, это сортировка. Вы сортируете по организации, last_name, first_name. У меня возникло бы желание разместить некластеризованный индекс в этих столбцах, чтобы помочь с сортировкой. Убедитесь, что эта таблица имеет разумный кластеризованный индекс, то есть первичный ключ.

Конечно, я предполагаю, что вы контролируете свою БД, которую я знаю, многие люди этого не делают. В этом случае (или, честно говоря, в каждом случае) используйте пейджинг в своей сетке. Если вы можете использовать какой-то разумный сервер подкачки на стороне сервера (то есть используя Skip и Take операторов LINQ), это значительно улучшит эффективность вашего связывания. Они будут просто намного меньше данных.

+0

Используйте профайлер SQL, чтобы увидеть, как запрос выполняется на стороне базы данных. – PraveenVenu

+0

абсолютно - извините, я не назвал его. Использовать SQL Profiler –

+0

Запрос является каноническим SELECT FROM

. В настоящее время в БД имеется 287 записей. – Pierre

Смежные вопросы