Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询处理 » 查询优化与执行 » 优化程序的工作原理 » 优化程序的基础假定

 

内存调控器

SQL Anywhere 数据库服务器使用高速缓存(也称为缓冲池)以临时在内存中存储(缓冲)数据库页的映像。这些页通常是表页和索引页,尽管还有若干其它类型的物理页存储在 SQL Anywhere 数据库中。除了这些页之外,数据库服务器还使用两个其它内存池的高速缓存。其中一个池是用于数据库服务器数据结构(例如表示连接、语句和游标的那些数据结构)的虚拟内存。第二个池由用作查询内存的虚拟存储的高速缓存页组成。

查询执行算法(例如散列连接和排序)需要内存来高效运行。SQL Anywhere 使用内存调控器来决定每个语句可用于查询执行的查询内存量。内存调控器负责为语句分配查询内存池以保证负载的高效执行。QueryMemPages 数据库服务器属性显示可用于分配的查询内存池中的页数。池容量设置为服务器的最大高速缓存大小(即,高速缓存大小上限,它可以由 -ch 服务器选项控制)的某一比例。QueryMemPercentOfCache 数据库服务器属性提供可以作为查询内存的最大高速缓存大小的比例,该比例为 50%。

内存调控器授予各个语句所选页数,该语句随后可将这些页数用于内存密集型查询处理算法。查询内存池中的内存仍然可以用于其它目的(例如缓冲表或索引页),直到查询处理算法使用这些页。使用查询内存的内存密集型查询处理算法包括所有基于散列的运算符(例如非重复散列、散列分组依据、散列连接)以及排序和窗口运算符。

当语句开始执行时,内存调控器使用优化程序的估计值来确定对该语句有用的内存是多少。该估计值会作为 QueryMemMaxUseful 出现在图形式计划中。语句的查询内存在该请求的访问计划中使用的特定内存密集型运算符之间进行分配。交换运算符之下的并行内存密集型运算符各自接收为其分配的查询内存。简单请求不会从大量内存中受益,但是如果有足够内存来保存全部所需行,则使用基于散列的运算符或排序的请求可更高效地运行。

要提高数据库服务器进程并发水平,需要该数据库服务器为每个附加并发任务或请求保留一些查询内存量,同时减少用于任意特定请求的内存量。此外,内存调控器会限制可以并发执行的内存密集型请求的数量。基于运行数据库服务器的计算机的性能特性选择该最大值,该限值通过服务器属性 QueryMemActiveMax 进行显示。内存调控器还会保留正在运行的并发内存密集型请求数的估计值,该估计值以数据库服务器属性和性能监控器统计信息 QueryMemActiveEst 的形式提供。内存调控器使用该运行平均值决定如何指派查询内存池的内存。如果正在执行的内存密集型请求很少,则会为每个请求指派更多的内存。如果执行的请求很多,会为每个请求指派较少的内存以更加均匀地共享查询内存,并考虑估计的对每个请求有用的查询内存页数。

如果某个内存密集型语句开始执行,而正在执行的并发内存密集型请求的数量已达到最大,则进来的语句会等待现有请求之一释放其指派的内存。query_mem_timeout 数据库选项控制进来的请求等待内存授予的时间长短。缺省设置为 -1,此时请求等待数据库服务器定义的时间段。如果经等待后没有内存授予可用,则可能通过内存不足执行策略(如果针对该计划的内存密集型物理运算符存在该策略),使用少量内存执行该语句的访问计划,这可能会导致执行速度很慢。数据库服务器属性和性能监控器统计信息 QueryMemGrantWaiting 显示正在等待要授予的内存请求的当前请求数,QueryMemGrantWaited 显示请求在授予内存请求之前等待的总次数。

在图形式计划中,值 QueryMemNeedsGrant 显示内存调控器认为这是简单请求(无需内存授予)还是内存密集型请求(需要内存授予)。如果内存调控器将某个请求分类为不需要内存授予的请求,则该请求会立即开始执行。否则,该请求会请求使用一定比例的查询内存池中的内存。图形式计划值 QueryMemLikelyGrant 显示为执行请求可能授予该请求的页数的估计值。

另请参见