SQL Server存储过程返回数据的速度太慢

时间:2016-03-16 17:44:05

标签: c# sql-server asp.net-mvc linq

我希望从表A中获取包含iddeptcoursecreated_date列的详细信息以及存储了与表B的外键关系的约35列过程

最后,我想通过只检查" id"来提取数据。在表A中应该可以作为列#34; userid"和另一列有空或“否”的列在表格中" B"。

表B共有220列。

通过

获取数据

查询#1

Select * 
from A 
where Exists (select userid from B where charge = 'no') 
  and created_date >= '2015-01-01' 
  and created_date <= '2016-01-01' 

查询#2

Select * 
from A aa  
left join B bb on bb.userid = aa.id 
               and charge = 'no' 
where 
    aa.created_date >= '2015-01-01' 
    and aa.created_date <= '2016-01-01'.

实际上表现太慢了。

观察:

  1. 如果我在SQL Server存储过程中使用硬编码值执行日期,则通过拉出属于6个月的6000条记录来快速返回数据

  2. 同样,如果我在同一个存储过程中使用动态参数执行,它返回的速度非常慢(在Amazon服务器本身中占用45秒)

  3. 我尝试使用实体linq面临同样的问题。

  4. 此外,我也希望以非常快速有效的方式获取数据。我正在使用ASP.NET MVC 4 Web应用程序并从服务方法执行存储过程以获取数据列表并将其绑定到网格。

    请帮助找到它。

2 个答案:

答案 0 :(得分:0)

当您尝试使用Entity时,您是否采取了任何措施加快实施速度?喜欢AsNoTracking()?在某些情况下,可以加快数据的检索速度。无论如何都要限制你拉回的列数量?我会限制列并为每个列添加昵称或缩短的列别名。这应该有所帮助。

答案 1 :(得分:0)

这充满了问题。

  1. 您确实需要返回220列吗?这会增加网络开销。
  2. 按原样,查询#1将返回A中的列,但查询#2将返回来自A和B的列。再次,更多的网络开销。
  3. 查询#1中的子查询不会将B.userid与A.userid进行比较,这意味着如果子查询返回任何单个结果,则EXISTS函数始终求值为1.
  4. &#34;和charge =&#39; no&#39;&#34;在查询#2中属于WHERE子句,而不是JOIN子句。这可能会使优化器失效。
  5. 在表A中,您需要WHERE子句中每列的覆盖索引和userid上的索引。
  6. 这只是美学,但请考虑在日期范围内使用BETWEEN关键字。我正在阅读它处理过的内容。
  7. 纠正其中一些问题,然后重试。