在sqlite(特别是版本3)中,是否应该在事务中运行ANALYZE?
如果是这样,并且我在进行大量更改的长事务结束时,是否可以在同一事务中运行ANALYZE,或者是否应首先提交该事务并为ANALYZE开始另一个事务?
The documentation并没有就这种或那种方式说些什么。
答案 0 :(得分:1)
ANALYZE从索引列中读取数据,并将统计信息写入某个内部表。 这有点类似于以下查询:
INSERT OR REPLACE INTO sqlite_statXXX
SELECT 'MyTable', 'MyColumn', COUNT(*), AVG(MyColumn) FROM MyTable
为每个索引列完成一次。
与将少量数据写入数据库的任何其他SQL语句一样,事务开销将远远大于编写数据本身的实际工作量。
在您的情况下,如果没有更改的统计信息,您的更改数据可用必要,因此您也可以在同一事务中执行ANALYZE。
如果数据库太大而且ANALYZE运行了很长时间,那么将其执行推迟到以后它与更重要的事务不冲突时可能是有意义的。