我想从表 A 中获取包含列 id
、dept
、course
、created_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'.
实际上性能太慢了。
观察:
如果我在SQL Server存储过程中使用硬编码值执行日期,它通过提取属于6个月的6000条记录非常快速地返回数据
同样,如果我在相同的存储过程中使用动态参数执行,它的返回速度非常慢(在亚马逊服务器本身中花费了 45 秒)
我尝试使用实体 linq 面临同样的问题。
我也想通过非常快速有效的方式获取数据。我正在使用 ASP.NET MVC 4 Web应用程序并从服务方法执行存储过程,以获取数据列表并将其绑定到网格。
请帮忙找到它。
当你尝试使用实体时,你做了什么技巧来加快它的速度吗?喜欢 AsNoTracking()?在某些情况下,这可以加快检索数据的速度。有没有办法限制你拉回来的列的数量?我会限制列并为每个列添加昵称或缩短的列别名。这应该会有所帮助。
这充满了问题。
- 您真的需要返回 220 列吗? 这会产生更多的网络开销。
- 按原样,查询 #1 将返回来自 A 的列,但查询 #2 将返回来自 A 和 B 的列。 同样,更多的网络开销。 查询
- #1 中的子查询不会将 B.userid 与 A.userid 进行比较,这意味着如果子查询返回任何单个结果,则 EXISTS 函数的计算结果始终为 1。
- 查询 #2 中的"和 charge = 'no'"属于 WHERE 子句,而不是 JOIN 子句。 这可能会抛弃优化器。
- 在表 A 中,WHERE 子句中的每一列都需要一个覆盖索引,以及一个关于 userid 的索引。
- 这只是美观的,但请考虑对日期范围使用 BETWEEN 关键字。 我正在阅读它的处理方式相同。
请更正其中一些问题,然后重试。