我需要从一个非常大的表中选择一个“页”的数据。由于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类型,不适合添加到索引中,所以我不能创建覆盖索引)。
是的,单独的数据库往返确实可以避免。在您的示例中,您应该能够简单地在第一个查询中使用第二个查询的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编写查询,但我想看看是否有更好的方法来实现这一点。