查询性能

PSQuery Performance

我有以下型号:

  A
  1
  |
  *
  B
^   ^
|   |
B1  B2

其中 B 是 B1 和 B2 的抽象超类。我现在有一个像这样的 PSQuery:

var data = es.PSQuery<A>().Where(..).SelectMany(x => x.Bs).ToList();

生成的 SQL 如下所示:

SELECT ALIAS.ID FROM B ALIAS WHERE ....

然后 MDriven 获取块中的所有鉴别器以确定对象的类型,因此这些可能相当多 SQLs:

SELECT ALIAS.ID, ALIAS.DISCRIMINATOR FROM B ALIAS WHERE ID in (?, ? ....)

现在 MDriven 知道类型并可以加载数据。总而言之,这个过程比手工制作的时间要长得多 SQL。所以我的问题是:

  1. 我可以从 PSQuery 中获取 SQL 以便我自己执行吗?在这种情况下,我构建了一个非常复杂的表达式,我真的更喜欢构建 PSQuery 而不是构建 SQL 字符串。
  2. 如果 MDriven 会在第一个 SQL 中加载描述符,则不需要延迟加载。我们为此 table 使用自定义 OR-Mapping。是否可以将鉴别器包含在第一个SQL中?
  3. 是否有不同的提示来防止这种耗时的加载行为(保持模型不变)?

首先:如果您需要多个 类 的结果集(抽象结果集),您的加载时间将受益于子 类 parent 映射(子类写成一个-parent-table)

要从 PSQuery 中获取生成的 SQL:

 var sqltext = this.EcoSpace.OclPs.ReturnPlatformQuery(null, vars, model.OclPS);

您可以拥有 Parent、Child 或自己的 Sub类 映射。 当你拥有“自己”时,你会得到每个子类 1 table + 每个超类 1 table。在这种情况下,我们首先根据鉴别器减少到特定的 ids——然后获取每个子类的数据