适用于以下版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17

自动内联绑定值

适用于 ❌ 开源版   ✅ Express 版   ✅ 专业版   ✅ 企业版

绑定值是 SQL 中的一个重要概念,出于性能原因,因为它们简化了某些 RDBMS 中预备语句的缓存。当你这样编写时,jOOQ 默认总是创建绑定值

-- Normally, a bind parameter marker is generated
AUTHOR.ID = ?
// This is the same as AUTHOR.ID.eq(val(1, AUTHOR.ID))
AUTHOR.ID.eq(1);

但在某些情况下,最好不要使用绑定变量,而是创建内联值,以便优化器可以更好地应用其统计信息。这主要在以下情况下很有用:

  • 该列是视图中的一个常量判别列,例如
  • 该列具有非常倾斜的统计信息,并且只有少数可能的取值(例如,BOOLEANENUM 类型或 CHECK COL IN (1, 2, 3) 约束)。

在这些情况下,启用Settings.transformInlineBindValuesForFieldComparisons并实现一个org.jooq.TransformProvider可能会很有用,如下所示

Configuration configuration = ...
configuration.settings().setTransformInlineBindValuesForFieldComparisons(true);
configuration.set(new TransformProvider() {
    @Override
    public boolean inlineBindValuesForFieldComparisons(Field<?> field) {
        return field.getType() == Boolean.class
            || field.getDataType().isEnum(); // Or, perhaps, limit this only to certain enums
    }
});

现在,所有其谓词与上述 TransformProvider 内容匹配的查询都将内联其相关的绑定值。例如

-- Inlining applies to some columns now, not all
AUTHOR.ID = ? AND AUTHOR.STATUS = 'ACTIVE'
AUTHOR.ID.eq(1).and(
    AUTHOR.STATUS.eq(Status.ACTIVE));

相关设置包括

引用此页

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo