Как я могу отследить источник медлительности для моего сценария? - PullRequest
1 голос
/ 21 июня 2011

Я озадачен этой проблемой производительности. При поиске по RadGrid я получаю мгновенные результаты. Однако, когда я фильтрую любой из столбцов, выполнение запроса занимает около 10 секунд, и любая подкачка, применяемая после фильтра, остается такой же медленной. Если я уберу фильтр, производительность будет просто отличной.

Production - это сервер 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);
   }

Repository:

  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 Ответ

2 голосов
/ 21 июня 2011

Я бы рекомендовал использовать LINQPad для эмуляции запросов.

  1. Вы можете просмотреть вкладку SQL, чтобы увидеть весь производимый SQL.Если причиной проблемы является сам SQL, вы можете профилировать его в SQL Server Management Studio и посмотреть, почему это занимает так много времени.
  2. Вы можете загрузить свою DLL и запустить свои реальные методы, чтобы увидеть, нужно ли что-то делатьс тем, как метод обрабатывает данные.
  3. Если вы можете сказать, что ваш метод работает без проблем, то вы можете сузить проблему до способа, которым элементы управления telerik вызывают ваши методы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...