c# – LINQ类似的查询完全不同的执行时间
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – LINQ类似的查询完全不同的执行时间,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4773字,纯文字阅读大概需要7分钟。
内容图文
我对Entity Framework和Linq有一个非常奇怪的问题.我的第一个查询看起来像这样:
from account in context.account
join access in context.access on account.Id equals access.IdAccount
join group in context.group on access.IdGroup equals group.Id
where account.IdUser == idUser
&& access.Date > DateTime(2014,02,21)
&& group.Access > 0
select access
执行没有任何问题.但添加附加条件(access.Status> 0)后的相同问题执行时间很长. 30秒后它仍在运行:
from account in context.account
join access in context.access on account.Id equals access.IdAccount
join group in context.group on access.IdGroup equals group.Id
where account.IdUser == idUser
&& access.Status > 0
&& access.Date > DateTime(2014,02,21)
&& group.Access > 0
select access
“状态”列不是计算列.从中返回的SQL查询
((System.Data.Objects.ObjectQuery)result).ToTraceString();
完全不同.这个额外的access.Status条件在查询中可能出现问题?
生成的SQL查询.列的名称是不同的,因为在LINQ示例中,它们从波兰语翻译成英语.第一个是:
SELECT
`Filter1`.`IdDostep`,
`Filter1`.`IDKONTO1` AS `IdKonto`,
`Filter1`.`IndeksOms`,
`Filter1`.`IdGrupa`,
`Filter1`.`DataUtw`,
`Filter1`.`DataMod`,
`Filter1`.`DataOd`,
`Filter1`.`DataDo`,
`Filter1`.`Znacznik`,
`Filter1`.`Kalendarz`,
`Filter1`.`Komplet`,
`Filter1`.`Access`
FROM (SELECT
`Extent1`.`IdKonto`,
`Extent1`.`IdAbonenta`,
`Extent1`.`NrAbonenta`,
`Extent1`.`NrFaktury`,
`Extent1`.`DataFaktury`,
`Extent1`.`Login`,
`Extent1`.`Password`,
`Extent1`.`Notatka`,
`Extent1`.`IPAdres`,
`Extent1`.`Email`,
`Extent1`.`LastLogin`,
`Extent1`.`LastIP`,
`Extent1`.`Session`,
`Extent1`.`Regulamin`,
`Extent1`.`RegulaminDataAkceptacji`,
`Extent1`.`Powiadomienie`,
`Extent1`.`Gratis`,
`Extent1`.`PrzyEmail`,
`Extent1`.`PrzyIdPytanie`,
`Extent1`.`PrzyOdpowiedz`,
`Extent1`.`PrzyStatus`,
`Extent1`.`PrzySesja`,
`Extent1`.`IdKod`,
`Extent1`.`szerokosc`,
`Extent1`.`wysokosc`,
`Extent1`.`serwis`,
`Extent1`.`Nzam`,
`Extent1`.`parent`,
`Extent1`.`RegulaminLogowanie`,
`Extent1`.`NoBaners`,
`Extent1`.`KontoPromocyjne`,
`Extent2`.`IdDostep`,
`Extent2`.`IdKonto` AS `IDKONTO1`,
`Extent2`.`IndeksOms`,
`Extent2`.`IdGrupa`,
`Extent2`.`DataUtw`,
`Extent2`.`DataMod`,
`Extent2`.`DataOd`,
`Extent2`.`DataDo`,
`Extent2`.`Znacznik`,
`Extent2`.`Kalendarz`,
`Extent2`.`Komplet`,
`Extent2`.`Access`
FROM `konto` AS `Extent1` INNER JOIN `dostep` AS `Extent2` ON `Extent1`.`IdKonto` = `Extent2`.`IdKonto`
WHERE `Extent2`.`DataDo` > @gp1) AS `Filter1` INNER JOIN `grupa` AS `Extent3` ON `Filter1`.`IdGrupa` = `Extent3`.`IdGrupa`
WHERE (`Filter1`.`NrAbonenta` = @p__linq__0) AND (`Extent3`.`Access` > 0)
第二个是:
SELECT
`Filter1`.`IdDostep`,
`Filter1`.`IDKONTO1` AS `IdKonto`,
`Filter1`.`IndeksOms`,
`Filter1`.`IdGrupa`,
`Filter1`.`DataUtw`,
`Filter1`.`DataMod`,
`Filter1`.`DataOd`,
`Filter1`.`DataDo`,
`Filter1`.`Znacznik`,
`Filter1`.`Kalendarz`,
`Filter1`.`Komplet`,
`Filter1`.`Access`
FROM (SELECT
`Extent1`.`IdKonto`,
`Extent1`.`IdAbonenta`,
`Extent1`.`NrAbonenta`,
`Extent1`.`NrFaktury`,
`Extent1`.`DataFaktury`,
`Extent1`.`Login`,
`Extent1`.`Password`,
`Extent1`.`Notatka`,
`Extent1`.`IPAdres`,
`Extent1`.`Email`,
`Extent1`.`LastLogin`,
`Extent1`.`LastIP`,
`Extent1`.`Session`,
`Extent1`.`Regulamin`,
`Extent1`.`RegulaminDataAkceptacji`,
`Extent1`.`Powiadomienie`,
`Extent1`.`Gratis`,
`Extent1`.`PrzyEmail`,
`Extent1`.`PrzyIdPytanie`,
`Extent1`.`PrzyOdpowiedz`,
`Extent1`.`PrzyStatus`,
`Extent1`.`PrzySesja`,
`Extent1`.`IdKod`,
`Extent1`.`szerokosc`,
`Extent1`.`wysokosc`,
`Extent1`.`serwis`,
`Extent1`.`Nzam`,
`Extent1`.`parent`,
`Extent1`.`RegulaminLogowanie`,
`Extent1`.`NoBaners`,
`Extent1`.`KontoPromocyjne`,
`Extent2`.`IdDostep`,
`Extent2`.`IdKonto` AS `IDKONTO1`,
`Extent2`.`IndeksOms`,
`Extent2`.`IdGrupa`,
`Extent2`.`DataUtw`,
`Extent2`.`DataMod`,
`Extent2`.`DataOd`,
`Extent2`.`DataDo`,
`Extent2`.`Znacznik`,
`Extent2`.`Kalendarz`,
`Extent2`.`Komplet`,
`Extent2`.`Access`
FROM `konto` AS `Extent1` INNER JOIN `dostep` AS `Extent2` ON `Extent1`.`IdKonto` = `Extent2`.`IdKonto`
WHERE ((`Extent2`.`Komplet`) > 0) AND (`Extent2`.`DataDo` > @gp1)) AS `Filter1` INNER JOIN `grupa` AS `Extent3` ON `Filter1`.`IdGrupa` = `Extent3`.`IdGrupa`
WHERE (`Filter1`.`NrAbonenta` = @p__linq__0) AND (`Extent3`.`Access` > 0)
解决方法:
问题不应该在linq中,而应该是数据库中sql语句的底层执行.可能第一个查询仅使用索引执行,而第二个查询扫描表.
建议解决您的问题,查看两个查询的执行计划,使用ToTraceString()并了解您的问题.如果您需要额外帮助,请发布该查询计划,我们会帮您解决.
编辑:
正如您从sql查询中看到的那样,它们没有那么不同,它们仅在内部查询过滤器中有所不同:
第一个查询有:
WHERE Extent2.datado > @gp1) AS Filter1
第二个:
WHERE ( ( Extent2.komplet ) > 0 )
AND ( Extent2.datado > @gp1 )) AS Filter1
所以,即使你有所有索引并不意味着它们是好的索引.如果每个列都有一个索引,则SQL可能只选择其中一个列.可能你需要检查它们.所以,就像我之前建议的那样,检查每个查询的执行计划,看看你的瓶颈在哪里.
内容总结
以上是互联网集市为您收集整理的c# – LINQ类似的查询完全不同的执行时间全部内容,希望文章能够帮你解决c# – LINQ类似的查询完全不同的执行时间所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。