This relates generally to computer databases and storage systems.
Storage systems may be implemented using a block interface that abstracts databases from the internal details of the storage system. Storage systems can be composed of disk drives, disk arrays, Redundant Array of Independent Disks (RAID) arrays, and other storage devices. The internal details of the storage system may refer to the presence and size of caches, different types of RAID levels, the number of disks, and more. Example block interfaces may include, but are not limited to, the Small Computer System interface (SCSI) and Advanced Technology Attachment (ATA) block command sets. To this end, block interfaces may be designed for ease-of-use and interoperability between different database systems and storage systems.
However, due to the level of abstraction provided by the storage block interface, certain information may be lost while communicating an input/output (I/O) operation regarding the source of the I/O and its contents. For example, it may not be feasible for the storage system to determine whether the I/O operation relates to a database record, table, index, journal, or any other database structure. In other words, storage systems may be unable to differentiate between different types of I/O operations.
Thus, quality of service policies of storage systems within a database system are usually implemented at a volume-wide level. Certain inefficiencies can arise under this framework since a quality of service policy for a particular volume may only benefit a fraction of storage requests (i.e., I/O operations) to that volume. As a result, valuable resources may be unnecessarily expended while executing the quality of service policy.