SQLite likelihood() 函数使用指南

SQLite likelihood() 函数是 SQLite 中最灵活且精细的查询优化器提示接口。它允许开发者显式地为某个条件表达式指定一个介于 0.0 到 1.0 之间的概率权重,直接向查询规划器(Query Planner)反映现实业务中的数据分布事实。

在面对缺乏系统统计数据、或者数据分布极其特殊的复杂查询时,SQLite 的自动化成本估算可能出现偏差。通过 likelihood(),开发者可以以最小的代码侵入性(无需重构索引或重写 SQL 结构)引导规划器生成最佳执行路径。

SQLite likelihood() 语法

这里是 SQLite likelihood() 函数的标准语法:

likelihood(expression, probability)

参数

expression
必需的。需要评估并赋值概率的条件表达式。
probability
必需的。一个介于 0.0 和 1.0(包含边界)之间的浮点数常量,代表该条件为真的预估概率。传入小于 0.0 或大于 1.0 的数值将引发运行时错误。

返回值

SQLite likelihood() 函数原样返回参数 expression 的评估结果。

  • 对表达式求值本身没有任何副作用。
  • 第二个参数 probability 仅在 SQL 编译优化阶段被查询规划器读取,在运行时会被完全忽略。

SQLite likelihood() 示例

这里展示 likelihood() 函数的基础调用与高精度调优实践。

基础调用与语法验证

SELECT 
    likelihood(50 > 10, 0.99) AS res_high,
    likelihood(50 < 10, 0.01) AS res_low,
    likelihood(NULL, 0.5) AS res_null;

输出:

res_high  res_low  res_null
--------  -------  --------
1         0        NULL    

精确设定业务维度的过滤概率

假设在电商系统的交易订单中,根据大数据统计,VIP 用户的订单占比约占总单量的 15%(0.15):

CREATE TABLE shop_orders (
    order_id INTEGER PRIMARY KEY,
    user_type TEXT,
    total_amount REAL
);

-- 显式指定 user_type = 'VIP' 的命中率为 0.15
SELECT 
    order_id, 
    total_amount
FROM shop_orders
WHERE likelihood(user_type = 'VIP', 0.15)
  AND total_amount > 1000.0;

输出:

order_id  total_amount
--------  ------------
301       1250.0      
418       3400.0      

规划器根据 0.15 的命中率,能够更合理地估算该谓词的筛选效率,并据此决定是否利用联合索引或确定最优驱动表。

结论

  • likelihood() 是 SQLite 优化提示体系的基石:likely(X) 等价于 likelihood(X, 0.9375),而 unlikely(X) 等价于 likelihood(X, 0.0625)。
  • 第二个参数必须是字面量浮点常量,不能使用动态变量或子查询列。
  • 建议仅在深入分析 EXPLAIN QUERY PLAN 并确认规划器发生误判时才针对性引入,以防过度干预阻碍数据库自身的自适应优化。