我正在使用H2并且有一个简单的查询,如下所示:
SELECT DISTINCT col
FROM PUBLIC.TABLE;
H2使用全表扫描,即使选择性很低,并且col上有一个非唯一索引。
我查了一下然后跑了:
SELECT SELECTIVITY(CLUSTERNODE ) FROM PUBLIC.TRANSFORMATION;
返回'1'。
有什么想法吗?
答案 0 :(得分:3)
尽管选择性低(=基数),但在DISTINCT查询中H2可能不会使用现有索引的原因是它在内部维护表统计信息,用于确定列选择性,这些可能已过期,或者根本没有初始化。
文档说在较新的版本中,这些会自动更新,但似乎需要一定数量的INSERT(或其他突变),至少在我的情况下单独升级没有做到这一点(我从1.2.143至1.3.171)。
只需执行“分析”更新查询,一切都应该没问题。就我而言,执行时间从近一分钟下降到300毫秒。