4

ANALYZE 命令是否有任何缺点(除了稍大的数据库)?如果不是,为什么默认不执行?

4

2 回答 2

4

还有另一个缺点。ANALYZE 结果可能会导致查询规划器忽略您真正想要使用的索引。

例如,假设您有一个带有布尔列“isSpecial”的表。大多数行的 isSpecial = 0,但也有一些行的 isSpecial = 1。

当您执行查询SELECT * FROM MyTable WHERE isSpecial = 1时,在没有 ANALYZE 数据的情况下,查询规划器将假定 isSpecial 上的索引是好的并会使用它。在这种情况下,它碰巧是对的。如果你要做 isSpecial = 0 那么它仍然会使用索引,这将是低效的,所以不要这样做。

运行 ANALYZE 后,查询规划器会知道 isSpecial 只有两个值,因此索引的选择性很差。所以它不会使用它,即使在上面的 isSpecial = 1 情况下也是如此。要知道 isSpecial 值分布非常不均匀,它需要仅在使用 SQLITE_ENABLE_STAT4 选项编译时收集的数据。该选项默认不启用,它有一个很大的缺点:它使准备好的语句的查询计划取决于其绑定值,因此 sqlite 将更频繁地重新准备语句。(可能每次都执行,具体不知道)

tl;dr:运行 ANALYZE 几乎不可能在布尔字段上使用索引,即使您知道它们会有所帮助。

于 2014-11-11T12:03:17.427 回答
2

简短的回答:计算所需的时间可能比节省的时间多。

与索引不同,分析统计数据不会在添加或更新数据时自动保持最新。每当添加或更新大量数据时,您都应该重新运行 ANALYZE。

于 2011-09-26T16:58:26.560 回答