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



我想从表 A 中获取包含列 iddeptcoursecreated_date 列的详细信息,以及大约 35 列,这些列在存储过程中与表 B 具有外键关系。

最后,我想通过检查表 A 中的"id"是否应该作为列"userid"和另一列在表"B"中具有 null 或"NO"来提取数据。

表 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. 同样,如果我在相同的存储过程中使用动态参数执行,它的返回速度非常慢(在亚马逊服务器本身中花费了 45 秒)

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

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

请帮忙找到它。

当你尝试使用实体时,你做了什么技巧来加快它的速度吗?喜欢 AsNoTracking()?在某些情况下,这可以加快检索数据的速度。有没有办法限制你拉回来的列的数量?我会限制列并为每个列添加昵称或缩短的列别名。这应该会有所帮助。

这充满了问题。

  1. 您真的需要返回 220 列吗? 这会产生更多的网络开销。
  2. 按原样,查询 #1 将返回来自 A 的列,但查询 #2 将返回来自 A 和 B 的列。 同样,更多的网络开销。
  3. 查询
  4. #1 中的子查询不会将 B.userid 与 A.userid 进行比较,这意味着如果子查询返回任何单个结果,则 EXISTS 函数的计算结果始终为 1。
  5. 查询 #2 中的"和 charge = 'no'"属于 WHERE 子句,而不是 JOIN 子句。 这可能会抛弃优化器。
  6. 在表 A 中,WHERE 子句中的每一列都需要一个覆盖索引,以及一个关于 userid 的索引。
  7. 这只是美观的,但请考虑对日期范围使用 BETWEEN 关键字。 我正在阅读它的处理方式相同。

请更正其中一些问题,然后重试。

最新更新