0

Мы работаем с приложением .NET, в котором при нажатии кнопки открывается форма DevExpress и выполняется запрос SQL Server, поэтому он может заполнять данные некоторыми сводками. Приложение работает отлично у многих клиентов, но в частности, он занимает больше минуты при загрузке формы. Я вижу на мониторе производительности, что SQL Server занимает много CPU, когда я хочу загрузить форму.Неверная производительность SQL Server

Я выполнил запрос непосредственно в SQL Server Management Studio, заняв не более секунды, однако я попытался взглянуть на монитор активности SQL и то, что я вижу здесь (не происходит с другими клиентами, такими же IO, одинаковыми SQL , то же самое все) это:

enter image description here

так что я могу видеть здесь, что я не понимаю, это почему этот запрос, имеющие столько казни? Почему он так долго извлекает данные? Здесь подмигнули план выполнения этого запроса:

Select * 
From cuinac_pos 
Where [group] in (Select [group] 
        From proc_groups 
        Where Code = 13100271) 

enter image description here

Спасибо за любую помощь вы можете дать мне, и, пожалуйста, если я могу дать больше информации, не стесняйтесь спрашивать.

Еще раз спасибо!

после добавления плана выполнения РЕКОМЕНДУЕМЫЙ ИНДЕКС

enter image description here

enter image description here

ИСПОЛНЕНИЯ ПЛАН QUERY

Select count(*) 
From proc_groups 
Where Code = 13100271 

enter image description here

enter image description here

Определение индекса в proc_groups:

enter image description here

Пример кода: план

private static void LoadDTPurchaseHerdRelation(Int32 status, Int32 herdNumber) 
     { 
      try 
      { 
       StringBuilder sb = new StringBuilder(); 


       sb.Append(" Select gr.[group] as HerdId, gr.code as HerdNumber, bo.code as PurchaseCode"); 
       sb.Append(" From cuinac_pos bo "); 
       sb.Append(" inner join proc_groups gr on bo.code=gr.code "); 

       if (herdNumber == 0) 
       { 
        string s1 = " Where (gr.created between '2015-12-09' And '2016-01-08') "; 
        sb.Append(s1); 

        if (status != 4) 
        { 
         string s2 = string.Format(" AND bo.purchasestatus = {0} ", status); 
         sb.Append(s2); 
        } 

        sb.Append(" order by bo.code "); 
       } 
       else 
       { 
        string s3 = string.Format(" Where gr.code = '{0}' ", herdNumber); 
        sb.Append(s3); 
       } 

       DTPurchaseHerdRelation.Clear(); 
       using (ConnectionScope cs = new ConnectionScope()) 
       { 
        SqlDataAdapter adapter = new SqlDataAdapter(sb.ToString(), (SqlConnection)cs.Connection); 
        adapter.Fill(DTPurchaseHerdRelation); 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

    } 
} 

исполнения для запроса

Select * From cuinac_pos Где [группа] в (Выберите [группа] из proc_groups, где Код = N'13100271 ')

enter image description here

Решено:

я, наконец, получил его, добавляя индексы предложил в ответ помечается как правильно, и добавление в коде, в запросах, которые искомых по значению NVARCHAR «Кодекс», н- до того RHE как это предлагается в комментариях shriop. Спасибо всем за ваши усилия!

+1

Во 2-м скриншоте, это не просит вас создать индекс на столбце cuinac_pos.group? – nullforce

+1

щелкните правой кнопкой мыши на плане выполнения и выберите отсутствующий индекс. это даст вам индексный скрипт. затем повторите попытку – Hiten004

+0

Я построил предложенный индекс как план выполнения, без успеха. –

ответ

3

Для этого запроса:

Select * 
From cuinac_pos 
Where [group] in (Select [group] From proc_groups Where Code = 13100271); 

оптимальные индексы proc_groups(code, group) и cuinac_pos(group). Эти индексы могут помочь.

EDIT:

Для выполнения, это могло бы быть лучше:

Select * 
From cuinac_pos cp 
Where exists (Select 1 
       From proc_groups pg 
       Where pg.Code = 13100271 and pg.[group] = cp.[group] 
      ); 

с индексом на `proc_groups (группа, код)

+0

Спасибо за вашу помощь. Я добавил указатель, предложенный в плане исполнения, но все же он очень медленный. –

+0

Изменение кода - наш последний вариант, потому что он работает на всех клиентах, кроме этого, к моменту, когда мы попытаемся внести изменения в SQL. Однако, спасибо за совет, возможно, нам придется внести некоторые изменения в код в конце! –

0

Всякий раз, когда я читал что-то вроде«быстро в SSMS, но медленный в применении "Я должен думать об этом:

http://www.sommarskog.se/query-plan-mysteries.html

Это относится, в частности, к старым БД, которые существуют от версии SQL Server до версии SQL Server и обновляются через скрипты, и где чтение данных выполняется с помощью хранимых процедур.

В большинстве случаев это поведение можно решить с помощью SET ARITHABORT ON в качестве первой строки вашего SQL-кода.

Вы можете поместить это в вас в SPs напрямую или установить его в приложении через Connection по умолчанию.

Удачи и счастливого кодирования

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