【问题标题】:SQL Server stored procedure returning data too slowlySQL Server 存储过程返回数据太慢
【发布时间】:2016-03-16 17:44:05
【问题描述】:

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

最后,我想通过检查表 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 应用程序并从服务方法执行存储过程以获取数据列表并将其绑定到网格。

请帮忙找一下。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 按实体,我从表 A 中获取数据,例如:大约有 9000 条记录,然后我正在检查那 9000 条,表 B 中有多少可用条件费用 =“否”。然后它通过提供选项 .Any() , .Exists() 函数最终在一分钟后返回我 5000 行
  • @LakshmiNarasimhanR 禁用更改跟踪 如果不需要,您应该禁用更改跟踪。最重要的是,当您只想检索数据并且根本不需要对读取的数据进行更新时,您不需要更改跟踪。
  • 这个,这是我第一次运行Entity时需要学习的一个非常重要的因素。如果您只检索只读数据,请始终禁用跟踪。这将显着提高您的吞吐量。
  • 这里我现在变得很快,因为以下几点: 1.首先通过检查日期从唯一的表 A 中获取。 2. 然后,传递列表数据并使用带有 AsNoTracking() 的实体的条件检查表 B 中的可用性。 3.还在所需行的表A和B上创建索引。 4、然后我感觉比以前更好(50% 以上)的性能
【解决方案2】:

这充满了问题。

  1. 您真的需要返回 220 列吗?这会增加网络开销。
  2. 照原样,查询 #1 将返回来自 A 的列,但查询 #2 将返回来自 A 和 B 的列。同样,更多的网络开销。
  3. 查询 #1 中的子查询不会将 B.userid 与 A.userid 进行比较,这意味着如果子查询返回任何单个结果,EXISTS 函数的计算结果始终为 1。
  4. "and charge = 'no'" in query #2 属于 WHERE 子句,而不是 JOIN 子句。这可能会导致优化器失效。
  5. 在表 A 中,您需要为 WHERE 子句中的每一列创建一个覆盖索引,并在用户 ID 上创建一个索引。
  6. 这只是为了美观,但请考虑使用 BETWEEN 关键字作为日期范围。我读到它的处理方式相同。

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

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2017-02-22
    • 2016-11-03
    • 2014-11-06
    相关资源
    最近更新 更多