SQLite:分析的缺点

标签 sqlite optimization analyzer sql-execution-plan

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/

相关文章:

sql - 如何基于另一个表的值在SQL表上创建列

sql - 按列排序表,但如果为0,则忽略-SQLite

python - 很快获得文件夹的总大小

android - 在 Api Map V2 Android 上绘制多边形时出现性能问题

MySql查询分析器-免费解决方案

ElasticSearch 索引与搜索时间分析器

dart - 使用analyzer_experimental以编程方式解析Dart文件时收到警告

android - 如何删除Android SQLite数据库?

c# - 以编程方式将 SQLite 转换为 .sql

c# - 是否可以将 (x == 0 || x == 1) 简化为单个操作?