SQL Server中进程来讲,一个数据库就像带有编号页的简单序列。数据库中的页可以用数据库编号、文件编号、页的编号来唯一标识。当一个进程访问一个页时,它向缓冲管理器发送一个请求,该请求指出要访问数据所在的数据库编号、文件编号、和页编号。
为了更快地访问内存中的数据和避免数据页的内存扫描(memory scans),对缓冲池的页进行散列处理,以提供更快地访问。散列(Hashing)是一种同过一个散列函数把一个key映射到一个散列桶(hansh bucket)的技术。散列桶是一种内存中的数据结构,该数据结构包含一个指针数组(以链表方式实现),每个指针指向一个缓冲页(buffer page)。A linked list chain of hash pages is built when the pointers to buffer pages do not fit on a single hash page. 散列桶的数量是SQL Server根据缓冲池大小动态进行调整。
在SQL Server中,散列值是由数据库编号、文件编号、页编号相结合生成的。散列函数生成散列值并保存在散列桶中。本质来讲,散列桶就是访问内存页的一个索引。即使在一个大的内存环境中,散列技术可以允许SQL Server快速查找内存中的具体数据页而这需要一些内存读操作。利用散列算法也让SQL Server快速判断某个请求的页是否在内存中,而不需要一个内存缓冲区的扫描。
如果被请求的页在内存中,缓冲区管理者返回一个指向内存缓冲区的指针,该内存缓冲区即为该进程请求的数据页。如果页不在内存中,则缓冲区管理者必须首先进行一次磁盘I/O操作把请求页读到内存缓冲区中,然后把指向该内存的指针返回给发送请求的进程。
如果请求页的进程最终对页中的任何信息进行了修改,该页就被标记为“脏页(dirty)”,当进行完成了对页的修改,缓冲区管理者会收到一个通知。缓冲区管理者协同日志和事务管理者,负责确保被修改的页写到了磁盘上。 |