天高地厚

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

局部性原理

Posted on 2012-12-18 09:36  天高地厚-GNU  阅读(404)  评论(0编辑  收藏  举报

局部性原理

    所谓的局部性原理分为时间和空间上的。由于程序是顺序执行的,因此当前数据段附近的数据有可能在接下来的时间被访问到。这就是所谓的空间局部性。而程序中还存在着循环,因此当前被访问的数据有可能在短时间内被再次访问,这就是所谓的时间局部性原理。

 

     因此在了解了局部性原理之后,我们可以通过以下几个手段来减少磁盘的IO。

 

提前读(Read-Ahead)

     提前读也被称为预读。根据磁盘原理我们不难看出,在磁盘读取数据的过程中,真正读取数据的时间只占了很小一部分,而大部分时间花在了旋转延迟和寻道时间上,因此根据空间局部性原理,SQL Server每次读取数据的时间不仅仅读取所需要的数据,还将所请求数据附近的数据进行读取。这在SQL Server中被称为预读。SQL Server通过预读可以有效的减少IO请求。

 

延迟写(Delayed write)

     同样,根据时间局部性原理,最近被访问的数据有可能再次被访问,因此当数据更改之后不马上写回磁盘,而是继续放在内存中,以备接下来的请求读取或者修改,是减少磁盘IO的另一个有效手段,在SQL Server中,实现延迟写是buffer pool,当一个修改请求被commit之后,并不会立刻写回磁盘,而是将修改的页标记为“脏”,然后根据某种机制通过checkpoint或lazy writer写回磁盘,关于checkpoint和lazy writer的原理,可以参考我之前的文章:浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色.