自动内联绑定值
适用于 ❌ 开源版 ✅ 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);
但在某些情况下,最好不要使用绑定变量,而是创建内联值,以便优化器可以更好地应用其统计信息。这主要在以下情况下很有用:
- 该列是视图中的一个常量判别列,例如
- 该列具有非常倾斜的统计信息,并且只有少数可能的取值(例如,
BOOLEAN
、ENUM
类型或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));
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!