【问题标题】:Is there a way to make the faster ordered SQL TOP 1 query as Entity Framework query?有没有办法将更快的有序 SQL TOP 1 查询作为实体框架查询?
【发布时间】:2020-05-24 11:32:47
【问题描述】:

这里有两种方法可以从有序表中获取前 1 行

慢一点:

select top 1 * 
from movies m
where m.Distributor = 'any'
order by m.IMDB_Rating desc

更快:

select top 1 m.* 
from movies m
left join movies m2 on m.Distributor = m2.Distributor 
                    and m2.IMDB_Rating > m.IMDB_Rating
where m.Distributor = 'any' 
  and m.IMDB_Rating is not null 
  and m2.id is null 

第一个更简单,但第二个更快。

那么,有没有办法使用实体框架进行第二次查询?

如果无法在 EF 或 EF Core 中进行此查询,如果可能的话,您能否给我另一个与第二个一样快的查询?

很抱歉,如果重复,我找不到任何问题的答案

非常感谢!

【问题讨论】:

    标签: sql sql-server entity-framework entity-framework-core


    【解决方案1】:

    对于这个查询:

    select top (1) m.*
    from movies m
    where m.Distributor = 'any'
    order by m.IMDB_Rating desc;
    

    您想要在movies(Distributor, IMDB_Rating desc) 上建立索引。

    我无法解释为什么第二个版本会更快。

    【讨论】:

    • 非常感谢您的回答,但我避免创建新索引,前提是它是解决我的问题的唯一方法。我的表有1048576行,看两个查询的执行计划:Execution plan
    • 那个执行计划应该是问题所在,理解你的模式非常重要。
    • 向数据库添加索引确实是这里最好的方法,OP的第二个查询类似于为发行商找到最大IMDB评级,然后找到与该评级值匹配的电影,这是一个复杂的逻辑绕过数据库未针对此类查询进行优化的事实。
    • 很抱歉,我无法完全理解您的回答。我知道,如果我在第一个查询中创建索引,它将与第二个查询一样快。但我真的不想只有在没有其他方法解决我的问题时才这样做。对我来说,创建索引是一个很好的解决方案,但如果没有它我可以这样做,否则我的数据库将充满索引,我真的不希望它变成那样。我可以解释原因,但总而言之,这是因为我的系统的性能,所以在这种情况下我接受了更多的复杂性。非常感谢您花时间回答我。
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多