Linq:TPT 层次结构,查找多个子类型的行的性能

本文关键字:类型 性能 TPT 层次结构 查找 Linq | 更新日期: 2023-09-27 18:33:48

我的情况是:
我有一个数据库,我确实选择在其中实现TPT层次结构。因此,我有一个基类和大约 25 个子类。
我必须查询此层次结构才能获取仅 5 个子类型的所有行。我的第一个镜头是进行 5 种不同类型的不同查询:

db.Rows.OfType<SubClass1>()...

我正在使用 Azure 中的数据库进行本地测试,每个查询大约需要 250 毫秒才能完成。
在超过一秒钟的总时间里,我想优化这部分,尝试只去数据库一次,所以我尝试写这样的东西:

db.Rows.Where(r => r is SubClass1 || r is SubClass2)...  
执行

这个新查询,我得到了正确的结果(我做了真正的测试(,但执行时间超过 6 秒!
我在Visual Studio调试器中为DbContext启动了记录器,我可以看到生成的SQL查询超过1350行代码(我没有把它放在这个消息中,但如果有人想看它,我在这里......
此外,我不是 SQL 专家,但查询不够可读,正如您可以想象的 1350 行代码查询......
它能做什么,我能做些什么来改善我的查询时间?
提前谢谢。
安德里亚

Linq:TPT 层次结构,查找多个子类型的行的性能

问题看起来可能是 TPT 映射本身。

问题是,针对基类型的查询会强制 EF 发现每个数据库行必须具体化为的 C# 类型。查询必须将每个子类型联接到基表,然后测试行是否存在确定 C# 类型的列。对于大型类层次结构,针对基类型的查询将导致高度复杂的查询,如您看到的查询。http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt,请阅读本文,深入了解 TPT 的查询生成工作原理。

至于提高性能,上面的文章建议;

对于即席报告,数据库视图提供了一种抵消 TPT 策略复杂性的方法。视图可用于将每类型表模型转换为更简单的每层次结构表模型。