0

我們正在與一個應用程序,.NET,其中當你按下一個按鈕DevExpress的形式被打開,一個SQL Server查詢工作被執行,因此它可與數據的一些組合框填寫。應用程序在許多客戶中運行良好,但是在特定的應用程序中,加載表單需要花費一分多鐘。我可以在性能監視器中看到,當我想要加載表單時,SQL Server佔用了大量CPU。SQL Server查詢性能差

我直接在SQL Server Management Studio中執行查詢,時間不超過一秒,但是我試着看看SQL Activity Monitor以及我在這裏可以看到的情況(不發生在其他客戶,相同的IO,相同的SQL ,同一切)是這樣的:

enter image description here

所以我可以在這裏看到,那我不明白的東西,這就是爲什麼是有這個查詢這麼多的執行?爲什麼檢索數據需要這麼長時間? 這裏it's這個查詢的執行計劃:

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

在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,其中Code = N'13100271')

enter image description here

解決:

我終於通過添加索引了它提出的答案標記爲正確的,並添加代碼,在搜查nvarchar的值「碼」查詢,RHE之前的N按照shriop的評論建議的價值。謝謝大家的努力!

+1

在第二個屏幕截圖中,是不是要求您在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)。有這些索引可能會有幫助。

編輯:

出於性能考慮,這可能會更好:

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版本並通過腳本進行升級以及通過存儲過程完成數據讀取的舊數據庫。

大多數情況下,您的SQL代碼的第一行可以使用SET ARITHABORT ON來解決此問題。

您可以直接將其放入SP中,或者通過Connection將其設置在您的應用程序中作爲默認值。

祝你好運,快樂編碼