何时使用 SQL 语句高速缓存

如果多个用户执行相同的 SQL 语句,那么应用程序可能会从使用 SQL 语句高速缓存中获益。如果语句中的所有字符都完全匹配,数据库服务器会将其视为相同的语句。

例如:设想有 50 个销售代表全天执行 add_order 应用程序,如果该应用程序中包含使用主变量的 SQL 语句,他们都执行相同的 SQL 语句,如以下示例所示:
SELECT * FROM ORDERS WHERE order_num = :hostvar

此种应用程序会从使用 SQL 语句高速缓存中获益,因为 用户很容易在 SQL 语句高速缓存中找到 该 SQL 语句。

对于以下 SQL 语句,数据库服务器认为它们不能精确匹配,因为它们在 WHERE 子句中包含的字面值有所不同:
SELECT * FROM customer, orders
      WHERE customer.customer_num = orders.customer_num
      AND order_date > "01/01/07"
SELECT * FROM customer, orders
      WHERE customer.customer_num = orders.customer_num
      AND order_date > "01/01/2007"
在以下情况下,使用 SQL 语句高速缓存不会提高性能:

如果语句包含主变量,那么数据库服务器在将该语句存储到 SQL 语句高速缓存中时,会使用占位符替换主变量。 因此,优化该语句时无需数据库服务器访问主变量的值。 在某些情况下,由于为某一列存储的分布信息会精确的告知优化器通过过滤器的行数,所以如果数据库服务器访问主变量的值,可能会以另外的方式优化该语句。

如果包含主变量的 SQL 语句在 SQL 语句打开的情况下执行性能很低,那么可尝试使用 onmode -e flush 命令清空 SQL 语句高速缓存,并尝试用在查询的多次执行中使用频率更高的变量运行该查询。 清空高速缓存时,数据库服务器重新优化查询,并生成针对这些频繁使用的值进行优化的查询计划。
要点: 只有在某个语句未被使用时,数据库服务器才能从 SQL 语句高速缓存中清空该语句条目。 如果某一应用程序准备好语句并将其继续保留,那么该条目仍在使用。 在此情况下,应用程序需要首先关闭该语句,才能通过清空提高性能。