如何跟踪我的场景的缓慢来源?

时间:2011-06-21 17:02:55

标签: asp.net sql-server linq linq-to-sql telerik

我对此性能问题感到困惑。在分页RadGrid时,我得到了瞬时结果。但是,当我过滤任何列时,查询大约需要10秒才能完成,并且在过滤器之后应用的任何分页都会保持同样缓慢。如果我删除过滤器,性能就好了。

生产是SharePoint 2010服务器,由少数用户在内部托管。我正在使用RadGrid控件,版本2009.3..1314.35,查询包含30,000条记录的表。我正在使用LINQ to SQL作为后端。我在生产中使用过IE和Firefox。在我的开发机器上没有性能问题。

查询并不复杂,记录来源不是特别大且流量很低,所以我不确定如何跟踪问题。以下是我的一些想法:

  • 我的LINQ查询出了问题。
  • 滥用或误解RadGrid。
  • 数据库未优化?我将它从Access转换为SQL Server 2008。
  • 网络问题?

以下是我的代码。任何帮助将不胜感激。

ASPX:

                                                         

      <telerik:GridTemplateColumn AllowFiltering="false" SortExpression="Marked" HeaderText="Marked" UniqueName="Marked">

           <ItemTemplate>
             <asp:CheckBox
               ID="chkbxMarked" runat="server"
               OnCheckedChanged="ToggleRowSelection"
               Checked='<%# Eval("Marked") %>'
               AutoPostBack="True" />
           </ItemTemplate>
        </telerik:GridTemplateColumn>
        <telerik:GridBoundColumn DataField="NamePrefix" SortExpression="NamePrefix" AllowFiltering="false" HeaderText="Name Prefix" />
        <telerik:GridBoundColumn DataField="LastName" SortExpression="LastName"  AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="Last Name" />
        <telerik:GridBoundColumn DataField="FirstName" SortExpression="FirstName" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="First Name" />
        <telerik:GridBoundColumn DataField="MiddleName" SortExpression="MiddleName" AllowFiltering="false" HeaderText="Middle Name" />
        <telerik:GridBoundColumn DataField="Phone1" SortExpression="Phone1" AllowFiltering="false" HeaderText="Phone" />
        <telerik:GridBoundColumn DataField="Phone1Ext" SortExpression="Phone1Ext" AllowFiltering="false" HeaderText="Ext." />
        <telerik:GridBoundColumn DataField="Email1" SortExpression="Email1" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="Email" />
        <telerik:GridBoundColumn DataField="Profile" SortExpression="Profile" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="Profile" />    

    </Columns>
</MasterTableView>

                                     

BLL:

   public IList<Person> FindAllByProfile(string profileName, int rowStart, int numRows)
   {
       return profileName == "All" ? _repos.FindAll(rowStart, numRows) : _repos.FindAllByProfile(profileName, rowStart, numRows);
   }

   public int FindAllByProfileCount(string profileName)
   {
       return profileName == "All" ? _repos.FindAllCount() : _repos.FindAllByProfileCount(profileName);
   }

存储库:

  public IList<Person> FindAll(int rowStart, int numRows)
  {
      using (PRADbDataContext db = new PRADbDataContext())
      {
          var data = from p in db.persons
                     join c in db.contacts on p.PersKey equals c.PersKey into personContacts
                     from pc in personContacts.DefaultIfEmpty()
                     orderby p.Modified descending
                     select new Person()
                                {
                                    Id = p.PersKey,
                                    AddressId = p.AddrKey,
                                    DateModified = p.Modified,
                                    Email1 = p.EMail1,
                                    Marked = p.Marked,
                                    Phone1 = p.Phone1,
                                    Phone1Ext = p.PhExt1,
                                    NamePrefix = p.MrMs,
                                    FirstName = p.FName,
                                    LastName = p.LName,
                                    MiddleName = p.MName,
                                    Title = p.Title,
                                    Profile = pc.ProfKey ?? "N/A"
                                };
          return data.Skip(rowStart).Take(numRows).ToList();
      }
  }

  public int FindAllCount()
  {
      using (PRADbDataContext db = new PRADbDataContext())
          {
              var data = from p in db.persons
                         join c in db.contacts on p.PersKey equals c.PersKey
                         select new Person()
                         {
                             Id = p.PersKey,
                         };
              return data.Count();
          }
  }

1 个答案:

答案 0 :(得分:2)

我建议使用LINQPad来模拟查询。

  1. 您可以查看SQL选项卡以查看正在生成的所有SQL。如果是SQL本身导致问题,您可以在SQL Server Management Studio中对其进行分析,看看为什么这么长时间。
  2. 您可以加载DLL并运行实际方法,看看它是否与方法处理数据的方式有关。
  3. 如果您可以确定您的方法运行没有问题,那么您可以将问题范围缩小到telerik控件调用方法的方式。