ANALYZE命令是否有任何缺点(接受稍大的数据库)?如果没有,为什么默认不执行?
答案 0 :(得分: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几乎不可能在布尔字段上使用索引,即使你知道它们会有用。
答案 1 :(得分:2)
简短回答:计算可能需要更多时间而不是节省时间。
与索引不同,在添加或更新数据时,ANALYZE统计信息不会自动保持最新。只要添加了大量数据,就应该重新运行ANALYZE。