解决方法
统计信息只是一种动态元数据形式,可帮助查询优化器做出更好的决策.例如,如果表中只有十几行,那么就没有必要去索引进行查找;进行全表扫描总是会更好.但是如果同一个表增长到一百万行,那么使用索引可能会更好.但是如果你在一个只有极少数唯一值的列上查询该表(例如它可能是一个只包含“M”或“F”的“性别”列),那么实际上FTS可能会更好,因为你会无论如何都需要检索块来构建结果集.现在说你的表是99%“M”而只有1%“F”,我们应该在一个案例中使用FTS或在另一个案例中使用索引.相同的表,相同的查询,可能有四种不同的查询计划,具体取决于表的内容.这些类型的东西是“统计”,它们是每个数据库的个体 – 即使两个具有相同表和索引结构的数据库也会有不同的统计数据.
总之,在现代数据库引擎中,有两种查询优化:重写sql(基于规则的优化,如编译器重写C以提高效率)和选择正确的数据路径(基于成本的优化),就像JIT编译器在运行时识别热点一样).如果你发现查询优化器做了明显错误的事情(例如,当你知道索引会更好时选择FTS),你只需要担心这个问题.