我目前有一个9Gb Sqlite3数据库,我有一个“维护”任务,该任务在晚上随机运行,以VACUMM;
的数据库运行(平均大约每周一次)。该数据库位于Windows 10计算机上。
一天早晨,我看到任务仍在运行。正如预期的那样,VACUMM;
命令使用的磁盘空间是原来的两倍,但是我并不希望它运行+2小时并使用100%的磁盘利用率。
我的问题是
将100%的磁盘用于大约9Gb的数据库并运行2个小时以上是否正常? (数据库不再真正增长了。)
有没有一种方法可以VACUUM;
在不杀死进程中的驱动器的情况下? (也许是低优先级的VACUUM还是有这种效果?)
答案 0 :(得分:3)
您可以尝试使用VACUUM INTO而不是VACUUM
,然后仅删除原始数据库文件并重命名新创建的文件。这样可以消除一半的磁盘抖动。
或者,您可能会考虑不大量使用VACUUM
。如您所说,如果数据库在大小方面已经稳定下来,那么几个空白页并不是真正值得关注的原因。您可以先将其减少为每月间隔而不是每周间隔,然后看看您是否注意到查询性能有所不同。很有可能,您不会。
答案 1 :(得分:0)
Is it normal to use 100% of the disk for an ~9Gb database and to run for over 2 hours? (the database is not really growing anymore).
不,我仍然想让您对它进行手动(和非跨国)版本的VACUUM进行基准测试:
echo ".dump" | sqlite3 old_db.db3 | sqlite3 new_db.db3; rm old_db.db3; mv new_db.db3 old_db.db3;
与适当的VACUUM相比,它的性能如何?还是100%cpu超过2小时?如果它的性能明显更好,我想这是某个地方的sqlite3 VACUUM性能错误。
有没有办法我可以抽真空?数据库中没有杀死我的驱动器的过程? (也许是低优先级的VACUUM还是有这种效果?)
是的,但是它会更慢,显然,这应该可以在非常低的io优先级和非常低的cpu优先级下运行并运行:
echo "VACUUM;" | ionice -c 3 nice -n 19 sqlite3 db.db3