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 服务器会为以下各项考虑高速缓存计划:

  • 在存储过程、用户定义函数和触发器中执行的所有语句。

  • 满足跳过优化条件的 SELECT、INSERT、UPDATE 或 DELETE 语句。请参见查询处理阶段

    对于 INSERT 语句,只有 INSERT...VALUES 语句能够高速缓存;INSERT...ON EXISTING 语句则不可高速缓存。

    对于 UPDATE 和 DELETE 语句,WHERE 子句必须存在,且必须包含使用主键标识行的搜索条件。如希望使用计划高速缓存,则不允许有其它搜索条件存在。另外,对于 UPDATE 语句,包含变量赋值的 SET 子句将使该语句不能够高速缓存。

当这些语句之一由某个连接执行多次后,优化程序将在不知道主机变量值的情况下为该语句构建一个可重用的计划。可重用的计划可能具有较高的开销,因为主机变量值不能用于选择性估计或语义查询转换。如果可重用的计划的结构与先前执行语句时所构建的计划的结构相同,则数据库服务器会将可重用的计划添加到计划高速缓存中。如果对每次执行进行优化的好处会超过不进行优化所节省的开销,则执行计划不会被高速缓存。

如果执行计划使用未被语句引用的实例化视图,且 materialized_view_optimization 选项设置为非 Stale 值,则不会高速缓存该执行计划,且会在下次调用存储过程、用户定义函数或触发器时再次优化该语句。

计划高速缓存是对用于执行访问计划的数据结构进行逐个连接的高速缓存。要重用高速缓存的计划,其步骤包括在高速缓存中查找计划并将其重置为初始状态。通常,这比在所有查询处理阶段中处理语句要快得多。如果高速缓存的计划未被频繁使用,并且不会提高高速缓存使用率,它们就可能被存储到磁盘中。优化程序会定期重新优化查询,以检验高速缓存的计划是否仍然具有较高的效率。

要高速缓存的最大计划数目由 max_plans_cached 选项指定。缺省值为 20。若要禁用计划高速缓存,请将此选项设置为 0。请参见max_plans_cached 选项 [数据库]

可以使用 QueryCachedPlans 统计信息显示当前对多少个查询执行计划进行了高速缓存。可以使用 CONNECTION_PROPERTY 函数检索此属性,以显示为给定连接高速缓存了多少个查询执行计划,或者可以使用 DB_PROPERTY 函数来计算为所有连接高速缓存的执行计划的数目。此属性可以与 QueryCachePages、QueryOptimized、QueryBypassed 和 QueryReused 组合使用,以帮助确定 max_plans_cached 选项的最佳设置。请参见连接属性

可以使用数据库或连接属性 QueryCachePages 来确定用于高速缓存执行计划的页数。这些页占用临时文件中的空间,但不必驻留在内存中。

另请参见