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并确认规划器发生误判时才针对性引入,以防过度干预阻碍数据库自身的自适应优化。