SQL Server查询性能不佳

时间:2016-01-18 19:08:16

标签: sql sql-server-2008 indexing query-performance sqlperformance

我们正在使用一个应用程序.NET,当你按下一个按钮时,会打开一个DevExpress表单并执行一个SQL Server查询,因此它可以填充一些组合框的数据。应用程序在许多客户中运行良好,但在特定的应用程序中,加载表单需要花费一分多钟时间。我可以在性能监视器中看到,当我想加载表单时,SQL Server占用了大量的CPU。

我直接在SQL Server Management Studio中执行查询,花了不到一秒钟,但是我试着看一下SQL Activity Monitor以及我在这里看到的内容(不会发生在其他客户,相同的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

查询的执行计划

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)
            {

            }
        }

    }
}

查询的执行计划

选择*来自cuinac_pos其中[group] in(Select [group] from proc_groups Where Code = N'13100271')

enter image description here

解决:

我终于通过添加标记为正确的答案中建议的索引,并在代码中添加了nvarchar值“Code”搜索的查询,在shriop的评论中建议的n之前的值。谢谢大家的努力!

2 个答案:

答案 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(group,code)

的索引

答案 1 :(得分:0)

每当我在SSMS中读取类似#34;但在应用程序中速度慢时#34;我不得不考虑这个:

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

这尤其适用于较旧的DB,它们从SQL Server版本到SQL Server版本,并通过脚本升级,并且数据读取通过存储过程完成。

大多数情况下,使用SET ARITHABORT ON作为SQL代码的第一行可以解决此问题。

您可以直接将其放入SP中,或者通过Connection默认将其设置在应用程序中。

祝你好运,编码愉快