ANALYZE 命令是否有任何缺点(接受稍大的数据库)?如果不是,为什么默认不执行?
最佳答案
还有另一个缺点。 ANALYZE 结果可能会导致查询规划器忽略您真正想要使用的索引。
例如,假设您有一个带有 bool 列“isSpecial”的表。大多数行的 isSpecial = 0,但也有一些行的 isSpecial = 1。
当您查询 SELECT * FROM MyTable WHERE isSpecial = 1
,在没有 ANALYZE 数据的情况下,查询计划器将假定 isSpecial 上的索引是好的并会使用它。在这种情况下,它碰巧是对的。如果你要做 isSpecial = 0 那么它仍然会使用索引,这将是低效的,所以不要这样做。
运行 ANALYZE 后,查询规划器会知道 isSpecial 只有两个值,因此索引的选择性很差。所以它不会使用它,即使在上面的 isSpecial = 1 情况下也是如此。要知道 isSpecial 值分布非常不均匀,它需要仅在使用 SQLITE_ENABLE_STAT4 选项编译时收集的数据。该选项默认情况下不启用,它有一个很大的缺点:它使准备好的语句的查询计划取决于其绑定(bind)值,因此 sqlite 将更频繁地重新准备语句。 (可能每次都执行,具体不知道)
tl;dr:运行 ANALYZE 几乎不可能在 bool 字段上使用索引,即使您知道它们会有所帮助。
关于SQLite:分析的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7557151/