当前位置: 首页 > 知识库问答 >
问题:

在Jooq子查询中避免fetch

舒斯伯
2023-03-14

我需要从一个非常大的表中选择一个“页”的数据。由于WHERE子句和需要分页到相当大的偏移量,我使用一个子查询来获取ID。只有在末尾放置fetch时,此策略才有效。这导致(我认为)到数据库的额外往返。有什么方法可以避免额外的fetch

final Object subquery =
    JooqUtil.DSL_CONTEXT
        .select(ID_FIELD)
        .from(MY_TABLE)
        .where(conditionBuilder.build())
        .orderBy(UPDATED_AT.asc())
        .offset(offset.get())
        .limit(limit.get())
        .fetch();

return JooqUtil.toPreparedSql(
    JooqUtil.DSL_CONTEXT
        .select(JooqUtil.createFields(ALL_COLUMN_NAMES))
        .from(MY_TABLE)
        .where(ID_FIELD.in(subquery)));

附言。我这样做的原因是由于orderBy/offset/limit用于大偏移量(我选择的列之一由于是blob类型,不适合添加到索引中,所以我不能创建覆盖索引)。

共有1个答案

丁德义
2023-03-14

是的,单独的数据库往返确实可以避免。在您的示例中,您应该能够简单地在第一个查询中使用第二个查询的select子句:

return JooqUtil.toPreparedSql(
    JooqUtil.DSL_CONTEXT
        .select(JooqUtil.createFields(ALL_COLUMN_NAMES))
        .from(MY_TABLE)
        .where(conditionBuilder.build())
        .orderBy(UPDATED_AT.asc())
        .offset(offset.get())
        .limit(limit.get())
);

由于行有一个ID,所以您可能希望使用Jooq的seek子句而不是offset。我建议您阅读这篇博客文章和本手册部分,其中解释了区别以及为什么您可能需要使用seek

 类似资料:
  • 你好,我有一个简单的mysql查询,我需要显示唯一的文件名,现在查询显示重复的文件名,我想避免这种情况

  • 问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的

  • 问题内容: 我有一个这样的表: 我在上具有唯一的B树索引。所以,当我执行这样的查询时: 由于存在现有索引,我希望看到具有索引范围扫描并且没有子句排序顺序(或任何其他类型的排序)的查询计划。其实我有查询计划 结果: 如果我从查询中删除,我将无法按所需顺序获取数据(这对我来说很奇怪,因为默认情况下,B树索引会按升序构建行树,并且在这种情况下,应提供与i相同的查询计划想法) 我该如何避免? Oracle

  • 我尝试在项目中使用jooq,但出于性能原因,我希望缓存查询。在性能考虑部分的用户手册中,提到了查询缓存,但没有关于如何实现的示例。因此,我尝试按如下方式缓存查询(例如SimpleSelectConditionStep): 我的软件是一个多线程的web应用程序,但可以保证两个不同的线程不能同时使用相同的查询(池在再次放入池之前不会返回相同的查询)。 我知道比工厂不是一个线程安全的对象,但我想知道在代

  • 我尝试了以下查询,但没有编译: order BY不支持子查询吗?

  • 在Jooq中运行上述查询的最佳方式是什么?我知道我可以用普通SQL编写查询,但我想看看是否有更好的方法来实现这一点。