选择最佳的执行计划,也可以称为选择代价最小的索引。
只对select、update、delete这三种SQL有效
select、update、delete都可以指定where子句,
1. 首先,根据where子句建立索引条件(index condition),
以下8种类型的表达式(org.h2.expression.Expression)子类能建立索引条件
Comparison
CompareLike
对于下面三个,都要求left表达式是ExpressionColumn
ConditionIn
ConditionInSelect
ConditionInConstantSet
ConditionAndOr 只支持AND的情形
ExpressionColumn 只支持列的类型是BOOLEAN的情形,如 delete from DeleteTest where b (b列在建表时是boolean类型)
ValueExpression 只支持值的类型是BOOLEAN,且是false的情形,如delete from DeleteTest where 3<2
索引条件有可能有多个。
2. 如果没有索引条件,那么使用ScanIndex
3. 否则按索引条件构建masks
代价比较:
EQUALITY < RANGE < END < START
4. 删除无用的索引条件(但是不删除AlwaysFalse的索引条件)