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 就可以避免许多重复和多余的计算。当请求完成(查询的游标关闭)时,SQL Anywhere 就会释放被高速缓存的值。

在进行查询处理时,SQL Anywhere 会监视被高速缓存的子查询值的重用频率。如果相关变量的值极少重复,SQL Anywhere 就只需要计算一次大多数的值。在这种情况下,SQL Anywhere 会发现重新计算偶尔出现的重复值比高速缓存大量只出现一次的条目更为有效。因此,对于语句的其余部分,数据库服务器会暂停对该子查询进行高速缓存,而为外部查询块中的每个行重新计算该子查询。

如果相关列的大小大于 255 字节,SQL Anywhere 也不会进行高速缓存。在这种情况下,您可能需要重写查询或者将另一列添加到表中,以提高这些操作的效率。

函数高速缓存

一些内置函数和用户定义函数的高速缓存方式与子查询结果的高速缓存方式相同。这样就可以大大改进那些在查询处理过程中用相同参数调用的且占用大量资源的函数。但是,这可能意味着函数的调用次数少于其它情况下的预期调用次数。

对于要高速缓存的函数,它必须满足两个条件:

  • 对于一组给定的参数,它必须始终返回相同的结果。

  • 它必须对基础数据没有副面影响。

满足这些条件的函数称为确定型等幂函数。SQL Anywhere 将所有用户定义的函数视为确定型(除非在创建时将它们声明为 NOT DETERMINISTIC)。即,数据库服务器假定对具有相同参数的同一函数连续进行两次调用将返回相同的结果,并且不会对查询的语义产生任何不良的副作用。

除了少数几个例外,内置函数均被视为确定型函数。RAND、NEW_ID 和 GET_IDENTITY 函数被视为非确定型函数,它们的结果不进行高速缓存。

有关用户定义函数的详细信息,请参见CREATE FUNCTION 语句(Web 服务)