Есть еще один недостаток. Результаты 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 делает практически невозможным использование индексов для логических полей, даже если вы знаете, что они будут полезны.