简体   繁体   English

为什么LinqToEntities跳过/采取oracle实现这么慢

[英]Why is LinqToEntities Skip/Take oracle implementation so slow

Context is an Oracle Database, Entity Framework 5, LinqToEntities, Database First. Context是Oracle数据库,实体框架5,LinqToEntities,数据库优先。

I'm trying to implement pagination over some large tables, my linqToEntities query looks like this : 我正在尝试在一些大表上实现分页,我的linqToEntities查询看起来像这样:

context.MyDbSet
    .Include("T2")
    .Include("T3")
    .Include("T4")
    .Include("T5")
    .Include("T6")
    .Where(o => o.T3 != null)
    .OrderBy(o => o.Id)
    .Skip(16300)
    .Take(50);

Fact is, depending on how many records i wanna skip (0 or 16300) it goes from 0.08s to 10.7s. 事实是,根据我想跳过多少条记录(0或16300),它从0.08s到10.7s。

It seems weird to me so i checked the generated SQL and here is how it looks like : 这对我来说似乎很奇怪,所以我检查了生成的SQL,这是它的样子:

SELECT * 
FROM ( 
SELECT 
[...]
FROM ( SELECT [...] row_number() OVER (ORDER BY "Extent1"."Id" ASC) AS "row_number"
    FROM      T1 "Extent1"
    LEFT OUTER JOIN T2 "Extent2" ON [...]
    LEFT OUTER JOIN T3 "Extent3" ON [...]
    LEFT OUTER JOIN T4 "Extent4" ON [...]
    LEFT OUTER JOIN T5 "Extent5" ON [...]
    LEFT OUTER JOIN T6 "Extent6" ON [...]
    WHERE ("Extent1"."SomeId" IS NOT NULL)
)  "Filter1"
WHERE ("Filter1"."row_number" > 16300)
ORDER BY "Filter1"."Id" ASC
)
WHERE (ROWNUM <= (50) )

I checked if it actually was Oracle who took time through SQL Developper, and it is. 我检查过它是否真的是Oracle通过SQL Developper花了一些时间,而且确实如此。

I then checked the execution plan and it's what appears : 然后,我检查了执行计划,它出现了什么:

执行计划

All i actually understand is that there's no STOPKEY for the first filter over row_number and that it probably fetch the whole sub query. 我真正理解的是,对于row_number上的第一个过滤器没有STOPKEY,它可能会获取整个子查询。

I don't really know where to look at, if i'm not mistaken, the request is generated by ODT/ODP/.. and thus, should be optimized for an Oracle DB.. (and i can't change it myself) 我真的不知道在哪里看,如果我没有弄错,请求是由ODT / ODP / ..生成的,因此,应针对Oracle DB进行优化..(我不能自己更改它)

Maybe my database model is rotten and i could add whetever indexes or optimization for it to work better ? 也许我的数据库模型是烂的,我可以添加更多的索引或优化,以使其更好地工作?

You see all those UNIQUE SCAN subqueries? 你看到所有那些独特的SCAN子查询? That's doing a UNIQUE on every single one of those tables. 这对每一张桌子都做了独一无二的事情。

You should have a one-to-many relationship with T1 being the parent, and any tables you need to be in the query to have a FOREIGN KEY relationship to an indexed ID primary key column on T1. 您应该具有一对多关系,其中T1是父级,并且您需要在查询中与T1上的索引ID主键列具有FOREIGN KEY关系的任何表。

Then you can use Join instead of Include and the subqueries will be unnecessary. 然后您可以使用Join而不是Include ,并且子查询将是不必要的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM