shakoon
2021-04-19 09:49:55 +08:00
我觉得楼主这个问题涉及到了应用程序层面、操作系统层面、硬件设备固件层面。每一个层面都有自己的优化算法可以对读写方式进行专门指定,但是一般来说,应用程序和操作系统都是没有办法改变硬件固件已经设定好的读写方式,但是如果觉得操作系统对硬件的调度算法对该应用不够最优,应用程序也是有可能直接操作读写硬件的,也就是跳过大部分操作系统常规的硬件调用 api 。最常见的场景就是,各种数据恢复软件、分区软件。
如 5 楼所言,常见数据库 oracle 、db2 较早已经提供了以 raw 方式读写磁盘以提供更优化的 io 性能。但这种模式下,应用程序对磁盘是完全独占的,即该分区将完全有应用所调度,其他程序是不能进行任何访问和操作的。
3 楼说的预先分配表空间的方式,对数据仓库类大量 insert 和 select 的应用来说效率很高,但是一旦涉及 update 和 delete,数据依然会产生物理上的不连续,当然相比完全由 os 管理还是要好得多。
固态硬盘有不少不会有碎片,只是由于其读写速度远高于磁盘的机械运动,碎片带来的影响在和磁盘相比上已经是若干数量级的区别了,所以一般都给忽略掉了。较大型的数据中心现在已经普遍在应用 ssd 阵列的存储设备了,和传统存储相比确实快了几倍(但没有到几个数量级的差别)。但是考虑到综合成本的问题,长期存储的数据主要还是在磁盘存储上,重要应用和需要经常读写的数据才放 ssd 上,毕竟二者价钱差异还是很大的。