linq Gridview上的DataBind()速度慢

6pp0gazn  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(637)

我有一个使用gridview的应用程序,它真的很慢。
在为页面添加了Trace=true之后,我跟踪了时间花在哪里:当在GridView上调用BindData()时。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">

在Code Behind中:

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这么慢?我如何进一步追踪正在发生的事情?

wko9yo5t

wko9yo5t1#

如果您使用的是SQL Server -我会对应用程序进行跟踪,然后再次运行。然后,我将挑选出实际运行的SQL。直接在数据库上运行它,然后看看是否能发现瓶颈。
看起来好像您正在带回loc_access_contacts中的所有数据,因此它可能是数据的绝对量。
另一个可能是排序。您正在按组织、姓氏和名字排序。我很想在这些列上放置一个非聚集索引,以帮助提高排序效率。请检查此表是否有合理的聚集索引,即主键
当然,我在这里假设你可以控制你的数据库,我知道很多人都没有。在这种情况下(或者说在任何情况下),在网格中使用分页。如果您可以使用某种合理的服务器端分页(即通过使用SkipTake LINQ操作符),这将大大提高绑定效率。它们将只是更少的数据。

798qvoo8

798qvoo82#

我也遇到过同样的问题,但是当我试着用一个简单的小技巧解决了它
我只是将(Select * From TableName)替换为(Select Top [Num] * From TableName

**将Num替换为结果中预期的最大记录数。

这会带来巨大的不同

相关问题