postgres 8.3/Ubuntu-Karmic/32位(在virtualbox中):
持续时间:76.534 ms语句:truncate audit.users cascade
持续时间:0.952毫秒语句:从audit.users中删除
postgres 8.4/Ubuntu lucid/64位(本机,在托管karmic virtualbox的机器上):
持续时间:1469.271 ms语句:truncate audit.users cascade
持续时间:0.988毫秒语句:从audit.users中删除
所以DELETE语句是相当的,但是TRUNCATE在一个平台上要比另一个平台长20倍。EXPLAIN似乎对TRUNCATE不起作用。我怎么知道花了这么长时间?
编辑以添加:
上面的示例是在另一个空闲连接打开到数据库,但没有打开的事务或其他活动时获取的。我在一些自动化测试的tearDown
方法中使用TRUNCATE,这是我注意到平台之间速度差异的地方。
最佳答案
TRUNCATE在PostgreSQL中的工作方式是,它非常敏感于文件系统删除块的速度,以及它是否正确地执行fsync系统调用(当您写以刷新写缓存时)。我猜这两个系统上有不同的文件系统设置。例如,如果Lucid安装使用ext4和Karmic one ext3,这种行为就不足为奇了。较新的内核将正确地将fsync调用转换为通过写屏障进行的磁盘缓存刷新;较旧的内核让驱动器向它们谎报正在写入的内容。这对于在崩溃期间保证数据库写操作的安全是一件好事,但是当内核从可靠性的角度做正确的事情时,性能会下降很多。
关于sql - 如何调试Postgresql TRUNCATE时间的差异?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3283753/